MYSQL の追加、削除、および変更ステートメント

入れる

文法:

単一行の挿入

INSERT INTO table_name (column_1, column_2, ...)
VALUES (value_1, value_2, ...);

複数行の挿入

INSERT INTO table_name (column_1, column_2, ...)
VALUES (value_11, value_12, ...),
       (value_21, value_22, ...)
       ...;

INSERT INTO と VALUES は両方ともキーワードです

INSERT INTO の後にテーブル名を続けます

テーブル名 table_name の後に、データを挿入する列名のリストが続きます。列名は括弧で囲まれています

VALUES キーワードの後の括弧内は値のリストです。フィールドと同じ数の値が存在する必要があります。値の位置と列の位置の間には 1 対 1 の対応関係があります。

INSERT ステートメントは挿入された行数を返します

まずテーブルを作成します

CREATE TABLE user (
    id INT AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    age INT,
    birthday DATE,
    PRIMARY KEY (id)
);

単一行を挿入

INSERT INTO user (name,age) VALUES ('zhangsan',18);

インデックスを 2 つの列に挿入しただけであることがわかります。そのため、他の列に値がない場合は NULL が埋め込まれ、ID 列は値を指定しなくても自動インクリメントされる主キーになります。

複数行の挿入

INSERT INTO user (name,age) VALUES ('lisi',4),('wangwu',6);

 

 

 日付フィールドを挿入

INSERT INTO user (name,age,birthday) VALUES ('zhaoliu',18,'2001-10-04');

DATE 形式でのデータ挿入では、YYYY-MM-DD の文字列が使用されます。

INSERT の修飾子

LOW_PRIORITY:

修飾子を指定すると LOW_PRIORITY 、MySQL サーバーは INSERT テーブルから読み取るクライアントがなくなるまで実行を遅らせます。

LOW_PRIORITYMyISAM修飾子は、 、  MEMORY、 など  、テーブル レベルのロック (ロックによる遅延実行) のみをサポートするストレージ エンジンに影響します MERGE

HIGH_PRIORITY:

修飾子を指定すると HIGH_PRIORITY 、サーバー起動 --low-priority-updates オプションがオーバーライドされます (LOW_PRIORITY オプションをサポートするすべてのステートメントは、デフォルトで低優先度として処理されます)。

LOW_PRIORITY について

書き込み操作が LOW_PRIORITY (低優先度) リクエストの場合、システムはそれを読み取り操作よりも高い優先度とはみなしません。この場合、ライターが待機している間に 2 番目のリーダーが到着すると、2 番目のリーダーはライターの前に挿入できます。ライターは、他のリーダーが存在しない場合にのみ操作を開始できます。理論的には、このスケジュール変更は、LOW_PRIORITY 書き込み操作が永久にブロックされる場合があることを意味します。前の読み取り操作の進行中に他の読み取り操作が到着した場合、新しいリクエストは LOW_PRIORITY 書き込み操作の前に挿入されます。
 

また、テーブルレベルのロックのみをサポートするストレージ エンジンにのみ影響します。

無視:

IGNORE 修飾子を指定すると、MySQL サーバーは INSERT 操作中に無視できるエラーを無視します。これらのエラーは最終的に WARNING として返されます。

挿入制限

MySQL では、max_allowed_packet サーバー側とクライアント側の単一メッセージのサイズに上限があります。ステートメントについても同様です SELECT 。ステートメントのサイズが この値SELECT を超える とmax_allowed_packet 、サーバーはエラーを返します。

次のステートメントは、 max_allowed_packet サーバー上の現在の構成を示しています。

SHOW VARIABLES LIKE 'max_allowed_packet';

max_allowed_packet バイト単位で。また、サーバーごとに値が異なる場合があります。 

消去

文法:

DELETE FROM table_name
[WHERE clause]
[ORDER BY ...]
[LIMIT row_count]

table_name ここからデータを削除するテーブル名です

テーブル内のすべてのデータが削除されるため、WHERE を省略しないようにしてください。

データを削除するように要求されるかもしれませんが、私は依然として順序が違うので、実際、ORDER BY と LIMIT は DELETE ではなく WHERE に変更されます。

DELETE ステートメントは削除された行数を返します

DELETE と SElECT の両方の後に WHRER ORDER BY LIMIT を続けることができますが、DELETE の後に列は続きません (行は削除されると削除されるため、ここにはパラメータはありませんが、デフォルトでは、複数のテーブルが存在する場合に現在のテーブルが反映されます)削除されました)

例:

単一テーブルの削除:

データを準備します:

デモにはSakilaサンプルデータベースのアクターテーブルを使用していますが、テーブルは事前にコピーしてから最後にインポートするので、削除するとテーブルが消えてしまいます。

CREATE TABLE actor_copy AS (SELECT * FROM actor);

条件付き削除:

DELETE FROM actor_copy WHERE actor_id = 1;

Actor_id = 1 の行を削除します

DELETE FROM actor_copy WHERE last_name LIKE 'S%';

Sで始まる行を削除します

削除する行の最大数を制限する

登録済みの早い方10名からの削除依頼

DELETE FROM actor_copy
ORDER BY actor_id DESC
LIMIT 10;

テーブルのエイリアスについて

初期の MYSQL はエイリアスの削除をサポートしていません 

エラーは次のように報告されます。

DELETE FROM main_table m
WHERE NOT EXISTS (
    SELECT *
    FROM another_table a
    WHERE a.main_id = m.id
  );

しかし、私たちにはこれができます

DELETE FROM main_table m
WHERE NOT EXISTS (
    SELECT *
    FROM another_table a
    WHERE a.main_id = m.id
  );

または、テーブル名を指定して直接削除します

複数テーブルの削除

LIMIT 複数のテーブルの削除ステートメントでは句と 句を使用できません ORDER BY 。

その他各種接続等にも使用可能

DELETE t1, t2
FROM t1 INNER JOIN t2
WHERE t1.id = t2.id;
DELETE t1
FROM t1 INNER JOIN t2
WHERE t1.id = t2.id;

これら 2 つを比較すると、最初のタイプは t1 と t2 の対象となる行をすべて削除し、2 番目のタイプは t1 の対象となる行のみを削除します (本体は DELETE t1)。

FROM の後の t1 と t2 の間に JOIN を追加する必要がありますか? FROM の後にテーブルが 2 つある場合は、途中に何も追加しなくても、デフォルトで CROSS JOIN になります。

本当にそうしたくない場合は、クエリに参加する必要はありません。

DELETE FROM t1 WHERE (SELECT * FROM t2 WHERE t1.id = t2.id);

2番目に相当します

DELETE t1
FROM
  t1 LEFT JOIN t2 ON t1.id = t2.id
WHERE t2.id IS NULL;

DELETE修飾子

  • LOW_PRIORITY: 修飾子を指定すると 、 テーブルから読み取るクライアントがなくなるまで、LOW_PRIORITY MySQL サーバーは操作の実行を遅らせます 。DELETEこの修飾子は、テーブル レベルのロックのみをサポートするストレージ エンジン ( 、  MyISAM、 MEMORYなど ) に影響しますMERGE

  • QUICKQUICK :修飾子を指定すると 、MyISAM ストレージ エンジンは DELETE 操作中にインデックスをマージしません。これにより、操作がいくらか高速化されます DELETE 。

  • IGNORE: 修飾子を指定すると IGNORE 、MySQL サーバーは DELETE 操作中に無視できるエラーを無視します。これらのエラーは最終的 WARNING に として返されます。

演算子の使用方法は INSERT と同じで、後から追加するだけです。

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name

アップデート

文法:

UPDATE [IGNORE] table_name
SET
    column_name1 = value1,
    column_name2 = value2,
    ...
[WHERE clause];

table_name はテーブル名です

column_name は列名です。カンマで区切って複数の列を指定できます。

WHERE 句を使用して、更新する行を指定します。WHERE 条件に一致する行のみが更新されます。

WHERE文は省略可能ですが、特別な必要(どうしても列データ全体を更新したい場合)がない限り省略しないでください。

例:

シングルトンデータを更新する

UPDATE customer
SET email = '[email protected]'
WHERE customer_id = 1;

これの意味は、顧客のcustomer_id = 1に一致するデータを[email protected]に更新することです。

  • 1 row affected 1 行のデータが影響を受けることを示します。つまり、1行分のデータが更新されます。
  • Rows matched: 1 一致条件を表す WHERE 行数は1 です。
  • Changed: 1 変更された行数が 1 であることを示します。
  • Warnings: 0 注意すべき点がないことを示します。

複数のデータ列を更新します。

UPDATE customer
SET first_name = 'Tim',
    last_name = 'Duncan',
    email = '[email protected]'
WHERE customer_id = 1;

 式の更新

UPDATE customer
SET email = REPLACE(email, 'sakilacustomer.org', 'sjkjc.com');

updateを使用する 場合UPDATE 、フィールドの値を関数やその他の演算などの式の演算結果に設定できます。

ここでの REPLACE 関数は、メール内の sakilacustomer.org を sjkjc.com に置き換え、置き換え後のメールを返します。

サブクエリで更新する

UPDATE customer
SET store_id = (
    SELECT store_id
    FROM store
    ORDER BY RAND()
    LIMIT 1
  )
WHERE store_id IS NULL;

任意のstore_idをstore_idのない列に割り当てます。

UPDATE修飾子

  • LOW_PRIORITY: 修飾子を指定すると 、 テーブルから読み取るクライアントがなくなるまで、LOW_PRIORITY MySQL サーバーは操作の実行を遅らせます 。UPDATE

    LOW_PRIORITY 修飾子は、テーブル レベルのロックのみをサポートするストレージ エンジン ( 、  MyISAM、 MEMORYなど ) に影響しますMERGE

  • IGNORE: 修飾子を指定すると IGNORE 、MySQL サーバーは UPDATE 操作中に無視できるエラーを無視します。これらのエラーは最終的 WARNING に として返されます。

​UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name = value

 

おすすめ

転載: blog.csdn.net/chara9885/article/details/131486988