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でテーブル書くのめんどいのでがっつり省略しています。