首先,為了方便說明問題,建立兩個表emp(僱員資訊)和dept(僱員部門資訊),其資料如下:
在先前的文章中,我們分享了單表查詢的方法,但是在實際應用中,我們要查的資料很可能不在同一個表中,而是來自於不同的表。多表查詢如果不加任何條件,得到的結果稱為笛卡兒積。 例如,找出僱員名、僱員工資以及部門所在的名字。
可以發現,結果是這樣的,從第一個表中選出第一筆記錄,和第二個表中的所有所有記錄進行組合,然後再從第一個表中取出第二張記錄,和第二張表的所有記錄進行組合,這樣的結果是沒有實際意義的。我們需要的是emp.deptno = dept.deptno欄位的記錄。
自連接
自連接是指在同一張表連接查詢
顯示員工FORD的上級領導的名字
子查詢
子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢。
單行子查詢:子查詢的查詢結果只有一行
顯示和SMITH同一部門的員工
多行子查詢(in ,all, any):傳回多筆記錄的子查詢
查詢和10好部門的工作相同的官員的名字、工作、工資、部門號,但不包括10號自己的資訊
顯示薪資比部門編號為30的所有員工的薪資高的員工的姓名、薪資和部門號
#顯示薪資比部門編號為30的任意員工的薪資高的員工的姓名、薪資和部門號碼
#多列子查詢:查詢傳回多個列資料的子查詢語句
查詢和SMITH的部門和職位完全相同的僱員,不含SMITH本人
#from子句中使用子查詢
顯示高於自己部門的平均薪資的員工資訊
查找每個部門薪水最高的人的ename, job, sal
顯示每個部門的資訊(部門名稱、編號、地址)和人員數量
這裡有兩種方法可以使用,但是經驗證,當資料非常多的時候from子查詢的效率是高於多表查詢的。
刪除表中的重複記錄
已知一個表tt中有重複的資料
建立一張空表tmp_tt,空表的結構與表tt的結構相同;create table tmp_tt like tt;
將tt表進行distinct,將資料匯入空表中;insert into tmp_tt select distinct * from tt;
刪除原表ttdrop table tt;
將tmp_tt改名為ttalter table tmp_tt rename tt;
合併查詢
在實際應用中,為了合併多個select的執行結果,可以使用union,union all集合運算子
1、union運算子用於取得兩個結果的並集,並再自動去掉重複行,查找薪資大於2500和職位Manger的人
2. union all 與union類似,但不會自動去重
例如:與or類似
外鍵
外鍵定義主表和從表的關係,外鍵約束主要是定義在從表上,主表必須是有主鍵或唯一鍵。當定義外鍵後,要求外鍵列資料必須在主表列存在或為NULL。
例如:建立一個主表class,從表stu
#由上圖,我們可以知道主鍵不能為null,但是外鍵可以為null,同時不能存在外鍵有的資料而主表中不存在。
更多相關問題請訪問PHP中文網:mysql影片教學
以上是mysql的多表查詢詳細解說的詳細內容。更多資訊請關注PHP中文網其他相關文章!