基本クエリ

基本クエリ

図書館に行って本を探したいと想像してください。すべての本を家に持ち帰るわけではありません — 代わりに司書にこう言います:「2020年以降に出版されたSF小説を探したいのですが、出版日の新しい順に並べて、最初の5冊を見せてください。」このプロセスは、SQLクエリの主要なステップに対応します:データの選択条件のフィルタリングソート数量の制限

前のレッスンでは、データベースとテーブルの作成、データの挿入方法を学びました。このレッスンでは、データベースから必要なデータを正確にクエリする方法を学びます。


基本概念

1. SELECTステートメント

SELECTはSQLで最もよく使われるステートメントで、データベーステーブルからデータを取得するために使用します。基本構造は:

SQL
SELECT カラム1, カラム2, ...
FROM テーブル名;

2. 特定の列とすべての列のクエリ

特定の列をクエリ(推奨):

SQL
SELECT name, salary FROM employees;

すべての列をクエリ:

SQL
SELECT * FROM employees;
💡 ヒント: 実際の開発では、*を使用する代わりに必要な列名を明示的に指定することを推奨します。これによりクエリ効率が向上し、コードがより明確になります。

3. WHERE条件フィルタリング

WHERE句はレコードをフィルタリングするために使用され、条件を満たす行のみを返します:

SQL
SELECT カラム1, カラム2
FROM テーブル名
WHERE 条件;

4. 比較演算子

演算子 説明
= 等しい salary = 50000
<> または != 等しくない status <> 'Inactive'
> より大きい salary > 50000
< より小さい age < 30
>= 以上 salary >= 50000
<= 以下 age <= 30

5. 論理演算子:AND / OR

SQL
SELECT name, salary, department_id
FROM employees
WHERE salary > 50000 AND department_id = 1;

SELECT name, salary, department_id
FROM employees
WHERE department_id = 1 OR department_id = 2;
💡 ヒント: ANDORが混在する場合、ANDの方が優先されます。括弧()を使用して優先順位を明確にし、あいまいさを避けましょう。

6. IN / BETWEEN / LIKE

IN — セット内の任意の値にマッチ:

SQL
SELECT name, department_id
FROM employees
WHERE department_id IN (1, 2, 3);

BETWEEN — 範囲内の値にマッチ(境界値を含む):

SQL
SELECT name, salary
FROM employees
WHERE salary BETWEEN 40000 AND 80000;

LIKE — あいまい文字列マッチング:

SQL
-- 名前が「J」で始まる従業員
SELECT name FROM employees WHERE name LIKE 'J%';

-- 名前が4文字で「John」で始まる従業員
SELECT name FROM employees WHERE name LIKE 'John_';

7. ORDER BYソート

ORDER BYは結果セットのソートに使用されます:

SQL
-- 給与が高い順にソート
SELECT name, salary
FROM employees
ORDER BY salary DESC;

-- 部署ID昇順、その後給与降順でソート
SELECT name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary DESC;

8. LIMIT行数制限

LIMITは返されるレコード数を制限するために使用されます:

SQL
-- 最初の5件のみ返す
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;

-- 最初の5件をスキップし、次の5件を返す(ページネーション)
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5 OFFSET 5;
💡 ヒント: LIMITは通常ORDER BYと併用します。そうしない場合、返されるレコードの順序は不定です。


基本構文/使い方

クエリステートメントの完全な構造

SQL
SELECT カラム1, カラム2, ...
FROM テーブル名
WHERE 条件
ORDER BY カラム [ASC|DESC]
LIMIT 件数 [OFFSET オフセット];

句の記述順序は厳密に守る必要があります:

順序 目的
1 SELECT クエリする列を指定
2 FROM ソーステーブルを指定
3 WHERE 行をフィルタリング
4 ORDER BY 結果をソート
5 LIMIT 返される行数を制限

よく使うテクニック

SQL
-- エイリアスで列名を見やすくする
SELECT name AS employee_name, salary AS employee_salary
FROM employees;

-- 重複値を除去
SELECT DISTINCT department_id
FROM employees;

-- SELECTで式を使用
SELECT name, salary, salary * 12 AS annual_salary
FROM employees;
💡 ヒント:

  • エイリアスには日本語を使用できますが、チーム協力のため英語を推奨します
  • DISTINCTは選択されたすべての列の組み合わせに基づいて重複を除去します
  • 式は元のデータを変更しません。クエリ結果の表示にのみ影響します

例:特定の部署の従業員をクエリ

要件:部署IDが1のすべての従業員の名前と給与を、給与が高い順にソートしてクエリします。

SQL
SELECT name, salary
FROM employees
WHERE department_id = 1
ORDER BY salary DESC;
▶ 試してみよう

期待される出力

TEXT
+----------+--------+
| name     | salary |
+----------+--------+
| John     |  85000 |
| Bob      |  62000 |
| Alice    |  55000 |
+----------+--------+

説明

例:複数条件クエリ

要件:給与が60000から90000の間で、部署IDが1または2の従業員をクエリします。名前、部署ID、給与を表示。部署ID昇順、その後給与降順でソート。

SQL
SELECT name, department_id, salary
FROM employees
WHERE salary BETWEEN 60000 AND 90000
  AND department_id IN (1, 2)
ORDER BY department_id ASC, salary DESC;
▶ 試してみよう

期待される出力

TEXT
+----------+---------------+--------+
| name     | department_id | salary |
+----------+---------------+--------+
| John     |             1 |  85000 |
| Bob      |             1 |  62000 |
| Jane     |             2 |  75000 |
+----------+---------------+--------+

説明

例:あいまいクエリとページネーション

要件:名前に「J」を含む従業員を見つけ、入社日の新しい順にソートし、2番目から3番目のレコードのみ表示。

SQL
SELECT name, hire_date, salary
FROM employees
WHERE name LIKE '%J%'
ORDER BY hire_date DESC
LIMIT 2 OFFSET 1;
▶ 試してみよう

期待される出力

TEXT
+--------+------------+--------+
| name   | hire_date  | salary |
+--------+------------+--------+
| Jane   | 2022-03-15 |  68000 |
| Julia  | 2021-08-20 |  52000 |
+--------+------------+--------+

説明


シナリオ

シナリオ1:給与範囲で高給従業員をフィルタリング

人事部門は給与が70000以上の従業員リストのエクスポートが必要です。名前、部署、給与を含み、給与が高い順にソートします。

SQL
SELECT e.name AS employee_name,
       d.name AS department_name,
       e.salary AS salary
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE e.salary > 70000
ORDER BY e.salary DESC;

注意事項

シナリオ2:ページネーション付き従業員リスト

Webアプリケーションの従業員リストページは1ページに10件表示します。ユーザーがページ3をクリックした場合、最初の20件をスキップして21〜30件目を表示する必要があります。

SQL
-- ページ3、1ページ10件
SELECT id, name, department_id, salary
FROM employees
ORDER BY id ASC
LIMIT 10 OFFSET 20;

ページネーション式OFFSET = (ページ番号 - 1) × 1ページあたりのレコード数

ページ LIMIT OFFSET
ページ1 10 0
ページ2 10 10
ページ3 10 20

❓ よくある質問

質問:SELECT *と列名を指定する違いは何ですか? 回答: SELECT *はテーブルのすべての列を返しますが、列名を指定すると必要な列のみを返します。本番環境では、列名を明示的に指定することを推奨します — クエリが速くなり、可読性が上がり、テーブル構造が変更された際のエラーが減ります。

質問:WHEREでエイリアスは使えますか? 回答: いいえ。SQLの実行順序はFROMWHERESELECTORDER BYです。WHEREが実行される時点ではエイリアスはまだ生成されていません。エイリアスでフィルタリングする必要がある場合は、サブクエリまたはHAVING(後のレッスンで説明)を使用してください。

質問:BETWEENは境界値を含みますか? 回答: はい。BETWEEN 10 AND 20>= 10 AND <= 20と等価です。両方の端点値が結果に含まれます。

質問:LIKEは大文字小文字を区別しますか? 回答: データベースの照合順序に依存します。MySQLはデフォルトで大文字小文字を区別しませんが、PostgreSQLはデフォルトで区別します。大文字小文字を区別させるには、PostgreSQLではLIKEを、MySQLではBINARYキーワードを使用できます。


📖 まとめ

このレッスンでは、SQLクエリの主要スキルをカバーしました:

  1. SELECT — クエリする列を指定。*ですべての列をクエリ
  2. WHERE — 条件で行をフィルタリング。比較演算子(=><<>>=<=)をサポート
  3. 論理演算子AND(両方)、OR(いずれか)。括弧で優先順位を制御
  4. IN — セット内の任意の値にマッチ
  5. BETWEEN — 範囲内の値にマッチ(境界値を含む)
  6. LIKE — あいまいマッチング。%は複数文字にマッチ、_は単一文字にマッチ
  7. ORDER BY — ソート。ASC昇順(デフォルト)、DESC降順
  8. LIMIT / OFFSET — 返される行を制限し、ページネーションを実現

クエリステートメントの記述順序:SELECTFROMWHEREORDER BYLIMIT


📝 演習

演習1:基本クエリ

departmentsテーブルのすべてのレコードをクエリし、namelocation列のみ表示してください。

演習2:条件フィルタリングとソート

employeesテーブルで、給与が60000以上かつ2022年1月1日以降に入社した従業員をクエリしてください。名前、給与、入社日を表示し、給与降順でソートしてください。

演習3:総合クエリ

employeesテーブルで、部署IDが1または3で、名前が「J」で始まらない従業員をクエリしてください。名前、部署ID、給与を表示。部署ID昇順、給与降順でソート。最初の3件のみ返してください。


次のレッスン:データ操作:INSERT、UPDATE、DELETE

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%