SQL语句之查询
查询语句:
1.where子句
select 查询内容 from 表名 where
where后面可以接如下查询条件
比较:>, <, >=, <=, =, <>(或!=)
确定范围:between and, not between and
确定集合:in, not in
字符匹配:like, not like
空值:is null, is not null
多重条件:and, or
字符匹配中所用的四种通配符:
_(下划线):匹配任意一个字符
%(百分号):匹配0个或多个字符
[ ](中括号):匹配括号里面的任意一个字符,如 [abc]则会匹配a、b、c任意一个,对于连续的字符,可以写为[a-c]
[^](中括号):不匹配括号里面的任意一个字符,如 [^abc]则不会匹配a、b、c中的任意一个
select sname from student where sname like '王%' --匹配姓王的学生
select sname from student where sname like '[张李陈]_%' -- 匹配姓张、李、陈的且名字只有一个字的学生
注意:where子句不能接统计函数
2.排序(默认情况为升序,即order by 字段名 就是升序)
order by 字段名 asc -- 升序
order by 字段名 desc --降序
select sname from student order by sdept asc, sage desc -- 对查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列
3.聚合函数
count(*):统计表中元组的个数
count(列名):统计列的非空值个数,可以加distinct会去除重复的值
sum(列名):计算该列的值的和
avg(列名):计算该列的值的平均值
max(列名):返回该列的值的最大值
min(列名):返回该列的值的最小值
示例:select sname from student where age = max(age)
4.分组统计
a.使用group by子句
注意:
使用了分组子句,则查询列表中的每个列必须要么是分组依据列(在group by后面的列),要么是聚合函数
***因为分组后,每个组只返回一行结果(好好想一想这句话的意思),比如按照性别分组,那就有两组,男的就返回一行结果,女的就返回一行结果,如果这时有一个查询列不在聚合函数中也不在分组子句后面,那么这个查询列就会出现多行的结果,和group by每一组只有一行结果就会冲突。
使用了分组子句,当使用聚合函数时,若括号里使用的是*,如count(*)则*默认为分组子句后面的字段
如:
select sname,sage,grade from student group by sage
-- 这是错误的,因为sname和grade并没有在group by函数后面或者聚合函数中
select sno 学号,count(*)选课门数,avg(grade)平均成绩 from sc group by sno
--正确,意思是统计每个学生的选课门数和平均成绩,这里的count(*)就是count(sno),因为结果是依据sno进行分组的。那为什么count(sno)就是选课门数呢?因为sno为学号,在sc表即选课表出现的次数就是该学生的选课门数。
按多列分组:
要求:统计每个系的男生人数和女生人数,以及男生的最大年龄和女生的最大年龄,结果按系名升序排序
select sdept 系, sex 性别, count(*)人数, max(age) 最大年龄
from student
group by sdept, sex
order by sdept
b.使用having子句
having 子句用于对分组后的结果再进行筛选,就像where子句,当它用于分组而不是单个记录。在having子句中可以使用统计函数。
示例:
要求:查询选修了三门以上课程的学生的学号和选课门数
select sno 学号, count(*) 选课门数
from sc
group by sno
having count(*) > 3
此语句的处理过程为:先执行group by 子句对sc表数据按sno进行分组,然后再用统计函数count分别对每一组进行统计,最后筛选出统计结果满足大于3的组。
where、group by、having子句的异同:
where子句用来筛选from子句中指定的数据源所产生的行数据
group by子句用来对经where子句筛选后的结果数据进行分组
having子句用来对分组后的结果数据在进行筛选
示例:
要求:查询计算机系和信息管理系的学生人数、
第一种写法
select sdept,count(*) from student
group by sdept
having sdept in('计算机系','信息管理系')
第二种写法
select sdept,count(*) from student
where sdept in('计算机系','信息管理系')
group by sdept
推荐使用第二种写法,因为第二种写法比第一种写法效率要高,where在group by语句之前执行,因此参与分组的数据比较少

浙公网安备 33010602011771号