《1.5关系数据库标准语言SQL.ppt》由会员分享,可在线阅读,更多相关《1.5关系数据库标准语言SQL.ppt(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,Sdept FROM
3、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;或 SELECT ALL Sno FROM SC;
4、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(含边界)的学生姓名、系别和年龄。SELECT Sname,Sdept,
5、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查询既非计科系、也非数学系的学生姓名和性别。SELECT Sname,Ssex FROM
6、 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 WHERE Sname LIKE 刘%;,例16查询姓”欧阳”且全名为三个汉字
7、的学生的姓名。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某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生学号和相应课程号。SELECT Sno,Cno FROM SC
8、 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号课程的学生学号及成绩,查询结果按分数降序排列。SELECT Sno,Grade FROM SC WHERE Cno=3 ORDER BY
9、 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(DISTINCT|ALL)其中:DISTINCT短语在计算时要取消指定列中的重复值,ALL短语不取消重复值,ALL为缺省值。,例26查询学
10、生总人数。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选修课程的总学分数。SELECT SUM(Ccredit)FROM SC,Course WHERE Sno=200215121 AND SC.Cno=Course.Cno;,GROU
11、P BY子句:将查询结果按某列或多列值分组。例31求各个课程号及相应的选课人数。SELECT Cno,COUNT(Sno)FROM SC GROUP BY Cno;使用HAVING短语筛选最终输出结果:只有满足HAVING短语指定条件的组才输出,HAVING短语与WHERE子句的区别是WHERE子句作用于基表或视图,从中选择满足条件的元组;HAVING短语作用于组,从中选择满足条件的组。例32查询选修了2门以上课程的学生学号。SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)2;,连接查询:若查询同时涉及两个以上的表,则称之为连接查询。连接查询是关系
12、数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合连接查询等。等值与非等值连接查询:一般格式为:.或.BETWEEN.AND.其中:连接谓词中的列名称为连接字段,各连接字段类型必须是可比的,但不必是相同的。例33查询每个学生及其选修课程的情况。SELECT Student.*,SC.*FROM Student,SCWHERE Student.Sno=SC.Sno;,例34对例33用自然连接完成。SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE Stu
13、dent.Sno=SC.Sno;自身连接:连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为自连接。例35查询每一门课的间接先修课(即先修课的先修课)。SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno=SECOND.Cno;,外连接:一般连接操作中,只有满足连接条件的元组才能作为结果输出。例36将例32改为:SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUTER JOIN SC
14、 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;,基本表的
15、定义、修改与删除定义基本表:CREATE TABLE(,);例1建立一个学生表Student。CREATE TABLE Student(Sno CHAR(9)PRIMARY KEY,Sname CHAR(8)UNIQUE,Ssex CHAR(2),Sage INT,Sdept CHAR(20);,数据定义,例2建立一个课程表Course。CREATE TABLE Course(Cno CHAR(4)PRIMARY KEY,Cname CHAR(40),Cpno CHAR(4),Ccredit INT,FOREIGN KEY(Cpno)REFERENCES Course(Cno);例3建立一个选
16、课表SC。CREATE TABLE SC(Sno CHAR(9),Cno CHAR(4),Grade INT,PRIMARY KEY(Sno,Cno),FOREIGN KEY(Sno)REFERENCES Student(Sno),FOREIGN KEY(Cno)REFERENCES Course(Cno);,数据类型:关系模型中每一个属性来自一个域,SQL中域的概念用数据类型来实现,SQL提供了以下常用数据类型:,修改基本表:ALTER TABLE ADD 完整性约束DROP ALTER COLUMN;例8向Student表增加“入学时间”列,类型为日期时间型。ALTER TABLE Student ADD S_entrance DATETIME;不论基本表中原来是否已有数据,新增加的列一律为空值。例9将年龄的数据类型改为整数。ALTER TABLE Student ALTER COLUMN Sage INT;例10增加课程名称必须取惟一值的约束条件。ALTER TABLE Course ADD UNIQUE(Cname);删除基本表:DROP TABLE;CASCADE:表示删除表的同时相关的对象如视图也被删除。,