3秒でわかる
データベースに条件を伝えて欲しいデータを取り出す問い合わせ。SQL で書き、大量のレコードから必要な行と列だけを絞り込むために使います。
30秒図解
もう少し詳しく
どういうものか
クエリは、データベースへの問い合わせです。英語の query が「質問」を意味するとおり、「この条件に合う行を、この順番で、この件数だけください」と伝える文で、SQL という言語で書きます。
取得だけを指すこともありますが、実務では追加・更新・削除も含めて「クエリを投げる」と言います。アプリからも、管理画面からも、BI ツールからも、データベースに触るときは最終的にクエリが発行されています。
なぜ必要か
数百万行あるテーブルから欲しいのは数十行、という状況がふつうです。全件をアプリ側に読み込んでプログラムで絞り込むこともできますが、転送量もメモリも時間も桁違いに増えます。
データベースは、どの索引を使えば最短で目的の行にたどり着けるかを実行計画として自分で組み立てます。条件をクエリとして渡すのは、その最適化をデータベースに任せるためです。集計もデータのある場所でやるほうが速く済みます。
具体例
-- 在庫のある商品を、カテゴリごとに集計する
SELECT
c.name AS category,
COUNT(*) AS product_count,
ROUND(AVG(p.price)) AS avg_price
FROM products AS p
<a href="/glossary/join" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">JOIN</a> categories AS c ON c.id = p.category_id
WHERE p.stock > 0
GROUP BY c.name
HAVING AVG(p.price) > 500
ORDER BY avg_price DESC
LIMIT 10;
-- どう<a href="/glossary/process-flow" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">処理</a>されるかを確認する(索引が使われているか見る)
EXPLAIN SELECT * FROM products WHERE price < 1000;つまずきやすいところ
WHERE と HAVING の使い分けが最初の関門です。WHERE は集計する前の行を絞り、HAVING は集計した結果を絞ります。WHERE COUNT(*) > 3 は書けません。
NULL の比較も引っかかります。= NULL は真にも偽にもならず、必ず IS NULL を使います。NULL を含む列に <> 'A' を書くと、NULL の行が結果から静かに消えます。
ORDER BY を書かずに LIMIT 10 だけ書くと、返る 10 件は毎回同じとは限りません。並び順を指定していない以上、データベースは都合のよい順で返してよいからです。
そして最重要が、利用者の入力を文字列連結でクエリに埋め込まないことです。SQL インジェクションの入口になります。値は必ずプレースホルダで渡します。
似た用語との違い
| 用語 | 指すもの |
|---|---|
| クエリ | データベースへの問い合わせそのもの |
| SQL | クエリを書くための言語 |
| クエリ文字列 | URL の ? 以降のパラメータ。名前が似ているだけの別物 |
| クエリビルダ | SQL をプログラムのメソッド呼び出しで組み立てる仕組み |
覚え方
query は質問。図書館の司書に「2024 年の IT 書を、新しい順に 10 冊」と頼む文がそのままクエリの形です。