最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MYSQL多表聯(lián)合查詢的示例詳解

 更新時間:2026年02月25日 09:22:08   作者:zhangyueping8385  
這篇文章主要介紹了MySQL中的多表聯(lián)合查詢,包括交叉連接、內(nèi)連接、外連接和子查詢的分類、語法和示例,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

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é)果3

all關(guān)鍵字舉例:

到此這篇關(guān)于MYSQL多表聯(lián)合查詢的文章就介紹到這了,更多相關(guān)mysql多表聯(lián)合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

自贡市| 如东县| 苏尼特左旗| 陈巴尔虎旗| 东明县| 林芝县| 东源县| 封开县| 虹口区| 巨鹿县| 德钦县| 沈阳市| 巴林右旗| 忻州市| 凤山县| 津市市| 东安县| 疏附县| 淮南市| 夏邑县| 灵石县| 广安市| 启东市| 盐源县| 农安县| 芜湖县| 万载县| 高唐县| 天峨县| 松潘县| 呼和浩特市| 饶平县| 庄浪县| 建瓯市| 建德市| 临海市| 桂东县| 白玉县| 武隆县| 青州市| 景德镇市|