ドンドン身に付く、スラスラ書ける書き込み式SQLドリル 3章読んだ
3-1, 3-2
そういえば、生のINSERT文書くの久しぶりすぎて笑えます。
列を指定せずに、新規のデータを挿入する場合
INSERT INTO table_name VALUES ( 'column1', 'column2', 'column3' ... // テーブルに定義されている順に書いていく。 // NULLや数値、関数値には''をつけない ) ;
列を指定して、新規のデータを挿入する場合、
INSERT INTO table_name ( // テーブル名の後に列指定を書く。列指定には''が必要ない // 指定しなかった列にはNULLかデフォルト値が代入される column3, column1, column2 ) VALUES ( 'column3' 'column1', 'column2', ... // テーブル名の後に指定されている順に書いていく。 ) ;
列名を指定する場合の書式で、指定しなかった列にNULL値が許されずデフォルト値も設定されていない場合は、エラーになってINSERT命令自体が失敗する。
MySQLの場合、VALUESの()部分を,区切りで連ねて書くことで一度に複数行挿入できる。
INSERT INTO users ( l_name, f_name ) VALUES ( '山田', 'リン' ), ( '鈴木', '朝子' ) ;
現在時間はNOW(), 今日の日付はCURRENT_DATEです(()不要)。
3-3
VALUES(...)のところをSELECT命令に置き換えることで、SELECT命令のサブクエリの結果を挿入することが可能。
SELECTする列の数、型とINSERTする列の数、型はVALUES(...)のときと同様に揃えておくこと。
また、固定値をセットしたい列に対しては、SELECT命令の取得列で固定値を指定するだけです。
既存テーブルにサブクエリの結果を挿入したい場合は、
INSERT INTO table_name (col1, col2, ...) SELECT (col1, col2, ...)
でよいが、サブクエリの結果(抽出結果)を新規テーブルに挿入したい場合は、
CREATE TABLE nikkei AS SELECT * FROM books WHERE publish = '日経BP' ; // p.200より引用
みたいな感じ。この場合、SELECT命令の結果がそのまま新規テーブルの列定義になるので、別名をつけたい場合はSELECT文の列名にAS句で別名をつけておくこと。
復習:日付の加工は
DATE_FORMATE(updated_at, '%Y年%m月%d日')
3-4, 3-5
UPDATE命令って実は最初のPHPのプログラミング以来書いたことが無いことに気づいた。
基本的な構文は以下の通りで、
UPDATE table_name SET column1=value1, column2=value2, ... ;
SET句で活躍するのが、REPLACE関数で、
target_column_nameREPLACE(source_column_name, '置換対象文字列', '置換文字列')
という風に使う。
上記の状態だとすべての行を更新してしまうので、少し恐ろしい。 だから、ほとんどはWHERE句を指定して、特定の列だけを更新する。
UPDATE table_name SET column1=value1, column2=value2, ... WHERE ... ;
UPDATE命令とサブクエリの章については、WHERE句にサブクエリを用いている印象でSELECTのときとそんなに差は無いかも。
CASE句をどう書いたらいいか分からなかった。
// 書式1 CASE WHEN 条件式1 THEN value1 WHEN 条件式2 THEN value2 ELSE value3 END // 書式2。条件式が同じ列が特定値をとるかどうかのみを問うとき CASE column WHEN 条件値1 THEN value1 WHEN 条件値2 THEN value2 ELSE value3 END
3-7, 3-8
あまり書いたことなかったけど、UPDATE文とあまり変わらない。
DELETE FROM sales WHERE s_date <= '2012-11' ; // p.223より引用
もしも将来的に少しでもデータを利用する可能性が残っている(または削除して良い自信が無い)のであれば、たとえばテーブル上に削除フラグ等の列を用意しておいて、不要となったデータであることを明示するなどの方法をとることをお勧めします
// p.224より引用
また、行全体ではなく、特定のカラムのみをクリアしたいというケースでは、UPDATE命令を使用します。DELETE命令はあくまで行全体を削除する命令です。
// p.225より引用