首頁  >  文章  >  資料庫  >  MySQL查詢語句之複雜查詢

MySQL查詢語句之複雜查詢

赶牛上岸
赶牛上岸原創
2018-03-06 15:37:128984瀏覽

MySQL是一種關聯式資料庫管理系統,關聯式資料庫將資料保存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。在MySQL中常常會有很多複雜的查詢,為了節省大家的時間,小編總結了一些常用到的複雜查詢。

MySQL複雜查詢

MySQL複雜查詢

#。分組查詢:1、關鍵字:

GROUP BY 

#2、用法:#GROUP BY 語句用於結合合計函數 (例如 SUM) 

,根據一個或多個列對結果集進行分組,

合計函數常常需要添加 GROUP BY 語句。

下面的給了兩張表格一張是emp,一張是dept

,下面的查詢我們都對這兩張表進行操作,如下圖:

第一張: emp表格

第二張:

dept表格

現在我們查詢emp每個部門的薪資總和,語句如下:

SELECT deptno,SUM(sal)FROM emp GROUP BY deptno;

結果如下:

###註###:這裡我們查詢每個部門的工資(sal)總和,所以應該按照部門標號(deptno)進行分組,求和所以用了sum(); ###########################3、having:################### ########where 和having 都是做條件判斷,在介紹having前我們看下where 和having的區別##################### where######的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,###條件中不能包含聚合函數###,使用where條件顯示特定的行。 ######

having的作用是篩選滿足條件的群組,即在分組之後過濾數據,條件中經常包含聚合函數,使用having 條件顯示特定的群組,也可以使用多個分組標準進行分組。

例如:我們要查詢emp表中工資總和大於10000的部門編號,語句如下:

#SELECT deptno,SUM(sal)FROM emp GROUP BY deptno HAVING SUM(sal)>10000;

結果如下:

##這樣就查了薪資總和大於10000的部門編號為20,(為了理解也把工資總和顯示出來了)。

二、連表查詢:

依兩個或多個表中的列之間的關係,從這些表中查詢資料.

#1、inner join(內連結):

# 語法:select 欄位名稱1,欄位名稱2 from table1 [INNER] join table2 ON table1.字段名=table2.字段名;

註:內連接是從結果中刪除其他被連接的表中沒有匹配行的所有行,只能查詢出連接的表中都擁有的信#息,所以內連接可能會丟失信息,還有inner可以省略

例如:我們連接emp 和dept兩張表,查詢ename 和deptno,語句如下:

SELECT emp.ename,dept.deptno FROM emp INNER JOIN dept ON emp.deptno=dept.deptno;

還有種寫法:SELECT emp.ename,dept.deptno from emp,dept where emp.deptno=dept.deptno;



#################################### #####注意:原來dept表中有deptno為40的,但查詢出來就沒有了,這裡是因為emp中deptno欄位中沒有值為40,所以使用innner join連接時就自動刪除了dept表中deptno欄位值為40的記錄。 #####################2、外連接:##################2.1:左外連接: ###結果集保留左表的所有行,但只包含第二個表與第一個表相符的行。第二個表格對應的空白行被放入######NULL值。 ##########

2.2:右外連接:結果集保留右表的所有行,但只包含第二個表與第一個表相符的行。第二個表格對應的空白行被放入NULL值。

#左外連接和右外連接交換兩個表的位置就可以達到相同的效果。

現在我們進行分組和連表一起使用的查詢

例如:我們要查詢emp每個部門的薪資總和並且對應dept表中的部門名稱

解析這句話: 查詢的欄位是emp中的每個部門sal(薪資總和),這裡就要用到分組查詢,但是也要查詢到對應部門的部門名稱(dname),由於dname

是在dept表中,所以就應該連接emp和dept兩張表.

#思路1:我們先查詢出我們需要的所有欄位再進行分組,所以先連接再分組,語句如下:

#SELECT e.deptno,d.dname,SUM(e.sal)  FROM  emp  e INNER JOIN dept d ON e.deptno= d.deptno GROUP BY d.deptno;)(注意這裡使

#用了別名emp的別名是e,dept的別名是d)

#第二種寫法:

#SELECT  e.deptno,d.dname,SUM(e.sal) FROM emp e ,dept d WHEREe.deptno=d.deptno GROUP BY d.deptno;

##這兩種寫法的結果都是一樣,如下:



思路2:我們要查詢emp每個部門的工資總和,把這個結果集當作一個表(這裡稱為表1),再讓表1去連接dept表查詢出對應的部門名稱(dname);

逐步1:SELECT deptno,SUM(sal) FROM emp GROUP BY deptno;這個語句就查詢出了emp表中每個部門的薪資總和,現在我們再與dept

表格連接:

逐步2:SELECT xin.*,d .dname FROM(SELECT deptno,SUM(sal) FROM emp GROUP BY deptno) xin INNER JOIN dept d ON xin.deptno

#=d.deptno;這樣就查詢出了想要的結果,注意這裡的xin 是別名,結果如下:



#這裡的程式碼看起來很長,其實思路是很明確的,就是把第一個查詢結果當作一張表去連接另一張表,這樣的思路不容易出錯,多練習寫起來就

很熟練了。

三、分頁:#######

關鍵字:LIMIT

#語法:select * from tableName 條件limit 目前頁碼*頁面容量-1 ,頁面容量;

一般limit 都和order by 連用

例如我們要查詢emp表中按部門編號升序排列的5-10的記錄,每頁顯示5筆記錄,語句如下:

SELECT *FROM emp ORDER BY deptno LIMIT 4,5;

#這樣就可以查詢出想要的結果了,注意最後一個參數5是頁面容量,也就是本頁要顯示的行數(即本頁開始行到結束行的記錄條數)。

 例如我們要查詢17頁的記錄,每頁顯示10筆記錄:

## LIMIT 17*10-1,10;

四:IN

##關鍵字:In

 子查詢的回傳值結果不只一個條件就必須用IN 不能用"=";

註:LIMIT 都是放在最後的

相關推薦:

#MySQL5.7缺少my.ini檔案如何解決

關於mysql max 與where 間的執行問題小結

MySQL統計資料的詳細概述

#

以上是MySQL查詢語句之複雜查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn