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; |
組合聚合函式:sum、avg、max、min、count這些函式可以一起使用: | 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的部門查出來
- 左連線:其中outer可以省略:(因為部門表在emp表左邊)
五、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;