03 DQL(數據庫查詢語言)

03 DQL(數據庫查詢語言)


一、簡單查詢

  1. 語法格式:select [字段1],[字段2],[字段3],··· from [表名] ;
  2. 查詢字段可以參與速學運算:select name,num*10 from emp;
  3. 查詢時還可以給字段別名:select name,num*10 as n from emp;as可以省略。
  4. 查詢所有字段:select * from emp;

二、條件查詢

  1. 語法格式:select [字段1],[字段2],[字段3],··· from [表名] where [條件];

  2. 按條件表達式篩選
    簡單條件運算符:> < = != <> >= <=

  3. 按邏輯表達式篩選
    邏輯運算符:
    作用:用於連接條件表達式
    && || !
    and or not

    &&和and:兩個條件都爲true,結果爲true,反之爲false
    ||或or: 只要有一個條件爲true,結果爲true,反之爲false
    !或not: 如果連接的條件本身爲false,結果爲true,反之爲false

  4. 模糊查詢

    • like (必須掌握兩個特殊字符,一個是%,一個是_。%代表任意多個字符,_代表任意1個字符)
    /*示例1:找出名字中有'O'的員工*/
    select ename from emp where ename like '%O%';
    
    /*找出名字中第二個字母是‘A’的員工*/
     select ename from emp where ename like '_A%';
    
    /*找出名字中有下劃線的員工*/
    select ename from emp where ename like '%\_%';
    +-------+
    | ename |
    +-------+
    | JOH_N |
    +-------+
    
    /*找出名字中最後一個字母是‘T’的員工*/
    select ename from emp where ename like '%T';
    +-------+
    | ename |
    +-------+
    | SCOTT |
    +-------+
    
    • between and
    • in (in運算和 or 類似)
    /*如找出工作崗位是'MANAGER'和'SALESMAN'的員工*/
    orselect ename,job from emp where job='MANAGER' or job='SALESMAN';
    
    inselect ename,job from emp where job in('MANAGER','SALESMAN');
    
    結果:
    +--------+----------+
    | ename  | job      |
    +--------+----------+
    | ALLEN  | SALESMAN |
    | WARD   | SALESMAN |
    | JONES  | MANAGER  |
    | MARTIN | SALESMAN |
    | BLAKE  | MANAGER  |
    | CLARK  | MANAGER  |
    | TURNER | SALESMAN |
    +--------+----------+
    
    • is null

三、排序

注意:asc升序排,desc降序排,不寫默認升序。

/*按照工資升序排*/
select ename,sal from emp order by sal;

/*按照工資降序排*/
 select ename,sal from emp order by sal desc;

/*按照工資的降序排列,工資一樣的按照名字的排列*/
select ename,sal from emp order by sal desc,ename asc;
+----------+---------+
| ename    | sal     |
+----------+---------+
| ADAMS    |   11000 |
| JAMES    |    9500 |
| KING     |    5000 |
| FORD     |    3000 |
| SCOTT    |    3000 |
| JONES    |    2975 |
| BLAKE    |    2850 |
+----------+---------+

/*找出工作崗位是‘SALESMAN’的員工,並按照工資降序排列*/
select ename,job,sal from emp where job='salesman' order by sal desc;
+--------+----------+------+
| ename  | job      | sal  |
+--------+----------+------+
| ALLEN  | SALESMAN | 1600 |
| TURNER | SALESMAN | 1500 |
| WARD   | SALESMAN | 1250 |
| MARTIN | SALESMAN | 1250 |
+--------+----------+------+

四、分組函數

  1. count 計數

  2. sum 求和

  3. avg 平均值

  4. max 最大值

  5. min 最小值

  6. 分組函數是對某一組數據進行操作

  7. 示例

    /*找出最高工資*/
    select max(sal) from emp;
    
    /*找出最低工資*/
     select min(sal) from emp;
    
    /*找出工資總和*/
    select sum(sal) from emp;
    
    /*找出平均工資*/
    select avg(sal) from emp;
    
    /*找出總人數*/
     select count(ename) from emp;
    
  8. 分組函數一共5個,分組函數又叫多行處理函數,其特點是輸入多行輸出一行,且忽略NULL。

  9. SQL 語句有一條規則,分組函數不能直接使用在where子句當中。
    如:

/*找出工資高於平均工資的員工*/
select ename,sal from emp where sal>avg(sal); #這是一條錯誤語句
ERROR 1111 (HY000): Invalid use of group function

正確寫法:
select ename,sal from emp where sal>(select avg(sal) from emp);

五、group by 和 having

  1. group by :按照某個字段或者某些字段進行分組。
    1. 示例

      /*找出每個工作崗位的最高薪資*/
      select job,max(sal) from emp group by job;
      
    2. 注意:分組函數一般聯合group by 使用,且在group by執行結束之後分組函數纔會執行。

    3. 多字段聯合分組

      /*找出每個部門不同崗位的最高薪資*/
      select max(sal),job,deptno from emp group by deptno,job;
      
  2. having:對分組之後的數據再次進行過濾。
    1. 示例
      /*找出每個部門的最高薪資,要求顯示薪資大於3000的部門*/
      #方法一
      select max(sal),deptno from emp group by deptno having max(sal)>3000;
      
      #方法二
      select max(sal),deptno from emp where sal>3000 group by deptno;
      
      

六、查詢結果去重(distinct)

distinct:清除查詢結果集的重複記錄
使用命令:select distinct [字段名] from [表名] ;
示例:select distinct sal from emp;

七、表連接查詢

  1. 什麼是連接查詢
    在實際開發中,大部分情況下都不是從單表中查詢數據,一般都是多張表聯合查詢取出最終結果。在實際開發中,一般一個業務都會對應多張表,比如:學生和班級,至少兩種表組成。
  2. 內連接和外連接有什麼區別
    • 內連接:
      假設A表和B表進行連接,使用內連接的話,凡是A表和B表能夠匹配上的記錄查詢出來,這就是內連接。AB兩張表沒有主副之分,兩張表是平等的。
    • 外連接:
      假設A和B表進行連接,使用外連接的話,AB兩張表中有一張表是主表,一張表是副表,主要查詢主表中的數據,捎帶着查詢副標,當副標中的數據沒有和主表中的數據匹配上,副表自動模擬出NULL與之匹配。
  3. 內連查詢
    1. 等值連接
      1. 特點:條件是等量關係
      2. 案例
      /*查詢每個員工的部門名稱,要求顯示員工名和部門名*/
      select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
      
      
    2. 非等值連接
      1. 案例
      /*找出每個員工的工資等級,要求顯示員工名、工資、工資等級*/
      select e.ename,e.sal,s.grade
      from emp e
      join salgrade s
      on e.sal between s.losal and s.hisal;
      
    3. 自連接
      1. 特點:自己連接自己,把自己看作2張表
      2. 案例
      /*找出每個員工的上級領導,要求顯示員工名和對應的領導名*/
      select e.ename,m.ename mgr
      from emp e
      inner join emp m
      on e.mgr=m.empno;
      
  4. 外聯查詢
    1. 左外連接(左連接):表示左邊的這張表是主表
    /*找出每個員工的上級領導,要求顯示員工名和對應的領導名*/
    select a.ename '員工',b.mgr '領導' from emp a left outer join emp b on a.mgr=b.empno;
    
    1. 右外連接(右連接):表示右邊的這張表是主表
  5. 全連接(不常使用)
  6. 三張表怎麼連接查詢
    /*案例:找出 每個員工 的 部門名稱 以及 工資等級 */
    select e.ename,d.dname,s.grade from emp e left join dept d on e.deptno=d.deptno left join salgrade s on e.sal between s.losal and s.hisal;
    

六、union 的使用

  1. union可以將查詢結果集相加
  2. 案例
/*找出工作崗位是SALESMAN和MANAGER的員工*/
select e.ename,e.job from emp e where e.job='SSALESMANE'
union 
select e.ename,e.job from emp e where e.job='MANAGER';

七、limit查詢(重點)

  1. 應用:常用於分頁查詢
  2. limit是mysql特有的,其他數據庫沒有,不通用。(Oracle中有一種相同的機制,叫做rownum)
  3. limit取結果集中的部分數據,這是它的作用
  4. 語法機制
    limit startIndex,length
    startIndex:表示起始位置
    length:表示取出幾個
    
    /*案例:取出工資前五的員工信息*/
    select * from emp order by sal desc limit 0,5;
    
  5. 分頁技巧
    limit (pageNo-1)*pageSize,pageSize
    pageNo:表示頁碼數
    pageSize:表示每頁顯示多少條數據

八、完整DQL語句

5. select
···
1.from  (後面可以加 join on)
···
2. where
···
3. group by
···
4. having
···
6. order by
···
7. limit
···
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章