DQL查詢語句select
-
- 11.簡單的查詢語句(DQL)
- 12.條件查詢:
- 13.排序(升序、降序)
- 14.分組函數:都是對某一組資料進行操作的
- 16.group by 和 having
- 17.完整的DQL語句的運作順序
- 以上操作使用的案例表
-
- EMP員工表
- DEPT部門表
- SALGRADE工資等級表
11.簡單的查詢語句(DQL)
文法格式
select 字段名1,字段名2,字段名3,…from 表名;
提示:
1.任何一條sql語句以;結尾。
2.sql語句不區分大小寫。
給查詢結果的列重命名:
select name,sal12 as yearsal from emp;
别名中含有中文
select ename,sal12 as ‘年薪’ from emp;
mysql> select ename,sal*12 as ‘年薪’ from emp;
+--------+----------+
| ename | 年薪 |
+--------+----------+
| smith | 9600.00 |
| allen | 19200.00 |
| ward | 15000.00 |
| jones | 35700.00 |
| martin | 15000.00 |
| blake | 34200.00 |
| clark | 29400.00 |
| scott | 36000.00 |
| king | 60000.00 |
| turner | 18000.00 |
| adams | 13200.00 |
| james | 11400.00 |
| frod | 36000.00 |
| miller | 15600.00 |
+--------+----------+
注意:标準sql語句中要求字元串用單引号括起來。
as關鍵字可以省略。
查詢所有字段:select * from emp;//實際開發中不建議使用,效率較低。*
12.條件查詢:
文法格式:
select
字段,字段…
from
表名;
where
條件;
案例
查詢工資等于5000的員工姓名:
select ename from emp where sal=5000;
查詢工資大于3000的員工姓名:
select ename,sal from emp where sal>3000;
查詢工資不等于3000的:
select ename,sal from emp where sal<>3000;
select ename,sal from emp where sal!=3000;
查詢工資在1100-3000的員工:
select ename,sal from emp where sal>=1100 and sal<=3000;
select ename,sal from emp where sal between 1100 and 3000;
mysql> select ename,sal from emp where sal between 1100 and 3000;
+--------+---------+
| ename | sal |
+--------+---------+
| allen | 1600.00 |
| ward | 1250.00 |
| jones | 2975.00 |
| martin | 1250.00 |
| blake | 2850.00 |
| clark | 2450.00 |
| scott | 3000.00 |
| turner | 1500.00 |
| adams | 1100.00 |
| frod | 3000.00 |
| miller | 1300.00 |
+--------+---------+
11 rows in set (0.00 sec)
between and 使用的時候要左小右大。
between and 也可以使用在字元串://此時左閉右開
select ename from emp where ename between ‘A’ and ‘C’;
mysql> select ename from emp where ename between 'A' and 'C';
+-------+
| ename |
+-------+
| allen |
| blake |
| adams |
+-------+
3 rows in set (0.00 sec)
找出沒有津貼的人:
null不能使用等号: is null 或 is not null;
select ename,sal,comm from emp where comm is null;
select ename,sal,comm from emp where comm is null or comm=0;
mysql> select ename,comm from emp where comm is null or comm=0;
+--------+------+
| ename | comm |
+--------+------+
| smith | NULL |
| jones | NULL |
| blake | NULL |
| clark | NULL |
| scott | NULL |
| king | NULL |
| turner | 0.00 |
| adams | NULL |
| james | NULL |
| frod | NULL |
| miller | NULL |
+--------+------+
11 rows in set (0.00 sec)
找出工作崗位是MANAGER和SALESMAN的員工:
select ename,job from emp where job='MANAGER’or job=‘SALESMAN’;
in等同于or:
select ename,job from emp where job in(‘MANAGER’,‘SALESMAN’);
mysql> select 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 |
+--------+----------+
7 rows in set (0.00 sec)
and和or聯合起來用:找出薪資大于1000的且部門編号是20或30部門的員工.
select ename,sal,deptno from emp where sal>100 and (deptno=20 or deptno=30);
注意:當運算符的優先級不确定的時候加小括号。
mysql> select ename,sal,deptno from emp where sal>100 and(deptno=20 or deptno=30);
+--------+---------+--------+
| ename | sal | deptno |
+--------+---------+--------+
| smith | 800.00 | 20 |
| allen | 1600.00 | 30 |
| ward | 1250.00 | 30 |
| jones | 2975.00 | 20 |
| martin | 1250.00 | 30 |
| blake | 2850.00 | 30 |
| scott | 3000.00 | 20 |
| turner | 1500.00 | 30 |
| adams | 1100.00 | 20 |
| james | 950.00 | 30 |
| frod | 3000.00 | 20 |
+--------+---------+--------+
11 rows in set (0.00 sec)
模糊查詢like:(特殊符号 % 和 _)
%代表任意多個字元,_代表任意一個字元。
找出名字中含有O的,
select ename from emp where ename like ‘%O%’;
+-------+
| ename |
+-------+
| jones |
| scott |
| frod |
+-------+
找出第二個字母是A的:
select ename from emp where ename like ‘_A%’;
+--------+
| ename |
+--------+
| ward |
| martin |
| james |
+--------+
找出名字中有下劃線的:
select name from t_user name like ‘%_%’;
13.排序(升序、降序)
按照工資升序,找出員工名和薪資:
select
ename,sal
from
emp
order by
sal;
預設是升序,asc表示升序,desc表示降序。
select ename,sal from emp order by sal;//升序
select ename,sal from emp order by sal asc;//升序
select ename,sal from emp order by sal desc;//降序
mysql> select ename,sal from emp order by sal;
+--------+---------+
| ename | sal |
+--------+---------+
| smith | 800.00 |
| james | 950.00 |
| adams | 1100.00 |
| ward | 1250.00 |
| martin | 1250.00 |
| miller | 1300.00 |
| turner | 1500.00 |
| allen | 1600.00 |
| clark | 2450.00 |
| blake | 2850.00 |
| jones | 2975.00 |
| scott | 3000.00 |
| frod | 3000.00 |
| king | 5000.00 |
+--------+---------+
按照工資的降序排列,當工資相同的時侯再按照名字的升序排列:
select ename,sal from emp by sal desc,ename asc;
mysql> select ename,sal from emp order by sal desc,ename asc;
+--------+---------+
| ename | sal |
+--------+---------+
| king | 5000.00 |
| frod | 3000.00 |
| scott | 3000.00 |
| jones | 2975.00 |
| blake | 2850.00 |
| clark | 2450.00 |
| allen | 1600.00 |
| turner | 1500.00 |
| miller | 1300.00 |
| martin | 1250.00 |
| ward | 1250.00 |
| adams | 1100.00 |
| james | 950.00 |
| smith | 800.00 |
+--------+---------+
14 rows in set (0.00 sec)
找出工作崗位是SALESMAN的員工,并且要求按照薪資的降序排列。
select 3
ename.job,sal
from 1
emp
where 2
job=‘SALESMAN’
order by 4
sal desc;
mysql> select ename,job,sal from emp where job='salesman' order by sal desc;
+--------+----------+---------+
| ename | job | sal |
+--------+----------+---------+
| allen | salesman | 1600.00 |
| turner | salesman | 1500.00 |
| ward | salesman | 1250.00 |
| martin | salesman | 1250.00 |
+--------+----------+---------+
4 rows in set (0.00 sec)
14.分組函數:都是對某一組資料進行操作的
count 計數
sum 求和
avg 平均值
max 最大值
min 最小值
求出工資總和
select sum(sal) from emp;
找出最高工資
select max(sal) from emp;
求總人數:
select count(*) from emp;
select count(ename)from emp;
分組函數自動忽略NULL。
count()和count(具體的某個字段)的差別:
count():統計總記錄條數。
count(comm):表示統計comm字段中不為NULL的資料總數量。
mysql> select max(sal),sum(sal),count(*) as '總人數' from emp;
+----------+----------+--------+
| max(sal) | sum(sal) | 總人數 |
+----------+----------+--------+
| 5000.00 | 29025.00 | 14 |
+----------+----------+--------+
1 row in set (0.00 sec)
找出工資高于平均工資的員工:
select ename,sal from emp where sal>avg(sal) ;//無效
原因:SQL語句中,分組函數不可以直接使用在where子語句中去。
因為group by實在where執行之後才會執行的。
select 5
…
from 1
…
where 2
…
group by 3
…
having 4
…
order by 6
…
改進:select ename,sal from emp where sal>(select avg(sal) from emp);
mysql> select ename,sal from emp where sal>(select avg(sal) from emp);
+-------+---------+
| ename | sal |
+-------+---------+
| jones | 2975.00 |
| blake | 2850.00 |
| clark | 2450.00 |
| scott | 3000.00 |
| king | 5000.00 |
| frod | 3000.00 |
+-------+---------+
6 rows in set (0.00 sec)
**15.多行處理函數:輸入多行,輸出一行。
單行處理函數:輸入一行,輸出一行。
計算員工的年薪:
select ename,(sal+comm)12 as yearsal from emp;
當null參與運算,運算結果一定是NULL
使用ifnull();
select ename,(sal+ifnull(comm,0))12 as yearsal from emp;
ifnull()空處理函數:
ifnull(可能為null的資料,被當作什麼處理):屬于單行處理函數
select ename,ifnull(comm,0) as comm from emp;
mysql> select ename,sal+ifnull(comm,0)*12 as yearsal from emp;
+--------+----------+
| ename | yearsal |
+--------+----------+
| smith | 800.00 |
| allen | 5200.00 |
| ward | 7250.00 |
| jones | 2975.00 |
| martin | 18050.00 |
| blake | 2850.00 |
| clark | 2450.00 |
| scott | 3000.00 |
| king | 5000.00 |
| turner | 1500.00 |
| adams | 1100.00 |
| james | 950.00 |
| frod | 3000.00 |
| miller | 1300.00 |
+--------+----------+
14 rows in set (0.00 sec)
16.group by 和 having
group by:按照某個字段或者某些字段進行分組。
having:having是對分組之後的資料進行再次過濾。
案例:找出每個工作崗位的最高薪資。
select max(sal),job from emp group by job;
mysql> select max(sal),job from emp group by job;
+----------+-----------+
| max(sal) | job |
+----------+-----------+
| 1300.00 | clerk |
| 1600.00 | salesman |
| 2975.00 | manager |
| 3000.00 | analyst |
| 5000.00 | persident |
+----------+-----------+
5 rows in set (0.00 sec)
注意:
1.分組函數一般都會和group by聯合使用,這也是為什麼它被稱為分組函數的原因
并且任何一個分組函數(count sum avg max min)都是在group by語句執行結束之後才會
執行的,當一個sql語句沒有group by的話,整張表的資料都會自成一組。
2.當一條語句中有group by的話,select後面隻能跟分組函數和參與分組的字段。
案例:找出每個部門不同工作崗位的最高薪資。
select
deptno,job,max(sal)
from
emp
group by
deptno,job;
mysql> select deptno,job,max(sal) from emp group by deptno,job;
+--------+-----------+----------+
| deptno | job | max(sal) |
+--------+-----------+----------+
| 20 | clerk | 1100.00 |
| 30 | salesman | 1600.00 |
| 20 | manager | 2975.00 |
| 30 | manager | 2850.00 |
| 10 | manager | 2450.00 |
| 20 | analyst | 3000.00 |
| 10 | persident | 5000.00 |
| 30 | clerk | 950.00 |
| 10 | clerk | 1300.00 |
+--------+-----------+----------+
9 rows in set (0.00 sec)
找出每個部門的最高薪資,要求顯示薪資大于2900的資料
select max(sal),deptno from emp group by deptno having max(sal)>2900;//效率低
select max(sal),deptno from emp where sal>2900 group by deptno;//where
mysql> select deptno,max(sal) from emp group by deptno having max(sal)>2900;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 20 | 3000.00 |
| 10 | 5000.00 |
+--------+----------+
2 rows in set (0.00 sec)
mysql> select deptno,max(sal) from emp where sal>2900 group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 20 | 3000.00 |
| 10 | 5000.00 |
+--------+----------+
找出每個部門的平均薪資,要求顯示薪資大于2000的薪資;
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
where後面不能使用分組函數,隻能使用having使用。
mysql> select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
+--------+-------------+
| deptno | avg(sal) |
+--------+-------------+
| 20 | 2175.000000 |
| 10 | 2916.666667 |
+--------+-------------+
2 rows in set (0.00 sec)
17.完整的DQL語句的運作順序
select 5
…
from 1
…
where 2
…
group by 3
…
having 4
…
order by 6
…