天天看點

mysql查詢_MySQL複雜查詢

一、基本介紹-為什麼需要多表查詢

mysql查詢_MySQL複雜查詢

說明: 我們在實際開發中,必然會遇到,資料來自不同的表,這時,我們就需要使用多表聯合查詢。

快速入門案例

mysql查詢_MySQL複雜查詢

?顯示雇員名,雇員工資及所在部門的名字

分析1: 因為上面的資料來自 emp 表和  dept 是以聯合查詢

select * from emp,dept

mysql查詢_MySQL複雜查詢

加強: ?顯示雇員名,雇員工資及所在部門的名字, 顯示工資的級别

思考(1) 一共要用到 3 張表 [emp, dept, salgrade]

select * from emp, dept, salgrade;

再次過濾

mysql查詢_MySQL複雜查詢

增加一個過濾條件即可

mysql查詢_MySQL複雜查詢

可以根據需要選擇我們要的字段

mysql查詢_MySQL複雜查詢

說明:如果我們顯示額字段名,沒有沖突【沒有相同的,則可以不要表名】.

?如何顯示部門号為10的部門名、員工名和工資

select dept.dname,emp.sal  from  emp , detp  where emp.deptno = dept.deptno and dept.deptno=10

mysql查詢_MySQL複雜查詢

顯示各個員工的姓名,工資,及其工資的級别

mysql查詢_MySQL複雜查詢

二、自連接配接

基本介紹

mysql查詢_MySQL複雜查詢

案例說明

mysql查詢_MySQL複雜查詢

比如顯示’FORD’的上級名字

思路: 我們先查詢到'ford' 的上級的編号

思路: 當得到 'ford'  上級編号後,就可以通過這個編号,擷取到這個人的所有資訊

mysql查詢_MySQL複雜查詢

要求大家使用多表查詢.

mysql查詢_MySQL複雜查詢

顯示所有員工的上級名字

mysql查詢_MySQL複雜查詢

三、子查詢

基本介紹:

mysql查詢_MySQL複雜查詢

Where型子查詢:内層的查詢結果最為外層sql的比較條件。如果 where 列=(内層sql),則内層sql傳回的必是單行單列,單個值,如果 where 列 in (内層sql), 則内層sql隻傳回單列,可以多行.

Form型子查詢:把select後的結果集取個别名當做表來用。

Exists型子查詢:先擷取外層sql所有資料,并把資料帶入到内查詢條件中,看能否查到資料。

示例:查詢欄目表,看cat_id對應的商品是否存在,如果存在,則這行記錄就要,否則不要;

mysql查詢_MySQL複雜查詢
mysql查詢_MySQL複雜查詢

關鍵字主要包括:in  not in  =  !=  exists  not exists等

mysql查詢_MySQL複雜查詢
mysql查詢_MySQL複雜查詢

如果子查詢記錄數唯一,還可以用 = 代替 in;

四、子查詢的分類

mysql查詢_MySQL複雜查詢

案例說明

請思考:如何顯示與SMITH同一部門的所有員工?

mysql查詢_MySQL複雜查詢

練習:如何查詢和部門10的工作相同的雇員的名字、崗位、工資、部門号,但是不含10自己的.

mysql查詢_MySQL複雜查詢

綜合查詢

mysql查詢_MySQL複雜查詢

說明: 在 ecs_goods 表中檢視 ,要求顯示 每個類别中,價格最高的商品的名稱和價格。

思路:

先根據 類别和 價格進行排序處理

mysql查詢_MySQL複雜查詢

把上面的結果,看做是一個臨時表,然後對其進行分組

mysql查詢_MySQL複雜查詢

五、all/any關鍵字的使用

案例說明:

請思考:如何顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門号

mysql查詢_MySQL複雜查詢

請思考:如何顯示工資比部門30的任意一個員工的工資高的員工的姓名、工資和部門号

mysql查詢_MySQL複雜查詢

六、多列子查詢

基本介紹:

mysql查詢_MySQL複雜查詢

說明: 多列子查詢就是指,我們的子查詢的結果是多列,而不是單列 。

請查詢和宋江數學,英語,國文   完全相同的學生

mysql查詢_MySQL複雜查詢

七、在from 子句中使用子查詢

基本介紹: 即你的子查詢出現在from 子句中.這裡要用到資料查詢的小技巧,把一個子查詢當作一個臨時表使用

案例說明:

請思考:如何顯示高于自己部門平均工資的員工的資訊

思路:先擷取到各個部門的平均工資,然後将其看成臨時表,具體sql語句如下

mysql查詢_MySQL複雜查詢

第二種解決方法

mysql查詢_MySQL複雜查詢

請思考:查找每個部門工資最高的人的詳細資料?

思路:先查詢到每個部門工資最高的人.

mysql查詢_MySQL複雜查詢

練習:

mysql查詢_MySQL複雜查詢

方法: 多表查詢,子查詢

mysql查詢_MySQL複雜查詢

第二種方式,使用了子查詢

mysql查詢_MySQL複雜查詢

八、自我複制(蠕蟲複制)

基本介紹:

有時,為了對某個sql語句進行效率測試,我們需要海量資料時,可以使用此法為表建立海量資料

案例說明

我們希望把emp 表的資料,快速的變成80000

步驟如下[自我複制]

mysql查詢_MySQL複雜查詢
mysql查詢_MySQL複雜查詢
mysql查詢_MySQL複雜查詢

九、删除某個表中的重複記錄

mysql查詢_MySQL複雜查詢

要求,将上面表中重複的記錄删除.

思路

先建立一張空表(temp_hsp100),空表的結構和 hsp100一樣.

mysql查詢_MySQL複雜查詢

把hsp100進行 distinct ,把資料導入到 (temp_hsp100)

mysql查詢_MySQL複雜查詢

删除 hsp100

mysql查詢_MySQL複雜查詢

将temp_hsp100 改成 hsp100

mysql查詢_MySQL複雜查詢

十、union合并查詢

基本介紹: 有時在實際應用中,為了合并多個select語句的結果,可以使用集合操作符号 union , union all

注意:隻要各語句取出的字段數要相同,字段名不是必須相同,會以第一個sql的字段名為準

案例說明

union 使用: 該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中重複行。過濾會比較費時,推薦使用union all

mysql查詢_MySQL複雜查詢

union all 使用: 該操作符用于取得兩個結果集的并集。當使用該操作符時,不會自動去掉結果集中重複行。

mysql查詢_MySQL複雜查詢

思考如下,内層語句的desc怎麼沒發揮作用呢?

mysql查詢_MySQL複雜查詢

思考如下語句:

(SELECT goods_id,cat_id,goods_name,shop_price FROM goods WHERE cat_id = 4 ORDER BY shop_price DESC)

UNION

(SELECT goods_id,cat_id,goods_name,shop_price FROM goods WHERE cat_id = 5 ORDER BY shop_price DESC)

order by shop_price asc;

外層語句還要對最終結果,再次排序.

是以,内層的語句的排序,就沒有意義.

是以:内層的order by 語句單獨使用,不會影響結果集,僅排序,

在執行期間,就被Mysql的代碼分析器給優化掉了.

内層的order by 必須能夠影響結果集時,才有意義.

比如 配合limit 使用. 如下例.

mysql查詢_MySQL複雜查詢

查出: 第3個欄目下,價格前3高的商品,和第4個欄目下,價格前2高的商品.

用union來完成,這一次:内層的order by 發揮了作用,因為有limit ,order 會實際影響結果集,有意義.

繼續閱讀