七種連線查詢mysql
阿新 • • 發佈:2022-02-25
在使用資料庫查詢語句時,
單表的查詢有時候不能滿足專案的業務需求
在專案開發過程中,
有很多需求都是要涉及到多表的連線查詢.
連線查詢:也可以叫跨表查詢,需要關聯多個表進行查詢
以下通過兩表例項來詳細介紹連線的使用方式.
所有操作基本department表和employee表
department表:
以下為建表語句與表資料
DROP TABLE IF EXISTS `department`; CREATE TABLE `department` ( `id` int(11) NOT NULL AUTO_INCREMENT, `deptName` varchar(30) DEFAULT NULL, `address` varchar(40) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
表資料:
INSERT INTO `department` VALUES ('1', '研發部(RD)', '2層'); INSERT INTO `department` VALUES ('2', '人事部(HR)', '3層'); INSERT INTO `department` VALUES ('3', '市場部(MK)', '4層'); INSERT INTO `department` VALUES ('4', '後勤部(MIS)', '5層'); INSERT INTO `department` VALUES ('5', '財務部(FD)', '6層');
employee表:
DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `dep_id` int(11) DEFAULT NULL, `age` int(11) DEFAULT NULL, `salary` decimal(10,2) DEFAULT NULL, `cus_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8;
表資料
INSERT INTO `employee`
VALUES ('1', '魯班', '1', '10', '1000.00', '1');
INSERT INTO `employee`
VALUES ('2', '後裔', '1', '20', '2000.00', '1');
INSERT INTO `employee`
VALUES ('3', '孫尚香', '1', '20', '2500.00', '1');
INSERT INTO `employee`
VALUES ('4', '凱', '4', '20', '3000.00', '1');
INSERT INTO `employee`
VALUES ('5', '典韋', '4', '40', '3500.00', '2');
INSERT INTO `employee`
VALUES ('6', '貂蟬', '6', '20', '5000.00', '1');
INSERT INTO `employee`
VALUES ('7', '孫臏', '6', '50', '5000.00', '1');
INSERT INTO `employee`
VALUES ('8', '蔡文姬', '30', '35', '4000.00', '1');
一、內連線
圖示:
作用:
查詢兩張表的共有部分
語句:
Select <select_list> from tableA A
Inner join tableB B
on A.Key = B.Key
原表資料:
示例:
SELECT * from employee e
INNER JOIN department d
on e.depart_id = d.id;
查詢結果資料:
二、左連線
圖示:
作用:
把左邊表的內容全部查出,右邊表只查出滿足條件的記錄
語句:
Select <select_list> from tableA A
Left Join tableB B
on A.Key = B.Key
原表資料:
示例:
SELECT * from employee e
LEFT JOIN department d
on e.depart_id = d.id;
查詢結果資料:
三、右連線
圖示:
作用:
把右邊表的內容全部查出,左邊表只查出滿足條件的記錄
語句:
Select <select_list> from tableA A
Left Join tableB B
on A.Key = B.Key
原表資料:
示例:
SELECT * from employee e
RIGHT JOIN department d
on e.depart_id = d.id;
查詢結果資料:
四、查詢左表獨有資料
圖示:
作用:
查詢A的獨有資料
語句:
Select <select_list> from tableA A
Left Join tableB B
on A.Key = B.Key where B.key IS NULL
原表資料:
示例:
SELECT * from employee e
LEFT JOIN department d
on e.depart_id = d.id WHERE d.id IS NULL;
查詢結果資料:
五、查詢右表獨有資料
圖示:
作用:
查詢B的獨有資料
語句:
Select <select_list> from tableA A
Right Join tableB B
on A.Key = B.Key where A.key IS NULL
原表資料:
示例:
SELECT * from employee e
RIGHT JOIN department d
on e.depart_id = d.id WHERE e.id IS NULL;
查詢結果資料:
六、全連線
圖示:
作用:
查詢兩個表的全部資訊
語句:
Select <select_list> from tableA A
Full Outter Join tableB B on A.Key = B.Key
注:Mysql 預設不支援此種寫法 Oracle支援
在Mysql中可以使用UNION來實現相應操作
原表資料:
示例:
SELECT * from employee e
LEFT JOIN department d
on e.depart_id = d.id
UNION
SELECT * from employee e
RIGHT JOIN department d
on e.depart_id = d.id
查詢結果資料:
七、查詢左右表各自的獨有的資料
圖示:
作用:
查詢A和B各自的獨有的資料
語句:
Select <select_list> from tableA A
Full Outter Join tableB B
on A.Key = B.Key where A.key = null or B.key=null
原表資料:
示例:
SELECT * from employee e
LEFT JOIN department d
on e.depart_id = d.id WHERE d.id is NULL
UNION
SELECT * from employee e
RIGHT JOIN department d
on e.depart_id = d.id
WHERE e.depart_id is NULL
查詢結果資料: