MySQL学习
二、查询(1)(DQL 数据查询语言)
1. 简单的查询语句
语法格式:
select 字段名1,字段名2,字段名3,..... from 表名;
提示:1. 任何一条sql语句以";"结尾。
2. sql语句不区分大小写。
1.1 查询员工的年薪(字段可以参与数学运算):
select ename,sal*12 from emp;
1.2 给查询结果的列重命名(用as)
select ename,sal*12 as yearsal from emp;
select ename,sal*12 as ‘年薪’ from emp;
▲as关键字可以省略。
select ename,sal*12 yearsal from emp;
注意:标准sql语句中要求字符串使用’'括起来。虽然MySQL支持双引号,但是不通用。
1.3 查询全部字段(一般不用)
select * from emp; //实际开发中不建议使用* ,效率较低。
2.条件查询
语法格式:
select
字段1,字段2,.....
from
表名
where
条件;
执行顺序:先from,然后where,最后select。
不等于: <>(大于小于就是不等于)!=也是不等于
between…and… :
①两个值之间,等同于>= and <=(闭区间,使用的时候必须 左小右大)
②除了可以使用在数字方面之外,还可以使用在字符串方面。…between ‘A’ and ‘C’ // 左闭右开,查询出首字母为A和B的字段(几乎不用)
is null : 为null(is not null不为空)
在数据库中NULL不是一个值,代表什么也没有,为空,空不是一个值,不能用=衡量,必须使用is null或者is not null。(为null和为0不是一个意思,一个是空,一个是数值为0)
and : 并且 or : 或者
select ename,deptno,sal from emp where sal > 1000 and deptno = 20 or deptno =30;//错误
and和or碰在一起,and的优先级会比较高,加粗的部分会优先组队。
select ename,deptno,sal from emp where sal > 1000 and (deptno = 20 or deptno =30);加了括号之后才是想要的结果。
注意:当运算符优先级不确定时,加(),()里优先级较高
in : 包含,相当于多个or(not in 表示不在这个范围里)
…in (…,…); (可读性更好)(中不是区间,in后面的每一个都是具体值。)
not : 可以取非,主要用在is或者in中
like : 模糊查询,支持%或下划线_匹配
%:代表任意多个字符。_ : 代表任意一个字符。
下划线的前面加一个\,\具有转义作用,代表是一个普通的_字符。
3.排序(升序、降序)
order by ①asc 表升序 ②desc表降序 (默认升序排列)
按照工资(SAL)升序排序,找出员工名(ENAME)和薪资(SAL):
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, ENAME asc;
▲多个字段同时排序,越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序时,才会启用后面的字段。
4.分组函数
4.1
分组之后才能用分组函数!(group by 之后)
count : 计数
sum : 求和
avg : 平均值
max : 最大值
min : 最小值
▲ 所有分组函数都是对”某一组“数据进行操作的。分组函数只有这五个,也叫多行处理函数(输入多行,最终输出结果只有一行)。
①找出员工的工资总和。select sum(SAL) from emp ;
②找出最高工资。select max(SAL) from emp;
③找出最低工资。select min(SAL) from emp;
④找出平均工资。select avg(SAL) from emp;
⑤找出总人数。select count(ENAME) from emp;或者select count(*) from emp;
▲所有分组函数自动忽略NULL,不需要额外添加过滤条件。(所有数据库都是这样规定的,只要有NULL参与的运算,最后的运算结果都是NULL)
4.2 ifnull() : 空处理函数(对空进行预处理)
ifnull(可能为NULL的数据,被当作什么处理)
找出工资高于平均工资的员工。
select ENAME,SAL from emp where SAL >= avg(SAL); // ❌无效的使用了分组函数。❗SQL语句的一个语法规则:分组函数不可直接使用在where字句中。因为group by 是在where执行之后才执行的。
4.3 count(*)和count(具体字段)
count(*) : 统计的是总记录条数(与字段没有关系)
count(具体字段) : 统计的是某个字段中不为NULL的数据条数总数量
4.4 分组函数也能组合起来用
select count(*),sum(SAL),avg(SAL),max(SAL),min(SAL) from emp;
5.分组查询 group by 和 having
5.1 group by
group by : 按照某个或某些字段进行分组。
▲分组函数是在group by语句执行结束之后再执行的,所以where后面不能直接用分组函数。
5.1.1 案例:找出每个工作岗位的最高薪资。
select JOB,max(SAL) from emp group by JOB;
▲分组函数一般都会和group by联合使用,这也是被称为分组函数的原因,并且任何一个分组函数都是在group by 语句执行结束之后才会执行。当一条sql语句没有group by 整张表的数据会自成一组。
5.1.2 找出工资高于平均工资的员工。
select ENAME,SAL from emp where SAL >= (select avg(SAL) from emp;); // select语句嵌套select语句,子查询
找出每个工作岗位的最高薪资。
select ENAME,JOB,max(SAL) from emp group by JOB; // 以上结果是有的,但结果没有意义,在Oracle数据库中会报错(语法错误)。
▲记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。
找出工作岗位的平均薪资 : select JOB,avg(SAL) from emp group by JOB;
5.1.3 多个字段联合起来一块分组
找出不同工作岗位的最高薪资: select JOB,max(SAL) from emp group by JOB;
找出每个部门(DEPTNO)不同工作岗位(JOB)最高薪资(SAL): select DEPTNO,JOB,max(SAL) from emp group by DEPTNO,JOB;(联合分组)
5.2 having
having : 对分组之后的数据进行再次过滤。(having是group by的搭档,只有group by出现时才能用having)
5.2.1 优先使用where来过滤
找出每个部门的最高薪资,要求显示薪资大于2900的数据: select DEPTNO,max(SAL) from emp group by DEPTNO having max(SAL) > 2900; // 这种方式效率低
select DEPTNO,max(SAL) from emp where SAL > 2900 group by DEPTNO; // 推荐这种写法来过滤,效率较高,where无法解决的过滤问题使用having来解决.
5.2.2 where无法解决的过滤问题使用having来解决。
找出每个部门的平均薪资,要求显示薪资大于2000的数据: select DEPTNO,avg(SAL) from emp group by DEPTNO having avg(SAL) > 2000; // where后面不能用分组函数
6.总结:一个完整的DQL语句怎么写
❗顺序不能换,是固定的
select 5
...
from 1
....
where 2
...
group by 3
....
having 4
...
order by 6
...
6.总结:一个完整的DQL语句怎么写
❗顺序不能换,是固定的
select 5
...
from 1
....
where 2
...
group by 3
....
having 4
...
order by 6
...