GROUP BY
查询选修了3门以上课程的学生学号(一定要在HAVING里面)
WHERE里面不能出现函数,where是对列的一些限制条件,所以在这个题目查询选修了3门以上课程的学生学号。
求各个课程号及对应的选课人数
查询平均成绩大于等于90分的学生学号和平均成绩
[例3.48 ]查询平均成绩大于等于90分的学生学号和平均成绩
下面的语句是不对的:
SELECT Sno, AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
因为WHERE子句中是不能用聚集函数作为条件表达式
正确的查询语句应该是:
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
HAVING短语与WHERE子句的区别
HAVING短语与WHERE子句的区别:
作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组。
连接查询
连接查询:同时涉及两个以上的表的查询
对于来自n张表的连接查询,连接条件要写n-1个
连接条件或连接谓词:用来连接两个表的条件
一般格式:
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
连接字段:连接谓词中的列名称
连接条件中的各连接字段类型必须是可比的,但名字不必相同
等值与非等值的连接条件
查询每个学生及其选修课程的情况
等值连接出现了两次
自然连接(自身连接)
自然连接相同的列只允许出现一次,不允许出现两次
选择表中的若干个列
查询指定列
查询全体学生的学号与姓名
SELECT Sno,Sname
FROM Student;
查询全体学生的姓名、学号、所在系
SELECT Sname,Sno,Sdept
FROM Student;
查询全部列
查询全体学生的详细记录
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或
SELECT *
FROM Student;
查询经过计算的值
SELECT子句的<目标列表达式>不仅可以为表中的属性列,也可以是表达式
查全体学生的姓名及其出生年份。
查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。
消除取值重复的行
如果没有指定DISTINCT关键词,则缺省为ALL
查询选修了课程的学生学号。
查询考试成绩有不及格的学生的学号。
字符匹配
<匹配串>可以是一个完整的字符串,也可以含有通配符%和 _
% (百分号) 代表任意长度(长度可以为0)的字符串
例如a%b表示以a开头,以b结尾的任意长度的字符串
_ (下横线) 代表任意单个字符。
例如a_b表示以a开头,以b结尾的长度为3的任意字符串
匹配串为固定字符串
查询学号为201215121的学生的详细情况
SELECT *
FROM Student
WHERE Sno LIKE ‘201215121';
等价于:
SELECT *
FROM Student
WHERE Sno = ’ 201215121 ';