MySQLのJOINクエリの詳細

1、データベースの準備:``` CREATE DATABASE IF NOT EXISTS library_db DEFAULT CHARACTER SET UTF8;

USE library_db;

DROP TABLE IF EXISTS product_catalog;

CREATE TABLE product_catalog ( item_id INT(11) PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(20) DEFAULT NULL, cost DECIMAL(6,2) DEFAULT NULL, creator VARCHAR(20) DEFAULT NULL, category_id INT(11) DEFAULT NULL ) ENGINE=INNODB DEFAULT CHARSET=UTF8;

INSERT INTO product_catalog VALUES (NULL,'Python基礎','85.00','ジョン・スミス',1),(NULL,'Webデザイン入門','65.00','マリア・ガルシア',1),(NULL,'詩集','45.00','ヤン・コペツキ',2),(NULL,'数学の原理','32.00','リチャード・リー',3);

DROP TABLE IF EXISTS product_categories;

CREATE TABLE product_categories ( category_id INT(11) PRIMARY KEY AUTO_INCREMENT, category_name VARCHAR(20) DEFAULT NULL ) ENGINE=INNODB DEFAULT CHARSET=UTF8;

INSERT INTO product_categories(category_id,category_name) VALUES (1,'技術書'),(2,'文学'),(3,'教育');


2、JOINクエリ:JOINクエリは2つ以上のテーブルを特定の条件で結合し、必要なデータを抽出する手法です。2.1、内部結合:内部結合は2つ以上のテーブルからデータを取得できます;例:product_catalogテーブルのアイテムID、作成者、製品名とproduct_categoriesテーブルのカテゴリ名を取得する:```
SELECT p.item_id, p.creator, p.product_name, c.category_name FROM product_catalog p, product_categories c WHERE p.category_id=c.category_id;

+----+-----------+----------------------+--------------+| item_id | creator | product_name | category_name |+----+-----------+----------------------+--------------+| 1 | ジョン・スミス | Python基礎 | 技術書 || 2 | マリア・ガルシア | Webデザイン入門 | 技術書 || 3 | ヤン・コペツキ | 詩集 | 文学 || 4 | リチャード・リー | 数学の原理 | 教育類 |+----+-----------+----------------------+--------------+4 rows in set (0.02 sec)2.2.外部結合:外部結合は特定のテーブルのすべての情報を取得できます;SELECT 属性リストFROM テーブル名1 LEFT|RIGHT JOIN テーブル名2 ON テーブル名1.属性1=テーブル名2.属性2;2.2.1:左外部結合:テーブル名1のすべてのレコードを取得でき、テーブル名2からは一致するレコードのみ取得できます:例:左外部結合を使用してproduct_catalogのすべての情報を取得する:SELECT * FROM product_catalog p LEFT JOIN product_categories c ON p.category_id = c.category_id;

SELECT * FROM product_catalog p LEFT JOIN product_categories c ON p.category_id = c.category_id;

+----+----------------------+--------+-----------+------------+------+--------------+| item_id | product_name | cost | creator | category_id | category_id | category_name |+----+----------------------+--------+-----------+------------+------+--------------+| 1 | Python基礎 | 85.00 | ジョン・スミス | 1 | 1 | 技術書 || 2 | Webデザイン入門 | 65.00 | マリア・ガルシア | 1 | 1 | 技術書 || 3 | 詩集 | 45.00 | ヤン・コペツキ | 2 | 2 | 文学 || 4 | 数学の原理 | 32.00 | リチャード・リー | 3 | 3 | 教育類 || 5 | データベース設計 | 78.00 | エミリー・チャン | 4 | NULL | NULL |+----+----------------------+--------+-----------+------------+------+--------------+5 rows in set (0.00 sec) 2.2.2右外部結合:``` SELECT * FROM product_catalog p RIGHT JOIN product_categories c ON p.category_id = c.category_id;


+------+----------------------+--------+-----------+------------+----+--------------+| item_id | product_name | cost | creator | category_id | category_id | category_name |+------+----------------------+--------+-----------+------------+----+--------------+| 1 | Python基礎 | 85.00 | ジョン・スミス | 1 | 1 | 技術書 || 2 | Webデザイン入門 | 65.00 | マリア・ガルシア | 1 | 1 | 技術書 || 3 | 詩集 | 45.00 | ヤン・コペツキ | 2 | 2 | 文学 || 4 | 数学の原理 | 32.00 | リチャード・リー | 3 | 3 | 教育類 |+------+----------------------+--------+-----------+------------+----+--------------+4 rows in set (0.00 sec)2.2.3:複数条件でのクエリ:例: product_catalogテーブルのアイテムID,作成者,製品名とproduct_categoriesテーブルのカテゴリ名、価格が20-30の間のレコードを取得する ```
mysql> SELECT p.item_id,p.creator,p.product_name,p.cost,c.category_name FROM product_catalog p,product_categories c WHERE p.category_id=c.category_id AND cost BETWEEN 20 AND 30;

+----+-----------+----------------------+-------+--------------+| item_id | creator | product_name | cost | category_name |+----+-----------+----------------------+-------+--------------+| 4 | リチャード・リー | 数学の原理 | 32.00 | 教育類 |+----+-----------+----------------------+-------+--------------+1 row in set (0.00 sec)2.2.4:自己結合:例:自己結合を使用してproduct_catalogテーブルで作成者がエミリー・チャンではないすべてのレコードを取得する:SELECT p1.* FROM product_catalog p1,product_catalog p2 WHERE p1.item_id=p2.item_id AND p2.creator'エミリー・チャン';``` mysql> SELECT p1.* FROM product_catalog p1,product_catalog p2 WHERE p1.item_id=p2.item_id AND p2.creator<>'エミリー・チャン';


+----+----------------------+--------+-----------+------------+| item_id | product_name | cost | creator | category_id |+----+----------------------+--------+-----------+------------+| 1 | Python基礎 | 85.00 | ジョン・スミス | 1 || 2 | Webデザイン入門 | 65.00 | マリア・ガルシア | 1 || 3 | 詩集 | 45.00 | ヤン・コペツキ | 2 || 4 | 数学の原理 | 32.00 | リチャード・リー | 3 |+----+----------------------+--------+-----------+------------+4 rows in set (0.00 sec)

タグ: MySQL JOIN データベース SQL

6月22日 19:09 投稿