文章目录

  • 基本查询
  • 汇总分析
  • 分组
  • 练习:
  • 查询每门课程被选修的学生数
  • 查询男生,女生人数
  • 对分组结果指定条件
  • 练习
  • 对查询数据进行排序
  • 练习
  • 复杂查询
  • 练习
  • 尽量避免多层嵌套!!!!
  • 练习
  • 多表连接
  • 表的加法
  • 表的联结
  • 练习
  • 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 ‘猴_’ 一个下划线代表一个字符

返回的是一个表

  1. sql不区分关键字的大小写
  2. 以英文分号;结尾

汇总分析

  1. count 求某列的行数
  2. sum 对某列数据求和
  3. avg 求某列的平均值
  4. max 求某列数据的最大值
  5. min 求某列数据的最小值
    其均返回一个值
select count(教师姓名)  count跳过null
       count(*) 会计算null
       count(distinct 姓名)
from teacher

分组

from student
where 出生日期 >'..'
group by 性别

mysql查询姓李的个数 sql查询姓李的学生个数_mysql查询姓李的个数

按照这个流程分析
把一类浓缩
在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

表的联结

mysql查询姓李的个数 sql查询姓李的学生个数_数据_02

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;