个人学习 | MySQL学习(SQL语言知识点)
select查询语句
一个完整的select语句格式如下:
select 字段 5
from 表名 1
where 条件 2
group by 分组条件 3
having 分组后的过滤条件 4
order by 排序字段 6
以上语句的执行顺序为:
- 首先执行
from
语句找到对应数据表 - 执行
where
过滤原始数据 - 执行
group by
进行分组 - 执行
having
对分组数据进行操作 - 执行
select
选出数据 - 执行
order by
排序
因此,能在where中过滤的数据,尽量在where中过滤,效率较高。having的过滤是专门对分组之后的数据进行过滤的。
模糊查询 like
like
关键字是在where条件中使用的,支持%
和下划线_
匹配。
例1:查询姓名以M开头的所有员工
select * from emp where ename like 'M%';
例2:查询姓名以N结尾的所有员工
select * from emp where ename like '%N';
例3:查询姓名中包含O的所有员工
select * from emp where ename like '%O%';
例4:查询姓名中第二个字符为A的所有员工
select * from emp where ename like '_A%';
例5:查询姓名中包含下划线的所有员工(转义字符\
)
select * from emp where ename like '%\_%';
注意:like中的表达式必须放在单引号或双引号中,建议单引号。
排序数据
排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序asc
,如果存在where子句那么order by必须放到where语句的后面。因为order by语句晚于where语句执行。
例1:按照sal由小到大排序(系统默认由小到大)
select * from emp order by sal;
select * from emp order by sal asc;
例2:按照sal由大到小排序(手动指定排序)
select * from emp order by sal desc;
例3:按照job和sal倒序(job优先级大于sal)
select * from emp order by job desc, sal desc;
例4:使用字段的位置来排序,按照表中第6列排序(查询语句中的相对列数)
select * from emp order by 6;
分组函数(多行处理函数)
分组函数也叫多行处理函数,即将多行数据输入后,输出一行数据。分组函数一般与group by联合使用。
count
取得记录数
sum
求和
avg
取平均
max
取最大的数
min
取最小的数
注意:分组函数自动忽略空值,不需要手动的加where条件排除空值。
为什么分组函数不直接使用在where子句中?
因为,group by语句在where之后执行。任何一个分组函数都是在group by语句执行结束之后才会执行的,即分组函数在分完组后才能执行。
因此,下面的SQL语句是错误的。
select ename, sal from emp where sal > avg(sal);
可以使用子查询的方式来实现,即select语句嵌套select语句。
select ename, sal from emp where sal > (select avg(sal) from emp);
count(*)和count(指定字段)的区别
count(*)
的作用是计算数据表中记录的条数。
count(指定字段)
的作用是对某个字段进行计数。
例1:取得工作岗位的个数(distinct
表示对不同的job值进行计数,而非记录数据条数)
select count(distinct job ) from emp;
IFNULL()函数
尽管分组函数可以自动忽略null值,但常规计算中null值会导致计算错误,如1+null=null。因此,IFNULL()
函数可以将null在计算时用指定值替代。
IFNULL(字段名, 指定值)
例如:计算工资与津贴的总和
select sum(sal+IFNULL(comm, 0)) from emp;
分组查询(group by与having)
分组查询主要涉及到两个子句,分别是:group by和having
在SQL语句中若有group by 语句,那么在select语句后面只能跟分组函数
+参与分组的字段
。
在having语句中可以使用分组函数,如取得每个岗位中平均工资大于2000的岗位。
select job, avg(sal) from emp group by job having avg(sal) >2000;
多字段分组查询
例1:找出每个部门不同工作岗位的最大薪资并按部门排序。
select deptno, job, max(sal) from emp group by deptno, job order by deptno;
having 和 where的区别和选择
例2:找出每个部门的最高薪资,要求显示薪资大于2900的数据。
select deptno, max(sal) from emp group by deptno having max(sal)>2900;
但是,使用having语句会导致执行效率太低。原因在于部分数据即使未用到,却仍被拿出来计算了,比如最高薪资不大于2900的数据。
可优化如下:
select deptno, max(sal) from emp where sal < 2900 group by deptno;
所以,在SQL语句中,能在where子句中过滤的数据就再where出过滤(where子句先执行)。除非where子句无法处理过滤的要求,如例3。
例3:找出每个部门的平均薪资,要求显示薪资大于2000的数据。
select deptno, avg(sal) from emp group by deptno having avg(sal)>2000;
查询结果集的去重 (distinct关键字)
distinct
关键字可以去重复记录,但该关键字只能出现在所有字段的最前面。它表示对后面所有字段的结果去重。
例1:打印每个部门中的职位
select distinct deptno,job from emp order by deptno;
例2:统计职位的数量
select count(distinct job) from emp;