数据库的多表查询
之前介紹了
- 數(shù)據(jù)庫基本常識(shí)的簡介及mysql安裝
- 結(jié)構(gòu)化查詢語言sql
- 數(shù)據(jù)庫表介紹
- 數(shù)據(jù)庫的數(shù)據(jù)類型
- 數(shù)據(jù)操作語言DML——數(shù)據(jù)的增刪改查
- 數(shù)據(jù)庫對(duì)象操作語言DDL——修改、刪除數(shù)據(jù)庫表等對(duì)象
- 數(shù)據(jù)庫的完整性約束
- 數(shù)據(jù)庫查詢語言——DQL
- 數(shù)據(jù)庫中的函數(shù)
- 數(shù)據(jù)庫的group by分組和having篩選
- select語句總結(jié)(DQL)
下面介紹一下多表查詢。
多表查詢(內(nèi)連接:這里的內(nèi)連接不只是inner,內(nèi)連接只能展示出匹配成功的部分)
- 笛卡爾積:所有的匹配形式都進(jìn)行一個(gè)匹配。如果表1中有5條記錄,表2中有10條,則這條命令共查詢出5*10條記錄,會(huì)進(jìn)行一一對(duì)應(yīng)。
- cross join:交叉連接查詢,也就是會(huì)一一對(duì)應(yīng)起來,其中mysql數(shù)據(jù)庫中cross可以省略。用法:select * from 表1 cross join 表2;或者select * from 表1 join 表2;
- natural join:自然連接,相比交叉連接而言,自然連接會(huì)自動(dòng)匹配所有的同名列。如果兩列內(nèi)容相同,則會(huì)進(jìn)行關(guān)聯(lián),并且同名列只展示一次。用法:select * from 表1 natural join 表2;
- 表名.字段:指定想要獲取的字段來自哪個(gè)表。表名太長的時(shí)候,可以使用別名,防止sql語句的過長導(dǎo)致可讀性較差。
- inner join以及using子句:內(nèi)連接,因?yàn)樽匀贿B接會(huì)匹配所有的同名列,但是有時(shí)候我們只需要匹配部分的同名列,因此可以使用using子句,但是其實(shí)是內(nèi)連接(inner join)的一個(gè)子句,并且inner可以省略不屑。用法:select * from 表1 join 表2 using 需要使用的同名列;或者select * from 表1 inner join 表2 using 需要使用的同名列;
- inner join以及on子句:自然連接和內(nèi)連接一般是同名的時(shí)候,但是不同名的時(shí)候可以使用on子句。用法:select * from 表1 inner join 表2 on (表1.字段 = 表2.字段)
總結(jié):多表查詢的連接類型包括一下四種,其中第四種用的較多。并且上面的sql后面可以加where條件。其實(shí)上面的內(nèi)容是from后面的表的一部分。
- 交叉連接(cross join)
- 自然連接(natural join)
- 內(nèi)連接using子句(inner join 表名 using 需要的同名列):其中再使用using子句可以指定同名列;
- 內(nèi)連接on子句(inner join 表名 on 表名.不同名列=表名.不同名列):使用on可以將不同名列也進(jìn)行關(guān)聯(lián)。
問題:上面的連接中,如果兩個(gè)之間關(guān)聯(lián)的時(shí)候,關(guān)聯(lián)字段存在null。則這時(shí)候這行數(shù)據(jù)不進(jìn)行展示。換句話說,上面的連接方式在多表查詢的時(shí)候,只能顯示出匹配成功的部分。
多表查詢(外連接,可以將沒有匹配的也進(jìn)行展示,其中outer關(guān)鍵字可以省略)
- left outer join:左外連接,也就是將左邊的表的內(nèi)容全部展示出來。用法:select * from 表1 left outer join 表2 on 表1.字段=表2.字段;這里就是將表1中的信息都展示出來,如果匹配失敗,表2中展示的是空。
- right outer join:右外連接,也就是將右邊的表的內(nèi)容全部展示出來。用法:select * from 表1 right outer join 表2 on 表1.字段=表2.字段;這里就是將表2中的信息都展示出來,如果匹配失敗,表1中展示的是空。
- full outer join:全外連接(mysql不支持,oracle中支持),也就是將右邊的表的內(nèi)容全部展示出來。用法:select * from 表1 full outer join 表2 on 表1.字段=表2.字段;這里就是將表1表、2中的信息全都展示出來,如果匹配失敗,則另外部分是空即可。
- mysql使用union代替full:其實(shí)說白了full就是將left和right進(jìn)行去一個(gè)并集,mysql不支持full,那我們可以去并集(union關(guān)鍵字)進(jìn)行。用法select * from 表1 left outer join 表2 on 表1.字段=表2.字段 union select * from 表1 right outer join 表2 on 表1.字段=表2.字段;
- union all:使用union的話,會(huì)去掉重復(fù)的部分,而union all則不會(huì)去除重復(fù)的部分。
- mysql中對(duì)集合操作范圍比較弱,只支持并集操作(union)。Oracle對(duì)并集、交集、差集都支持。
上面的都是基于兩張表的,三張表就是上面的兩者表關(guān)聯(lián)先形成一張表,然后接著關(guān)聯(lián)第三張。
- 舉個(gè)簡單例子:查詢員工編號(hào)、姓名、薪水、部門編號(hào)、部門名稱、薪水等級(jí)。其中前面4個(gè)在emp中,部門名稱在dept中,薪水等級(jí)在salgrade中。
- select e.empno,e.ename,e.sal,e.deptno,d.dname,s.grade from emp e inner join dept d on e.deptno = d.deptno inner join salgrade s on e.sal between s.losal and s.hisal;
總結(jié)
- 上一篇: jQuery 简单案例
- 下一篇: 【数据分析面试】大厂高频SQL笔试题(二