Mysql表的內(nèi)聯(lián)和外聯(lián)區(qū)別案例解析
表的連接分為內(nèi)連和外連
內(nèi)連接
內(nèi)連接實(shí)際上就是利用where子句對(duì)兩種表形成的笛卡兒積進(jìn)行篩選,我們前面文章的查詢都是內(nèi)連接,也是在開發(fā)過程中使用的最多的連接查詢。
語法
select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件;
案例
- 顯示
SMITH的名字和部門名稱
用之前的方法
mysql> select ename, dname from emp, dept where emp.deptno=dept.deptno and ename='SMITH'; +-------+----------+ | ename | dname | +-------+----------+ | SMITH | RESEARCH | +-------+----------+ 1 row in set (0.00 sec)
用標(biāo)準(zhǔn)內(nèi)連接
mysql> select ename, dname from emp inner join dept on emp.deptno=dept.deptno and ename='SMITH'; +-------+----------+ | ename | dname | +-------+----------+ | SMITH | RESEARCH | +-------+----------+ 1 row in set (0.00 sec)
兩種方式混合使用,更好的區(qū)分笛卡爾積和篩選條件
mysql> select ename, dname from emp inner join dept on emp.deptno=dept.deptno where ename='SMITH'; +-------+----------+ | ename | dname | +-------+----------+ | SMITH | RESEARCH | +-------+----------+ 1 row in set (0.00 sec)
外連接
外連接分為左外連接和右外連接
左外連接
如果聯(lián)合查詢,左側(cè)的表完全顯示我們就說是左外連接。
語法
select 字段名 from 表名1 left join 表名2 on 連接條件
案例
前期準(zhǔn)備:
mysql> create table stu (id int, name varchar(30));-- 學(xué)生表 Query OK, 0 rows affected (0.03 sec) mysql> desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(30) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from stu; +------+------+ | id | name | +------+------+ | 1 | jack | | 2 | tom | | 3 | kity | | 4 | nono | +------+------+ 4 rows in set (0.00 sec) mysql> create table exam (id int, grade int); -- 成績表 Query OK, 0 rows affected (0.02 sec) mysql> desc exam; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | grade | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into exam values(1, 56),(2,76),(11, 8); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from exam; +------+-------+ | id | grade | +------+-------+ | 1 | 56 | | 2 | 76 | | 11 | 8 | +------+-------+ 3 rows in set (0.00 sec)
- 查詢所有學(xué)生的成績,如果這個(gè)學(xué)生沒有成績,也要將學(xué)生的個(gè)人信息顯示出來
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)
右外連接
如果聯(lián)合查詢,右側(cè)的表完全顯示我們就說是右外連接。
語法
select 字段 from 表名1 right join 表名2 on 連接條件;
案例
- 對(duì)
stu表和exam表聯(lián)合查詢,把所有的成績都顯示出來,即使這個(gè)成績沒有學(xué)生與它對(duì)應(yīng),也要顯示出來
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í)
列出部門名稱和這些部門的員工信息,同時(shí)列出沒有員工的部門
運(yùn)用左外連接
mysql> select dept.deptno, dname, ename from dept left join emp on dept.deptno=emp.deptno order by dept.deptno asc; +--------+------------+--------+ | deptno | dname | ename | +--------+------------+--------+ | 10 | ACCOUNTING | CLARK | | 10 | ACCOUNTING | MILLER | | 10 | ACCOUNTING | KING | | 20 | RESEARCH | JONES | | 20 | RESEARCH | SMITH | | 20 | RESEARCH | ADAMS | | 20 | RESEARCH | SCOTT | | 20 | RESEARCH | FORD | | 30 | SALES | MARTIN | | 30 | SALES | ALLEN | | 30 | SALES | JAMES | | 30 | SALES | BLAKE | | 30 | SALES | WARD | | 30 | SALES | TURNER | | 40 | OPERATIONS | NULL | +--------+------------+--------+ 15 rows in set (0.00 sec)
運(yùn)用右外連接
mysql> select dept.deptno, dname, ename from emp right join dept on dept.deptno=emp.deptno order by dept.deptno asc; +--------+------------+--------+ | deptno | dname | ename | +--------+------------+--------+ | 10 | ACCOUNTING | CLARK | | 10 | ACCOUNTING | MILLER | | 10 | ACCOUNTING | KING | | 20 | RESEARCH | JONES | | 20 | RESEARCH | SMITH | | 20 | RESEARCH | ADAMS | | 20 | RESEARCH | SCOTT | | 20 | RESEARCH | FORD | | 30 | SALES | MARTIN | | 30 | SALES | ALLEN | | 30 | SALES | JAMES | | 30 | SALES | BLAKE | | 30 | SALES | WARD | | 30 | SALES | TURNER | | 40 | OPERATIONS | NULL | +--------+------------+--------+ 15 rows in set (0.00 sec)
?? 寫在最后:以上內(nèi)容是我在學(xué)習(xí)以后得一些總結(jié)和概括,如有錯(cuò)誤或者需要補(bǔ)充的地方歡迎各位大佬評(píng)論或者私信我交流?。?!
到此這篇關(guān)于Mysql表的內(nèi)聯(lián)和外聯(lián)區(qū)別案例解析的文章就介紹到這了,更多相關(guān)mysql內(nèi)聯(lián)和外聯(lián)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL定時(shí)備份之使用Linux下的crontab定時(shí)備份實(shí)例
這篇文章主要介紹了使用Linux下的crontab進(jìn)行MySQL定時(shí)備份的例子,需要的朋友可以參考下2014-04-04
mysql如何查找連續(xù)出現(xiàn)n次以上的數(shù)
這篇文章主要介紹了mysql如何查找連續(xù)出現(xiàn)n次以上的數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
MySQL insert into select 主鍵沖突解決方案
本文主要介紹了MySQL insert into select主鍵沖突解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
一文搞懂mysql如何處理json格式的字段(解析json數(shù)據(jù))
這篇文章主要給大家介紹了關(guān)于mysql如何處理json格式的字段的相關(guān)資料,MySQL中的JSON類型是一種數(shù)據(jù)類型,用于存儲(chǔ)和處理JSON(JavaScript Object Notation)格式的數(shù)據(jù),需要的朋友可以參考下2023-12-12

