一、DQL語言的詳解
SQL標準語言中的DQL,用於查詢數據。其基本語法可以分成六個部分,我們稱之爲六個子句
1、基本查詢語句的語法格式
select..... from......[where......][group by.......][having........][order by.......]
一個基本查詢語句中,至少要有select子句和from子句。其他四個子句根據需求來選擇。
2、子句執行順序
在六個子句同時存在的查詢語句中,他們的執行時機也是由先後順序的。我來整理一下:
1)、查詢時,要基於表操作,因此,第一步先 執行 from子句
2)、表確定後,可以使用where子句,進行條件篩選。
3)、然後,再對數據進行分組查詢,因此,要執行group by子句
4)、分組查詢後,我們可以對分組查詢後的數據,再次過濾,限制,所以,要使用having子句
5)、過濾後,我們使用select子句來選擇要顯示的字段信息
6)、顯示的字段值,可以進行相應的排序,這個時候可以使用 order by子句
3、where子句
當我們在對數據表進行CRUD(PS:增加Create、讀取查詢Retrieve、更新Update和刪除Delete)操作時,where子句有對數據進行條件篩選和約束的作用。
where子句的條件表達式形式如下
1)關係表達式。 符號有 >,>=,<,<=, =, !=, <>
如要求年齡大於20,寫法:where age > 20;
年齡等於20,寫法:where age=20;
年齡不等於20,寫法: where age!=20 或者 where age<>20
2)多條件連接符:and、or、[not] between ....and ....
需求1:查詢工資在[1500,3500]區間內的員工姓名、職位、工資、部門號。
mysql > select ename,job,sal,deptno from emp where sal>=1500 and sal<=3500;
mysql > select ename,job,sal,deptno from emp where sal between 1500 and 3500;
需求2:查詢工資不在[1500,3500]區間內的員工姓名、職位、工資、部門號。
mysql > select ename,job,sal,deptno from emp where sal<1500 or sal>3500;
mysql > select ename,job,sal,deptno from emp where sal not between 1500 and 3500;
需求3:查詢姓名是‘james’和‘smith’員工的信息。
mysql > select * from emp where ename='james' or ename='smith';
PS: and 和 or 一定要慎重考慮,以免出差錯。
3)集合操作:
[not] in (集合元素)、>all(集合元素)、<all(集合元素)、>any(集合元素)、<any(集合元素)
in (集合元素) 相當於 使用連接符or,對同一字段的"="等式 進行多個值的連接。
not int (集合元素) 相當於使用連接符and,對同一個字段的"!="不等式進行多個值的連接
需求1:查詢姓名是 ”james“,"smith","lucy"的員工信息。
mysql > select * from emp where ename='james' or ename='smith' or ename='lucy';
mysql > select * from emp where ename in ('james' , 'smith' , 'lucy');
需求2:查詢姓名是不是 ”james“,"smith","lucy"的員工信息。
mysql > select * from emp where ename!='james' and ename!='smith' and ename<>'lucy';
mysql > select * from emp where ename not in ('james' , 'smith' , 'lucy');
PS:對於>all(集合元素)、<all(集合元素)、>any(集合元素)、<any(集合元素)這樣的集合操作,mysql僅僅支持子查詢。
>all(..):查詢結果爲大於集合中最大的值。
<all(..):小於集合中最小的值
>any(..):大於集合中最小的即可。
<any(..):小於集合中最大的即可。
4)模糊查詢
關鍵字:like
通配符 %:匹配0或0個以上的字符。
佔位符 _: 匹配一個字符。
需求1:查詢姓名中含有s的員工姓名,職位,入職日期,部門編號
select ename,job,hiredate,deptno from emp where ename like '%s%';-----單雙引號都可以
需求2:查詢姓名中第二個字母是a,工資大於1000的員工姓名,職位,入職日期,部門編號
select ename,job,hiredate,deptno from emp where ename like '_a%' and sal>1000;
4、order by子句
對於查詢的數據,我們可以按照需求來排序,如升序,降序,此時需要使用order by子句。
排序關鍵字:
desc 降序
asc: 升序
語法: order by colName1 [desc|asc] [,colName2 [desc|asc] ]
如果order by子句中不寫排序關鍵字,默認是升序,即默認情況下爲asc。
需求1:查詢10號部門員工的姓名、職位,工資,獎金 按照工資降序,獎金升序(工資相同時,獎金排序生效)
mysql > select ename,job,sal,comm from emp where deptno=10 order by sal desc,comm;
5、group by子句
有的時候,我們的需求可能是這樣的:查詢員工表中每個部門的總人數,總工資,平均工資等等;或者是在全校成績表中,查詢每個班級的平均成績等等。此時,在查詢時,就要將表中的數據按照相應的字段,根據值的不同,來劃分成不同的小組。如上述需求,我們要按照部門號這個字段,根據不同的值,10號一組,20號一組,30號一組.......來統計。全校成績表中,我們要按照班級編號來劃分小組。
在做分組查詢時,一般都會涉及到相應的分組函數(也叫聚合函數),而所有聚合函數都會忽略null,不進行統計。
count(colName):統計指定字段的字段值的記錄總數,null值會被忽略。
max(colName):返回指定字段的字段值中的最大值,null值會被忽略。
min(colName):返回指定字段的字段值中的最小值,null值會被忽略。
sum(colName):返回指定字段的字段值的和,null值會被忽略。
avg(colName):返回指定字段的字段值的平均值,null值會被忽略。
注意:在使用avg()函數時,因爲其忽略空值記錄,因此要根據需求考慮是否要將null值記錄計算在內,如果想要計算在內的話,我們可以使用這個函數:ifnull(colName,value),它的作用是如果指定的colName對應的值有null,我們就使用value值,否則使用其本身
需求1:求員工表中的所有員工的平均獎金。分析:即使有的員工的獎金爲null,我們也要將之計算進來。
mysql > select avg(ifnull(comm,0)) from emp ;
參照下面需求
需求2:求有獎金的員工的平均獎金。分析:此時,不計算獎金爲null的員工數。
mysql > select avg(comm) from emp
注意:當使用了分組函數時,卻沒有使用group by子句,此時是將整張表劃成了一組。
下面我整理了一些需求,供大家理解分組查詢。
需求1:查詢所有員工的最高工資,最低工資,工資總和,平均工資及其總員工數;--分析:整張表爲一組。
mysql > select max(sal),min(sal),sum(sal),avg(ifnull(sal,0)),count(ename) from emp;
需求2:查詢每個部門的最高工資,入職最早的日期,獎金之和,平均獎金及其總人數;--分析:按照部門分組
mysql > select max(sal),min(hiredate),sum(comm),avg(ifnull(comm,0)),count(ename) from emp group by deptno;
從第二個需求,我們可以看到,在數據顯示上,我們不知道是哪個部門的信息,因此,我們可以將分組字段,添加到select子句中。再次注意,在分組查詢中,select子句中除了分組函數外,只能存在分組字段,其他不相關的字段不允許存在。
改進後:
mysql > selectdeptno,max(sal),min(hiredate),sum(comm),avg(ifnull(comm,0)),count(ename) from emp group by deptno;
需求3:查詢每個部門的總人數,工資之和,按照 部門號降序排序
mysql > select deptno "部門號",count(*) '總人數',sum(sal) 工資之和 from emp group by deptno order by deptno desc;
需求4:查詢每個部門,每種職位的人數 --分析:按照部門和職位分組
mysql > select deptno,job,count(*) 總人數 from emp group by deptno,job;
6、having子句
在做分組查詢時,我們可能需要再次過濾,這個時候需要使用having子句。
如下需求
需求1:查詢部門工資總和大於10075的部門號,工資總和,最高工資,最低工資,總人數,按照部門號降序
mysql > select deptno,sum(sal),max(sal),min(sal),count(*) from emp group by deptno having sum(sal)>10075 order by deptno;
二、去重查詢
關鍵字 distinct。需要注意的是此關鍵字必須緊挨着select關鍵字。看下面需求:
需求1:查詢員工表中有哪些部門編號------分析:同一個部門編號不需要顯示很多次,因此需要去重查詢。
mysql > select distinct deptno from emp;
需求2:查看員工表中有哪些職位
mysql > select distinct job from emp;