Mysql入门之简单的DQL查询语句【Mysql数据库基础】

11.简单的查询语句(DQL)

语法格式
select 字段名1,字段名2,字段名3,…from 表名;
提示:
1.任何一条sql语句以;结尾。
2.sql语句不区分大小写。
给查询结果的列重命名:
select name,sal12 as yearsal from emp;
别名中含有中文
select ename,sal
12 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员工表

员工表

DEPT部门表

部门表

SALGRADE工资等级表

工资等级表

原创文章 27 获赞 2 访问量 1120

猜你喜欢

转载自blog.csdn.net/liudachu/article/details/105887955
今日推荐