|
楼主 |
发表于 2009-6-13 10:39:12
|
显示全部楼层
二、选择表中的若干元组
1. 消除取值重复的行
两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行了.
例6 查询选修了课程的学生学号.
SELECT Sno FROM SC
假设SC表中有下列数据
Sno
Cno
Grade
95001
1
92
95001
2
85
95001
3
88
95002
2
90
95002
3
80
执行上面的SELECT语句后,结果为:
如果想去掉结果表中的重复行,必须指定DISTINCT短语:
SELECT DISTINCT Sno FROM SC;
执行结果为:
Sno
95001
95002
如果没有指定DISTINCT短语,则缺省为ALL,即保留结果表中取值重复的行.
2.查询满足条件的元组
表3.3 常用的查询条件
查询条件
谓词
比较
=, > , <, <=, >=, <>, !>,!<,
NOT+上述比较运算符
确定范围
BETWEEN AND, NOT BETWEEN AND
确定集合
IN , NOT IN
字符匹配
LIKE, NOT LIKE
空值
IS NULL, IS NOT NULL
多重条件
AND, OR
(1)比较大小
= > < >= <= !=或<>
逻辑符NOT可与比较运算符同用,对条件求非。
例7 查询计算机系全体学生的名单。
SELECT Sname
FROM Student
WHERE Sdept=’CS’;
例8 查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname, Sage
FROM student
WHERE Sage< 20;
或
SELECT Sname, Sage
FROM student
WHERE NOT Sage>= 20;
例9 查询考试成绩有不及格的学生的学号。
SELECT DISTINCT Sno
FROM SC WHERE Grade< 60;
(2)确定范围
BETWEEN…AND…, NOT BETWEEN…AND…
例10 查询年龄在20-23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
例 11 查询年龄不在 20-23岁之间的学生姓名、系别和年龄。
SELECT Sname, Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
(3)确定集合
IN , NOT IN
例12 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN (‘IS’,’MA’,’CS’);
例13 查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN (‘IS’,’MA’,’CS’);
(4)字符匹配
[ NOT] LIKE ‘<匹配串>’[ESCAPE ‘<换码字符>’]
查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以含有通配符%和_
%(百分号)代表任意长度(可以为0)的字符串。
例如 a%b
_(下横线)代表任意单个字符。
例如 a_ b
例14查询学号为95001的学生的详细情况。
SELECT *
FROM STUDENT
WHERE SNO LIKE ‘95001’;
等价于 SELECT *
FROM STUDENT
WHERE SNO= ‘95001’;
如果LIKE后面的匹配串中不含通配符,则可以用=(等于)运算符取代LIKE谓词,用!=或<>(不等于)运算符取代NOT LIKE谓词。
例15 查询所有姓刘的学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE ‘刘%’;
例16查询姓“欧阳”且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE ’欧阳_ _’;
例17 查询名字中第2个字为“阳”字的学生的姓名和学号。
SELECT Sname, Sno
FROM Student
WHERE Sname LIKE ‘_ _阳%’;
例18 查询所有不姓刘的学生姓名。
SELECT Sname
FROM Student
WHERE Sname NOT LIKE ‘刘%’;
如果用户要查询的字符串本身就含有%或_,这时就要使用ESCAPE ’<换码字符>’ 短语对通配符进行转义。
例19 查询 DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE ‘DB\_Design’ ESCAPE ‘\’
例20查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE ‘DB\_%i_ _’ ESCAPE ‘\’;(5)涉及空值的查询
例21 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT SNO,CNO
FROM SC
WHERE GRADE IS NULL
例22 查询所有有成绩的学生学号和课程号。
SELECT SNO,CNO
FROM SC
WHERE GRADE IS NOT NULL
(6)多重条件查询
AND OR
例23 查询计算机系年龄在20岁以下的学生姓名。
SELECT SNAME
FROM Student
WHERE Sdept=’CS’ AND Sage<20; |
|