查询
全列查询
指定列查询
查询字段并添加自定义表达式
自定义表达式重命名
查询指定列并去重
select distinct 列名 from 表名
where条件
查询列数据为null的 null与' '(空串)是不同的!
查询列数据不为null的
查询某列数据指定范围
select * from 表名 where 列名 between 起点 and 末尾;
若未指定,其他不满足的数据也会显示,因为本身命令没要求他们不显示,其次也没要求他们不显示。
查询某列数据指定范围并且指定显示
select 列名... from 表名 where 列名 between 起点 and 末尾
select 列名... from 表名 where 列名>范围 and 列名<范围
select 列名... from 表名 where 列命 in(指定范围)
查找列指定数据
模糊匹配
查找第一个为孙的
查找以孙开头两个字的
查找以孙开头三个字的
查找不以孙字开头的
查找两个列比较大小的
查找语文>数学
查找语文大于80并且name不以孙字开头的
查找总分>200的
为什么这里用别名会报错?
可以看到select的执行顺序,先找到表,其次是条件,再去表里查找,而条件是 ’总分' 但并没用这个条件,因为总分是在第四次才开始重命名的,所以报错了。
正确做法
结果排序
查询chinese的升序
查询chinese的降序
查询以数学降序,英语升序,语文升序的方式显示
以数学为key先排 如果数学数据相同,以英语来排,如果英语数据也相同,以语文来排。
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
以总分排降序
为什么这里用别名可以,而where不行?这也跟select执行顺序有关
因为排序是最后才执行的,所以第二步时其实并没用用到 ‘总分' ,执行排序时,排序是第五梯队,而重命名是第四梯队,所以排序时总分已经重命名了,即可以使用,不会报错。
查询总分降序并且只显示前三个。
limit 3 取得结果后的前三行
limit s,n 取第s个到n个
更新
update 表名 set 修改的数据 where 条件
将孙悟空的英语修改为90
update test12 set chinese=80; 谨慎使用!
将数据内chinese所有数据都修改为80
将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
update 表名 set 条件 order by 排序的分数 desc limit n(要修改的n行)
删除
delete from 表名 where 条件
delete from 表名 order by 总分 limit n(要删除n行)
聚合函数
count()返回查询到的数据的数量
统计name有几个
统计name有几个并去重
统计英语成绩大于60分的有几个
sum()返回查询到的数据的总和(对列方向的计算)
计算数学成绩的总和
计算数学成绩小于90分的总和
avg()返回查询到的数据平均值
计算英语的平均分
计算总分的平均分
计算英语大于60分的平均分
max()返回查询到的数据的最大值
计算英语的最大值
计算总分的最大值
min()返回查询到的数据的最小值
计算英语的最小值
计算总分的最小值
group by
在select中使用group by子句可以对指定列进行分组查询
对部门编号进行分组,再进行计算平均值,和最大值。
为什么会报错?
ename未进行分组,group没有进行分钟的列,无法在select显示
where avg(sal)
报错,where本质是以条件来筛数据的。而avg是聚合函数,它要有数据后才能工作。而这个where的条件竟然是一个没数据的聚合函数。出现了矛盾。
显示部门平均工资低于2000的
select执行顺序
having是对聚合后的数据进行筛选
工资大于1000的,平均工资大于2000的部门。
执行顺序
先找到表,where进行初步筛选,筛选后进行分组,分组后进行聚合函数,最后having对组进行最后筛选
group by总结
SQL查询中各个关键字的执行先后顺序 from > on> join > where > group by > with > having > select > distinct > order by > limit