直積結合

SQL
CREATE TABLE student_list (
	student_id	char(4),
	student_name	varchar(15),

	PRIMARY KEY(student_id)
);

CREATE TABLE teacher_list (
	teacher_id	char(3),
	teacher_name	varchar(15),
	ex_number	char(4),

	PRIMARY KEY(teacher_id)
);

CREATE TABLE subject_list (
	subject_id	char(3),
	subject_name	varchar(20),
	teacher_id	char(3),
	PRIMARY KEY(subject_id),
	FOREIGN KEY(teacher_id) REFERENCES teacher_list(teacher_id)
		ON UPDATE RESTRICT
		ON DELETE RESTRICT
);

CREATE TABLE registration_list (
	student_id	char(4),
	subject_id	char(3),

	PRIMARY KEY(student_id, subject_id),
	FOREIGN KEY(student_id) REFERENCES student_list(student_id)
		ON UPDATE RESTRICT
		ON DELETE RESTRICT,
	FOREIGN KEY(subject_id) REFERENCES subject_list(subject_id)
		ON UPDATE RESTRICT
		ON DELETE RESTRICT
);

INSERT INTO student_list(student_id, student_name) 
VALUES('1001', '鈴木'), 
	('1002', '佐藤'),  
	('1003', '田中'),  
	('1004', '高橋');

INSERT INTO teacher_list(teacher_id, teacher_name, ex_number)
VALUES('T01', '沖田', '0013'), 
	('T03', '山南', '0036');

INSERT INTO subject_list(subject_id, subject_name, teacher_id)
VALUES('A01', 'データベース演習', 'T01'), 
	('B01', 'MOS対策', 'T01'),
	('C01', 'Webデザイン概論', 'T03');

INSERT INTO registration_list(student_id, subject_id)
VALUES('1001', 'A01'), 
	('1001', 'B01'), 
	('1002', 'A01'), 
	('1002', 'B01'), 
	('1003', 'B01'), 
	('1003', 'C01'), 
	('1004', 'A01'), 
	('1004', 'C01');


もっとも単純な結合方式が『直積結合』です。これは『複数のテーブルから1つずつレコードを取り出して結合する』ことをすべての組み合わせについて行います。従って、出力されるレコードの数は組み合わせの総数、つまり各テーブルのレコード数の積になります。

書式

FROMにテーブル名を”,”(カンマ区切り)で列挙するだけです。

SELECT カラム FROM テーブル1, テーブル2 [,…]

例:【subject_list】と【teacher_list】の直積結合
SQL
SELECT * FROM subject_list, teacher_list;
結果

2つのテーブル subject_listとteacher_list それぞれのレコードを1行ずつ取り出して組み合わせる、すべての組み合わせが表示されています。これをテーブルの『直積結合』といいます。

直積結合で出力される件数は、結合する各テーブルに存在するレコード数の積となります。
この例の場合はsubject_listに3行、teacher_listに2行のレコードがあったので、3×2=6行出力されています。

3つ以上のテーブルの場合

3つ以上のテーブルの直積結合も、FROM句に”,”区切りでテーブル名を並べて記述するだけです。

例:【registration_list】と【subject_list】と【student_list】の直積結合
SQL
SELECT * FROM registration_list,subject_list,student_list
結果

3つのテーブルの場合も、各テーブルからレコードを1つずつ取り出すすべての組み合わせが出力されています。この例の場合はregistration_listに8行、subject_listに3行、student_lsitに4行のレコードがあったので、直積結合は8×3×4=96行出力されています。

直積結合では外部キー参照などレコード同士の関連は考慮されません。
よって実用上はあまり意味がないように思われるかもしれませんが、この後の結合の基準になっています。

練習

【sales】と【sales_detail】と【item_list】の直積結合を求めるSQLを記述しなさい。

コメント

タイトルとURLをコピーしました