聯表查詢JOIN ON ★★★
聯表查詢JOIN ON ★★★
1、MySQL七種 join 理論
2、七種 join 理論練習
-
聯表查詢練習專用表SQL程式碼
-- 建表 CREATE TABLE tbl_dep( id INT(11) NOT NULL AUTO_INCREMENT, deptName VARCHAR(22) DEFAULT NULL, addr VARCHAR(22) DEFAULT NULL, PRIMARY KEY(id) )ENGINE = INNODB DEFAULT CHARSET=utf8; CREATE TABLE tbl_emp( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(22) DEFAULT NULL, `deptId` VARCHAR(22) DEFAULT NULL, PRIMARY KEY (`id`) #constraint `fk_deptId` foreign key (`deptId`) references tbl_dep(id); )ENGINE=INNODB DEFAULT CHARSET=utf8; -- 插入資料 INSERT INTO tbl_dep(deptName,addr) VALUES('hr','111'); INSERT INTO tbl_dep(deptName,addr) VALUES('bd','112'); INSERT INTO tbl_dep(deptName,addr) VALUES('vb','113'); INSERT INTO tbl_dep(deptName,addr) VALUES('sd','114'); INSERT INTO tbl_dep(deptName,addr) VALUES('yy','115'); INSERT INTO tbl_emp(name,deptId) VALUES('k8',1); INSERT INTO tbl_emp(name,deptId) VALUES('k6',2); INSERT INTO tbl_emp(name,deptId) VALUES('k4',3); INSERT INTO tbl_emp(name,deptId) VALUES('k4',11);
-
tbl_dep 表
-
btl_emp 表
-
-
內連線練習(兩表的共有部分)
內連線語法為
SELECT 欄位名 FROM 表名 [AS] 表別名 INNER JOIN 表名 [AS] 表別名 ON條件
-- 內連線練習(兩表共有部分) SELECT * FROM tbl_dep d INNER JOIN tbl_emp e ON d.id=e.deptId;
-
左連線練習(左表的全部,右表不滿足部分補NULL)
左連線語法為
SELECT 欄位名 FROM 表名 [AS] 表別名 LEFT JOIN 表名 [AS] 表別名 ON條件
-- 左連線練習(左表的全部,右表不滿足補NULL) SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId;
-
右連線(右表的全部,左表不滿足部分補NULL)
右連線語法為
SELECT 欄位名 FROM 表名 [AS] 表別名 RIGHT JOIN 表名 [AS] 表別名 ON條件
-- 右連線(右表的全部,左表不滿足的補NULL) SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId;
-
特殊的左連線(顯示為左表的獨有的資料)
-
說明:查詢 tbl_dep 表中跟 tbl_emp 表無關聯關係的資料,即 tbl_dep 獨佔,且 tbl_emp 表的顯示列補NULL;
-
特殊左連線語法為
SELECT 欄位名 FROM 表名 [AS] 表別名 LEFT JOIN 表名 [AS] 表別名 ON條件 WHERE條件
-- 特殊的左連線,(顯示為左表的獨有的資料) -- 說明:查詢 tbl_dep 表中跟 tbl_emp 表無關聯關係的資料,即 tbl_dep 獨佔,且 tbl_emp 表的顯示列補NULL; SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId WHERE e.deptId IS NULL;
-
-
特殊的右連線(顯示為右表的獨有的資料 )
-
說明:查詢 tbl_emp 表中跟 tbl_dep 表無關聯關係的資料,即 tbl_emp 獨佔,且 tbl_dep 表的顯示列補NULL;
-
特殊右連線語法為
SELECT 欄位名 FROM 表名 [AS] 表別名 RIGHT JOIN 表名 [AS] 表別名 ON條件 WHERE條件
-- 特殊的右連線(顯示為右表的獨有的資料 ) -- 說明:查詢 tbl_emp 表中跟 tbl_dep 表無關聯關係的資料,即 tbl_emp 獨佔,且 tbl_dep 表的顯示列補NULL; SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId WHERE d.id IS NULL;
-
-
全連線(顯示全部資料)(mysql 不支援 full outer join)
全連線其實就是左右連線的合併形式
可以通過union去重
全連線依舊會像左右連線一樣自動補null
-- 全連線(顯示全部資料)(mysql 不支援 full outer join) -- UNION :有去重的功能。 SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId UNION SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId;
mysql 不支援 full outer join
-
顯示兩表的獨有的資料
顯示兩表獨有資料其實就是特殊左右連線的合併
可以通過union去重
自動補null
-- 顯示兩表的獨有的資料 SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId WHERE e.deptId IS NULL UNION SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId WHERE d.id IS NULL;
3、自連線(瞭解即可)
所謂的自連線就是和自己的表連線
核心:一張表拆分為兩張一樣的表
自連線其實就是將一張表視為兩張表,然後再建立父子關係
其精髓就在這裡:
FROM `category` AS a,`category` AS b
-
自連線專用資料庫表sql
CREATE TABLE `school1`.`category`( `categoryid` INT(3) NOT NULL COMMENT 'id', `pid` INT(3) NOT NULL COMMENT '父id 沒有父則為1', `categoryname` VARCHAR(10) NOT NULL COMMENT '種類名字', PRIMARY KEY (`categoryid`) )ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci; INSERT INTO `school1`.`category` (`categoryid`, `pid`, `categoryname`) VALUES ('2', '1', '資訊科技'); insert into `school1`.`CATEGOrY` (`categoryid`, `pid`, `categoryname`) values ('3', '1', '軟體開發'); insert into `school1`.`category` (`categoryid`, `PId`, `categoryname`) values ('5', '1', '美術設計'); insert iNTO `School1`.`category` (`categoryid`, `pid`, `categorynamE`) VAlUES ('4', '3', '資料庫'); insert into `school1`.`category` (`CATEgoryid`, `pid`, `categoryname`) values ('8', '2', '辦公資訊'); insert into `school1`.`category` (`categoryid`, `pid`, `CAtegoryname`) values ('6', '3', 'web開發'); inserT INTO `SCHool1`.`category` (`categoryid`, `pid`, `categoryname`) valueS ('7', '5', 'ps技術');
-
父類表
categoryid categoryname 2 資訊科技 3 軟體開發 5 美術設計 -
子類表
pid categoryid categoryname 3 4 資料庫 3 6 web開發 5 7 ps技術 2 8 辦公資訊 -
查詢父類對應的子類關係
父類 子類 資訊科技 辦公資訊 軟體開發 資料庫 軟體開發 web開發 美術設計 ps技術
上邊這三個表先看懂,然後我們用 sql 語句去實現查詢父子資訊
-
sql 語句實現查詢父子資訊
-- 查詢父子關係 SELECT a.`categoryname` AS '父類',b.`categoryname` AS '子類' FROM `category` AS a,`category` AS b WHERE a.`categoryid`=b.`pid`;
4、聯表查詢練習
1.查詢學員所屬年級(學號,姓名,年級名稱)
-- 1.查詢學員所屬年級(學號,姓名,年級名稱)
SELECT `studentno`,`studentname`,`gradename`
FROM `student` s
INNER JOIN `grade` g
ON s.`gradeid`=g.`gradeid`;
2.查詢科目所屬年級(科目編號,科目名稱,所屬年級名稱)
-- 2.查詢科目所屬年級(科目編號,科目名稱,所屬年級名稱)
SELECT `subjectno`,`subjectname`,`gradename`
FROM `subject` s
INNER JOIN `grade` g
ON s.`gradeid`=g.`gradeid`;
3.查詢參加 '資料庫結構-1' 考試同學的資訊:學號,學生姓名,科目名,分數
-- 3.查詢參加 '資料庫結構-1' 考試同學的資訊:學號,學生姓名,科目名,分數
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
WHERE subjectname='資料庫結構-1';