关系数据库标准语言SQL
开始学习数据库,以后每天把学习的知识点一点点记录
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
SELECT[ALL|DISTINCT] <目标列表达式>
[,<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>]…
[ WHERE<条件表达式>]
[ GROUPBY<列名1>[HAVING<条件表达式>] ]
[ ORDERBY<列名2>[ ASC|DESC ] ];
语句格式:
学生-课程数据库
查询操作:
3.3.1 概述
1-- 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结单表查询:
查询仅涉及一个表,是一种最简单的查询操作:
一、选择表中的若干列
二、选择表中的若干元组
三、对查询结果排序
四、使用集函数
五、对查询结果分组
2--查询指定列:
[例1] 查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student;
[例2] 查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept FROM Student;
3--查询全部列:
[例3] 查询全体学生的详细记录。
SELECT Sno,Sname,Ssex,Sage,Sdept FROMStudent;
SELECT * FROMStudent;
SELECT子句的<目标列表达式>为表达式
[例4] 查全体学生的姓名及其出生年份。
SELECT Sname,2007-Sage FROMStudent;
[例5] 查询全体学生的姓名、出生年份和所有系。在出生年份前面增加一个说明,在系名称后面增加一个“系”作为表示
SELECT Sname,'出生年份:', 2007-Sage, Sdept + '系' FROMStudent;
SELECT Sname'姓名','Year of Birth: ' '生日标识', 2007-Sage '生日', Sdept+'系' '系名' FROM Student;
5--选择表中的若干元组
假设SC表中有下列数据
Sno Cno Grade
------- ------- -------
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
ALL 与DISTINCT
[例6] 查询选修了课程的学生学号。
(1)SELECT Sno FROM SC; 或(默认ALL) SELECT ALL Sno FROM SC; (2) SELECT DISTINCT Sno FROM SC;
例:查询选修课程的各种成绩
错误的写法
SELECTDISTINCT Cno,DISTINCTGrade FROMSC;
SELECTDISTINCT Cno,Grade FROM SC;
WHERE子句常用的查询条件
:在WHERE子句的<比较条件>中使用比较运算符
[例8] 查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname, Sage FROM Student WHERE Sage < 20; 或 SELECT Sname,Sage FROM Student WHERE NOT Sage >= 20;确定范围” :
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;确定集合
使用谓词 IN<值表>, NOT IN <值表>
<值表>:用逗号分隔的一组取值
[例12]查询信息系(IS)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname, Ssex FROM Student WHERE Sdept IN ( 'IS', 'CS' );
[例13]查询既不是信息系又不是计算
机科学系的学生的姓名和性别。
SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ( 'IS','CS' ); <span style="color:#FF0000;"> </span>字符串匹配:
<匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串
当匹配模板为固定字符串时,
可以用 = 运算符取代LIKE谓词
用 != 或<>运算符取代NOTLIKE谓词
通配符:
1) 匹配模板为固定字符串
[例14] 查询学号为95001的学生的详细情况。
SELECT* FROM Student WHERE SnoLIKE '95001';
等价于:
SELECT * FROM Student WHERE Sno= '95001';
[例15] 查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex FROM Student WHERE SnameLIKE ‘刘%’;
[例16] 查询姓“刘"且全名为三个汉字的学生的姓名。
SELECT Sname FROM Student WHERE Sname LIKE ‘刘__';这里有一个疑问?:
匹配模板为含通配符的字符串
[例17] 查询名字中第2个字为“伟”字的学生的姓名和学号。
<pre name="code" class="sql">SELECT FRIST.Cno '课程名',SECOND.Cpno '先修课程' FROM Course FRIST,Course SECONDWHERE FRIST.Cpno=SECOND.Cno
[例18] 查询所有不姓刘的学生姓名。
SELECTSname,Sno,Ssex FROM Student WHERE SnameNOT LIKE '刘%';
使用换码字符将通配符转义为普通字符
[例19] 查询课程名称中包含“面向对象_C++课程”的课程号和学分。
SELECT Cno, Ccredit FROM Course WHERE Cname LIKE ‘%面向对象\_C++%’ ESCAPE ‘\’
使用换码字符将通配符转义为普通字符(续)
[例20] 查询以"DB_"开头,且倒数第3个字符为i的课程的详细情况。
SELECT * FROM Course WHERE Cname LIKE 'DB\_%i_ _' ESCAPE ' \ ';
SELECT FRIST.Cno '课程名',SECOND.Cpno '先修课程' FROM Course FRIST,Course SECONDWHERE FRIST.Cpno=SECOND.Cno用逻辑运算符 AND 和 OR 来联结多个查询条件
可用来实现多种其他谓词
[例23] 查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname FROM Student WHERE Sdept= 'CS' AND Sage<20;
[例24] 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECTSname,Ssex FROMStudent WHERESdeptIN ( 'IS', 'MA', 'CS' )
SELECTSname,Ssex FROM Student WHERE Sdept='IS' OR Sdept='MA' OR Sdept='CS ';[ 例 25] 查询年龄在 20~23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别和年龄 。
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; 可改写为: SELECT Sname,Sdept,Sage FROM Student WHERE Sage>=20 AND Sage<=23对查询结果排序
使用ORDERBY子句
当排序列含空值时
NULL 作为最小值
对查询结果排序(续)<span style="color:#000000;">SELECT Sno,Grade FROM SC WHERE Cno= '3' ORDER BY Grade DESC; </span>
[例25] 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
<span style="color:#000000;">SELECT * FROM Student ORDER BY Sdept, Sage DESC; </span>
5类主要集函数 计数 COUNT([DISTINCT|ALL] *) COUNT([DISTINCT|ALL] <列名>) 计算总和 SUM([DISTINCT|ALL] <列名>) 计算平均值 AVG([DISTINCT|ALL] <列名>)
求最大值 MAX([DISTINCT|ALL] <列名>) 求最小值 MIN([DISTINCT|ALL] <列名>) DISTINCT短语:在计算时要取消指定列中的重复值 ALL短语:不取消重复值 ALL为缺省值
[例26] 查询学生总人数。
SELECT COUNT(*) FROM Student;
[例27] 查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno) FROM SC; 注:用DISTINCT以避免重复计算学生人数
[例28] 计算2号课程的学生平均成绩。
SELECT AVG(Grade) FROM SC WHERE Cno= ' 2 ';
[例29] 查询选修3号课程的学生最高分数。
SELECT MAX(Grade) FROM SC WHER Cno= ' 3';
使用GROUPBY子句分组
细化集函数的作用对象
[例30] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;