1. 程式人生 > 其它 >七種連線查詢mysql

七種連線查詢mysql

在使用資料庫查詢語句時,

單表的查詢有時候不能滿足專案的業務需求

在專案開發過程中,

有很多需求都是要涉及到多表的連線查詢.

連線查詢:也可以叫跨表查詢,需要關聯多個表進行查詢

以下通過兩表例項來詳細介紹連線的使用方式.

所有操作基本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

查詢結果資料: