Student表
Course表
SC表
1.选择表中的若干列
(1)查询指定的列
eg:查询全体学生的学号,姓名和所在系的有关信息
select Sno,Sname,Sdept from Student
eg:查询所有学生的所有信息
select * from Student
(2)查询经过计算的值
查询所有学生的姓名及出生年份
select Sname,2017-Sage from Student
select Sname,'Year of Birth',2017-Sage from Student
select Sname,2017-Sage Birthday from Student
eg:查询学生的学号,姓名和所在系,要求用小写字母表示所在的系
select Sno,Sname,lower(Sdept) from Student
2.选择表中的若干元组
(1)消除取值相同的行
select distinct Sno from SC;
(2)查询满足条件的元组
比较 =,>,<,>=,<,=,!=,<>,!>,!<,not+上述比较运算符
确定范围 between and,not between and
确定集合 in,not in
字符匹配 like,not like
空值 is null,is not null
逻辑运算 and,or,not
基于比较运算的查询
eg:查询计算机系的所有学生的学号和姓名。
select Sno,Sname from Student where Sdept='CS';
eg:查询考试成绩不及格的学生的学号
select Sno from SC where Grade<60;
或者
select Sno from SC where not Grade>=60;
基于范围条件的查询
eg:查询年龄在20-30岁之间的学生的姓名,所在系和性别
select Sname,Sdept,Ssex from Student
where Sage between 20 and 23
或者
select Sname,Sdept,Ssex from Student
where Sage>=20 and Sage<=23
基于确定集合的查询
eg:查询计算机系,数学系,和信息系的学生姓名和年龄。
select Sname,Sage from Student
where Sdept='CS' or Sdept='MA' or Sdept='IS'
或者
select Sname,Sage from Student
where Sdept in ('CS','MA','IS')
eg:查询既不是数学系也不是计算机系的学生姓名和性别
select Sname,Ssex from Student
where Sdept not in ('MA','CS')
基于字符串匹配的查询
谓词like可以用来查找指定列与给定字符串常量匹配的元组。在字符串常量中可以包含通配符从而实现模糊查询。其语法格式为:
[not] like '<匹配串>' [escape '<换码子符>']
其含义是查询指定的属性列值与<匹配串>相匹配的元组。<匹配串>中可以包含下面两个通配符
- %(百分号):代表任意长度(长度可以为0)的字符串
例如:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,afdvb,ab等都满足该匹配串 - _(下划线):代表任意单个字符
例如:a_b表示以a为开头,以b为结尾的长度为3的字符串。
eg:查询信息系所有学生的情况
select * from Student
where Sdept like 'IS'
或者
select * from Student
where Sdept='IS'
eg:查询所有姓张的,第3个字为”伟”的学生的姓名,学号和性别。
select Sname,Sno,Ssex from Student
where Sname like '张__伟%'
eg:查询DB_Design课程的课程号及学分
select Cno,Ccredit from Course
where Cname like 'DB\_Design' escape '\'
//escape '\'为转换字符,这样匹配串中紧跟在'\'后的字符就不再具有通配符的含义,即将通配符_转义为普通的字符.
基于空值的查询
eg:查询没有考试成绩的学生的学号及相应的课程号。
select Sno,Cno from SC
where Grade is null
基于多个条件的查询
eg:查询计算机系年龄在20岁以下的学生的学号,姓名和性别
select Sno,Sname,Ssex from Student
where Sdept='CS' and Sage<20
查询结果排序
eg:查询选修了1号课程的学生的学号及成绩,查询结果按成绩的降序排序
select Sno,Grade from SC
where Cno='1'
order by Grade desc
eg:查询全体学生情况,查询结果按所在系的升序排序,同一系中的学生按年龄降序排序
select * from Student
order by Sdept,Sage desc;
聚集函数
(1)AVG,用于计算查询结果的平均值,语法格式为
AVG ([all|distinct] <列名>)
其中,distinct表示只计算不同值的平均值,若有重复值,则该重复值只计算一次,默认为all。
eg:计算选修了2号课程的学生的平均分
select AVG(Grade) as '平均成绩' from SC
where Cno='2';
(2)MIN,该函数用于在表中查询列值的最小值。语法格式为:
min([all|distinct] <列名>)
eg:查询成绩表中的最低分
select min(distinct Grade) as '最低分' from SC;
(3),max,该函数用于在表中查询列值的最大值
(4).sum,该函数用于计算表中某列值的和。语法格式为
sum([all|distinct] <列名>)
其中,all|distinct的含义与avg函数相同
(5)count,该函数用于统计表中或查询结果中元组的个数,且只统计不为
空的元组。语法格式为count([all|distince] <列名>])
注意,若指定distinct短语,则表示统计是取消指定列中的重复值,默认为all。
eg:统计学生的总人数
select count(*) as '总人数' from Student;
eg:统计选修了课程的学生人数
select count(distinct Sno) from SC;
查询结果分组
(1)group by子句。在SQL中,可以用group by子句将查询的结果按指定的列进行分组,即将指定列值相同的元组分为一组。对查询结果分组的目的是为了细化聚集函数的作用对象。若对查询结果没有分组,聚集函数的作用对象是整个查询结果,分组后聚集函数将作用于每一个分组,即相当于每个分组均有一个函数值。
eg:查询每门课程的课程号及相应的选课人数。
select Cno,COUNT(Sno)
from SC
group by Cno;
该查询把结果中的元组按课程号值相同进行分组,那么选修了相同课程的学生被分为一组,然后再对每个分组作用于聚集函数count,即可求的每个分组中的学生人数。
(2)having短语,having短语按一定的条件对分组进行筛选,即把符合指定条件的分组进行输出。但having与where子句不同,他们的区别有如下几点。
- where子句中条件的作用对象是基本表或视图,而having子句中条件的作用对象是每个分组。
- 执行查询时,再按照group by子句分组之前先去除不满足where子句中条件的元组,而having子句中的条件在分组之后被应用。
- having子句可以在条件中包含聚集函数,但where子句中不能包含。
select Sno from SC
where Grade>=90
group by Sno having count(*)>3;
该例查询中,先用group by子句将90分以上的成绩按照Sno进行分组,在用聚集函数count对每一组进行统计,having子句给出了选择组的条件,只有满足元组个数大于3的组才能被输出,即有3门以上成绩大于90分的组予以输出。