MYSQL多表聯(lián)合查詢的示例詳解
1. 分類
查詢兩個及以上的表,主要分類如下:
| 多表查詢類型 | 說明與關(guān)鍵字 | 語法示例 |
|---|---|---|
| 交叉連接 | 產(chǎn)生笛卡爾積,一般僅用于了解,不推薦業(yè)務(wù)使用 | select * from A, B; |
| 內(nèi)連接 | 只返回兩表中匹配到的行,inner 可省略;分為隱式(SQL92)和顯式(SQL99)寫法 | 隱式:select * from A, B where A.id = B.a_id;顯式:select * from A inner join B on A.id = B.a_id; |
| 左外連接 | 左表全部返回,右表只返回匹配行,不匹配顯示 NULL;outer 可省略 | select * from A left outer join B on A.id = B.a_id; |
| 右外連接 | 右表全部返回,左表只返回匹配行,不匹配顯示 NULL;outer 可省略 | select * from A right outer join B on A.id = B.a_id; |
| 滿外連接 | 兩表全部返回,不匹配的一側(cè)顯示 NULL;MySQL 不原生支持,可用 union 模擬 | select * from A full outer join B on A.id = B.a_id; |
| 子查詢 | select 嵌套,在查詢中再嵌套查詢,用于條件或結(jié)果集 | select * from A where id in (select a_id from B); |
| 表自關(guān)聯(lián) | 將同一張表當成多張表使用,通過別名區(qū)分,常用于層級 / 遞歸場景 | select a.name, b.name from emp a join emp b on a.mgr = b.empno; |
參考圖示:

數(shù)據(jù)準備:
create database if not exists mydb3;
use mydb3;
-- 創(chuàng)建部門表
create table if not exists dept3 (
deptno varchar(20) primary key, -- 部門號
name varchar(20) -- 部門名字
);
-- 創(chuàng)建員工表
create table if not exists emp3 (
eid varchar(20) primary key, -- 員工編號
ename varchar(20), -- 員工名字
age int, -- 員工年齡
dept_id varchar(20) -- 員工所屬部門
);
-- 給dept3表添加數(shù)據(jù)
insert into dept3 values('1001','研發(fā)部');
insert into dept3 values('1002','銷售部');
insert into dept3 values('1003','財務(wù)部');
insert into dept3 values('1004','人事部');
-- 給emp3表添加數(shù)據(jù)
insert into emp3 values('1','喬峰',20, '1001');
insert into emp3 values('2','段譽',21, '1001');
insert into emp3 values('3','虛竹',23, '1001');
insert into emp3 values('4','阿紫',18, '1001');
insert into emp3 values('5','掃地僧',85, '1002');
insert into emp3 values('6','李秋水',33, '1002');
insert into emp3 values('7','鳩摩智',50, '1002');
insert into emp3 values('8','天山童姥',60, '1003');
insert into emp3 values('9','慕容博',58, '1003');
insert into emp3 values('10','丁春秋',71, '1005');2. 交叉連接查詢
返回被連接的兩個表的所有數(shù)據(jù)行的笛卡爾積(理解為一張表的每一行去和另一張表的任意一行進行匹配),例如A表有m行數(shù)據(jù),B表有n行數(shù)據(jù),則返回 m*n 行數(shù)據(jù)。笛卡爾積會產(chǎn)生很多冗余數(shù)據(jù),需要進行條件篩選。
語法格式:
select * from 表1,表2,表3,...;
舉例:
select * from emp3,dept3;
3. 內(nèi)連接查詢
查詢多張表的交集。
語法格式:
-- 隱式內(nèi)連接 select * from A,B where 條件; -- 顯式內(nèi)連接 select * from A inner join B on 條件;
舉例:
-- 查詢每個部門的所屬員工
select * from dept3,emp3 where dept3.deptno = emp3.dept_id;
-- 或
select * from dept3 inner join emp3 on dept3.deptno = emp3.dept_id;
-- 查詢研發(fā)部門的所屬員工
select
dept3.name,emp3.ename
from
dept3
inner join
emp3
on
dept3.deptno = emp3.dept_id
where
dept3.name = '研發(fā)部';
-- 查詢研發(fā)部和銷售部的所屬員工
select
dept3.name,emp3.ename
from
dept3
inner join
emp3
on
dept3.deptno = emp3.dept_id
where
dept3.name = '研發(fā)部' || dept3.name = '銷售部';
-- 查詢每個部門的員工數(shù),并升序排序
select
dept3.name,count(emp3.ename)
from
dept3
inner join
emp3
on
dept3.deptno = emp3.dept_id
group by
dept3.name
order by
count(ename) asc;
-- 查詢?nèi)藬?shù)大于等于3的部門,并按照人數(shù)降序排序
select
dept3.name,count(emp3.ename) as total_number
from
dept3
inner join
emp3
on
dept3.deptno = emp3.dept_id
group by
dept3.name
having
total_number > 3
order by
total_number desc;4. 外連接查詢
外連接分為左外連接(left outer join)、右外連接(right outer join)、滿外連接(full outer join)。
語法格式:
-- 左外連接
select * from 表1
left outer join 表2 on 條件1
left outer join 表3 on 條件2
left outer join 表4 on 條件3;
-- 右外連接
select * from 表1 right outer join 表2 on 條件;
-- 滿外連接
select * from 表1 full outer join 表2 on 條件;舉例:
--外連接查詢 use mydb3; -— 查詢哪些部門有員工,哪些部門沒有員工 select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id; -- 查詢哪些員工有對應(yīng)的部門,哪些沒有 select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id; -- 使用union關(guān)鍵字實現(xiàn)左外連接和右外連接的并集 -- union 查詢結(jié)果上下拼接;去重 select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id union select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id; -- union all 查詢結(jié)果上下拼接;不去重 select * from dept3 left outer join emp3 on dept3.deptno = emp3.dept_id union all select * from dept3 right outer join emp3 on dept3.deptno = emp3.dept_id;
4. 子查詢
就是select的嵌套,特點是:
| 子查詢返回數(shù)據(jù)類型 | 說明 |
|---|---|
| 單行單列 | 返回的是一個具體列的內(nèi)容,可以理解為一個單值數(shù)據(jù) |
| 單行多列 | 返回一行數(shù)據(jù)中多個列的內(nèi)容 |
| 多行單列 | 返回多行記錄之中同一列的內(nèi)容,相當于給出了一個操作范圍 |
| 多行多列 | 查詢返回的結(jié)果是一張臨時表 |
子查詢常用的邏輯關(guān)鍵字如下:
| 關(guān)鍵字 | 核心作用 |
|---|---|
| ALL | 與比較運算符結(jié)合,需滿足子查詢所有返回值的條件 |
| ANY | 與比較運算符結(jié)合,滿足子查詢任意一個返回值的條件即可 |
| SOME | 功能與 ANY 完全等價,是 ANY 的別名,語義上更強調(diào) “存在一些” |
| IN | 判斷操作數(shù)是否在子查詢的返回結(jié)果集中,可替代 =ANY |
| EXISTS | 僅判斷子查詢是否存在返回行,存在則為真,不存在則為假 |
子查詢舉例:
-- 查詢年齡最大的員工信息,顯示信息包含員工號、員工名字,員工年齡 SELECT * FROM emp3 WHERE age = (SELECT max(age) FROM emp3); -- 單行單列,輸出單個值 -- 查詢研發(fā)部和銷售部的員工信息,包含員工號、員工名字 SELECT -- 內(nèi)連接 * FROM dept3 INNER JOIN emp3 ON dept3.deptno = emp3.dept_id AND NAME = '研發(fā)部' OR NAME = '銷售部'; -- 或 SELECT * FROM emp3 WHERE dept_id IN ( SELECT -- 多行單列,輸出了多個值 deptno FROM dept3 WHERE (NAME = '研發(fā)部' OR NAME = '銷售部')); --查詢研發(fā)部20歲以下的員工信息,包括員工號、員工名字,部門名字 -- 方式一:關(guān)聯(lián)查詢 SELECT * FROM emp3 INNER JOIN dept3 ON emp3.dept_id = dept3.deptno WHERE age < 20 AND NAME = '研發(fā)部'; -- 或 -- 方式二:子查詢 SELECT * FROM emp3 WHERE age < 20 AND dept_id IN (SELECT deptno FROM dept3 WHERE NAME = '研發(fā)部'); -- 單行多列 / 多行多列
關(guān)鍵字語法格式:
-- all 語法格式
select
...
from
...
where
c > all(查詢語句)
-- 等價于
select
...
from
...
where
c > 結(jié)果1 and c > 結(jié)果2 and c > 結(jié)果3all關(guān)鍵字舉例:
到此這篇關(guān)于MYSQL多表聯(lián)合查詢的文章就介紹到這了,更多相關(guān)mysql多表聯(lián)合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
安裝MySQL phpMyAdmin cpolar實現(xiàn)遠程訪問連接的操作步驟
這篇文章主要給大家介紹了安裝 MySQL phpMyAdmin cpolar實現(xiàn)遠程訪問連接的流程步驟,文中有詳細的圖文介紹,具有一定的參考價值,需要的朋友可以參考下2023-08-08
mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的方法示例
這篇文章主要介紹了mysql創(chuàng)建本地用戶及賦予數(shù)據(jù)庫權(quán)限的相關(guān)資料,文中的介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04
MySQL Server 8.0.13.0 安裝教程圖文詳解
本文通過圖文并茂的形式給大家介紹了MySQL Server 8.0.13.0 安裝教程 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04
mysql 觸發(fā)器實現(xiàn)兩個表的數(shù)據(jù)同步
本文將介紹mysql 觸發(fā)器實現(xiàn)兩個表的數(shù)據(jù)同步,需要的朋友可以參考2012-11-11

