一 高级查询
1 去重复查询 distinct(字段名):distinct要放在要查询的字段的最前面。
select distinct(sage) , sname from student;
2 限定行数的查询 limit limit后面的参数是一个或两个
limit n 表示从第一行开始返回n行结果
limit m,n表示从第m+1行开始返回n行结果,所以limit是可以实现数据分页的效果
3条件过滤
1 单条件过滤:select 字段1,字段2 from 表名 where 字段3=值;
这里最后面的关系运算符有:> >= < <= = !=
2 多条件过滤:select 字段1,字段2 from 表名 where 条件1 and或者or 条件2;
4 选择范围
select *from 表名 where 字段 between m and n;
betweem后面的是一个闭区间即[ m, n ]
5 定义集合(这里的关键字是in/not in)
select *from 表名 where 字段 in( l,m ,n);
select *from 表名 where 字段 in( 22,24 ,25);查看年龄为22,24,25的学生的信息。
6模糊查询
select *from 表名 where sname like'_';
select *from 表名 where sname like'd%';所有以d开头 的
select *from 表名 where sname like'%a';所有以a结尾的
select *from 表名 where sname like'%a%';只要名字中有a的数据
select *from 表名 where sname like'_a%';查询名字中第二个字母是a的数据
关于like模糊查询,有两个关键字需要记住:
_(下划线):代表任一一个字符,可能代表a也可能代表b...
%(百分号):代表任意的n个字符,可能代表ab也可能代表abcd...
7处理空值数据
select *from 表名 where sagel is null;
判断条件不能是字段=null,要写为字段 is null // is not null;
8排序操作
使用order by排序时字段后面加上asc或desc asc表示正序desc表示倒序
select *from 表名 order by sage asc;
select *from 表名 order by sage desc;
多次排序
select *from 表名 order by sage asc,sexx desc;
sql执行顺序:1执行from选表 2where条件过滤 3select选字段 4order by排序
二 聚合分组
2.1 聚合函数
SQL中提供的聚合函数可以用来求值,统计等
count():统计行数量(可以是某一个字段,也可以是某一个表)
sum():求某个列的和 如果指定列是字符串类型,那么使用字符串排序运算;
avg():求某个列的均值 如果指定列是字符串类型,那么使用字符串排序运算;
max():求某个列的最大值 如果指定列类型不是数值类型,那么计算结果为0;
min():求某个列的最小值 如果指定列类型不是数值类型,那么计算结果为0;
1,select count(计数对象) from 表名 where 条件;
count(*) 计数表的所有行,包括null值 :select count(*) as con from 表名 ;计算表的所有行记录,con是新起的别名。
count(*) 加where条件计数表的记录:select count(*) from 表名 where sexx=0;计算有多少女生
count(字段) 计算有多少不重名女生 select count(distinct sname) as '人数' from 表名 where sexx=0;//修饰的字段为参
2,计算年龄和 select sum(sage) from student;
3, 计算平均年龄select avg(sage) from student;
4,返回年龄最大最小的学生信息select max(sage) , min(sage) from student;
2.2 分组 group by
1,查询每个部门编号和每个部门的工资和:
select deptno, sum(sal) from emp group by (deptno);
2, 查询每个部门的编号以及每个部门工资大于1500的人数:
select deptno, count(*) from emp where sal>1500 group by deptno;
加入where条件执行顺序:where过滤——分组——聚合
后面也可以用having过滤如下:
2.3 聚合过滤 (实现在进行聚合后再执行过滤)
- 查询工资总和大于9000的部门编号以及工资总和:
- select deptno, sum(sal) from emp group by deptno having sum(sal)>9000;
- 查询平均年龄大于22岁的不同学生
- select sname, avg(sage) as averege from student group by (sname) having avg(sage)>22;
SQL顺序:执行from—where条件过滤—group by—执行select选择列—having条件过滤—order by排序—limit限定行数(分页)
注意:
1. having是在分组聚合后对数据进行过滤,而where是在分组前对数据进行过滤
2. having后面可以使用聚合函数(统计函数),where后面不可以使用聚合函数
凡是和聚合函数同时出现的列名,一定要写在group by 之后 即这里的sal sname
group by 一般会合聚合函数配合使用,单独使用的时候意义不大
三 子查询
1在where中嵌套