SELECT文はデータベースからデータを取得するためのSQL文です。基本的な構文は以下の通りです。
SELECT 列名 FROM テーブル名;
すべての列を取得する場合は
*を使用できます。
SELECT * FROM users;
WHERE句を使用すると、特定の条件に合致するデータのみを取得できます。
SELECT * FROM users WHERE age = 30;
LIKEを使うと、部分一致検索ができます。例えば、ユーザーの名前に特定の文字列が含まれているデータを検索する場合に使用されます。
SELECT * FROM users WHERE name LIKE '田中%';
%は0文字以上の任意の文字列にマッチします。
_は1文字の任意の文字にマッチします。
SELECT * FROM users WHERE name LIKE '田中%';
SELECT * FROM users WHERE name LIKE '%一郎';
SELECT * FROM users WHERE name LIKE '%田中%';
SELECT * FROM users WHERE name LIKE '田_%';
LIKEを使うことで、完全一致ではなく柔軟な検索が可能になります。ただし、大量のデータを対象に
LIKE '%文字列%'を使用するとパフォーマンスが低下します。あまりにもパフォーマンスが悪くなるようでしたら
FULLTEXTインデックスなどを検討しましょう。
WHEREでは比較演算子を使うことで条件を指定できます。
SELECT * FROM users WHERE age > 20;
SELECT * FROM users WHERE age < 30;
SELECT * FROM users WHERE age >= 20 AND age <= 30;
=:等しい
!=または
<>:等しくない
>:より大きい
<:より小さい
>=:以上
<=:以下
AND条件の使用
ANDを使うと複数の条件を組み合わせることができます。
SELECT * FROM users WHERE age > 20 AND gender = 'male';
注意:OR条件はなるべく使わない
条件式が複雑で理解しにくくなる上に、
ORはインデックスが効きにくくなり、パフォーマンスが落ちます。
どうしてもORを使うような場面になったら、UNIONなどを使うことを検討してください。
日付型のカラムに対して
WHEREで条件を指定することで、特定の日付や月のデータを検索できます。
SELECT * FROM orders WHERE order_date = '2024-02-01';
特定の月のデータを取得する
SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%Y-%m') = '2024-02';
LIMITを使うと、取得する件数を制限できます。
SELECT * FROM users LIMIT 10;
ページネーション(ページごとのデータ取得)では
LIMITと
OFFSETを組み合わせます。
SELECT * FROM users LIMIT 10 OFFSET 20;
OFFSET 20は20件目から取得(1ページ10件の場合、3ページ目のデータ)
Laravel では
offsetを直接使わず、ページネーション機能を利用することが一般的です。
例えばLaravelでは以下のようにページネーションを実装します。offsetはLaravelが内部的に使用するので、エンジニアがoffsetを見ることはありません
$users = DB::table('users')->paginate(10);
データを並び替えるには
ORDER BYを使います。
SELECT * FROM users ORDER BY age ASC;
降順にする場合は
DESCを使います。
SELECT * FROM users ORDER BY age DESC;
複数のカラムで並び替えも可能です。
SELECT * FROM users ORDER BY age ASC, name DESC;
WHEREで条件指定ができる(
LIKE,
AND,
>などを活用)
WHEREの
AND条件が多く使われる(
ORはなるべく使わない)
DATE_FORMATなどを活用
LIMITと
OFFSETでページネーション
ORDER BYでデータの並び順を変更
SELECT文の基本を押さえることで、データの取得を効率よく行えるようになります!