1. 程式人生 > >MySql多表查詢分組查詢,子查,分頁查詢

MySql多表查詢分組查詢,子查,分頁查詢

一.多表查詢

 查詢每個僱員的編號,姓名,職位,工資,部門名稱,部門位置。
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 的使用

  1. 顯示非銷售人員工作名稱以及從事同一工作僱員的月工資的總和,並且要滿足從事同一工作的僱員的月工資合計大於$5000,輸出結果按月工資的合計升序排列:

    SELECT job,SUM(sal) sum
    FROM emp
    WHERE job<>'SALESMAN'
    GROUP BY job
    HAVING SUM(sal)>5000
    ORDER BY sum ASC;
  2. 顯示部門編號不是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;