ドンドン身に付く、スラスラ書ける書き込み式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より引用