1. 程式人生 > >MySQL-入門(二)

MySQL-入門(二)

本部分主要是MySQL的常用函式和高階用法。

一、MySQL排序

    排序關鍵字:order by 排序欄位。後面寫上要排序欄位,排序欄位可以有多個,多個採用逗號間隔,order by預設採用升序(asc)排序,可以手動設定為降序(desc)。如果存在where子句,那麼order by必須放到where語句後面。

    舉例:1、單個欄位排序:

            手動指定按照id號由大到小排序(降序關鍵字desc):  select id from emp order by id desc;

               2、多個欄位排序:採用多個欄位排序時,如果根據第一個欄位排序重複了,會根據第二個欄位排序

            按照 id 和age倒序排序:select id,name,age from emp order by id desc,age desc;

 

二、MySQL常用處理函式

常用函式 用例
lower():轉換為小寫 查詢員工姓名,將員工姓名全部轉換成小寫:
select lower(ename) as ename from emp;
upper()轉換為大寫 查詢員工姓名,將員工姓名全部轉換為大寫:
select upper(ename) as ename from emp;
substr()擷取子串:
該函式接收
3個引數:substr(被擷取欄位名稱,起始下標,擷取長度),起始下標從1開始。
查詢並顯示所員工姓名的第二個字母:

select substr(ename,2,1) from emp;
ifnull()空值處理
該函式接收兩個引數:
ifnull(欄位名,替換值)

在資料庫中,有Null參與數學運算的結果一定為Null;為了防止計算結果出現Null,建議先使用ifnull函式預先處理。
查詢員工姓名及補助,如果補助為Null設定為0;
select ename,ifnull(comm,0) from emp;
case…when…then…else…end select ename, sal, job,

    (case job
        when ‘MANAGER’  then sal * 1.1
        when ‘SALESMAN’then sal * 1.5
        else    sal
    end) as newsal

from emp;
trim()---去除首尾空格:MySQL預設去除欄位後面的空格,原因:MySQL語法鬆散。 取得工作崗位為manager的所有員工:
select * from emp where job = trim(' manager ');
round()----四捨五入:該函式接收兩個引數round(數字,保留的小數位數) 檢視員工薪水保留1位小數:
select round(sal,1) from emp;
rand()生成隨機數: 會生成一個0~1之間的的隨機數,包含0和1。
select rand();
str_to_date()字串轉日期:該函式接收兩個引數,str_to_date(‘日期字串’,’日期格式’) 使用str_to_date()函式查詢02-20-1981年入職的員工:
select ename,hiredate from emp where hiredate = str_to_date('02-20-1981','%m-%d-%Y');
date_format()格式化日期:該函式接收兩個引數,date_format(日期型別資料,’日期格式’) 查詢員工的入職日期,以’10-12-1980’的格式顯示到視窗中;
select ename,date_format(hiredate,'%m-%d-%Y') hiredate from emp ;

 

三、MySQL分組和聚合函式

  1、  聚合函式包括:sum、avg、max、min、count等,組合聚合函式:sum、avg、max、min、count這些函式可以一起使用

    需要注意:

  • 聚合函式在計算時會自動忽略空值,不用手動寫sql將空值排除。
  • 聚合函式不能直接寫在where語句的後面。
聚合函式 用例
sum()求和函式 取得薪水的合計:
select sum(sal) from emp;
avg()取平均值函式 取得平均薪水:
select avg(sal) as avgsal from emp;
max()取得最大值函式 取得最晚入職的日期:日期也可以使用max()函式進行比較
select max(hiredate) as lastemp from emp;
min()取得最小值函式 取得薪水最低值:
select min(sal) as minsal from emp;
count()取得資料總數 取得補助不為空的員工數:count()函式不會統計資料為null的記錄
select count(comm) from emp;

統計沒有補助的員工數:
select count(*) from emp where comm is null;
組合聚合函式:sumavgmaxmincount這些函式可以一起使用: select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;

 

    2、分組函式group by

    group by後面可以寫多個欄位,資料庫會分別對這些欄位進行分組

    舉例:找出每個職位的最高薪水:按照工作崗位分組:select max(sal) as maxsal from emp group by job;

   

     3、having過濾,作用:如果想對分組的資料進行過濾,需要使用having子句。

    舉例:找出每個工作崗位的平均薪水,要求顯示平均薪水大於2000的:

    select job,avg(sal) from emp group by job having avg(sal) > 2000;

    注意:能夠在where後過濾的資料不要放到having中進行過濾,否則影響SQL詢句的執行效率。

    

    where和having區別如下:

  • where和having都是為了完成資料的過濾,它們後面都是新增條件;
  • where是在 group by之前完成過濾;
  • having是在group by之後完成過濾;

 

    4、  select語句關鍵字順序總結:

     select xxxx      from xxxx     where xxxx        group by       xxxx       having xxxx        order by xxxx

  • from 將硬碟上的表文件載入到記憶體
  • where:將符合條件的資料篩選出來。生成一張新的臨時表
  • group by :根據列中的資料種類分組,將當前臨時表劃分成若干個新的臨時表
  • having : 可以過濾掉group by生成的不符合條件的臨時表
  • select : 對當前臨時表進行整列讀取
  • order by : 對select生成的臨時表,進行重新排序,生成新的臨時表

 

四、MySQL連線查詢

連線查詢:在實際開發中,資料往往是同時儲存在多張表中,這些表與表之間存在著關係,我們在檢索資料的時候往往需要多張表聯合起來檢索,這種多表聯合檢索被稱為連線查詢。

連線的分類

1、內連線:內連線查詢出的資料是兩張表的交集,即上圖中C所表示的部分。

  • select d.dname,e.ename from emp e inner join dept d on e.deptno = d.deptno;(inner可省略)

2、左外連線:左外連結如上圖中A部分+C部分的內容,即包含左邊表的全部行(不管右邊的表中是否存在與它匹配的行),和右邊表中全部匹配的行。

3、右外連結:右外連結如上圖中B部分+C部分的內容,即包含右邊表的全部行(不管左邊的表中是否存在與它匹配的行),和左邊表中全部匹配的行。

4、全外連線:MySQL中不支援

5、自連線:表自己跟自己做連線查詢,這種寫法叫做自連線。

舉例說明:

    內連線案例:

  • 查詢每個員工所在的部門名稱,顯示用工姓名和對應的部門名稱:
    • select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;

    自連線:查詢員工的名稱和員工對應的領導名稱:

  • select a.ename empname ,b.ename leadername from emp a join emp b on a.mgr = b.empno;

左、右連線案例:

  • 找出每一個員工對應的部門名稱,要求部門名稱全部顯示(說明要把部門表的資料全顯示出來,所有偏向部門表連線):
    • 左連線:其中outer可以省略:(因為部門表在emp表左邊)
      • select e.ename,d.dname from dept d left outer join emp e on e.deptno = d.deptno;
    • 使用右連線:其中outer可以省略:(因為部門表在emp表右邊)
      • select e.ename,d.dname from emp e right outer join dept d on e.deptno = d.deptno;
    • 說明:為什麼使用左右連線?因為如果部門表中出現某個部門,但是員工表中沒有員工屬於這個部門,那麼如果用普通的查詢則不會顯示這個部門。但是這裡要求部門全部顯示,所以要偏向部門表連線查詢,才能把員工為NULL的部門查出來

 

五、MySQL查詢其他內容

1、子查詢:select 語句巢狀 select 語句被稱為子查詢;

注意:select子句可出現在select、from、where關鍵字後面,可以將select語句查詢出的資料看做是一張新的表。

舉例:(重要)找出每個部門的平均薪水,並且要求顯示平均薪水的薪水等級:注意,這裡的t是括號中select子句構成的新表的別名

2、使用union合併結果

將查詢的結果集合並,合併結果集時查詢欄位的個數必須一致。

舉例:查詢出job為MANAGER和SALESMAN的員工:

3、limit(m,n),獲取某段資料

作用:獲取一表前幾條及中間某幾行資料,主要用來分頁處理,limit關鍵字只在MySQL中起作用。

語法:limit(m,n);起始下標m,長度n,m:記錄開始的index,預設從 0 開始,表示第一條記錄;n :指從第 m+1 條開始,取 n 條;

舉例:取前5個員工資訊:

  • select * from emp limit 0,5;
  • select * from emp limit 5;