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