《1.5关系数据库标准语言SQL》由会员分享,可在线阅读,更多相关《1.5关系数据库标准语言SQL(24页珍藏版)》请在金锄头文库上搜索。
1、1.5关系数据库标准语言SQL,学习目标,理解SQL的特点和基本概念掌握基本表的定义、删除与修改理解SELECT语句的一般格式 掌握单表查询操作 掌握多表连接查询操作,SQL(Structured Query Language)简介:结构化查询语言,是一个通用的、功能极强的关系数据库标准语言。1974年由Boyce和Chamberlin提出,并在IBM公司研制的RDBMS原型System R上实现。1986年10月美国国家标准局ANSI批准为美国标准(SQL-86)。1987年国际标准化组织ISO通过了这一标准。随着数据库技术的发展而不断发展,最新标准SQL2003。,1.5 关系数据库标准语
2、言SQL,查 询,SELECT语句的一般格式: SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC;,示例学生-课程数据库,单表查询:仅涉及一个表的查询。选择表中的若干列:对应于关系代数的投影运算。查询指定列 例1查询全体学生的学号与姓名。 SELECT Sno,Sname FROM Student; 例2查询全体学生的姓名、学号、系别。 SELECT Sname,Sno,Sdept FROM Student;查询全部列 例3查询全体学生的详细记录。 SELECT Sno,Sname,Ssex,Sage,Sd
3、ept FROM Student; 或SELECT * FROM Student;,查询经过计算的值 例4 查询全体学生的姓名及其出生年份。 SELECT Sname,2010-Sage FROM Student; 例5查询全体学生的姓名、出生年份和系别,要求用小写字母表示所有系名。 SELECT Sname,2010-Sage ,LOWER(Sdept) FROM Student;选择表中的若干元组消除取值重复的行:两个原不相同的元组,投影到指定的某些列后,可能变成相同的行了,可以用DISTINCT取消它们。例6查询选修了课程的学生学号。 SELECT Sno FROM SC; 或 SELE
4、CT ALL Sno FROM SC; SELECT DISTINCT Sno FROM SC;,查询满足条件的元组:使用WHERE子句,其中的条件有:比较 例7查询计算机科学系全体学生的名单。 SELECT Sname FROM Student WHERE Sdept=CS;,例8查询所有年龄在20岁以下的学生姓名及其年龄。 SELECT Sname,Sage FROM Student WHERE Sage20; 例9查询考试成绩有不及格的学生学号。 SELECT DISTINCT Sno FROM SC WHERE Grade60;确定范围 例10查询年龄在2023(含边界)的学生姓名、系
5、别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23; 例11查询年龄不在2023的学生姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;确定集合:使用谓词IN或NOT IN查找属性值属于指定集合的元组。,例12查询计算机科学系或数学系的学生姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept IN (IS,MA); 例13查询既非计科系、也非数学系的学
6、生姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN (IS,MA); 字符匹配:谓词NOT LIKE 匹配串 ESCAPE 换码字符。其含义是查找指定的属性列值与匹配串相匹配的元组。例14查询学号为200215121的学生详细情况。 SELECT * FROM Student WHERE Sno LIKE 200215121; 等价于:SELECT * FROM Student WHERE Sno=200215121; 例15查询所有姓刘学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student
7、 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 刘%;,空值:使用谓词IS NULL 或 IS NOT NULL。 例21某些学生选修课程后没有参加考试,所以有选课记录,但
8、没有考试成绩。查询缺少成绩的学生学号和相应课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL; 例22查所有有成绩的学生学号和课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;多重条件 例23查询计算机科学系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student WHERE Sdept=CS AND Sage20;ORDER BY子句:对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为升序。 例24查询选修了3号课程的学生学号及成绩,查询结果按
9、分数降序排列。SELECT Sno,Grade FROM SC WHERE Cno=3 ORDER BY Grade DESC;,例25查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。 SELECT * FROM Student ORDER BY Sdept,Sage DESC; 聚集函数:五类聚集函数:计数:COUNT(DISTINCT|ALL *) COUNT(DISTINCT|ALL )计算总和:SUM(DISTINCT|ALL )计算平均值:AVG(DISTINCT|ALL )求最大值:MAX(DISTINCT|ALL )求最小值:MIN(DISTINC
10、T|ALL ) 其中:DISTINCT短语在计算时要取消指定列中的重复值,ALL短语不取消重复值,ALL为缺省值。,例26查询学生总人数。 SELECT COUNT(*) FROM Student; 例27查询选修了课程的学生人数。 SELECT COUNT(DISTINCT Sno) FROM SC; 例28计算2号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC WHERE Cno=2; 例29查询选修2号课程的学生最高分数。 SELECT MAX(Grade) FROM SC WHERE Cno=2; 例30查询学生200215121选修课程的总学分数。 SELE
11、CT SUM(Ccredit) FROM SC,Course WHERE Sno=200215121 AND SC.Cno=Course.Cno;,GROUP BY子句:将查询结果按某列或多列值分组。 例31求各个课程号及相应的选课人数。 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; 使用HAVING短语筛选最终输出结果:只有满足HAVING短语指定条件的组才输出,HAVING短语与WHERE子句的区别是WHERE子句作用于基表或视图,从中选择满足条件的元组;HAVING短语作用于组,从中选择满足条件的组。 例32查询选修了2门以上课程的学生学号。 S
12、ELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 2;,连接查询:若查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合连接查询等 。等值与非等值连接查询:一般格式为: . . 或 . BETWEEN . AND . 其中:连接谓词中的列名称为连接字段,各连接字段类型必须是可比的,但不必是相同的。 例33查询每个学生及其选修课程的情况。SELECT Student.*,SC.* FROM Student,SCWHERE Student.Sno=S
13、C.Sno;,例34对例33用自然连接完成。 SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno=SC.Sno;自身连接:连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为自连接。 例35查询每一门课的间接先修课(即先修课的先修课)。 SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST, Course SECOND WHERE FIRST.Cpno=SECOND.Cno;,外连接:一般连接操作中,只有满足连接条件的元
14、组才能作为结果输出。例36将例32改为: SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno); 复合条件连接:WHERE子句中可以多个连接条件。 例37查询选修2号课程且成绩在80分以上所有学生。 SELECT Student.Sno,Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND Cno=2 AND Grade80;,例38查询每个学生的学号、姓名、选修的课程名及成绩。 SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;,