天天看點

Mysql入門之簡單的DQL查詢語句【Mysql資料庫基礎】

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

以上操作使用的案例表

EMP員工表

Mysql入門之簡單的DQL查詢語句【Mysql資料庫基礎】

DEPT部門表

Mysql入門之簡單的DQL查詢語句【Mysql資料庫基礎】

SALGRADE工資等級表

Mysql入門之簡單的DQL查詢語句【Mysql資料庫基礎】