入れる
文法:
単一行の挿入
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_PRIORITY
MyISAM
修飾子は、 、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
。
QUICK
QUICK
:修飾子を指定すると 、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