查询一共有6个子句
书写顺序 执行顺序 作用
一、单表查询
投影查询
select sname (as) 姓名,sage 年龄 from student
--为了减小数据库的负担,尽量缩减语句
select distinct sage,ssex from student
--加上distinct就是去重,修饰的后方的组合
*的作用是啥? *里面包含所有的属性,比如select *就是显示所有的属性
select sname --显示name
from student --from做for循环
where sage>19 --取出一个给where一个比大小,进行筛选
where(筛选)语句的特点:
1:比大小 < > <= >= !=<> =(数据库的=不是赋值) 数值可以比大小,字符串也可以比大小
2:支持逻辑运算 and or not 加括号可以改变优先级 判断逻辑时注意理解中文的意思
3:逻辑关系的优先级
where snativeplace=上海
or snativeplace=北京
and ssex=女
注意与或非三者的优先级()>not>and>or
select * from student
where not ssex=男
#not用来修饰右侧的表达式,相当于取反
4:支持连续的数据闭空间,用between
where sage between 19 and 22
5:支持不连续的数据空间,用in
where sage in(19,20,33)
6:支持对空的匹配
空存在的几种形式:
这种字符串不是空,因为字符串内部分配了一个字节的内存
空的实际含义是没有分配内存,因此用null来表示空
where ssex=` ` -- ` `并不是空
where ssex=null --不能用=来表示空,需要用is来表示空
where ssex is not null
7:支持迷糊匹配,用like %代表任意多个任意字母 _表示一个任意字母
精确匹配 where sname =李四
模糊匹配 where sname like 王%
只要是比大小一定是精确匹配
group by(分组)语句:
分组 分组完成则再无个体,以后再执行时不再单个筛选,不能显示分组以外的其他属性,例如group by ssex,那么显示的时候只有男生一组,女生一组
select ssex
from student
where sage>19
group by ssex --根据性别分组的,后续查询就只能查询性别
group by 分组特征
1:投影的属性必须来自分组特征(在group by 之后执行的语句受限)
2:分组的意义在于统计,先分组才能统计(有些时候没有分组,但是进行了统计,这时候是默认分组)
假如出现两个同名的,再按照学号进行一次分组,每个人的姓名和学号就可以一一对应
select ssex,max(sage),min(sage),avg(sage),sum(sage),count(*)
from student
group by ssex
在mark表中找出所有学生的学号,最高分,均分,以及选修课程数目
select sid,max(cmark),avg(cmark),count(*) --使用count(*)时要注意各个属性的对应关系
from mark
group by sid
count 是计数,只考虑你是否是空,只要不是空都+1
在学生表中,找出男生,将男生按照班级分组,统计他们来自多少个地区。
select sclass,count(distinct snativeplace) --这里就不能用count(*)因为可能有没有填的人
from student
where ssex='男'
group by sclass
请显示学生的学号以及每个学生80分以上的课程数
select sid,count(*)
from mark
where cmark>80
group by sid
3:默认分组(可以不写group by ,但是也有分组,默认将整张表分为一个组)在不好分组时使用
select max(sage) --因为是分组所以就不能查询别的东西
from student
4:支持多属性分组
select
from student
group by sage,ssex
having(筛选)语句:
having过滤的是分组(包含统计)
练习:请找出各个班级的男生人数,请用两种不同的方法实现
方法一:先把男生筛选出来,再把筛选出来的男生进行分组,再统计。
select sclass,count (ssex)
from student
where ssex='男'
group by sclass
方法二:先将所有的人按照班级,性别分组,再筛选出性别为男生的分组,再进行统计
select sclass,ssex,count(ssex)
from student
group by sclass,ssex
having ssex='男' --筛选分组特征,可以进行统计筛选
order by(排序)语句:
- asc desc,修饰前面的属性
select *
from student
order by sage desc
根据均分降序显示每个学生的学号和均分
select sid,avg(cmark) 均分
from mark
group by sid
order by 均分 desc
2.可以进行多属性排序
select *
from student
order by sage desc,sid desc --先进行年龄排序,年龄一样的再进行学号排序
同一个学生的选课记录集中显示,但是自己的选课记录要根据成绩降序排序
select *
from mark
order by sid,cmark desc;