SQLで複数テーブルからデータの取得・表示を行う
SQLを用いてDB(データベース)内の複数テーブルからデータの取得・表示を行う方法をサンプルと画像説明付きでわかりやすく解説します。
スマホで見る
目次
SQLで複数テーブルからデータの取得・表示を行う
例)参照対象テーブルの中身
【目的】master_tableのデータをsep_table_1~4に分割。その分割したテーブルの情報を参照してmaster_tableと同じ情報を結果に出力できれば成功
【基礎SQL文1】1つのテーブル内のデータを全て結果に出力
SELECT * FROM master_table;
【基礎SQL文2】1つのテーブル内の指定カラムのデータが特定の値と同じデータを結果に出力
SELECT * FROM master_table WHERE (
id = 10001 OR
id = 10002 OR
id = 10003 OR
id = 10004 OR
id = 10005
);
【複数テーブルからデータ取得SQL文1】 sep_table_1内のidの値を検索して、sep_table_2内の値とidで一致したsep_table_2のデータを取得して結果に出力
SELECT
tbl1.id,
tbl1.name,
tbl1.age,
tbl1.gender,
tbl2.mail
FROM
sep_table_1 tbl1
INNER JOIN
sep_table_2 tbl2
ON
tbl1.id = tbl2.id
WHERE (
tbl1.id = 10001 OR
tbl1.id = 10002 OR
tbl1.id = 10003 OR
tbl1.id = 10004 OR
tbl1.id = 10005
);
【複数テーブルからデータ取得SQL文2】 sep_table_1内のidの値を検索して、sep_table_2内の値とidで一致したsep_table_2のデータを取得して結果に出力
+ 更に別テーブルの情報も取得(合計4テーブルから情報を取得して結果でまとめて表示)
SELECT
tbl1.id,
tbl1.name,
tbl1.age,
tbl1.gender,
tbl2.mail,
tbl3.address,
tbl4.memo
FROM ((
sep_table_1 tbl1
INNER JOIN
sep_table_2 tbl2
ON
tbl1.id = tbl2.id
)
INNER JOIN
sep_table_3 tbl3
ON
tbl1.id = tbl3.id
)
INNER JOIN
sep_table_4 tbl4
ON
tbl1.name = tbl4.name
WHERE (
tbl1.id = 10001 OR
tbl1.id = 10002 OR
tbl1.id = 10003 OR
tbl1.id = 10004 OR
tbl1.id = 10005
);
[DB環境設定1] DB環境構築からDB接続までの事前準備
ここからはそもそもでDB(データベース)環境を構築したい方に向けての内容です
DB環境を準備する – docker
- xampp と同様のLAMP環境を Docker で構築する | これを読めば思い出す … 環境準備のための解説
- Docker-LAMP-202004 … GitHub Repositories へアクセス
- [Download ZIP] … 直でファイルをダウンロード
今回は docker-compose 環境のDBを使ってテストした。
初回の「docker-compose up -d
」でサンプルテーブル作成までされる(はず…)
SQLクライアントツールでDBにアクセス 例)Windows – HeidiSQL
# mysql
db:
image: mysql
# container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: docker_db
MYSQL_USER: docker_user
MYSQL_PASSWORD: docker_pass
docker-compose.yml に書いてある情報を元に docker 内の DB へアクセス。
テーブルの表示が確認出来れば接続成功。
コマンドプロンプト(win) or ターミナル(mac) からDBにアクセス 例)今回はコマンドプロンプト(win)
docker-compose ps –service | docker-composeで起動中のサービス名を表示する |
---|---|
docker-compose exec db bash | docker-composeで起動中の「DB」へアクセスする |
mysql -u docker_user -p | mysqlに「docker_user」としてログインする (このあとDBのパスワードを求められる) |
use docker_db | 「docker_db」へアクセス |
show tables; | DB内のテーブルを参照 |
exit | mysqlやexecの処理を抜ける |
「show tables;」とコマンドを打ってもDB内にテーブルが無いと「Empty set」と表示される。
中身があればちゃんと上図のように表示される。
[DB環境設定2] DBにテーブルと中身のデータを作成するSQL文
もしDB内にテーブルが存在しない場合は下記のSQLコマンドを実行すればサンプルと同じ状態を構築できる
サンプルテーブルと中身のデータ作成をするSQL文
-- docker-compose.yml内で設定したDB名
USE docker_db;
-- create test_table
create table IF not exists `test_table`
(
`id` INT(20) AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`created_at` Datetime DEFAULT NULL,
`updated_at` Datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- insert sample data
INSERT INTO test_table VALUES (1,'suzuki',null,null);
INSERT INTO test_table VALUES (2,'tanaka',null,null);
INSERT INTO test_table VALUES (3,'satou',null,null);
-- create master_table
create table IF not exists `master_table`
(
`id` INT(5) AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`age` INT(3) DEFAULT NULL,
`gender` VARCHAR(4) NOT NULL,
`mail` VARCHAR(50) NOT NULL,
`address` VARCHAR(50) NOT NULL,
`memo` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- insert sample data
INSERT INTO master_table VALUES (10001,'佐藤',30,'男','satou@mail.com','アドレス1','メモ1_佐藤');
INSERT INTO master_table VALUES (10002,'鈴木',12,'女','suzuki@mail.com','アドレス2','メモ2_鈴木');
INSERT INTO master_table VALUES (10003,'田中',45,'男','tanaka@mail.com','アドレス3','メモ3_田中');
INSERT INTO master_table VALUES (10004,'遠藤',34,'男','endou@mail.com','アドレス4','メモ4_遠藤');
INSERT INTO master_table VALUES (10005,'山本',26,'女','yamamoto@mail.com','アドレス5','メモ5_山本');
-- create sep_table_1
create table IF not exists `sep_table_1`
(
`id` INT(5) AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`age` INT(3) DEFAULT NULL,
`gender` VARCHAR(4) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- insert sample data
INSERT INTO sep_table_1 VALUES (10001,'佐藤',30,'男');
INSERT INTO sep_table_1 VALUES (10002,'鈴木',12,'女');
INSERT INTO sep_table_1 VALUES (10003,'田中',45,'男');
INSERT INTO sep_table_1 VALUES (10004,'遠藤',34,'男');
INSERT INTO sep_table_1 VALUES (10005,'山本',26,'女');
-- create sep_table_2
create table IF not exists `sep_table_2`
(
`id` INT(5) AUTO_INCREMENT,
`mail` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- insert sample data
INSERT INTO sep_table_2 VALUES (10001,'satou@mail.com');
INSERT INTO sep_table_2 VALUES (10002,'suzuki@mail.com');
INSERT INTO sep_table_2 VALUES (10003,'tanaka@mail.com');
INSERT INTO sep_table_2 VALUES (10004,'endou@mail.com');
INSERT INTO sep_table_2 VALUES (10005,'yamamoto@mail.com');
-- create sep_table_3
create table IF not exists `sep_table_3`
(
`id` INT(5) AUTO_INCREMENT,
`address` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- insert sample data
INSERT INTO sep_table_3 VALUES (10001,'アドレス1');
INSERT INTO sep_table_3 VALUES (10002,'アドレス2');
INSERT INTO sep_table_3 VALUES (10003,'アドレス3');
INSERT INTO sep_table_3 VALUES (10004,'アドレス4');
INSERT INTO sep_table_3 VALUES (10005,'アドレス5');
-- create sep_table_4
create table IF not exists `sep_table_4`
(
`name` VARCHAR(20) NOT NULL,
`memo` VARCHAR(50) NOT NULL,
PRIMARY KEY (`name`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- insert sample data
INSERT INTO sep_table_4 VALUES ('佐藤','メモ1_佐藤');
INSERT INTO sep_table_4 VALUES ('鈴木','メモ2_鈴木');
INSERT INTO sep_table_4 VALUES ('田中','メモ3_田中');
INSERT INTO sep_table_4 VALUES ('遠藤','メモ4_遠藤');
INSERT INTO sep_table_4 VALUES ('山本','メモ5_山本');