MySql多表查詢分組查詢,子查,分頁查詢
阿新 • • 發佈:2018-12-22
一.多表查詢
查詢每個僱員的編號,姓名,職位,工資,部門名稱,部門位置。
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno;
1.全連線
查詢每個僱員的編號,姓名,職位,工資,部門名稱,部門位置。
SELECT e.empno,e.ename,e.job,e.sal,d.dname
FROM emp e JOIN dept d
ON(e.deptno=d.deptno);
2.左連線
左外連線就是在全連線的基礎上加上主表中的未匹配資料。
查詢左邊全部資料,新增右表中的資料,右邊沒有資料顯示為null
查詢出每一位僱員的編號、姓名、職位、部門編號、部門名稱。
SELECT e.empno,e.ename,e.job,d.deptno,d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
二.分組查詢
1.常見的集合函式:
sum() 求和
count() 統計
max() 最大值
min() 最小值
avg() 平均值
檢視所有僱員中最高的薪資。
SELECT MAX(sal) FROM emp;
統計 emp 中 有佣金的僱員的個數。
SELECT MAX(sal) FROM emp;
2.分組查詢,使用group by操作
1.按照部門編號分組,求出每個部門的人數,平均工資
SELECT deptno, COUNT(empno), AVG(sal)
FROM emp
GROUP BY deptno;
2.按照職位分組,求出每個職位的最高和最低工資
SELECT job, MAX(sal), MIN(sal)
FROM emp
GROUP BY job;
三. 分組查詢 HAVING 的使用
顯示非銷售人員工作名稱以及從事同一工作僱員的月工資的總和,並且要滿足從事同一工作的僱員的月工資合計大於$5000,輸出結果按月工資的合計升序排列:
SELECT job,SUM(sal) sum FROM emp WHERE job<>'SALESMAN' GROUP BY job HAVING SUM(sal)>5000 ORDER BY sum ASC;
顯示部門編號不是30的,的部門詳細資訊(部門編號、部門名稱、部門人數、部門月薪資總和),並要求 部門月工資總和大於$8000,輸出結果按部門月薪資的總和降序排列。
SELECT d.deptno,d.dname,COUNT(*) 人數,SUM(e.sal) 月總收入 FROM dept d,emp e WHERE d.deptno=e.deptno AND d.deptno!=30 GROUP BY d.deptno,d.dname HAVING SUM(e.sal) >8000 ORDER BY SUM(e.sal) DESC;
三.子查詢
子查詢:指的就是在一個查詢之中嵌套了其他的若干查詢,巢狀子查詢之後的查詢SQL語句
一般情況下:- WHERE:子查詢一般只返回單行單列、多行單列、單行多列的資料;
- FROM:子查詢返回的一般是多行多列的資料,當作一張臨時表出現。
.1子查詢在 WHERE 中出現
查詢出工資比SMITH還要高的全部僱員資訊SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename='SMITH');
2 子查詢返回 單行多列 資料(少用)
SELECT * FROM emp WHERE (job,sal) in (SELECT job,sal FROM emp WHERE ename='SCOTT');
3.子查詢返回 多行單列 資料
1.>ANY:比子查詢中返回記錄最小的還要大的資料;SELECT * FROM emp WHERE sal >ANY( SELECT sal FROM emp WHERE job='MANAGER');
2.>ALL:比子查詢中返回的最大的記錄還要大
SELECT * FROM emp WHERE sal >ALL(SELECT sal FROM emp WHERE job='MANAGER');
4.子查詢返回 多行多列 資料(當臨時表使用)
查詢出每個部門的編號、名稱、位置、部門人數、平均工資SELECT d.deptno,d.dname,d.loc,temp.count,temp.avg FROM dept d,( SELECT deptno dno,COUNT(empno) count,AVG(sal) avg FROM emp GROUP BY deptno) temp WHERE d.deptno=temp.dno;
四.分頁查詢 limit
1.select * from emp limit 0(從哪兒開始),5(查詢多條資料);
2.要查詢 0 到 5 條資料
select * from emp limit 0,5;
3. 比如 分頁的操作
15條資料 每一頁 4條件 4頁
第1頁資料: 0 - 4;
select * from emp limit 0,4; -- currentPage = 1
第2頁資料: 4 - 8;
select * from emp limit 4,4;-- currentPage = 2
第3頁資料: 8 - 12;
select * from emp limit 8,4; -- currentPage
第4頁資料: 12 - 15;
select * from emp limit 12,4;
當前的頁數 currentPage = 1,2,3
每頁的大小 pageSize = 4;
分頁的總結:
select * from emp limit (currentPage - 1) * pageSize ,pageSize;