《MySQL數據庫》DQL的使用詳解

一、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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章