MySQL中的交叉連接、自然連接和內(nèi)連接查詢?cè)斀?/h1>
更新時(shí)間:2025年04月11日 11:47:22 作者:今天自洽了嗎
這篇文章主要介紹了MySQL中的交叉連接、自然連接和內(nèi)連接查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
一、引入
實(shí)際開(kāi)發(fā)中往往需要針對(duì)兩張甚至更多張數(shù)據(jù)表進(jìn)行操作,而這多張表之間需要使用主鍵和外鍵關(guān)聯(lián)在一起,然后使用連接查詢來(lái)查詢多張表中滿足要求的數(shù)據(jù)記錄。
一條SQL語(yǔ)句查詢多個(gè)表,得到一個(gè)結(jié)果,包含多個(gè)表的數(shù)據(jù)。效率高。
多種連接查詢的類(lèi)型:
cross
natural
using
on
二、交叉連接(cross join)
交叉連接(CROSS JOIN)是對(duì)兩個(gè)或者多個(gè)表進(jìn)行笛卡兒積操作,所謂笛卡兒積就是關(guān)系代數(shù)里的一個(gè)概念,表示兩個(gè)表中的每一行數(shù)據(jù)任意組合的結(jié)果。
比如:有兩個(gè)表,左表有m條數(shù)據(jù)記錄,x個(gè)字段,右表有n條數(shù)據(jù)記錄,y個(gè)字段,則執(zhí)行交叉連接后將返回m*n條數(shù)據(jù)記錄,x+y個(gè)字段。笛卡兒積示意圖如圖所示。

我希望查找員工編號(hào)、員工姓名、部門(mén)編號(hào)和部門(mén)名稱這4個(gè)字段的數(shù)據(jù),在員工表emp中可以查詢到員工編號(hào)、員工姓名、部門(mén)編號(hào)的數(shù)據(jù),在部門(mén)表dept中可以查詢到字段部門(mén)名稱的數(shù)據(jù),如果想同時(shí)查找這些數(shù)據(jù),需要使用多表查詢語(yǔ)法,交叉連接cross join:
查詢員工表emp:
select * from emp;

查詢部門(mén)表dept:
select * from dept;

一條SQL查詢兩個(gè)表:
select * from emp cross join dept;

表emp14條記錄,表dept4條記錄,交叉連接查詢后,14*4=56條記錄,交叉連接就是對(duì)這兩個(gè)表進(jìn)行笛卡爾乘積操作,笛卡爾乘積沒(méi)有實(shí)際意義,但是有理論意義。
關(guān)于交叉連接的寫(xiě)法,MySQL中可以省略cross,Oracle中不可以省略不寫(xiě),上條SQL等價(jià)于:
select * from emp join dept;
三、自然連接(natural join)
交叉連接會(huì)查詢到許多冗余數(shù)據(jù),比如在員工表emp和部門(mén)表dept中,讓主鍵和外鍵關(guān)聯(lián)起來(lái)的外鍵deptno,沒(méi)有匹配到一起,造成數(shù)據(jù)冗余:

使用自然連接,可以自動(dòng)匹配所有的同名列,讓同名列只在查詢中展示一次,提高查詢效率,
select * from emp natural join dept;

可以指定查詢的部分字段:
select empno,ename,deptno,dname from emp natural join dept;

當(dāng)查詢一個(gè)字段時(shí),系統(tǒng)會(huì)分別從兩個(gè)關(guān)聯(lián)的表中查找,因此效率較低,為解決這個(gè)問(wèn)題,我們可以在查詢目標(biāo)字段時(shí),指定表名,格式為表名.字段名
select emp.empno,emp.ename,emp.deptno,dept.dname from emp natural join dept;
查詢結(jié)果和上述一致,但是查詢效率得到了提升。
此時(shí),如果表名過(guò)長(zhǎng),查詢的SQL也會(huì)過(guò)長(zhǎng),在查詢時(shí),我們可以為表起別名:
select e.empno,e.ename,d.dname,d.deptno
from emp e
natural join dept d;
四、內(nèi)連接
使用natural join 的缺點(diǎn):會(huì)自動(dòng)匹配表中所有的同名列,但是有的時(shí)候我們希望只匹配部分同名列,那么我們可以使用using子句,這屬于內(nèi)連接(inner join)
select *
from emp as e
inner join dept as d
using(deptno);
using子句的缺點(diǎn):關(guān)聯(lián)的字段,必須是同名的
解決方法:使用內(nèi)連接中的on子句
select *
from emp e
inner join dept d
on (e.deptno = d.deptno);
五、總結(jié)
多表查詢的類(lèi)型有:
- 交叉連接 cross join
- 自然連接 natural join
- 內(nèi)連接 - using子句
- 內(nèi)連接 - on子句
綜合來(lái)看:內(nèi)連接 - on子句的使用頻率最高。
六、補(bǔ)充
select *
from emp e
inner join dept d
on (e.deptno = d.deptno)
where sal > 3500;
條件:
1、篩選條件 where having
2、連接條件 on/using/natural
在SQL99語(yǔ)法當(dāng)中,篩選條件和連接條件是分開(kāi)的。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
在MySQL中同時(shí)查找兩張表中的數(shù)據(jù)的示例
這篇文章主要介紹了在MySQL中同時(shí)查找兩張表中的數(shù)據(jù)的示例,即一次查詢操作返回兩張表的結(jié)果,需要的朋友可以參考下 2015-07-07
-
MySQL開(kāi)啟遠(yuǎn)程訪問(wèn)權(quán)限的最新方法
這篇文章主要給大家介紹了關(guān)于MySQL開(kāi)啟遠(yuǎn)程訪問(wèn)權(quán)限的最新方法,在MySQL中,要實(shí)現(xiàn)遠(yuǎn)程訪問(wèn),首先需要在MySQL服務(wù)端上開(kāi)啟相應(yīng)的權(quán)限,需要的朋友可以參考下 2023-08-08
-
減少mysql主從數(shù)據(jù)同步延遲問(wèn)題的詳解
本篇文章是對(duì)減少mysql主從數(shù)據(jù)同步延遲的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下 2013-06-06
-
mysql免安裝版1067錯(cuò)誤終極解決辦法圖文教程
這篇文章主要介紹了mysql免安裝版1067錯(cuò)誤終極解決辦法圖文教程,從筆記本到pc端。本文給大家介紹的非常詳細(xì),需要的朋友參考下 2017-01-01
-
MySQL 百萬(wàn)級(jí)分頁(yè)優(yōu)化(Mysql千萬(wàn)級(jí)快速分頁(yè))
MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考這個(gè)問(wèn)題還是從前天開(kāi)始。有過(guò)痛苦有過(guò)絕望,到現(xiàn)在充滿信心 2012-11-11
-
linux下mysql自動(dòng)備份數(shù)據(jù)庫(kù)與自動(dòng)刪除臨時(shí)文件
mysql自動(dòng)備份數(shù)據(jù)庫(kù)與自動(dòng)刪除臨時(shí)文件,有需要的朋友可以參考下 2013-02-02
最新評(píng)論
一、引入
實(shí)際開(kāi)發(fā)中往往需要針對(duì)兩張甚至更多張數(shù)據(jù)表進(jìn)行操作,而這多張表之間需要使用主鍵和外鍵關(guān)聯(lián)在一起,然后使用連接查詢來(lái)查詢多張表中滿足要求的數(shù)據(jù)記錄。
一條SQL語(yǔ)句查詢多個(gè)表,得到一個(gè)結(jié)果,包含多個(gè)表的數(shù)據(jù)。效率高。
多種連接查詢的類(lèi)型:
cross
natural
using
on
二、交叉連接(cross join)
交叉連接(CROSS JOIN)是對(duì)兩個(gè)或者多個(gè)表進(jìn)行笛卡兒積操作,所謂笛卡兒積就是關(guān)系代數(shù)里的一個(gè)概念,表示兩個(gè)表中的每一行數(shù)據(jù)任意組合的結(jié)果。
比如:有兩個(gè)表,左表有m條數(shù)據(jù)記錄,x個(gè)字段,右表有n條數(shù)據(jù)記錄,y個(gè)字段,則執(zhí)行交叉連接后將返回m*n條數(shù)據(jù)記錄,x+y個(gè)字段。笛卡兒積示意圖如圖所示。
我希望查找員工編號(hào)、員工姓名、部門(mén)編號(hào)和部門(mén)名稱這4個(gè)字段的數(shù)據(jù),在員工表emp中可以查詢到員工編號(hào)、員工姓名、部門(mén)編號(hào)的數(shù)據(jù),在部門(mén)表dept中可以查詢到字段部門(mén)名稱的數(shù)據(jù),如果想同時(shí)查找這些數(shù)據(jù),需要使用多表查詢語(yǔ)法,交叉連接cross join:
查詢員工表emp:
select * from emp;
查詢部門(mén)表dept:
select * from dept;
一條SQL查詢兩個(gè)表:
select * from emp cross join dept;
表emp14條記錄,表dept4條記錄,交叉連接查詢后,14*4=56條記錄,交叉連接就是對(duì)這兩個(gè)表進(jìn)行笛卡爾乘積操作,笛卡爾乘積沒(méi)有實(shí)際意義,但是有理論意義。
關(guān)于交叉連接的寫(xiě)法,MySQL中可以省略cross,Oracle中不可以省略不寫(xiě),上條SQL等價(jià)于:
select * from emp join dept;
三、自然連接(natural join)
交叉連接會(huì)查詢到許多冗余數(shù)據(jù),比如在員工表emp和部門(mén)表dept中,讓主鍵和外鍵關(guān)聯(lián)起來(lái)的外鍵deptno,沒(méi)有匹配到一起,造成數(shù)據(jù)冗余:
使用自然連接,可以自動(dòng)匹配所有的同名列,讓同名列只在查詢中展示一次,提高查詢效率,
select * from emp natural join dept;
可以指定查詢的部分字段:
select empno,ename,deptno,dname from emp natural join dept;
當(dāng)查詢一個(gè)字段時(shí),系統(tǒng)會(huì)分別從兩個(gè)關(guān)聯(lián)的表中查找,因此效率較低,為解決這個(gè)問(wèn)題,我們可以在查詢目標(biāo)字段時(shí),指定表名,格式為表名.字段名
select emp.empno,emp.ename,emp.deptno,dept.dname from emp natural join dept;
查詢結(jié)果和上述一致,但是查詢效率得到了提升。
此時(shí),如果表名過(guò)長(zhǎng),查詢的SQL也會(huì)過(guò)長(zhǎng),在查詢時(shí),我們可以為表起別名:
select e.empno,e.ename,d.dname,d.deptno from emp e natural join dept d;
四、內(nèi)連接
使用natural join 的缺點(diǎn):會(huì)自動(dòng)匹配表中所有的同名列,但是有的時(shí)候我們希望只匹配部分同名列,那么我們可以使用using子句,這屬于內(nèi)連接(inner join)
select * from emp as e inner join dept as d using(deptno);
using子句的缺點(diǎn):關(guān)聯(lián)的字段,必須是同名的
解決方法:使用內(nèi)連接中的on子句
select * from emp e inner join dept d on (e.deptno = d.deptno);
五、總結(jié)
多表查詢的類(lèi)型有:
- 交叉連接 cross join
- 自然連接 natural join
- 內(nèi)連接 - using子句
- 內(nèi)連接 - on子句
綜合來(lái)看:內(nèi)連接 - on子句的使用頻率最高。
六、補(bǔ)充
select * from emp e inner join dept d on (e.deptno = d.deptno) where sal > 3500;
條件:
1、篩選條件 where having
2、連接條件 on/using/natural
在SQL99語(yǔ)法當(dāng)中,篩選條件和連接條件是分開(kāi)的。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在MySQL中同時(shí)查找兩張表中的數(shù)據(jù)的示例
這篇文章主要介紹了在MySQL中同時(shí)查找兩張表中的數(shù)據(jù)的示例,即一次查詢操作返回兩張表的結(jié)果,需要的朋友可以參考下2015-07-07MySQL開(kāi)啟遠(yuǎn)程訪問(wèn)權(quán)限的最新方法
這篇文章主要給大家介紹了關(guān)于MySQL開(kāi)啟遠(yuǎn)程訪問(wèn)權(quán)限的最新方法,在MySQL中,要實(shí)現(xiàn)遠(yuǎn)程訪問(wèn),首先需要在MySQL服務(wù)端上開(kāi)啟相應(yīng)的權(quán)限,需要的朋友可以參考下2023-08-08減少mysql主從數(shù)據(jù)同步延遲問(wèn)題的詳解
本篇文章是對(duì)減少mysql主從數(shù)據(jù)同步延遲的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06mysql免安裝版1067錯(cuò)誤終極解決辦法圖文教程
這篇文章主要介紹了mysql免安裝版1067錯(cuò)誤終極解決辦法圖文教程,從筆記本到pc端。本文給大家介紹的非常詳細(xì),需要的朋友參考下2017-01-01MySQL 百萬(wàn)級(jí)分頁(yè)優(yōu)化(Mysql千萬(wàn)級(jí)快速分頁(yè))
MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考這個(gè)問(wèn)題還是從前天開(kāi)始。有過(guò)痛苦有過(guò)絕望,到現(xiàn)在充滿信心2012-11-11linux下mysql自動(dòng)備份數(shù)據(jù)庫(kù)與自動(dòng)刪除臨時(shí)文件
mysql自動(dòng)備份數(shù)據(jù)庫(kù)與自動(dòng)刪除臨時(shí)文件,有需要的朋友可以參考下2013-02-02