MySQL 是一個廣泛使用的開源關系型數據庫管理系統,它支持多種數據存儲引擎,包括MyISAM、InnoDB、MEMORY、CSV、BLACKHOLE等等。而在日常使用 MySQL 數據庫過程當中,三線表是常常使用的一種結構。
三線表也被稱為中間表、聯結表、連接表等,它是指關聯兩張表的第三張表。三線表相當于兩張表中的一個中間橋梁,實現兩個表之間的數據溝通。它一般由兩個主鍵和其他需要查詢的字段組成。
/* * student 表 * id:學生編號 * name: 學生姓名 */ CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(100) ); /* * course 表 * id:課程編號 * name:課程名稱 */ CREATE TABLE course ( id INT PRIMARY KEY, name VARCHAR(100) ); /* * student_course 表(三線表) * student_id:學生編號(外鍵) * course_id:課程編號(外鍵) */ CREATE TABLE student_course ( student_id INT, course_id INT, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES student(id), FOREIGN KEY (course_id) REFERENCES course(id) );
在上述代碼中,我們可以看到三線表 student_course 表的定義,其由兩個外鍵以及兩個主鍵構成。foreign key 表示將 student_course 表中的 student_id 和 course_id 與 student 表和 course 表中的 id 字段聯系起來。
在實際應用中,三線表的應用場景是十分廣泛的。以學生和課程為例,學生表和課程表中都不包含該表所需的信息(即學生選修了哪些課程,以及每門課程由哪些學生選修),需要借助一個三線表進行關聯。
/* * 插入數據 */ INSERT INTO student (id, name) VALUES (1, 'Amy'); INSERT INTO student (id, name) VALUES (2, 'Bob'); INSERT INTO student (id, name) VALUES (3, 'Cathy'); INSERT INTO course (id, name) VALUES (1, 'Math'); INSERT INTO course (id, name) VALUES (2, 'Science'); INSERT INTO course (id, name) VALUES (3, 'Art'); INSERT INTO student_course (student_id, course_id) VALUES (1, 1); INSERT INTO student_course (student_id, course_id) VALUES (1, 2); INSERT INTO student_course (student_id, course_id) VALUES (2, 2); INSERT INTO student_course (student_id, course_id) VALUES (2, 3); INSERT INTO student_course (student_id, course_id) VALUES (3, 3);
上述代碼中的 INSERT INTO 語句是用來插入數據的,具體內容不再贅述。我們在使用三線表查詢數據時,一般會借助到 INNER JOIN 或者 LEFT JOIN 等關鍵字來關聯三張表的數據。
/* * 查詢選修了某門課的學生 */ SELECT s.name FROM student s INNER JOIN student_course sc ON s.id = sc.student_id INNER JOIN course c ON c.id = sc.course_id WHERE c.name = 'Science'; /* * 查詢某個學生選修的課程 */ SELECT c.name FROM course c INNER JOIN student_course sc ON c.id = sc.course_id INNER JOIN student s ON s.id = sc.student_id WHERE s.name = 'Amy';
上述兩個查詢語句,分別查詢選修了某門課的學生和某個學生選修的課程。我們可以看到,這兩個查詢中都采用了 INNER JOIN 進行關聯。查詢的結果是通過三線表進行查詢后,再與 student 表和 course 表進行數據的關聯查詢。這樣,我們就可以完整地查詢到三張表中我們所需要的數據。