基本情報技術者試験対策(24)「SQL」

スポンサーリンク
IT系

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年版


コメント

タイトルとURLをコピーしました