查询语句的格式及作用:
select distinct… as… (去重)选择哪些字段(名字改为…)
from … 从哪些表中查询
join … on … 多表连接。on后面跟连接条件
where … ①and / or… 进行筛选,and跟再一个条件 / or再包含一种情况 ②in (‘’, ‘’, ‘’) ③(not)like ‘%北京%’ 通配符↓
group by … 按照字段分组
having … 在分组后进行筛选
order by … asc/desc 结果中的行按照某个字段值的升序/降序排序
limit n 限制被select语句返回的行数为n
union 将前后两个select语句的结果组合到一个结果集中
select… … … . … …
通配符:
_:匹配任意一个字符;
%:匹配0个或多个字符;
[ ]:匹配[ ]中的任意一个字符(若要比较的字符是连续的,则可以用连字符“-”表 达 );
[^ ]:不匹配[ ]中的任意一个字符。***
聚合函数:
count() 总的数量
avg() 平均值
round( , 1) 保留一位小数
易错点:
where语句过滤完之后才进行group by分组,
分组之后才进行聚合函数的运算。
所以若需要将聚合函数的结果作为筛选条件——也就是说,这个筛选条件在分组之后——那么就需要使用having在分组之后筛选条件。
join …on…联表查询时,select后面要注明是哪个表的。嵌套查询时不用。
易错点:用除法求了平均值,就不要再用avg了
去重求总数:count(distinct qpd.device_id)
分别查看&结果不去重:所以直接使用两个条件的or是不行的,直接用union也不行,要用union all,分别去查满足条件1的和满足条件2的,然后合在一起不去重
union和union all的区别:
union:
1.对两个结果集进行并集操作, 不包括重复行,相当于distinct,
2.会对获取的结果进行排序操作
union all:
1.对两个结果集进行并集操作, 包括重复行。即所有的结果全部显示, 不管是不是重复;
2.不会对获取的结果进行排序操作
引用自:https://blog.csdn.net/a200822146085/article/details/119545374
case
when 表达式 then ‘…’
when 表达式 then ‘…’
end as xx 的用法:
select
device_id,
gender,
case
when age < 20 then '20岁以下'
when age between 20 and 24 then '20-24岁'
when age >= 25 then '25岁及以上'
when age is null then '其他'
end as age_cut
from user_profile
day=‘2021-08-12’
year(day)=‘12’
month(day)=‘8’
day(day)=‘12’
在使用GROUP BY子句时,SELECT列表中的列必须要么被聚合函数处理,要么包含在GROUP BY子句中。
解决办法:
select
device_id,university,gpa
from user_profile
where (university,gpa) in
(select university,min(gpa) as gpa
from user_profile
group by university)
order by university