文章目录
- 基本查询
- 汇总分析
- 分组
- 练习:
- 查询每门课程被选修的学生数
- 查询男生,女生人数
- 对分组结果指定条件
- 练习
- 对查询数据进行排序
- 练习
- 复杂查询
- 练习
- 尽量避免多层嵌套!!!!
- 练习
- 多表连接
- 表的加法
- 表的联结
- 练习
- case 表达式
基本查询
select 直接换行
(distinct删除重复数据,若用在多个列 必须都相同才能算为重复) 列名 *代表所有列 (可以在这里直接进行计算 如 成绩/100 as 百分比成绩) (列之间是英文逗号,) as给列设置别名
from 直接换行
表名
where 姓名=‘猴子’;<>不等于 is null is not null
not 姓名='猴子'
and or
in 是or 的简单写法 姓名 in(‘猴子’,‘马云’) 姓名 not in(‘猴子’,‘马云’)
模糊查询
姓名 like ‘%猴’ %代表任意长度字符串
like ‘猴%’
like ‘%猴%’
like ‘猴_’ 一个下划线代表一个字符
返回的是一个表
- sql不区分关键字的大小写
- 以英文分号;结尾
汇总分析
- count 求某列的行数
- sum 对某列数据求和
- avg 求某列的平均值
- max 求某列数据的最大值
- min 求某列数据的最小值
其均返回一个值
select count(教师姓名) count跳过null
count(*) 会计算null
count(distinct 姓名)
from teacher
分组
from student
where 出生日期 >'..'
group by 性别
按照这个流程分析
把一类浓缩
在SQL中where字句的运行顺序是先于 group by 字句的,where 字句会会在形成组和计算列函数之前消除不符合条件的行
练习:
查询各科成绩最高的和最低的分
select
subject subject,max(score),min(score)
from
sc
group by
subject;
查询每门课程被选修的学生数
select
course,count(*)
from
sc
group by
course
查询男生,女生人数
select
sex,count(*)
from
sc
group by
sex
对分组结果指定条件
select
max(score),min(score)
from
sc
group by
subject;
having
count(*) > 1
练习
查询平均成绩大于60分学生的学号和平均成绩
select
sid,avg(score)
from
sc
group by
sid
having avg(score) > 60
查询至少选修两门课程的学生学号
select
sid
from
sc
group by
sid
having count(*)>= 2
查询同名同性学生名单并统计同名学生人数
select
sname,count(*)
from
sc
group by
sname
对查询数据进行排序
...
order by score desc(降序) asc(升序) 默认升序
排序 空值会默认在前
limit 2 返回前两行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lcLFKBhc-1614248052802)(4B302B9428944F3E9A0F479F0BB938F9)]
练习
查询不及格的课程并按课程号从大到小排列
select
course,avg(score) as 平均成绩
from
sc
group by
course
having
avg(score) >60 (O 里不能用别名)
order by score desc
复杂查询
视图里实际存放的是查询语句
create view 按性别汇总(性别,人数)
as
select 性别,count(*)
from student
group by 性别
然后就可以使用视图了!
select
性别,人数
from
按性别汇总
相关子查询
select
*
from (临时表)
练习
找出每个课程里成绩最低的学号
select
course,sid
from
(select
course,sid,min(score)
from
sc
group by
course
)
any all
哪些学生比课程0002的全部成绩里的任意一个高吗(一科就行)? 全部用all 经常使用直接定义成视图就行
select distinct sid
from
(
select
sid,score
from
sc
where score > any(
select
score
from
sc
where course='0002'
)
)
注意max和any的位置
select distinct sid
from
(
select
sid,score
from
sc
where score >
select
max(score)
from
sc
where course='0002'
)
✖ a>3*all(b)
✔ a/3>all(b) 对前面操作 别对后面
尽量避免多层嵌套!!!!
练习
大于平均成绩学生的学号和成绩
select
sid,score
from
sc
where
score >
(
select avg(score) from sc
);
找出中等生的学号和平均成绩
中等生(60< <80)
select sid,avg(score)
from
sc
group by
sid
having avg(score)<80 and avg(score)>60
多表连接
表的加法
(两个相同的表相加)
select 课程号,课程名称
from course
union(删除重复数据) union all(保留重复数据)
select 课程号,课程名称
from course1
表的联结
left join 从左表
right join 没有on时 有中间的
练习
查询所有学生的学号,姓名,选课数,总成绩
select sid,sname,count(*),sum(score)
from sc![在这里插入图片描述](https://img-blog.csdnimg.cn/20210225182121641.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hjaDk3Nw==,size_16,color_FFFFFF,t_70)
group by sid
查询平均成绩大于85的所有学生的学号,姓名,平均成绩
select sid,sname,avg(score)
from sc
group by sid
on avg(score) > 85;
case 表达式
case 等于对查询到的值的一个函数
select sid,sname,(case when score>60 then 'good' else 'not good' end) as goodornot
from sc
查询每门课的及格人数和不及格人数
select course,sum(case when score > 60 then 1 else 0)as 及格人数,sum(case when score >60 then 1 else 0 end)as 不及格人数
from sc
group by course
使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分段人数,课程号,和课程名称
select cid,course,sum(case when score >85 and score <= 100 then 1 else 0 end) as'[85-100]',sum(case when score >70 and score <= 85 then 1 else 0 end) as'[70-85]',sum(case when score >=0 and score <=60 then 1 else 0 end ) as'[0-60]'
from sc
group by cid;