#この記事について
DBやSQLを実際に触って練習しようとなったときに真っ先に困ることといえば、ある程度まとまった大きさのデータが入手しにくい!ということです。
適当にWebサイトスクレイピングしてSQLのinsert文に加工→それをDBに突っ込むでもいいのですが、時間がかかる上に作業が面倒です。
そんな人のために、MySQLでは公式ページでテストデータが配布されています。これをインポートするだけで、SQLのクエリを叩くのにいい練習になりそうなちょうどいいテーブルを簡単に作ることができます。
本記事では、テストデータをインポートする方法・各テーブル・Culumnの意味といったデータの詳細な情報について記述し、すぐにテストデータを触っ手のSQLの練習ができるようになるようサポートします。
##使用する環境・バージョン
- OS : MacOS Mojave ver 10.14.5
- mysql : Ver 8.0.18 for osx10.14 on x86_64 (Homebrew)
使用する公式テストデータは以下のリンクから入手可能です。
MySQL :: Other MySQL Documentation
##読者に要求する前提知識
- 主キー、外部キー、E-R図といったDBの基本的な知識があること。
#ファイルのインポート
上述したURLから、公式データのSQLファイルを入手します。
そのSQLファイルが置いてあるディレクトリにcd
コマンドで移動してから以下のコマンドを実行します。
$ mysql -u root -p
パスワード入力
mysql> source [ファイル名].sql
world database
world内には、世界の国・都市・言語の情報が3個のテーブルに分かれて格納されています。
E-R図と各テーブルの概要
- country : 世界の国の基本情報
- city : 世界の都市の基本情報
- countrylanguage : 各国で使われている言語の情報
1.country(データ数:239)
###Column一覧
注:以下、テーブルの主キーを太字+斜体で、外部キーとその参照先の対応を色文字で表す。
- Code : アルファベット大文字3つからなる国コード
- Name : 国の英名
- Continent : どこの大陸にあるか
['Asia','Europe','North America','Africa','Oceania','Antarctica','South America']の中から選択 - Region : 国の大まかな位置
(例) Eastern Europe(東ヨーロッパ), Middle East(中東)など - SurfaceArea : 領土面積[$km^2$]
- IndepYear : 独立年
- Population : 人口
- LifeExpentancy : 平均寿命
- GNP : 国民総生産(単位、該当年不明)
- GNPOld : 前年の国民総生産(単位、該当年不明)
- LocalName : 現地語での国名
- GovernmentForm : 政治体制
(例) Constitutional Monarchy(立憲君主制)、Republic(共和制)など - HeadOfState : 国家元首の名前
- Capital : 首都のcityテーブルでのID
- Code2 :アルファベット大文字2つからなる国コード
(例)
Code | Name | LocalName | Capital | Code2 |
---|---|---|---|---|
JPN | Japan | Nihon/Nippon | 1532 | JP |
DEU | Germany | Deutschland | 3068 | DE |
2.city(データ数:4079)
###Column一覧
- ID : 自然数の通し番号
- Name : 都市名
- CountryCode : アルファベット大文字3つからなる国コード
- countryテーブル"Code"の外部キー
- District : その都市がある行政区
(例)
ID | Name | CountryCode | District |
---|---|---|---|
1536 | Sapporo | JPN | Hokkaido |
3796 | Houston | USA | Texas |
3.countrylanguage(データ数:984)
###Column一覧
- CountryCode : アルファベット大文字3つからなる国コード
- countryテーブル"Code"の外部キー
- Language : 言語名
- IsOfficial : 公用語かどうか
- Percentage : 使用率
(例)フィンランドの場合
Country | Language | IsOfficial | Percentage |
---|---|---|---|
FIN | Estonian | F | 0.2 |
FIN | Finnish | T | 92.7 |
FIN | Russian | F | 0.4 |
FIN | Saame | F | 0.0 |
FIN | Swedish | T | 5.7 |
#sakila database
sakila内には、ある架空の貸しDVD屋の業務データが16個のテーブルに分かれて格納されています。
E-R図と各テーブルの概要
- actor : 俳優の情報
- address : 住所録
- category : 映画に付けられるカテゴリ一覧(アクション・ホラーなど)
- city : 世界の都市の情報
- country : 世界の国の情報
- customer : 顧客情報
- film : 映画の情報
- film_actor : 映画に出演している俳優の情報 ← actorとfilmの中間テーブル
- film_category : 映画のカテゴリ情報 ← categoryとfilmの中間テーブル
- film_text : 映画の説明文の一覧
- inventory : どの店にどの映画DVDの在庫があるかの一覧
- language : 言語の一覧
- payment : 支払い記録
- rental : レンタル先・日時の記録
- staff : スタッフ名簿
- store : 店舗情報
1.actor(データ数:200)
###Column一覧
- actor_id : 俳優1人1人につく通し番号
- first_name : ファーストネーム(英大文字)
- last_name : 下の名前(英大文字)
- last_update : データが追加されたタイムスタンプ
2.address(データ数:603)
###Column一覧
- adress_id : 自然数の通し番号
- adress : 住所(いわゆるAddress Line1)
- adress2 : 住所その2(Address Line2)
- district : 所在地区(州)
- city_id : 所在地の都市id
- cityテーブル"city_id"の外部キー
- postal_code : 郵便番号
- phone : 電話番号
- location : 所在地の位置情報
- last_update : データが追加されたタイムスタンプ
(例)
address_id | address | district | city_id | postal_code | phone |
---|---|---|---|---|---|
6 | 1121 Loja Avenue | California | 449 | 17886 | 838635286649 |
10 | 1795 Santiago de Compostela Way | Texas | 295 | 18743 | 860452626434 |
3.category(データ数:16)
###Column一覧
- category_id : 自然数の通し番号
- name : カテゴリ名
- last_update : データが追加されたタイムスタンプ
4.city(データ数:600)
###Column一覧
- city_id : 自然数の通し番号
- city : 都市名
- country_id : 都市のある国id
- countryテーブル"country_id"の外部キー
- last_update : データが追加されたタイムスタンプ
(例)
city_id | city | country_id |
---|---|---|
89 | Braslia | 15 |
205 | Hiroshima | 50 |
5.country(データ数:109)
###Column一覧
- country_id : 自然数の通し番号
- country : 国名
- last_update : データが追加されたタイムスタンプ
6.customer(データ数:599)
###Column一覧
- customer_id : 自然数の通し番号
- store_id : よく使う店舗(ホーム)
- storeテーブル"store_id"の外部キー
- first_name : ファーストネーム
- last_name : 下の名前
- email : メールアドレス
- address_id : 住所id
- adressテーブル"address_id"の外部キー
- active : 在籍しているか退会しているか(0or1の値)
- create_date : DB登録日
- last_update : データが追加されたタイムスタンプ
(例)
customer_id | store_id | first_name | last_name | address_id | active | create_date |
---|---|---|---|---|---|---|
4 | 2 | BARBARA | JONES | 8 | 1 | 2006-02-14 22:04:36 |
271 | 1 | PENNY | NEAL | 276 | 0 | 2006-02-14 22:04:36 |
7.film(データ数:1000)
###Column一覧
- film_id : 自然数の通し番号
- title : 映画タイトル
- description : 概要文
- release_year : 公開年
- language_id : 言語id
- languageテーブル"language_id"の外部キー
- original_language_id : 翻訳前の元言語id
- languageテーブル"language_id"の外部キー
- rental_duration : レンタル期間[day]
- rental_rate : rental_duration日の間DVDを借りる値段[$]
- length : 映画の長さ[min]
- replacement_cost : 期限までに返却されない時・DVDを壊れた状態で返却した時の追加料金[$]
- rating : 公開レーティング
['G','PG','PG-13','R','NC-17']のどれか - special_features : DVD特典映像の種類
['Trailers','Commentaries','Deleted Scenes','Behind the Scenes']から複数選択 - last_update : データが追加されたタイムスタンプ
(例)
film_id | title | language_id | rental_duration | rental_rate | length | rating | special_features |
---|---|---|---|---|---|---|---|
86 | BOOGIE AMELIE | 1 | 6 | 4.99 | 121 | R | Commentaries,Behind the Scenes |
674 | PET HAUNTING | 1 | 3 | 0.99 | 99 | PG | Trailers,Commentaries |
8.film_actor(データ数:5462)
###Column一覧
- actor_id : 出演役者のid
- actorテーブル"actor_id"の外部キー
- film_id : 映画のid
- filmテーブル"film_id"の外部キー
- last_update : データが追加されたタイムスタンプ
9.film_category(データ数:1000)
###Column一覧
- film_id : 映画のid
- filmテーブル"film_id"の外部キー
- category_id : カテゴリid
- categoryテーブル"category_id"の外部キー
- last_update : データが追加されたタイムスタンプ
10.film_text(データ数:1000)
###Column一覧
- film_id : 映画id
- title : タイトル
- description : 説明文
これはテーブル7"film"の3つの列を抜き出したものと同じです。データの追加・更新・削除もトリガーで同期されています。
MySQL5.6.10以前のInnoDBでは、descriptionで使われているデータ構造"text"の検索がサポートされていなかったため、該当箇所だけMyISAMで作り直したのがこの"film_text"テーブルです。
11.inventory(データ数:4581)
###Column一覧
- inventory_id : 自然数の通し番号
- film_id :
- filmテーブル"film_id"の外部キー
- store_id :
- storeテーブル"store_id"の外部キー
- last_update : データが追加されたタイムスタンプ
(例)
inventory_id | film_id | store_id |
---|---|---|
1 | 1 | 1 |
2 | 1 | 1 |
5 | 1 | 2 |
12.language(データ数:6)
###Column一覧
- language_id : 自然数の通し番号
- name : 言語名
- last_update : データが追加されたタイムスタンプ
13.payment(データ数:16049)
###Column一覧
- payment_id : 自然数の通し番号
- customer_id : 支払いをした顧客番号
- customerテーブル"customer_id"の外部キー
- staff_id : 対応した店員番号
- staffテーブル"staff_id"の外部キー
-
rental_id : 支払いがレンタル料金の支払いだった場合、そのレンタルid
(延長料金の支払いなどで対応していない場合はなし) - rentalテーブル"rental_id"の外部キー
- amount : 支払い額[$]
- payment_date : 取引日
- last_update : データが追加されたタイムスタンプ
(例)
payment_id | customer_id | staff_id | rental_id | amount | payment_date |
---|---|---|---|---|---|
56 | 2 | 1 | 14475 | 4.99 | 2005-08-21 13:24:32 |
14.rental(データ数:16044)
###Column一覧
- rental_id : 自然数の通し番号
- rental_date : 貸出日
- inventory_id : 貸したDVDのid
- inventoryテーブル"inventory_id"の外部キー
- customer_id : DVDを借りた顧客番号
- customerテーブル"customer_id"の外部キー
- return_date : 返却日
- staff_id : 対応した店員番号
- staffテーブル"staff_id"の外部キー
- last_update : データが追加されたタイムスタンプ
(例)
rental_id | rental_date | inventory_id | customer_id | return_date | staff_id |
---|---|---|---|---|---|
88 | 2005-05-25 14:13:54 | 2221 | 53 | 2005-05-29 09:32:54 | 2 |
15.staff(データ数:2)
###Column一覧
- staff_id : 自然数の通し番号
- first_name : ファーストネーム
- last_name : 下の名前
- address_id : 住所id
- adressテーブル"address_id"の外部キー
- picture : 写真(blob型)
- email : メールアドレス
- store_id : いつも務めている店のid
- storeテーブル"store_id"の外部キー
- active : 在籍しているかどうか。0or1
- username : 業務システムでのユーザーネーム
- password : 業務システムでのPW
- last_update : データが追加されたタイムスタンプ
(例)
staff_id | first_name | last_name | address_id | active | username | password |
---|---|---|---|---|---|---|
4 | BARBARA | JONES | 8 | 1 | 2006-02-14 22:04:36 | |
271 | PENNY | NEAL | 276 | 0 | 2006-02-14 22:04:36 |
16.store(データ数:2)
###Column一覧
- store_id : 自然数の通し番号。主キー
- manager_staff_id : 店長の店員id
- staffテーブル"staff_id"の外部キー
- address_id : 住所id
- adressテーブル"address_id"の外部キー
- last_update : データが追加されたタイムスタンプ
(例)
store_id | manager_staff_id | address_id |
---|---|---|
1 | 1 | 1 |
2 | 2 | 2 |
#employee database
employee内には、架空の会社の人事情報が6個のテーブルに分かれて格納されています。
E-R図と各テーブルの概要
- departments : 会社の部署一覧
- dept_emp : 社員の部署所属一覧 ←departmentsとemployeesの中間テーブル
- dept_manager : 部署のマネージャー一覧 ←departmentsとemployeesの中間テーブル
- employees : 社員名簿
- salaries : 社員の給与履歴
- titles : 社員の役職履歴
1.departments(データ数:9)
###Column一覧
- dept_no : 部署の通し番号
- dept_name : 部署名
(例)
dept_no | dept_name |
---|---|
d001 | Marketing |
d007 | Sales |
2.dept_emp(データ数:331603)
###Column一覧
- emp_no : 社員の通し番号
- employeesテーブル"emp_no"の外部キー
- dept_no : 社員の所属部署の番号
- departmentsテーブル"dept_no"の外部キー
- from_date : 勤務開始日
- to_date : 勤務終了日
(例)
emp_no | dept_no | from_date | to_date |
---|---|---|---|
10001 | d005 | 1986-06-26 | 9999-01-01 |
10011 | d009 | 1990-01-22 | 1996-11-09 |
3.dept_manager(データ数:24)
###Column一覧
- emp_no : 部長を務める社員の通し番号
- employeesテーブル"emp_no"の外部キー
- dept_no : 部署の番号
- departmentsテーブル"dept_no"の外部キー
- from_date : 勤務開始日
- to_date : 勤務終了日
4.employees(データ数:300024)
###Column一覧
- emp_no : 社員の通し番号
- birth_date : 誕生日
- first_name : 名字
- last_name : 下の名前
- gender : 性別。MかF
- hire_date : 雇用開始日
(例)
emp_no | birth_date | first_name | last_name | gender | hire_date |
---|---|---|---|---|---|
10044 | 1961-09-21 | Mingsen | Casley | F | 1994-05-21 |
5.salaries(データ数:2844047)
###Column一覧
- emp_no : 社員の通し番号
- salary : 給料
- from_date : 給料の試算開始日
- to_date : 給料の試算終了日
(例)
emp_no | salary | from_date | to_date |
---|---|---|---|
12658 | 73254 | 1985-03-28 | 1986-03-28 |
6.titles(データ数:443308)
###Column一覧
- emp_no : 社員の通し番号
-
title : 職種
(例) Engineer, Technique Leader, Staff など - from_date : 着任日
- to_date : 解任日
(例)
emp_no | title | from_date | to_date |
---|---|---|---|
13959 | Engineer | 1985-05-15 | 1992-05-15 |
14005 | Technique Leader | 1985-05-10 | 9999-01-01 |
#さいごに
これで、公式データの各テーブル間の関係・各Columnの意味がわかったかと思います。これがわかれば、テーブル結合を使ったSQL文の練習もガンガンできるのではないでしょうか。
また、公式データにはインデックスやパーティションといった、効率的に利用するための各種設定が最初から行われています。ですので、
- どうしてこの列にはインデックスが張ってある/ないんだろう?
- この2つの列の間には関連があるのに、どうして外部キー設定がないんだろう?
- どうしてデータを1つのテーブルにまとめないで2つに分けたんだろう?
といったことを考察すると、DB構成に関する理解が深まると思います。