SQL文の意味を読み取るコツ
SQL (Structured Query Language) は、 DBMSに命令を伝える言語である。
SQLで記述された命令文を「SQL文」 と呼ぶ。 試験問題の内容は、自分の考えでSQL文を作るのではなく、問題文や選択肢に示されたSQL文の意味を読み取るものになっている。
SQL文の意味を読み取るコツは、 「英語だと思って意味を考えること」 と 「表を対象として操作が行われることを意識すること」 である。 表に対する操作には、登録、読み出し、更新、削除があり、 それぞれ INSERT、 SELECT、 UPDATE、DELETE という命令で示されます。
ここでは、下図に示した「employees(社員表)」と「department_id(部署表)」から構成されたデータベースを対象として、SQL文の具体例を示し、それぞれの意味を説明しよう。 SQL文の構文の説明を見るより、 SQL文の具体例を見た方が、SQL文の読み 方を効率的に覚えられるからである。

今回は、実際にMySQLを使ってSQL文の具体例を見ていこう。
なお、GitHub Codespacesで構築したMySQL開発環境で実行している。
このMySQL開発環境のセットアップについては、また、回を改めてご紹介しよう。
SELECT命令
INSERT、SELECT、 UPDATE、 DELETEの中で、最もよく出題されるのは、 データを読み出すSELECT命令である。 SELECT命令によって、表全体の中から、条件に一致したデータだけが読み出される。 条件の中で指定する文字列データと日付データは、 シングルクォーテーションで囲む。 数は、囲まない。 例4.1~例4.5に、 SELECT命令の例を示す。 文は、適宜途中で改行してある (後で示す、 別の命令の例でも同様)
例4.1 WHERE で条件を指定する
mysql> SELECT name FROM employees WHERE gender ='男';+--------------+
| name |
+--------------+
| 佐藤一郎 |
| 鈴木二郎 |
| 田中四郎 |
+--------------+例4.2 論理演算で複数の条件を結び付ける
SELECT name, CAST(salary AS UNSIGNED) FROM employees WHERE gender = '男' AND salary >= 400000;+--------------+--------------------------+
| name | CAST(salary AS UNSIGNED) |
+--------------+--------------------------+
| 佐藤一郎 | 450000 |
| 鈴木二郎 | 400000 |
+--------------+--------------------------+例4.3 BETWEEN で範囲を指定する
SELECT name,birth_date FROM employees WHERE birth_date BETWEEN '1970-01-01' AND '1979-12-31';+--------------+------------+
| name | birth_date |
+--------------+------------+
| 高橋花子 | 1973-03-03 |
+--------------+------------+例4.4 LIKE と %で任意の文字列を指定する
SELECT name FROM employees WHERE name LIKE '%子';+--------------+
| name |
+--------------+
| 高橋花子 |
| 渡辺良子 |
+--------------+例4.5 DISTINCT を指定すると重複なしで読み出される
SELECT DISTINCT gender FROM employees;+--------+
| gender |
+--------+
| 男 |
| 女 |
+--------+データの整列
SELECT 命令で読み出したデータを整列させることができる。 ORDER BY の後に、整列の対象となる列名を指定する。 さらに、 昇順 (小さい順) の場合はASC、 降順 (大きい順) の場合は DESCを指定する。 整列の順序を省略した場合は、 ASCが指定されたものとみなされる。例4.6 と例4.7に、 データの整列の例を示す。
ASC は ASCENDING (昇順) を意味し、DESC は DESCENDING (降順) を意味する。
例4.6 ORDER BY と DESC で降順に整列する
SELECT name,birth_date FROM employees ORDER BY birth_date DESC;+--------------+------------+
| name | birth_date |
+--------------+------------+
| 渡辺良子 | 1995-05-05 |
| 田中四郎 | 1984-04-04 |
| 高橋花子 | 1973-03-03 |
| 鈴木二郎 | 1962-02-02 |
| 佐藤一郎 | 1951-01-01 |
+--------------+------------+例4.7 複数の列を対象にして整列を行う
SELECT gender, name, birth_date
FROM employees
ORDER BY FIELD(gender, '男', '女'), birth_date ASC;+--------+--------------+------------+
| gender | name | birth_date |
+--------+--------------+------------+
| 男 | 佐藤一郎 | 1951-01-01 |
| 男 | 鈴木二郎 | 1962-02-02 |
| 男 | 田中四郎 | 1984-04-04 |
| 女 | 高橋花子 | 1973-03-03 |
| 女 | 渡辺良子 | 1995-05-05 |
+--------+--------------+------------+集約関数
SELECT 命令の中で集約関数を使うことができる。 集約関数には合計値を求めるSUM関数、最大値を求めるMAX関数、 最小値を求めるMIN関数、平均値を求めるAVG 関数、 データの登録件数を求めるCOUNT関数などがある。これらの関数のカッコの中には、集約する列の名前を指定する。例4.8と例4.9に、 集約関数の例を示す。
例4.8 SUM関数で合計値を求める
SELECT CAST(SUM(salary) AS UNSIGNED) AS total_salary FROM employees;+--------------+
| total_salary |
+--------------+
| 1750000 |
+--------------+例4.9 COUNT 関数でデータの登録件数を求める
SELECT COUNT(salary) FROM employees WHERE salary >= 350000;+---------------+
| COUNT(salary) |
+---------------+
| 3 |
+---------------+SQL の主な集約関数
- SUM関数 : 合計値を求める
- MAX 関数 : 最大値を求める
- MIN 関数 : 最小値を求める
- AVG 関数 : 平均値を求める
- COUNT 関数 : 登録件数を求める
グループ化
SELECT 命令で読み出したデータを、 列の値が同じものどうしでクループ化できる。
GROUP BYの後に、 グループ化する列の名前を指定する。
ク ループ化したデータに条件を指定するときは、 WHEREでなくHAVINGを使う。
例4.10と例4.11に、 グループ化の例を示す。
例4.10 GROUP BY でグループ化する
SELECT gender,COUNT(gender) FROM employees GROUP BY gender;+--------+---------------+
| gender | COUNT(gender) |
+--------+---------------+
| 男 | 3 |
| 女 | 2 |
+--------+---------------+例4.11 HAVING でグループに条件を指定する
SELECT LPAD(department_id, 3, '0') AS department_id,COUNT(department_id) AS employee_count FROM employees GROUP BY department_id
HAVING COUNT(department_id) >= 2; +---------------+----------------+
| department_id | employee_count |
+---------------+----------------+
| 001 | 2 |
| 003 | 2 |
+---------------+----------------+- グループ化した後のデータの抽出条件は HAVING で指定する。
- グループ化する前のデータの抽出条件は WHERE で指定する。
様々な命令が使われたSQL文は、基本的に、FROM (表を指定する) →WHERE(表から条件に一致したデータを抽出する)→GROUP BY (デー タをグループ化する) → HAVING (グループから条件に一致したデータを抽出する)SELECT(列や集約関数を読み出す)→ORDER BY(結果を整列する)の順に解釈される。
ビュー
ビュー (view) は、SELECT 命令に名前を付けて、データベースに保存したものである。 CREATE VIEW命令で、ビューを作成する。作成されたビューは、 SELECT 命令のFROM の後に指定して、表と同様に使える。ビューを使うと、 SELECT命令の条件をシンプルにできる効果がある。
例4.12と例4.13に、 ビューの例を示す。 例4.13では、 「性別 = ‘男’」という条件を指定しなくても、男性だけが対象になる。
例4.12 CREATE VIEW 命令でビューを作成する
CREATE VIEW 男性社員 AS SELECT * FROM employees WHERE gender = '男';「男性社員」というビューが作成される。試しに使ってみよう。
例4.13 SELECT命令のFROM の後にビューを指定する
SELECT * FROM 男性社員;
SELECT name, salary FROM 男性社員 ORDER BY salary DESC;+--------------+-----------+
| name | salary |
+--------------+-----------+
| 佐藤一郎 | 450000.00 |
| 鈴木二郎 | 400000.00 |
| 田中四郎 | 300000.00 |
+--------------+-----------+- VIEWはデータを保存しない(元のテーブルを参照するだけ)
- 元のテーブルが更新されると、VIEWの結果も変わる
- VIEWに対してもSELECT文を実行できる
副問い合せ
SELECT命令の WHEREの後に指定する条件の中で、別のSELEC命令を使うことができる。 このようなSELECT命令を副問い合せ (サブクエリ)と呼ぶ。 副問い合せではないSELECT 命令を主問い合せ(メインクエリ)と呼ぶ。例4.14に、 副問い合せの例を示す。
例4.14 副問い合せで得られた集約関数の値を条件に指定する
SELECT name, salary FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);+--------------+-----------+
| name | salary |
+--------------+-----------+
| 佐藤一郎 | 450000.00 |
+--------------+-----------+関係代数
SELECT 命令を使って、条件に一致した特定の行を読み出すことを選択と呼ぶ。 SELECTの後に列の名前を指定して、 特定の列を読み出すことを射影と呼ぶ。 複数の表を結び付けてデータを読み出すことを結合と呼ぶ。 これらの操作を関係代数と呼ぶ。
関係代数の種類
- 選択: 表から特定の行を読み出すこと
- 射影 : 表から特定の列を読み出すこと
- 結合 : 複数の表を結び付けてデータを読み出すこと
表の結合
SELECT命令で結合を行うには、2つの方法がある。 1つは、 FROMの後に複数の表を指定し、WHERE の後に主キーと外部キーが一致する条件(表と表を結び付ける条件) を指定する方法である。 もう1つは、INNER JOIN という構文を使う方法である。 例4.15と例4.16に、表の結合の例を示す。
例4.15 主キーと外部キーが一致する条件を指定して表を結合する
SELECT name,department_name FROM employees,departments WHERE employees.department_id = departments.department_id;+--------------+-----------------+
| name | department_name |
+--------------+-----------------+
| 高橋花子 | 総務部 |
| 田中四郎 | 総務部 |
| 佐藤一郎 | 経理部 |
| 鈴木二郎 | 営業部 |
| 渡辺良子 | 営業部 |
+--------------+-----------------+
例 4.16 INNER JOIN を使って表を結合する
SELECT name,department_name FROM employees INNER JOIN departments ON employees.department_id = departments.department_id;+--------------+-----------------+
| name | department_name |
+--------------+-----------------+
| 高橋花子 | 総務部 |
| 田中四郎 | 総務部 |
| 佐藤一郎 | 経理部 |
| 鈴木二郎 | 営業部 |
| 渡辺良子 | 営業部 |
+--------------+-----------------+その他の命令
試験には、表を作成するCREATE TABLE 命令、表にデータを登録するINSERT 命令、表のデータを更新するUPDATE命令、表からデータを削除するDELETE命令が出題されることもある。例4.17~4.20に、それぞれの命令の例を示す。
CREATE TABLE命令では、表の名前、列の名前とデータ型、および主キーとなる列を設定する。データ型には、固定長文字列を格納するCHAR型、可変長文字列を格納するVARCHAR型、日付を格納するDATE型、整数を格納するINTEGER型などがある。
例4.17 CREATE TABLE 命令で表を作成する
CREATE TABLE employees2 (employee_id CHAR(4), name VARCHAR(20), gender CHAR(2),birth_date DATE,salary INTEGER, department_id CHAR(3),PRIMARY KEY(employee_id));+----------------------+
| Tables_in_company_db |
+----------------------+
| departments |
| employees |
| employees2 |
| 男性社員 |
+----------------------+例4.18 INSERT命令でデータを登録する
INSERT INTO employees VALUES('0006','伊藤六郎','男','1995-06-06',220000,'001');確認しよう。
mysql> SELECT * FROM employees;
+-------------+--------------+--------+------------+-----------+---------------+
| employee_id | name | gender | birth_date | salary | department_id |
+-------------+--------------+--------+------------+-----------+---------------+
| 0001 | 佐藤一郎 | 男 | 1951-01-01 | 450000.00 | 002 |
| 0002 | 鈴木二郎 | 男 | 1962-02-02 | 400000.00 | 003 |
| 0003 | 高橋花子 | 女 | 1973-03-03 | 350000.00 | 001 |
| 0004 | 田中四郎 | 男 | 1984-04-04 | 300000.00 | 001 |
| 0005 | 渡辺良子 | 女 | 1995-05-05 | 250000.00 | 003 |
| 0006 | 伊藤六郎 | 男 | 1995-06-06 | 220000.00 | 001 |
+-------------+--------------+--------+------------+-----------+---------------+
6 rows in set (0.00 sec)例4.19 UPDATE命令でデータを更新する
UPDATE employees SET salary = salary + 10000 WHERE gender = '女';確認しよう。
mysql>SELECT * FROM employees;
+-------------+--------------+--------+------------+-----------+---------------+
| employee_id | name | gender | birth_date | salary | department_id |
+-------------+--------------+--------+------------+-----------+---------------+
| 0001 | 佐藤一郎 | 男 | 1951-01-01 | 450000.00 | 002 |
| 0002 | 鈴木二郎 | 男 | 1962-02-02 | 400000.00 | 003 |
| 0003 | 高橋花子 | 女 | 1973-03-03 | 360000.00 | 001 |
| 0004 | 田中四郎 | 男 | 1984-04-04 | 300000.00 | 001 |
| 0005 | 渡辺良子 | 女 | 1995-05-05 | 260000.00 | 003 |
| 0006 | 伊藤六郎 | 男 | 1995-06-06 | 220000.00 | 001 |
+-------------+--------------+--------+------------+-----------+---------------+
6 rows in set (0.00 sec)
例4.20 DELETE命令でデータを削除する
DELETE FROM employees WHERE employee_id = '0006';確認しよう。
mysql> SELECT * FROM employees;
+-------------+--------------+--------+------------+-----------+---------------+
| employee_id | name | gender | birth_date | salary | department_id |
+-------------+--------------+--------+------------+-----------+---------------+
| 0001 | 佐藤一郎 | 男 | 1951-01-01 | 450000.00 | 002 |
| 0002 | 鈴木二郎 | 男 | 1962-02-02 | 400000.00 | 003 |
| 0003 | 高橋花子 | 女 | 1973-03-03 | 360000.00 | 001 |
| 0004 | 田中四郎 | 男 | 1984-04-04 | 300000.00 | 001 |
| 0005 | 渡辺良子 | 女 | 1995-05-05 | 260000.00 | 003 |
+-------------+--------------+--------+------------+-----------+---------------+
5 rows in set (0.00 sec)SQLの主なデータ型
- CHAR型: 固定長文字列 (文字数を固定的に決める)
- VARCHAR型: 可変長文字列 (最大文字数を指定した任意の長さ)
- DATE型 日付(年月日)
- INTEGER型 整数 (小数点以下がない数)
※CHAR は、 CHARACTER (文字) という意味で、VARCHAR は、 VARIABLE CHARACTER (可変の文字)という意味である。
(参考)情報処理教科書 出るとこだけ!基本情報技術者[科目A][科目B]2025年版


コメント