MySQL查詢語句之複雜查詢_day04
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 JOINdept 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:
分步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 都是放在最後的。
今天的筆記就到這了,裡面也還有完善的地方,以後的學習過程中我再慢慢訂正,大家也可以指出來