原創聲明:本文為作者原創,未經允許不得轉載,經授權轉載需注明作者和出處
今天開始講一點高級點的內容。我們的數據庫,在生產環境中肯定不是只有一張表,有可能有用戶表,商品表,訂單表等等等等。這里我們有這樣一個場景,有一個班級表,班級表里有班級id,班級名稱,還有一個學生表,學生表里有學生id,學生姓名,學生性別,學號,班級id(這個主要用于將班級和學生關聯起來)。
CREATE DATABASE coupletDemo;
USE coupletDemo;
CREATE TABLE class(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(10) NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO class (name) VALUES('妖怪班');
INSERT INTO class (name) VALUES('神仙班');
CREATE TABLE student(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(5) NOT NULL,
gender VARCHAR(1) NOT NULL,
stu_no VARCHAR(10) NOT NULL,
class_id INT NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('大妖怪','男','00001',1);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('二妖怪','女','00002',1);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('三妖怪','男','00003',1);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('四妖怪','女','00004',1);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('小妖怪','男','00005',1);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('神仙1','男','00006',2);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('神仙2','女','00007',2);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('神仙3','男','00008',2);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('神仙4','女','00009',2);
INSERT INTO student (name,gender,stu_no,class_id) VALUES('神仙5','男','00010',2);
運行上述SQL打開表:
在這些數據的前提下,有個需求,查詢所有學生信息以及每個學生所在的班級。這個需求可以用左聯實現:
SELECT s.id sid, s.name sname, s.gender sgender,s.stu_no sno,c.name cname FROM student s LEFT JOIN class c ON s.class_id = c.id;
結果就是這樣。
這條sql看起來這么長是有點恐怖,其實也很簡單,左聯的基本語法是:
在上述的表結構中設計中,我們可以把student表中的class_i當做是一個外鍵(當然,這并不是mysql上真正的外鍵),這個字段主要是用來存放用戶所在班級class的id,這樣就相當于將班級和學生關聯起來了,這種表與表之間關系叫做一對多,班級是一的一方,學生是多的一方。
通俗來講,聯表就是把兩張表通過特定的字段進行關聯然后合并成一張大表。其大概過程是這樣:
上圖僅顯示了妖怪班的查詢結果,其查詢語句應該是:
SELECT c.name, s.name FROM class c LEFT JOIN student s ON c.id = s.class_id WHERE c.name=’妖怪班’;
SELECT s.id sid, s.name sname, s.gender sgender,s.stu_no sno,c.name cname FROM student s LEFT JOIN class c ON s.class_id = c.id WHERE s.gender = '男';
SELECT s.id sid, s.name sname, s.gender sgender,s.stu_no sno,c.name cname FROM student s LEFT JOIN class c ON s.class_id = c.id WHERE s.gender = '男' AND c.name = '神仙班';
當然也可以在此用上前面的排序、分組,以及以后要學到的分頁等等。