MySQL內(nèi)外連接實(shí)戰(zhàn)詳解

表的連接分類(lèi)
表的連接主要分為內(nèi)連接和外連接兩種類(lèi)型。
內(nèi)連接
內(nèi)連接實(shí)際上就是利用WHERE子句對(duì)兩種表形成的笛卡爾積進(jìn)行篩選,這是我們前面學(xué)習(xí)的主要查詢(xún)方式,也是開(kāi)發(fā)過(guò)程中使用最多的連接查詢(xún)。
我們除了可以使用“ , ”來(lái)隔離表,我們還可以使用下面的語(yǔ)法:和我們之前笛卡爾積,后面使用where條件篩選是一樣的效果的!只不過(guò)下面的寫(xiě)法是比較標(biāo)準(zhǔn)的!
SELECT 字段 FROM 表1 INNER JOIN 表2 ON 連接條件 AND 其他條件;
前面學(xué)習(xí)的大部分查詢(xún)都屬于內(nèi)連接。
案例:顯示SMITH的名字和部門(mén)名稱(chēng)
傳統(tǒng)寫(xiě)法:
SELECT ename, dname FROM EMP, DEPT WHERE EMP.deptno=DEPT.deptno AND ename='SMITH';
mysql> select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno and emp.ename='SMITH'; +-------+----------+ | ename | dname | +-------+----------+ | SMITH | RESEARCH | +-------+----------+ 1 row in set (0.00 sec)
標(biāo)準(zhǔn)內(nèi)連接寫(xiě)法:
SELECT ename, dname FROM EMP INNER JOIN DEPT ON EMP.deptno=DEPT.deptno AND ename='SMITH';
mysql> select emp.ename, dept.dname from emp inner join dept on emp.deptno=dept.deptno and emp.ename='SMITH'; +-------+----------+ | ename | dname | +-------+----------+ | SMITH | RESEARCH | +-------+----------+ 1 row in set (0.00 sec)
外連接
外連接分為左外連接和右外連接。
為主的在哪一邊,基本就是使用那一邊的連接方式!--- 后面的練習(xí)部分體現(xiàn)?。。?/strong>
左外連接
如果聯(lián)合查詢(xún)時(shí),左側(cè)的表完全顯示(左側(cè)的信息不要做任何的過(guò)濾和篩選,完全保留)(即使右側(cè)沒(méi)有匹配記錄),我們就稱(chēng)為左外連接。
僅僅將 inner join 改成了 left join
SELECT 字段名 FROM 表名1 LEFT JOIN 表名2 ON 連接條件
創(chuàng)建測(cè)試表:
CREATE TABLE stu (id INT, name VARCHAR(30)); -- 學(xué)生表 INSERT INTO stu VALUES(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono'); CREATE TABLE exam (id INT, grade INT); -- 成績(jī)表 INSERT INTO exam VALUES(1, 56),(2,76),(11, 8); mysql> select * from stu; +------+------+ | id | name | +------+------+ | 1 | jack | | 2 | tom | | 3 | kity | | 4 | nono | +------+------+ 4 rows in set (0.00 sec) mysql> select * from exam; +------+-------+ | id | grade | +------+-------+ | 1 | 56 | | 2 | 76 | | 11 | 8 | +------+-------+ 3 rows in set (0.00 sec)
查詢(xún)所有學(xué)生的成績(jī),如果學(xué)生沒(méi)有成績(jī)也要顯示個(gè)人信息:
SELECT * FROM stu LEFT JOIN exam ON stu.id=exam.id;
mysql> select * from stu left join exam on stu.id=exam.id; +------+------+------+-------+ | id | name | id | grade | +------+------+------+-------+ | 1 | jack | 1 | 56 | | 2 | tom | 2 | 76 | | 3 | kity | NULL | NULL | | 4 | nono | NULL | NULL | +------+------+------+-------+ 4 rows in set (0.00 sec)
這個(gè)查詢(xún)會(huì)顯示左邊表的所有記錄,即使右邊表沒(méi)有匹配的記錄。
右外連接
如果聯(lián)合查詢(xún)時(shí),右側(cè)的表完全顯示(即使左側(cè)沒(méi)有匹配記錄),我們就稱(chēng)為右外連接。
SELECT 字段 FROM 表名1 RIGHT JOIN 表名2 ON 連接條件;
對(duì)stu表和exam表聯(lián)合查詢(xún),顯示所有成績(jī),即使沒(méi)有對(duì)應(yīng)學(xué)生:
SELECT * FROM stu RIGHT JOIN exam ON stu.id=exam.id;
mysql> select * from stu right join exam on stu.id=exam.id; +------+------+------+-------+ | id | name | id | grade | +------+------+------+-------+ | 1 | jack | 1 | 56 | | 2 | tom | 2 | 76 | | NULL | NULL | 11 | 8 | +------+------+------+-------+ 3 rows in set (0.00 sec)
練習(xí):
列出部門(mén)名稱(chēng)和這些部門(mén)的員工信息,同時(shí)列出沒(méi)有員工的部門(mén)
方法一(使用左連接):
SELECT d.dname, e.* FROM dept d LEFT JOIN emp e ON d.deptno=e.deptno;
mysql> select d.dname, e.* from dept d left join emp e on d.deptno=e.deptno; +------------+--------+--------+-----------+------+---------------------+---------+---------+--------+ | dname | empno | ename | job | mgr | hiredate | sal | comm | deptno | +------------+--------+--------+-----------+------+---------------------+---------+---------+--------+ | ACCOUNTING | 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 | | ACCOUNTING | 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 | | ACCOUNTING | 007782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 | | RESEARCH | 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 | | RESEARCH | 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 | | RESEARCH | 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 | | RESEARCH | 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 | | RESEARCH | 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 | | SALES | 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 | | SALES | 007844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 | | SALES | 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 | | SALES | 007654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 | | SALES | 007521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 | | SALES | 007499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 | | OPERATIONS | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | +------------+--------+--------+-----------+------+---------------------+---------+---------+--------+ 15 rows in set (0.00 sec)
方法二(使用右連接):
SELECT d.dname, e.* FROM emp e RIGHT JOIN dept d ON d.deptno=e.deptno;
mysql> select d.dname, e.* from emp e right join dept d on d.deptno=e.deptno; +------------+--------+--------+-----------+------+---------------------+---------+---------+--------+ | dname | empno | ename | job | mgr | hiredate | sal | comm | deptno | +------------+--------+--------+-----------+------+---------------------+---------+---------+--------+ | ACCOUNTING | 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 | | ACCOUNTING | 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 | | ACCOUNTING | 007782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 | | RESEARCH | 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 | | RESEARCH | 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 | | RESEARCH | 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 | | RESEARCH | 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 | | RESEARCH | 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 | | SALES | 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 | | SALES | 007844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 | | SALES | 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 | | SALES | 007654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 | | SALES | 007521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 | | SALES | 007499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 | | OPERATIONS | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | +------------+--------+--------+-----------+------+---------------------+---------+---------+--------+ 15 rows in set (0.00 sec)
實(shí)戰(zhàn)OJ題目
到此這篇關(guān)于MySQL內(nèi)外連接詳解的文章就介紹到這了,更多相關(guān)mysql內(nèi)外連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
win2003服務(wù)器下配置 MySQL 群集(Cluster)的方法
MySQL 群集是 MySQL 適合于分布式計(jì)算環(huán)境的高可用、高冗余版本。它采用了 NDB Cluster 存儲(chǔ)引擎,允許在 1 個(gè)群集中運(yùn)行多個(gè) MySQL 服務(wù)器。2010-12-12
Pentaho Kettle工具實(shí)現(xiàn)SQL Server到MySQL數(shù)據(jù)庫(kù)的定時(shí)數(shù)據(jù)同步方案
本文介紹了使用Kettle工具實(shí)現(xiàn)SQL Server到MySQL數(shù)據(jù)庫(kù)的定時(shí)數(shù)據(jù)同步方案,首先需放置數(shù)據(jù)庫(kù)驅(qū)動(dòng)并創(chuàng)建目標(biāo)表結(jié)構(gòu),通過(guò)圖形化界面配置轉(zhuǎn)換流程,該方案無(wú)需編寫(xiě)代碼,完全通過(guò)圖形化操作即可實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)的定時(shí)數(shù)據(jù)同步2026-03-03
Mysql索引的類(lèi)型和優(yōu)缺點(diǎn)詳解
這篇文章主要為大家詳細(xì)介紹了Mysql索引的類(lèi)型和優(yōu)缺點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
詳解MySQL主從復(fù)制實(shí)戰(zhàn) - 基于GTID的復(fù)制
本篇文章主要介紹了MySQL主從復(fù)制實(shí)戰(zhàn) - 基于GTID的復(fù)制,基于GTID的復(fù)制是MySQL 5.6后新增的復(fù)制方式.有興趣的可以了解一下。2017-03-03
Docker部署MySQL8.0從拉取鏡像到配置遠(yuǎn)程訪(fǎng)問(wèn)完整指南
在開(kāi)發(fā)測(cè)試環(huán)境中,通過(guò)Docker部署MySQL 8.0可實(shí)現(xiàn)快速啟動(dòng)、環(huán)境隔離和數(shù)據(jù)持久化,這篇文章主要介紹了Docker部署MySQL8.0從拉取鏡像到配置遠(yuǎn)程訪(fǎng)問(wèn)的相關(guān)資料,需要的朋友可以參考下2026-05-05
MySQL中跨表排序和指定類(lèi)型置頂?shù)乃姆N寫(xiě)法詳解
這篇文章主要介紹了MySQL跨表排序和固定置頂?shù)膬煞N排序需求的實(shí)現(xiàn)方法,并結(jié)合實(shí)戰(zhàn)場(chǎng)景分析了四種解決方案,通過(guò)具體SQL示例和適用場(chǎng)景分析,幫助開(kāi)發(fā)者更好地理解和應(yīng)用這些排序策略2026-06-06
MySQL視圖中用變量實(shí)現(xiàn)自動(dòng)加入序號(hào)功能
在 MySQL 中,視圖不支持直接使用變量來(lái)生成序號(hào),因?yàn)橐晥D是基于靜態(tài) SQL 查詢(xún)定義的,而變量是在運(yùn)行時(shí)動(dòng)態(tài)計(jì)算的,不過(guò),你可以通過(guò)一些技巧來(lái)實(shí)現(xiàn)類(lèi)似的效果,以下是一個(gè)常見(jiàn)的方法,使用子查詢(xún)來(lái)初始化變量,然后在視圖中使用這些變量,需要的朋友可以參考下2024-10-10
遠(yuǎn)程訪(fǎng)問(wèn)MySQL數(shù)據(jù)庫(kù)的方法小結(jié)
MySQL數(shù)據(jù)庫(kù)不允許從遠(yuǎn)程訪(fǎng)問(wèn)如何辦?本文提供了 3種解決思路方法2009-12-12
mysql中索引使用不當(dāng)速度比沒(méi)加索引還慢的測(cè)試
mysql的索引使用不當(dāng)速度比沒(méi)加索引還慢,我們舉個(gè)例子來(lái)解釋一下。2011-08-08

