はじめに
いざMySQLを使って学習しようにも、レコードの準備がとてもめんどうです。 あらかじめサンプルデータを取り込んでおくのが良いと思います。
というわけで、ググった所簡単に見つかりました。
以下のサイトからMySQLの公式サンプルデータベースを取得可能です。
ダウンロード
上述したリンクからZIP形式かTGZ形式のファイルをダウンロードします。
データベースの種類が①~⑤まで5種類ありますが、一番シンプルなサンプルは②です。
①~⑤までの概要と規模は簡単に以下の通りです。
No | 概要 | 規模 |
---|---|---|
① | 従業員データ | 大 |
② | 国データ | 小(3テーブル) |
③ | 国データ | 小(4テーブル) |
④ | レンタルDVDショップデータ | 小(16テーブル + 7ビュー) |
⑤ | 空港データ | 大 |
⑥ | ペットショップデータ | 中 |
②と③はどちらも国データですが「world_x」の方が1テーブル多く、更にテーブル内にjson形式のカラムがあります。
④だと大分テーブル数は増えますが、まだ把握出来ないことはないといった感じでしょうか。
①⑤⑥の中以上のデータは一応ダウンロードしてみましたが、ファイルの種類が様々で扱い方を調べるだけでも大変そうでした。気が向いたら挑戦しようと思いましたが、当分先になりそうです。。
データベースの取り込み~登録テーブルの確認
まずはダウンロードしたデータを解凍します。(以下はzip形式の例です)
「source」コマンドで取り込みます。
mysql>source C:\Users\[ユーザー名]\Desktop\work\world-db\world.sql;
「show databases」コマンドで登録されているDBを確認。「world」が追加されているのがわかります。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world | +--------------------+ 5 rows in set (0.00 sec)
「use world」コマンドで利用するDBを選択。
mysql> use world; Database changed
「show tables」コマンドでテーブルを確認します。
内容は、cityテーブル、countryテーブル、countrylanguageテーブル の3つです。
レコードやカラムの内容を見なくても、各テーブルが紐づいていることが想像できると思います。
mysql> show tables; +-----------------+ | Tables_in_world | +-----------------+ | city | | country | | countrylanguage | +-----------------+ 3 rows in set (0.00 sec)
テーブルの内容を確認
レコード数を確認
まずはレコード数を確認します。コマンドは「 SELECT COUNT(*) FROM [DB名]」です。
239の国があり、各国に合計4079の街と合計984の言語があります。
country(国テーブル)
mysql> SELECT COUNT(*) FROM country; +----------+ | COUNT(*) | +----------+ | 239 | +----------+ 1 row in set (0.00 sec)
country(街テーブル)
mysql> SELECT COUNT(*) FROM city; +----------+ | COUNT(*) | +----------+ | 4079 | +----------+ 1 row in set (0.00 sec)
country(言語テーブル)
mysql> SELECT COUNT(*) FROM countrylanguage; +----------+ | COUNT(*) | +----------+ | 984 | +----------+ 1 row in set (0.00 sec)
テーブル構造を確認
各テーブルのテーブル構造を確認します。「desc [テーブル名]」コマンドを実行。
country(国テーブル)
mysql> desc country; +----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+ | Code | char(3) | NO | PRI | | | | Name | char(52) | NO | | | | | Continent | enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') | NO | | Asia | | | Region | char(26) | NO | | | | | SurfaceArea | decimal(10,2) | NO | | 0.00 | | | IndepYear | smallint(6) | YES | | NULL | | | Population | int(11) | NO | | 0 | | | LifeExpectancy | decimal(3,1) | YES | | NULL | | | GNP | decimal(10,2) | YES | | NULL | | | GNPOld | decimal(10,2) | YES | | NULL | | | LocalName | char(45) | NO | | | | | GovernmentForm | char(45) | NO | | | | | HeadOfState | char(60) | YES | | NULL | | | Capital | int(11) | YES | | NULL | | | Code2 | char(2) | NO | | | | +----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+ 15 rows in set (0.00 sec)
city(街テーブル)
mysql> desc city; +-------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------+------+-----+---------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | Name | char(35) | NO | | | | | CountryCode | char(3) | NO | MUL | | | | District | char(20) | NO | | | | | Population | int(11) | NO | | 0 | | +-------------+----------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
city(言語テーブル)
mysql> desc countrylanguage; +-------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------+------+-----+---------+-------+ | CountryCode | char(3) | NO | PRI | | | | Language | char(30) | NO | PRI | | | | IsOfficial | enum('T','F') | NO | | F | | | Percentage | decimal(4,1) | NO | | 0.0 | | +-------------+---------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
テーブル構造を確認(2)
より理解を深めるため、「show create table [テーブル名]」コマンドを利用します。
テーブルをCREATEする時のコマンドに近い内容を見ることが出来るのでとても便利です。
country(国テーブル)
mysql> show create table country; +---------+-------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+-------------------------------------------------------------------------------------------------------------------+ | country | CREATE TABLE `country` ( `Code` char(3) NOT NULL DEFAULT '', `Name` char(52) NOT NULL DEFAULT '', `Continent` enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia', `Region` char(26) NOT NULL DEFAULT '', `SurfaceArea` decimal(10,2) NOT NULL DEFAULT '0.00', `IndepYear` smallint(6) DEFAULT NULL, `Population` int(11) NOT NULL DEFAULT '0', `LifeExpectancy` decimal(3,1) DEFAULT NULL, `GNP` decimal(10,2) DEFAULT NULL, `GNPOld` decimal(10,2) DEFAULT NULL, `LocalName` char(45) NOT NULL DEFAULT '', `GovernmentForm` char(45) NOT NULL DEFAULT '', `HeadOfState` char(60) DEFAULT NULL, `Capital` int(11) DEFAULT NULL, `Code2` char(2) NOT NULL DEFAULT '', PRIMARY KEY (`Code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +---------+--------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
country(街テーブル)
mysql> show create table city; +-------+--------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------+ | city | CREATE TABLE `city` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT NULL DEFAULT '', `CountryCode` char(3) NOT NULL DEFAULT '', `District` char(20) NOT NULL DEFAULT '', `Population` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `CountryCode` (`CountryCode`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`) ) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 | +-------+---------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
以下をご覧頂くと分かる通り、国テーブルを親として外部キー制約を設定しています。
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
※「CONSTRAINT `city_ibfk_1` 」は通常のCREATE文では不要です。
「show create table」コマンド利用時のみ表示されます。
「city_ibfk_1」が外部キーの名前を表しており、[テーブル名]_ibfk_1が自動で割り当てられるようです。
country(言語テーブル)
mysql> show create table countrylanguage; +-----------------+------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-----------------+------------------------------------------------------------------------------------------------------------+ | countrylanguage | CREATE TABLE `countrylanguage` ( `CountryCode` char(3) NOT NULL DEFAULT '', `Language` char(30) NOT NULL DEFAULT '', `IsOfficial` enum('T','F') NOT NULL DEFAULT 'F', `Percentage` decimal(4,1) NOT NULL DEFAULT '0.0', PRIMARY KEY (`CountryCode`,`Language`), KEY `CountryCode` (`CountryCode`), CONSTRAINT `countryLanguage_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +-----------------+------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
言語テーブルも街テーブルと同様に、国テーブルを親として外部キー制約を設定しています。
CONSTRAINT `countryLanguage_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
以上、MySQL公式サンプルの「world」の紹介でした。
具体的にどんなデータが入っているか確認してみると様々な発見があると思うのでこれから色々検証してゆこうと思います。