woshidan's loose leaf

ぼんやり勉強しています。

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