Fighting against SQL.

SQL文はキモい

慣れないことするもんじゃないわね・・・。

select item.id from item where price = 100

fromでテーブル名指定する前からselectでテーブル名ガンガン使わせてくるのが本当にキモイんですわ。

という愚痴は置いといて、SQLの構文さらっと復習しておきます。

チョー基本

select key_name from table_name where "条件"
  • select key_name

出力するキー名を指定します

  • from table_name

問い合わせ先のテーブル名を指定します

  • where "条件"

各要素の条件を指定します。これに合致したものだけが選択されます。

並び替え

  • order by key_name1, key_name2, ...

キー名に応じて出力するテーブルを昇順ソートします。複数指定すると、最初の方が優先されます、

  • order by desc key_name1, key_name2, ...

desc(descend,降順)キーワードを使用すると、文字通り降順ソートされます。

重複除外

distinct

select distinct id from item where ...

このキーワードを指定すると、出力するテーブルから重複を排除します。

グループ化

select item_no sum(price*count) as SUM from sales group by item_no
item_no price count
1 10 5
2 20 3
3 35 2
1 10 1
1 10 4
2 20 2

重複排除ではなく、各要素ごとにグループ化(合算)して出力します。

ちなみにwhere条件も同時に使えます

さらに応用

合算したやつを、SUMで降順ソートします。

//order by 2とは2番目のキー名のこと、つまりSUM
select item_no, sum(price*count) as SUM from sales group by item_no order by 2 desc

JOIN(結合)

結合とは、2つのテーブルを列の値を見てくっつけ、新しい結果を表示するものです。

  • 内部結合
    2つのテーブルを条件を満たすもので結合し、新しいテーブルを出力します。
select * from sales inner join item on sales.id = item.id

この時、片方のテーブルにしかないidがあった場合、それは無視されます。

  • 左外部結合

左側のテーブル(要は、1つ目に指定されたテーブル)の行を全て取り出し、右側のテーブルに結合します。

select id,name from sales left outer join item where sales.id = item.id

この時、右側にない値を持った要素はNULLが入力されます。

  • 右外部結合

左外部結合の逆です。

  • 完全外部結合

左右両方のテーブルの行を取り出し結合します。お互いに持ってない値があったら、そこはNULLになります。

  • 自己結合

あるテーブルと、そのテーブル自身を結合することを指します。

同一テーブル内の別の列と値を比較して、新しいテーブルを作る時に使います。

副問い合わせ

select文の結果を、他のselect文に使うことを指します。

英語ではSubQueryとも言います。

よくある使い方
  • where句の条件に。
select id,date from main where id in 
    (select id from sub where item=101 or item=102)
  • tableの代わりに。
select * from ( SUBQUERY ) where ...

相関副問い合わせ

副問い合わせと違い、主問い合わせから1行ずつ行を取り出し、各行に副問い合わせをするイメージ。

select id,date from main m where exists
    (select * from sub where id = m.id and ( item = 101 or item = 102) )

Create,Insert,Update,Delete

  • Create

テーブルを作る

  • Insert

テーブルに行を追加

  • update

特定の一つの行を更新

  • delete
    特定の一つの行を削除

以上。Markdownでテーブル書くのめんどいのでがっつり省略しています。