はじめに
応用情報技術者の勉強の中でデータベースの勉強をしていたのですが、参考書を読んでもさっぱりわからず、過去問を解いて多少理解したという状況だったので、この機にデータベースの全体像をつかんでおきたいと考えSQL Fiddleでデータベースの作成から基本操作までを行い、全体像をつかみにかかりました。
この記事ではSQL Fiddleでデータベースを作成し、基本的なSQL操作を確認します。
ところでSQL Fiddleとは何かというと、環境構築なし、ブラウザ上でSQLを実行できる便利なサイトです。
詳しくはサイトをご覧ください。
今回作成するデータベース設計
SQLを書き始める前に、まずはどのようなデータをどのような構造で管理したいのかを整理します。
今回は「社員」と「部署」を管理する、シンプルなデータベースを作成します。
テーブル構成
・社員
・部署
今回は、上記2つの表を作成する想定で設計します。
社員と部署は1人の社員が1つの部署に所属するという関係を想定しています。
各テーブルのカラム
それぞれのテーブルが持つカラム(列)は以下の通りです。
・Employee
・EmployeeID(社員を一意に識別するための番号)
・EmployeeName(社員の氏名)
・DepartmentID(社員が所属している部署を示す番号)
・Department
・DepartmentID(各部署を一意に識別するための番号)
・DepartmentName(部署の名称)
Employeeテーブルでは、部署名はそのまま持たず、DepartmentIDのみを保持します。
この部署番号を使って、Departmentテーブルと関連付けることで、
・社員がどの部署に所属しているか
・部署ごとにどんな社員がいるかといった情報を取得できます。
テーブル作成SQL
ではテーブルを作っていきます。
まずはDepartmentテーブルです。
CREATE TABLE departments (
dept_no INT PRIMARY KEY,
dept_name VARCHAR(50) NOT NULL
);
主キーはdept_noとし、INT型で定義しました。
一方dept_nameはVARCHAR(50)(可変長文字列で今回は50文字)でNOT NULLと定義しました。
NOT NULLとは空白のフィールドを許可しないことを表しています。
続いてEmployeeテーブルです。
CREATE TABLE employees (
emp_no INT PRIMARY KEY,
emp_name VARCHAR(50) NOT NULL,
dept_no INT NOT NULL,
FOREIGN KEY (dept_no) REFERENCES departments(dept_no)
);
主キーはemp_noとし、emp_name, dept_noはnull禁止、dept_noは外部キーとして組み込みました。
また、データ型ですが、emp_no, dept_noはINT(整数)型、emp_nameはVARCHAR(50)です。
サンプルデータのINSERT
続いて「動く状態」を作るステップです。
・部署データのINSERT
・社員データのINSERT
SQL Fiddleでは具体的なデータがないとSELECTの確認ができないため、それぞれにデータを挿入していきます。
INSERT INTO departments (dept_no, dept_name) VALUES
(10, '営業'),
(20, '開発'),
(30, '人事');
まずDepartmentテーブルです。
このテーブルは左から「部署番号」「部署名」の並びとなります。
例えば一番上のカラムは部署番号「10」の「営業」です。
続いてEmployeeテーブルです。
INSERT INTO employees (emp_no, emp_name, dept_no) VALUES
(1001, '田中', 10),
(1002, '鈴木', 20),
(1003, '佐藤', 20),
(1004, '高橋', 30);
このテーブルは左から「社員番号」「社員名」「部署番号」となります。
SQLの基本操作
さて、データを挿入したところで操作をします。
単純なSELECT(並び替え付き)
SELECT emp_no, emp_name, dept_no
FROM employees
ORDER BY emp_no DESC;
これはEmployeeテーブルからemp_no、emp_name、dept_noを取り出し社員番号を降順で並び替えて表示するSQLです。
ここでのポイントはORDER BYで、結果をemp_noの降順で並び替えるように指定しています。
この時点では部署番号は数値でしか分からず、部署名はまだ見えない状態です。
ですので次のJOINを使用してよりわかりやすいビューを作成します。
JOINを使って社員と部署を結合する(社員視点)
SELECT
e.emp_no AS 社員番号,
e.emp_name AS 名前,
d.dept_name AS 部署
FROM employees e
JOIN departments d ON e.dept_no = d.dept_no
ORDER BY e.emp_no;
このSQLではemp_no、emp_name、dept_nameをそれぞれ「社員番号」「名前」「部署」という表示に変更し、EmployeeテーブルとDepartmentテーブルのカラムを一つのビューに表示するSQLとなります。
AS 社員番号の部分はカラム名を一時的に命名する方法でエイリアスと名がついています。
これにより実行結果の可読性がかなり上がります。
またEmployeeはeと表記し、Departmentはdと表記するように記載しました。(FROM句とJOIN句に記載があります。)
JOIN departments d ON e.dept_no = d.dept_no
ここの部分ではEmployeeのdept_noとDepartmentのdept_noが等しい行同士を結びつけるという意味のSQLです。
SQLはFROMから順に下に読んでいき、最後にSELECTを読むというのが読み方です。
実行順序そのものではなく、理解しやすくするための読み方です。
自分が引っ掛かったところの備忘録として記載しておきます。
JOIN(部署視点で表示順を変える)
SELECT
d.dept_name AS 部署,
d.dept_no AS 部署番号,
e.emp_name AS 社員名
FROM departments d
JOIN employees e ON d.dept_no = e.dept_no
ORDER BY d.dept_no, e.emp_no;
今度はDEPARTMENTとEMPLOYEEがdept_noでくっつきました。
また、ORDER BYに二つのカラムが選択されています。
この場合、まずはdept_noで並び替えがされ、dept_noが同じ項目に関してはemp_noで並び替えがされます。
また、末尾に並び方に関する指示が書いていないので、デフォルトで昇順となります。
まとめ
今回はSQL Fiddleを使ってSQLの練習をする趣旨で記事を書こうとしましたが、SQLの解説に重点を置いてしまいました。
結局、SQLの解説をQiitaに書くのが一番勉強になった気がします。
ただ、SQL Fiddleの自由度は高いため、家計簿をつけたり、ランニングの記録をつけたりなんにでも応用が利くので好きなテーブルを作成してみてもいいかもしれません。