書き込み式SQLメモ

CONCAT('追加する名前', カラム名) 
DATE_FORMAT(カラム名, '&y年%m月%d日') アルファベットを大文字にすると英語、小文字にすると日本的
ROUND(値, 切り捨てる小数点以下桁) 小数点以下全てならそこ省略可

ORDER BY の後複数の項目について降順で並べる場合 DESCはその数だけ必要

GROUP BYした項目に条件を付けるときはWEHER句ではなくHAVING句

比較演算子の左辺は必ず集計列

集計列を取り出すときに対応するカラムも一緒に取り出す

WHEREは普通の条件、HAVINGはグループの条件

COUNT(*)と(カラム名)は非NULLを数えるか数えないかの違い

複数のカラムでグループ化すると両方満たすものがグループ

CASE WHEN 条件式1 THEN 値1 WHEN 条件式2 THEN 値2 ELSE 値3 END

CASE (集計)列 WHEN 条件式1 THEN 値1 WHEN 条件式2 THEN 値2 ELSE 値3 END

CASEは演算子なので前に, がいる。上から条件に当てはまらなかったら下にいく。

FROM テーブル1名 AS テーブル1略名 INNER JOIN テーブル2名 AS テーブル2略名 ON テーブル1名.列名=テーブル2.列名2  内部結合

結合する条件の列名が同名ならONではなくてUSING(列名)でもいい

INNER JOIN などは複数テーブルでも入れ子でできる

WHERE 列名 演算子 (サブクエリ) サブクエリはWHERE限定というわけではない

FROM句にサブクエリを使う場合、それにASでエイリアスをつける必要あり 

ビューの定義 CREATE VIEW 名前 AS サブクエリで仮想テーブル(ビュー)をつくって結合する

AVGなど集計関数を直接使って比較はできない。サブクエリで結果を返してからメインクエリで比較する。

EXISTSの使い方????????????????

INとEXISTSの違い INはカラム指定する値を返し、EXISTSはカラム無指定真偽を返す

SELECT 命令1 UNION SELECT 命令2 列の数とデータ型は等しくする。合わないならNULLを足して記述。 
ORDER BYはソートキー名が合わない場合があるので数字でする。これはUNIONじゃなくてもできるが分かりづらいので非推奨 
重複は排除される。重複チェックをせずに全て出すのはUNION ALL

EXCEPT 差
INTERSECT 共通

INSERT INTO テーブル名 VALUES (値); (全テーブルへ挿入)

INSERT INTO テーブル名 (列名, ...) VALUES (値, ...) (列指定)

INSERT INTO テーブル名 (列名, ...) SELECT 列名, ... で選択結果を挿入できる

UPDATE テーブル名 SET カラム名=値

REPLACE(カラム名, '置き換え元', '置き換え先');

相関サブクエリ WHERE NOT EXISTS (SELECT * FROM テーブル名1 WHERE テーブル名1.カラム名1 = テーブル名2.カラム名1)

DELETE FROM テーブル名 WHERE

TRUNCATE TABLE テーブル名 高速に全削除。ログも残さない。

BEGIN でトランザクション開始。 ROLLBACKすると取り消せる。COMMITでコミット。

CREATE TABLE テーブル名(列名 データ型 列フラグ, ...)

AUTO_INCREMENT(自動連番)
DEFAULT(値が未指定の場合のデフォルト値)
[NOT]NULL (NULLを許容するorしない)

PRIMARY KEY (重複をゆるさないandNULLは不可)
id INT AUTO_INCREMENT PRIMARY KEY(主キーの作成。列フラグとの置き換え可)

UNIQUE(重複を許さないandNULLは許容)
PREFERNECES テーブル名(列名, ...) (外部参照制約)

DROP TABLE テーブル名