4.SELECT语句完整的句法
SELECT <目标表的列名或列表达式序列>
FROM <基本表名和(或)视图序列>
[WHERE <行条件表达式>]
[GROUP BY <列名序列>
[HAVING <组条件表达式>]]
[ORDER BY <列名[ASC | DESC]>,…]
说明:[]表示其中的内容根据需要可以省略。
|表示二选一。
各子句的作用:SELECT子句用于指定输出的内容;FROM子句用于指定要检索的数据的来源表;WHERE子句称为“行条件子句”,用于指定对元组的选取条件;GROUP BY子句称为“分组子句”,作用是指定对元组进行分类后再检索;HAVING子句称为“组条件子句”,用于指定对分类后的元组的选取条件;ORDER BY子句称为“排序子句”,作用是对检索到的元组进行排序。
整个语句的执行过程为:
1)读取FROM子句中基本表、视图的数据,执行笛卡儿积操作。
2)选取满足WHERE子句中给出的条件表达式的元组。
3)按GROUP子句中指定列的值分组,同时提取满足HAVING子句中组条件表达式的那些组。
4)按SELECT子句中给出的列名或列表达式求值输出。
5)ORDER子句对输出的目标表进行排序,按附加说明ASC升序排列,或按DESC降序排列。
例1:统计每门课程的学生选修人数。
SELECT COUNT(S#)
FROM SC
GROUP BY C#
例2:统计每门课程的学生选修人数,要求只查询出选修人数超过50人的结果。
SELECT COUNT(S#)
FROM SC
GROUP BY C#
HAVING COUNT(S#)>50
例3:检索每名学生的学号和年龄,查询结果按年龄降序排列,年龄相同按学号升序排列。
SELECT S#,AGE>
FROM S
ORDER BY AGE DESC,S# ASC
5.SELECT子句的具体规定
SELECT [ALL | DISTINCT] 〈列名或列表达式序列>|*
说明:1)DISTINCT选项保证重复的行将从结构中去除;而ALL选项是默认的,将保证重复的行留在结果中,一般可不必写出。
2)*是对于在FROM子句中命名表的所有列的简写。
3)列表达式中允许出现+、-、*、/等运算符以及列名和常数、聚合函数等。
例1:检索男同学选修的课程的课程号。
SELECT DISTINCT C#
FROM S,SC
WHERE S.S#=SC.S# AND SEX=’男’
例2:检索所有的学生信息。
SELECT *
FROM S
例3:检索每个学生的学号和出生年份。
SELECT S#,2008-AGE
FROM S
6.列和基本表的改名操作
有时,一个基本表在SELECT语句中多次出现,即这个表被多次调用,为区别不同的引用,应给每次的引用加上不同的名字。当然,除此情况之外,也可以给任何一个表起别名。但要注意:一旦给表起了别名,在该语句中,凡是引用该表名时,必须用别名而不能用原表名。
有时,用户也可以要求输出的列名与基本表中列名不一致,可在SELECT子句用“旧名 AS 新名”形式改名。其中AS可以省略。
例:检索每个学生的姓名和出生年份,输出的列名分别为STUDENT_NAME和BIRTH_YEAR。
SELECT S# AS STUDENT_NAME,2008-AGE AS BIRTH_YEAR
FROM S
7.条件表达式中的比较操作
1)算术比较操作:常用运算符有〈、〈=、〉、〉=、=、<>或!=
[NOT] BETWEEN…AND用来查找(不)在给定范围内的数据,下限在前,上限在后,包括上、下限。
例:检索18—20岁的学生姓名。
SELECT SNAME
FROM S
WHERE AGE〉=18 AND AGE〈=20
或:
SELECT SNAME
FROM S
WHERE AGE BETWEEN 18 AND 20
2)字符串的匹配操作
语法:<字符串> [NOT] LIKE <匹配模式>
说明:匹配模式中常使用两个通配符:
%:与零个或多个字符组成的字符串匹配。
_:与单个字符匹配。
例:检索姓名以字符D打头的学生姓名。
SELECT SNAME
FROM S
WHERE SNAME LIKE ‘D%’
转义字符:为使字符串中包含特殊字符(即%和_),允许定义转义字符。转义字符紧靠特殊字符并放在它前面,表示该特殊字符被当成普通字符。使用ESCAPE定义转义字符。
例:LIKE ‘ab\%cd%’ ESCAPE ‘\’ 匹配所有以ab%cd开头的字符串。
LIKE ‘ab\\cd%’ ESCAPE ‘\’ 匹配所有以ab\cd开头的字符串。
3)空值的比较操作
使用IS [NOT] NULL来比较。
例:检索年龄为空值的学生姓名。
SELECT SNAME
FROM S
WHERE AGE IS NULL
4)集合成员资格的比较
语法:[NOT] IN (<集合>)
例1:检索年龄分别是18、20、21岁的学生姓名。
SELECT SNAME
FROM S
WHERE AGE IN(18,20,21)
例2:检索男同学选修课程的课程号。
SELECT DISTINCT C#
FROM SC
WHERE S# IN(SELECT S# FROM S WHERE SEX=‘男’)
5)集合成员的算术比较
语法:元组 θ ALL|SOME|ANY(〈集合〉)
说明:ALL表示左边那个元组与右边集合中每一个元组满足θ运算;
ANY和SOME含义相同,表示左边那个元组与右边集合中至少一个元组满足θ运算。
例1:检索学习C2课程的学生学号和姓名。
SELECT S#,SNAME
FROM S
WHERE S# = SOME(SELECT S#
FROM SC
WHERE C#=‘C2’)
例2:检索不学C2课程的学生姓名与年龄。
SELECT SNAME,AGE
FROM S
WHERE S#〈〉ALL(SELECT S#
FROM SC
WHERE C#=‘C2’)
6)集合空否的测试
使用[NOT]EXISTS。见前面例子。