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语句之前执行,因此参与分组的数据比较少

 

posted @ 2021-08-05 17:15  功不唐捐-纯小喜  阅读(522)  评论(0)    收藏  举报