第4章 SELECTステートメント

まず、サンプルとして利用するテーブルを定義します。ここでは、従業員情報を保持する「Employees」テーブルとします。このテーブルは以下のような構造を持つとしましょう。

CREATE TABLE Employees (
    id INT PRIMARY KEY,
    first_name VARCHAR(30),
    last_name VARCHAR(30),
    birth_date DATE,
    join_date DATE,
    department VARCHAR(20)
);

次に、データをこのテーブルに挿入します。挿入は以下のようにINSERT INTOクエリを使用して行います。

INSERT INTO Employees (id, first_name, last_name, birth_date, join_date, department)
VALUES (1, 'John', 'Doe', '1980-01-15', '2020-01-01', 'Sales'),
       (2, 'Jane', 'Doe', '1982-02-20', '2021-03-01', 'HR'),
       (3, 'Alice', 'Johnson', '1985-05-10', '2022-04-01', 'Marketing'),
       (4, 'Bob', 'Smith', '1978-11-12', '2019-11-01', 'Engineering');

ここで、すべての従業員のデータを取得するには、SELECTクエリを使用します。以下のクエリはテーブルからすべてのデータを取得します。

SELECT * FROM Employees;
id first_name last_name birth_date join_date department
1 John Doe 1980-01-15 2020-01-01 Sales
2 Jane Doe 1982-02-20 2021-03-01 HR
3 Alice Johnson 1985-05-10 2022-04-01 Marketing
4 Bob Smith 1978-11-12 2019-11-01 Engineering


取得するカラムを指定する

従業員の名前と所属部署だけを取得するには以下のようにします。

SELECT first_name, last_name, department FROM Employees;
+------------+-----------+-------------+
| first_name | last_name | department  |
+------------+-----------+-------------+
| John       | Doe       | Sales       |
| Jane       | Doe       | HR          |
| Alice      | Johnson   | Marketing   |
| Bob        | Smith     | Engineering |
+------------+-----------+-------------+


取得する条件を指定する

エンジニアリング部門に所属する従業員だけを取得するには、以下のようにWHERE句を用いて条件を指定します。

SELECT * FROM Employees WHERE department = 'Engineering';
+----+------------+-----------+------------+------------+-------------+
| id | first_name | last_name | birth_date | join_date  | department  |
+----+------------+-----------+------------+------------+-------------+
|  4 | Bob        | Smith     | 1978-11-12 | 2019-11-01 | Engineering |
+----+------------+-----------+------------+------------+-------------+


取得する条件を複数指定する

姓がDoe、名がJohnの両方の条件を満たす従業員を取得するには、以下のようにANDで条件を指定します。

SELECT * FROM Employees WHERE first_name = 'John' AND last_name = 'Doe';
+----+------------+-----------+------------+------------+------------+
| id | first_name | last_name | birth_date | join_date  | department |
+----+------------+-----------+------------+------------+------------+
|  1 | John       | Doe       | 1980-01-15 | 2020-01-01 | Sales      |
+----+------------+-----------+------------+------------+------------+


並び替えて取得する(昇順)

指定したカラムで並び替えて取得するには、以下のようにORDER句を用います。

SELECT * FROM Employees ORDER BY join_date;
+----+------------+-----------+------------+------------+-------------+
| id | first_name | last_name | birth_date | join_date  | department  |
+----+------------+-----------+------------+------------+-------------+
|  4 | Bob        | Smith     | 1978-11-12 | 2019-11-01 | Engineering |
|  1 | John       | Doe       | 1980-01-15 | 2020-01-01 | Sales       |
|  2 | Jane       | Doe       | 1982-02-20 | 2021-03-01 | HR          |
|  3 | Alice      | Johnson   | 1985-05-10 | 2022-04-01 | Marketing   |
+----+------------+-----------+------------+------------+-------------+


並び替えて取得する(降順)

指定したカラムで並び替えて取得するには、以下のようにORDER句にDESCを指定します。

SELECT * FROM Employees ORDER BY join_date DESC;
+----+------------+-----------+------------+------------+-------------+
| id | first_name | last_name | birth_date | join_date  | department  |
+----+------------+-----------+------------+------------+-------------+
|  3 | Alice      | Johnson   | 1985-05-10 | 2022-04-01 | Marketing   |
|  2 | Jane       | Doe       | 1982-02-20 | 2021-03-01 | HR          |
|  1 | John       | Doe       | 1980-01-15 | 2020-01-01 | Sales       |
|  4 | Bob        | Smith     | 1978-11-12 | 2019-11-01 | Engineering |
+----+------------+-----------+------------+------------+-------------+


件数を数える

従業員の数を数えるには、COUNT関数を用います。

SELECT COUNT(*) FROM Employees;
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+


グループ毎に件数を数える

部署ごとに従業員の数を取得するには、以下のようにGROUP句でグルーピングしたいカラムを指定します。

SELECT department, COUNT(*) FROM Employees GROUP BY department;
+-------------+----------+
| department  | COUNT(*) |
+-------------+----------+
| Sales       |        1 |
| HR          |        1 |
| Marketing   |        1 |
| Engineering |        1 |
+-------------+----------+


取得する件数を指定する

最も早く入社した従業員を取得するには、ORDER句で並び替えて、LIMIT句で取得する件数を指定します。

SELECT * FROM Employees ORDER BY join_date LIMIT 1;
+----+------------+-----------+------------+------------+-------------+
| id | first_name | last_name | birth_date | join_date  | department  |
+----+------------+-----------+------------+------------+-------------+
|  4 | Bob        | Smith     | 1978-11-12 | 2019-11-01 | Engineering |
+----+------------+-----------+------------+------------+-------------+