1、第三章 关系数据库标准语言 SQL,第三章 关系数据库标准语言SQL,SQL(structured query language),结构化查询语言,是一个通用的、功能极强的关系数据库语言。 SQL是关系数据库的标准语言。 SQL是一种介于关系代数与关系演算之间的语言。,本章主要内容,SQL概述 数据定义 数据查询 数据更新 视图 数据控制,3.1 SQL概述 3.1.1 SQL的产生与发展,发展过程 1974年,Boyce 和Chamberlin提出SQL语言 19751979年,在IBM公司System R上实现,SQL标准的进展,3.1.2 SQL语言的特点,综合统一 高度非过程化 面向集
2、合的操作方式 以同一种语法结构提供两种使用方式 语言简洁,易学易用,SQL语言的动词,3.1.3 SQL语言的基本概念,SQL,视图1,视图2,基本表1,基本表2,基本表3,基本表4,存储文件1,存储文件2,内模式 (存储模式),模式,外模式,SQL数据库体系结构,用户,student,Student 视图,3.2 学生-课程数据库,Student,Course,SC,3.3 数据定义,关系数据库的基本对象是表、视图、索引。 SQL的数据定义功能包括模式定义、表定义、视图和索引定义。,SQL的数据定义语句,3.3.1 模式的定义与删除,一.定义模式 CREATE SCHEMAAUTHORIZA
3、TION,例1:定义一个学生-课程模式S-T CREATE SCHEMA“S-T“ AUTHORIZATION WANG; 例2: CREATE SCHEMA AUTHORIZATION WANG;,CREATE SCHEMA AUTHORIZATION ,例3 CREATE SCHEMA TEST AUTHORIZATION ZHANGCREATE TABLE TAB1(COL1 SMALLINT,COL2 INT,COL3 CHAR(20),COL4 NUMERIC(10,3),COL5 DECIMAL(5,2);,删除模式 DROP SCHEMA ,例4DROP SCHEMA ZHANG
4、 CASCADE;,3.2.2 定义、删除与修改基本表,定义基本表基本格式: CREATE TABLE (列级完整性约束条件,列级完整性约束条件 ,);,例5 建立一个“学生”表Student,它由学号Sno、 姓名Sname、性别Ssex、年龄Sage、所在系Sdept 5个属性组成,其中学号是主键,学生姓名值是唯一的。CREATE TABLE Student(Sno CHAR(5) PRIMARY KEY,Sname CHAR(20) UNIQUE,Ssex CHAR(1),Sage INT,Sdept CHAR(15);,Student,例6 建立一个“课程表”Course.CREATE
5、 TABLE Course(Cno CHAR(4) PRIMARY KEY,Cname CHAR(40),Cpno CHAR(4),Ccredit SMALLINT,FOREIGN KEY Cpno REFERENCES Course(Cno);,例7 建立学生选课表SC CREATE TABLE SC(Sno CHAR(9),Cno CHAR(4),Grade SMALLINT,PRIMARY KEY(Sno,Cno),FOREIGN KEY(Sno)REFERENCES Student(Sno),FOREIGN KEY(Cno)REFERENCES Course(Cno);,二.数据类型,
6、常用数据类型,三.模式与表,定义基本表所属模式的方法: 方法一:在表名中明显地给出模式名CREATE TABLE “S-T“.Student();CREATE TABLE “S-T“.Cource();CREATE TABLE “S-T“.SC();,方法二:在创建模式语句中同时创建表,如例3,方法三:设置所属的模式,这样在创建表时表名中不必给出模式名。 SET search_path TO “S-T“,PUBLIC;,修改基本表基本格式:ALTER TABLE ADD完整性约束DROPMODIFY(ALTER COLUMN);,例8 向Student表增加“入学时间”列,其数据类 型为日期型
7、。ALTER TABLE Student ADD S_entrance DATE;,例9 将年龄的数据类型改为整数。ALTER TABLE Student MODIFY Sage INT;(ALTER COLUMN Sage INT;),例10 删除关于学号必须取唯一值的约束ALTER TABLE StudentDROP UNIQUE(Sno);,Student,例11.增加课程名称必须取唯一值的约束条件ALTER TABLE Course ADD UNIQUE(Cname);,删除基本表基本格式:DROP TABLERESTRICTCASCADE;例12 删除Student表DROP TAB
8、LE Student CASCADE;,例13 若表上建有视图,选择RESTRICT时表不能删除;CASCADE时可以删除表,视图也自动被删除。 CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept=IS;DROP TABLE Student RESTRICT; -ERROR:cannot drop table Student because other objects depend on it DROP TABLE Student CASCADE; -NOTICE:drop cascades to v
9、iew IS_StudentSELECT * FROM IS_Student; -ERROR:relation “IS_Student“ does not exist,3.2.2 建立与删除索引,建立索引基本格式: CREATE UNIQUECLUSTER INDEX ON(, );,索引类型,普通索引没有指定UNIQUE或CLUSTERED等,将建立普通索引。 唯一索引通过指定UNIQUE则为表创建唯一索引(不允许存在索引值相同的两个元组)。 聚簇索引聚簇索引的索引值与关系中元组的顺序物理上相同。一个表只允许建立一个聚簇索引。,例13 CREATE CLUSTER INDEX Stusnam
10、eON Student(Sname);,例14 为学生-课程数据库中的Student,Course,SC 3个表建立索引。其中Student按学号升序建立唯一索引,Course 表按课程号升序建立唯一索引,SC表学号升序和课程号降序建唯一索引。CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);,删除索引基本格式:DROP INDEX例7 删除Student 表的Stusnam
11、e索引。DROP INDEX Stusname;,习题,建立一个图书表book,由图书号(定长字符串,长度20),书名(变长字符串,长度50),作者(变长字符串,长度30),出版社(变长字符串,长度30),单价(浮点型 ,FLOAT)构成,其中书名、作者、出版社单价均不能为空值。 建立一个读者表reader,由读者号(定长字符串,长度10),姓名(定长字符串,长度8),性别(定长字符串,长度为2),办公电话(定长字符串,长度为8),部门(变长字符串,长度30)构成,其中,姓名、性别为非空值,办公电话和部门为空值。 建立借阅表loan,由读者号(定长字符串,长度10),图书号(定长字符串,长度2
12、0),借出日期(定长字符串,长度8),归还日期(定长字符串,长度8),其中借出日期不能为空值,归还日期为空值。,给图书表增加一列“ISBN”,数据类型为CHAR(13)。 为增加的ISBN列增加非空值的约束。 删除图书表中ISBN列非空值约束。 将ISBN的数据类型改为整数。 在图书表的图书号上建立一个唯一索引。 在图书表的书名列上建立一个聚簇索引。 删除刚建立的索引。,列级完整性约束 NOT NULL和NULL约束说明指定的列允许或不允许为空值。 UNIQUE约束唯一性约束,每个UNIQUE约束都生成一个惟一索引。 DEFAULT定义为列定义默认值,每列只能有一个DEFAULT定义。,例 在
13、student上经常需要按学号进行查询,则可以为之建立一个普通索引:CREATE INDEX Sno-idx ON student(Sno)多字段上建立索引 CREATE INDEX Sno-Sage-idx ON student(Sno,sage DESC),例 在student关系中规定一个学生只能有 一个学号,因此可以在student的sno 属性上建立一个惟一索引。CREATE UNIQUE INDEX sno-idx ON student(sno);,例 在student表的姓名列上建立一个聚簇索引。CREATE CLUSTER INDEX sname-idx on student(
14、sname);,3.3 数据查询,基本格式SELECT ALLDESTINCT, FROM , WHERE GROUP BY HAVINGORDER BY ASCDEC;,“学生课程”数据库: Student 表 由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)组成:Student (Sno,Sname,Ssex,Sage,Sdept)其中Sno为主码。 SC表 由学号(Sno)、课程号(Cno)、成绩(Grade)组成:SC (Sno, Cno,Grade) Course表 课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Cc
15、redit) 组成:Course (Cno,Cname,Cpno,Ccredit),单表查询(简单查询),查询表中的若干列 查询指定列例1. 查询全体学生的学号与姓名.SELECT Sno, SnameFROM Student ;,例2. 查询全体学生的姓名,学号,所在系.SELECT Sname , Sno, SdeptFROM Student ;,查询全体在SELECT后列出所有列名将目标表达式指定为*(结果顺序与基本表中相同)例3.查询全体学生的详细记录SELECT *FROM Student ;,可以是列名,列和常数组成的加、减、乘、除 等算术表达式,还可以是字符串常量、函数等。查询经
16、过计算的值 例4.查询全体学生的姓名及出生年份.SELECT Sname,2013-SageFROM Student ;查询结果:Sname 2013-Sage李勇 1990刘晨 1991王名 1992张立 1992,查询结果中包含字符串常量、函数例5.查询全体学生的姓名、YearofBirth:、出生年份和所在系,用小写字母表示所有系名。SELECT Sname,Year of Birth:, 2010-Sage ,ISLOWER(Sdept)FROM Student ;输出结果: Sname Yearof Birth: 2010-Sage ISLOWER(Sdept) 李勇 Yearof
17、Birth: 1990 cs刘晨 Yearof Birth : 1991 is王名 Yearof Birth : 1992 ma张立 Yearof Birth : 1992 is,改变查询结果的列标题 例 查询全体学生的姓名、YearofBirth、出生年份和所在系,要求YearofBirth列名设置为BIRTH,小写字母表示所有系名,将所在系的列名设置为DEPARTMENT,将姓名列的列名设置为NAME,出生年份列名设置为BIRTHDAYSELECT Sname NAME,Year of Birth: BIRTH ,1996-Sage BIRTHDAY,ISLOWER(Sdept) DEPA
18、RTMENTFROM Student ;NAME BIRTH BIRTHDAY DEPARTMENT李勇 Yearof Birth: 1990 cs刘晨 Yearof Birth : 1991 is王名 Yearof Birth : 1992 ma张立 Yearof Birth : 1992 is,取消取值重复的行 SELECT ALLDISTINCT, FROM , ALL:不去掉重复元组DISTINCT:去掉重复元组例6. 查询所有选修过课的学生学号。SELECT SnoFROM SC ;,假设SC表中有下列数据:Sno Cno Grade95001 1 9295001 2 8595001
19、 3 8895002 2 8095002 3 80 执行SELECT语句后,输出结果:Sno9500195001950019500295002,例 查询所有选修过课的学生的学号,去掉结果表中的重复行SELECT DISTINCT SnoFROM SC ;输出结果:Sno9500195002,习题,设一图书馆数据库中包括3个表:图书表 Book(Bno,Bname,Writer,Pub,Price)读者表 Reader(Rno,Rname,Rsex,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rday)查询全体图书的详细信息(两种查询方式)查询书名、作者、出版社、价格、图书号
20、查询所有读者的姓名、读者号、电话查询全体图书的信息,其中单价打8折,并且将该列设置别名为“打折价”,设一图书馆数据库中包括3个表:图书表 Book(Bno,Bname,Writer,Pub,Price)读者表 Reader(Rno,Rname,Rsex,Rage,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rday)查询全体读者的姓名、性别、出生年份、部门,要求用大写字母表示所有部门名(UPPER)SELECT Rname,Rsex,2010-Rage,UPPER(Rdep)FROM Reader; 查询全体借出图书的图书号,读者号, center library 该列设置
21、别名“library”,借阅日期,归还日期SELECT Bno,Rno,center libray library,Lday,RdayFROM Loan; 显示所有借阅者的读者号,并去掉重复行SELECT DISTINCT RnoFROM Loan;,2.查询表中的若干元组 查询满足条件的元组通过WHERE子句实现条件查询,常用的查询条件,比较比较运算符:=,, =, , !, !NOT+比较符例7. 查询计算机系全体学生的名单.SELECT Sname FROM StudentWHERE Sdept=CS;,例8. 查询年龄在20岁以下的学生姓名及其年龄。SELECT Sname ,Sage
22、FROM StudentWHERE Sage=20,例9. 查询考试不及格的同学的学号SELECT DISTINCT SnoFROM SC WHERE Grade60;,确定范围BETWEEN AND NOT BETWEEN AND 例10. 查询年龄在20和23之间的学生的姓名,系别和年龄. SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 23;( WHERE Sage NOT BETWEEN 20 AND 23; ),确定集合INNOT IN 例12.查询信息系,数学系和计算机系的学生的姓名和性别。SELECT Sn
23、ame,SsexFROM StudentWHERE Sdept IN (IS,MA,CS);(WHERE Sdept NOT IN (IS,MA,CS);),字符匹配 语法格式: NOT LIKE ESCAPE% 代表任意长度的字符串._ 代表任意单个的字符.,例14. 查询学号为95001的学生详细情况SELECT *FROM StudentWHERE Sno LIKE 95001;例15.查询所有姓段的学生姓名,学号,性别.SELECT Sname, Sno, SsexFROM StudentWHERE Sname LIKE 段%;,例16.查询名字中第二个字为“丽”字的学生姓名和学号.S
24、ELECT Sname ,SnoFROM StudentWHERE Sname LIKE _ _丽% ;例17.查询名字为“兵”且全名为2个汉字的学生的姓名。SELECT Sname FROM StudentWHERE Sname LIKE _ _兵 ;,例18.查询姓“欧阳”且全名为3个汉字的学生的姓名 SELECT Sname FROM StudentWHERE Sname LIKE 欧阳_ _ ;例19.查询所有不姓段的学生学号,姓名,性别.SELECT Sno, Sname, SsexFROM StudentWHERE Sname NOT LIKE 段% ;,例20.查DB_DESIG
25、N课程的课程号和学分。SELECT Cno,CcreditFROM CourseWHERE Cname LIKE DB_Design ESCAPE ;例21.查以“DB_”开头,且倒数第三个字符为i的课程 的详细情况。SELECT *FROM CourseWHERE Cname LIKE DB_% i_ _ ESCAPE ;,其执行结果为:Cno Cname Ccredit 8 DB_Design 4 10 DB_Programing 2 13 DB_DBMS Design 4,空值的查询IS NULLIS NOT NULL例22.查缺少成绩的学生的学号和相应的课程号。SELECT Sno,C
26、noFROM SCWHERE Grade IS NULL;,例23.查所有有成绩的学生的学号和相应的课程号.SELECT Sno,CnoFROM SCWHERE Grade IS NOT NULL;,多重条件查询AND,OR例24.查CS系年龄在20岁以下的学生姓名。SELECT SnameFROM StudentWHERE Sdept=CS AND Sage20 ;,例25.查询信息系,数学系和计算机系的学生的姓名和性别。 SELECT Sname,Ssex FROM Student WHERE Sdept=IS OR Sdept=MA OR Sdept=CS ;,习题,设一图书馆数据库中包
27、括3个表:图书表 Book(Bno,Bname,Writer,Pub,Price)读者表 Reader(Rno,Rname,Rsex,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rday) 查询所有单价在20-30元之间的图书信息SELECT *FROM BookWHERE Price BETWEEN 20 AND 30;WHERE (Price=20) AND (Price=30); 查询所有单价不在20-30元之间的图书信息SELECT *FROM BookWHERE Price NOT BETWEEN 20 AND 30; 查询机械工业出版社、科学出版社、人民邮电出版
28、社的图书信息SELECT*FROM BookWHERE Pub IN(机械工业出版社,科学出版社,人民邮电出版社);WHERE (Pub= 机械工业出版社) OR (Pub=科学出版社) OR (Pub= 人民邮电出版社);,习题,设一图书馆数据库中包括3个表:图书表 Book(Bno,Bname,Writer,Pub,Price)读者表 Reader(Rno,Rname,Rsex,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rday) 查询不是机械工业出版社、也不是科学出版社的图书信息SELECT*FROM BookWHERE Pub NOT IN(机械工业出版社,科学出
29、版社);WHERE Pub!= 机械工业出版社 AND Pub!= 科学出版社; 查找姓名的第二个字符是“建”并且只有两个字符的读者的读者号、姓名。SELECT Rno,RnameFROM ReaderWHERE Rname LIKE _ _建; 查找姓“王”的所有读者的读者号、姓名SELECT Rno,RnameFROM ReaderWHERE Rname LIKE王%;,设一图书馆数据库中包括3个表:图书表 Book(Bno,Bname,Writer,Pub,Price)读者表 Reader(Rno,Rname,Rsex,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rd
30、ay) 查找姓“王”、“张”或“李”的所有读者的读者号、姓名。SELECT Rno,RnameFROM ReaderWHERE (Rname LIKE 王%) OR (Rname LIKE 张%) OR (Rname LIKE 李%); 查找不姓“王”、“张”或“李”的所有读者的读者号、姓名。SELECT Rno,RnameFROM ReaderWHERE (Rname NOT LIKE 王%) AND (Rname NOT LIKE 张%) AND (Rname NOT LIKE 李%); 查询未归还图书的借阅信息。SELECT *FROM LoanWHERE Rday IS NULL;,设
31、一图书馆数据库中包括3个表:图书表 Book(Bno,Bname,Writer,Pub,Price)读者表 Reader(Rno,Rname,Rsex,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rday) 查询借出并已归还的图书的借阅信息。SELECT *FROM LoanWHERE Rday IS NOT NULL; 11 查询单价在20元以上,30元以下的机械工业出版社出版的图书名、单价。SELECT Bname,PriceFROM BookWHERE (Price BETWEEN 20 AND30) AND (Pub=机械工业出版社); 12 查询机械工业出版社或科
32、学出版社出版的图书名、出版社、单价。SELECT Bname,Pub,PriceFROM BookWHERE Pub=机械工业出版社 OR Pub=科学出版社;WHERE Pub IN (机械工业出版社, 科学出版社);,3.对查询结果排序,ORDER BY ASCDESC;例 26.查询选修3号课的学生的学号及成绩,查 询结果按分数的降序排列。SELECT Sno , GradeFROM SCWHERE Cno=3ORDER BY Grade DESC;,查询结果:SNO GRADE9501095024 95007 9295003 8295010 8295009 7595014 619500
33、2 55,例27 查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列。 SELECT*FROM StudentORDER BY Sdept,Sage DESC,4.聚集函数,COUNT(DISTINCT |ALL *)统计元组个数。 COUNT(DISTINCT |ALL列名)统计一列中值的个数 SUM(DISTINCT |ALL列名)(此列必须是数值型)计算一列值的总和。 AVG(DISTINCT |ALL列名)(此列必须是数值型)计算一列值的平均值。 MAX(DISTINCT |ALL列名)求一列值中的最大值。 MIN(DISTINCT |ALL列名)求一列值中的最
34、小值。,例28.查询学生总人数。SELECT COUNT(*)FROM Student;例29.查询选修了课程的学生人数。SELECT COUNT (DISTINCT Sno)FROM SC ;,例30.计算1号课程的学生平均成绩。SELECT AVG(Grade)FROM SCWHERE Cno= 1 ;例31.查询1号课程的学生最高成绩。SELECT MAX(Grade)FROM SCWHERE Cno=1 ;,5.对查询结果分组,GROUP BY HAVING例32 查询各个课程号与相应的选课人数。SELECT Cno, COUNT(Sno)FROM SCGROUP BY Cno ;,查
35、询结果CNO COUNT(SNO)1 222 343 444 33 5 48,例33.查询信息系选修了3门以上课程的学生的 学号 SC表 由学号(Sno)、课程号(Cno)、成绩(Grade)、所在系(Sdept)组成:SC (Sno, Cno,Grade, Sdept) SELECT SnoFROM SCWHERE Sdept=ISGROUP BY SnoHAVING COUNT(*)3;,运算符优先级,SQL SERVER 2008,SQL SERVER2005,习题,设一图书馆数据库中包括3个表:图书表 Book(Bno,Bname,Writer,Pub,Price)读者表 Reader
36、(Rno,Rname,Rsex,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rday) 求读者的总人数SELECT COUNT(*)FROM Reader; 求借阅了图书的读者的总人数SELECT COUNT(DISTINCT Rno)FROM Loan; 求机械工业出版社图书的平均价格、最高价、最低价SELECT AVG(Price), MAX(Price), MIN(Price)FROM BookWHERE Pub=机械工业出版社;WHERE Pub LIKE 机械工业出版社; 查询借阅图书本数超过2本的读者号、总本数。并按借阅本数值从大到小排序。SELECT Rno,
37、COUNT(Bno)FROM LoanGROUP BY Rno HAVING COUNT(*)2ORDER BY COUNT(Bno) DESC;,3.3.2连接查询,连接查询一个查询同时涉及两个以上的表就称为连接查询。 连接条件用来连接两个表的条件称为连接条件或连接谓词。格式:.比较运算符:=、=、. BETWEEN .AND.定义别名在FROM子句中为表定义别名。格式:FROM , ,内连接 等值与非等值连接查询例34. 查询每个学生及其选修课的情况 。SELECT Student . *,SC. *FROM Student, SCWHERE Student. Sno= SC. Sno ;
38、,Student表Sno Sname Ssex Sage Sdept 95001 李勇 男 20 cs 95002 刘辰 女 19 Is 95003 王名 女 18 ma 95004 张力 男 18 IsSC表Sno Cno Grade 95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80,自然连接如果按照两个表中的相同属性进行等值连接,且目标列中去掉了重复属性列,但保留了所有不重复的属性列,则称之为自然连接。例35.自然连接Student表和SC表。SELECT Student.Sno,Sname,Ssex,Sage,sdept,Cno
39、,GradeFROM Student, SCWHERE Student.Sno= SC. Sno ;,Student.sno sname ssex sage sdept cno grade 95001 李勇 男 20 CS 1 92 95001 李勇 男 20 CS 2 85 95001 李勇 男 20 CS 3 88 95002 刘辰 女 19 IS 2 90 95002 刘辰 女 19 IS 3 80,自身连接连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。例36. 查询每一门课的间接先修课(先修课的先修课)。,FIRST表(course),SECOND
40、表(course),SELECT FIRST.Cno,SECOND.CpnoFROM Course FIRST ,Course SECONDWHERE FIRST.Cpno=SECOND.Cno;查询结果:Cno Cpno1 73 5 5 6,外连接返回查询结果集合中不仅包含符合连接条件的行,而且还包括左表、右表中所有的数据行。例37.查询所有学生及其选课情况,包括选课与未选课的学生。SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUT JOIN SC ON(Student.Sno=SC.Sno);FR
41、OM Student LEFT OUT JOIN SC USING (Sno); SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SCWHERE Student.Sno=SC.Sno(*);,Student.sno Sname Ssex Sage Sdept Cno Grade 95001 李勇 男 20 CS 1 92 95001 李勇 男 20 CS 2 85 95001 李勇 男 20 CS 3 88 95002 刘辰 女 19 IS 2 90 95002 刘辰 女 19 IS 3 80 95003 王名 女
42、 18 MA 95004 张力 男 18 IS,交叉连接交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡儿积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。SELECT Student. *, SC. *FROM Student,SC;,复合条件连接WHERE有多个条件的连接操作,称为复合条件连接。例38. 查询选修2号课且成绩在90以上的所有学生。SELECT Student.Sno,SnameFROM Student ,SCWHERE Student.Sno=SC.Sno ANDSC.Cno=2AND SC.Grade9
43、0 ;,查询结果:Student.sno sname 95002 刘辰,多表连接例39.查询每个学生的学号、姓名、选修的课程名及成绩。SELECT Student.Sno,Sname,Course.Cname,SC.Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno and SC.Cno=Course.Cno;,查询结果:Student.Sno Sname Cname Grade95001 李勇 数据库 9295001 李勇 数学 8595001 李勇 信息系统 8895002 刘晨 数学 9095002 刘晨 信息系统 80,习题,设一
44、图书馆数据库中包括3个表:图书表 Book(Bno,Bname,Writer,Pub,Price)读者表 Reader(Rno,Rname,Rsex,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rday) 查询读者的基本信息以及他/她借阅的情况。SELECT Reader.*,Loan.*FROM Reader,LoanWHERE Reader.Rno=Loan.Rno; 查询读者的读者号、姓名、借阅的图书名、借出日期、归还日期。SELECT Reader.Rno,Rname,Bname,Lday,RdayFROM Reader,Loan,BookWHERE Reader.
45、Rno=Loan.Rno AND Book.Bno= Loan.Bno; 查询借阅了机械工业出版社出版,并且书名中包含“数据库”3个字的图书的读者的读者号、姓名、书名、出版社,借出日期、归还日期。 SELECT Reader.Rno,Rname,Bname,Pub,Lday,Rday FROM Reader,Loan,Book WHERE Reader.Rno=Loan.Rno AND Book.Bno=Loan.Bno AND Pub=机械工业出版社 AND (Bname LIKE %数据库%),设一图书馆数据库中包括3个表:图书表 Book(Bno,Bname,Writer,Pub,Pri
46、ce)读者表 Reader(Rno,Rname,Rsex,Rtel,Rdep)借阅表 Loan(Rno,Bno,Lday,Rday) 查询至少借阅过1本机械工业出版社出版的书的读者的读者号、姓名、书名,借阅本数,并按借阅本数多少降序排列。SELECT Loan.Rno,Rname,Bname,COUNT(Loan.Bno) 借阅本数FROM Loan,Reader,BookWHERE Reader.Rno=Loan.Rno AND Loan.Bno=Book.Bno AND Pub=机械工业出版社GROUP BY Loan.Rno HAVING COUNT(Loan.Bno)=1ORDER B
47、Y COUNT(Loan.Bno) DESC;SELECT Loan.Rno,Rname,Bname,COUNT(Loan.Bno) 借阅本数FROM Loan,Reader,BookWHERE Reader.Rno=Loan.Rno AND Loan.Bno=Book.Bno AND Pub=机械工业出版社GROUP BY Loan.Rno,Rname,Bname HAVING COUNT(Loan.Bno)=1ORDER BY COUNT(Loan.Bno) DESC;SELECT Loan.Rno,Rname,Bname,COUNT(Loan.Bno) FROM Loan,Reader,Book WHERE Reader.Rno=Loan.Rno AND Loan.Bno=Book.Bno ANDLoan.Rno in (SELECT Loan.Rno,COUNT(Loan.Bno) FROM Loan,Reader,BookWHERE Loan.Bno=Book.Bno AND Pub=机械工业出版社 AND GROUP BY Loan.RnoHAVING COUNT(Loan.Bno)=1) ORDER BY COUNT(Loan.Bno) DESC;,