3秒でわかる
データベースに検索や更新を指示する専用の言語。ほしい結果の条件だけを書けば、取り出し方はデータベース側が決めてくれます。
30秒図解
もう少し詳しく
どういうものか
SQLは、リレーショナルデータベースを操作するための言語です。表に対して行を取り出す、足す、書き換える、消すといった指示を書きます。手続き型の言語と違い、どの順にファイルを読むかといった手順は書きません。「売上が1000以上の行を日付順で」と結果の条件だけを書くと、実際の取り出し方はデータベースの最適化機能が決めます。
なぜ必要か
数百万行あるデータから条件に合う行を探す処理を、自分でファイルを開いて書くと、絞り込みの順序や索引の使い方を全部自力で設計することになります。SQLならその判断をデータベースに任せられ、しかもMySQLでもPostgreSQLでもほぼ同じ書き方が通じます。表計算ソフトが扱いきれない量になったとき、次に来るのがこの言語です。
具体例
-- 1. 取り出す
SELECT name, price
FROM products
WHERE price >= 1000
ORDER BY price DESC
LIMIT 10;
-- 2. 集計する
SELECT category, COUNT(*) AS cnt, AVG(price) AS avg_price
FROM products
GROUP BY category
HAVING COUNT(*) >= 3;
-- 3. 書き換える
UPDATE products SET price = price * 1.1 WHERE category = 'drink';SELECT FROM WHERE の3つが土台で、そこに並び替えと集計が乗る構造です。
つまずきやすいところ
WHERE と HAVING の使い分けでつまずく人が多く見られます。WHERE は集計する前の1行ずつに、HAVING は集計した後のグループに対する条件です。もうひとつ、UPDATE や DELETE で WHERE を書き忘れると全行が対象になります。実行前に同じ条件を SELECT で試し、件数を確かめる癖をつけると事故が減ります。NULL の比較も要注意で、= NULL は決して真にならず IS NULL と書きます。
覚え方
英語の文としてほぼそのまま読めます。何を、どこから、どんな条件で、という順に並べるだけです。
似た用語との違い
| 語 | 内容 |
|---|---|
| SQL | データベースを操作する言語 |
| リレーショナルデータベース | 表の形でデータを持つ製品の分類 |
| NoSQL | 表以外の持ち方をするデータベースの総称 |
同じSQLでも製品ごとに方言があり、日付の関数や上限件数の書き方あたりから差が出はじめます。