第5章SQL结构化查询语言

上传人:人*** 文档编号:573905221 上传时间:2024-08-15 格式:PPT 页数:76 大小:657.50KB
返回 下载 相关 举报
第5章SQL结构化查询语言_第1页
第1页 / 共76页
第5章SQL结构化查询语言_第2页
第2页 / 共76页
第5章SQL结构化查询语言_第3页
第3页 / 共76页
第5章SQL结构化查询语言_第4页
第4页 / 共76页
第5章SQL结构化查询语言_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《第5章SQL结构化查询语言》由会员分享,可在线阅读,更多相关《第5章SQL结构化查询语言(76页珍藏版)》请在金锄头文库上搜索。

1、第第5 5章章 SQL结构化查询语言Find Information Using SQL Languageo1 1、指出下面数据类型的长度或者默认长度。、指出下面数据类型的长度或者默认长度。 intint real money real money datetimedatetime bit text bit texto2 2、建立表和修改表结构的命令是什么?、建立表和修改表结构的命令是什么?o3 3、删除数据库、删除表、删除记录的命令是什么?、删除数据库、删除表、删除记录的命令是什么?o4 4、在表中插入一条记录后,原来的记录顺序会发生、在表中插入一条记录后,原来的记录顺序会发生怎样的改变?怎

2、样的改变?o5 5、简要说明什么是视图?、简要说明什么是视图?o6 6、表与视图有什么异同?、表与视图有什么异同?o7 7、创建视图的命令是什么?、创建视图的命令是什么?复习与提问复习与提问Find Information Using SQL Languageo5.1 SQL5.1 SQL简介简介o5.2 SELECT5.2 SELECT查询语句查询语句o5.3 5.3 基于单表的查询基于单表的查询o5.4 5.4 基于多表的连接查询基于多表的连接查询o5.5 5.5 子查询子查询讲解提纲讲解提纲Find Information Using SQL Language5.1 SQL简介oSQL是

3、在20世纪70年代末由IBM公司开发出来的一套程序语言,并被用在DB2关系数据库系统中。但是,直到1981年,IBM推出商用的SQLDS关系型数据库系统;Oracle及其他大型关系型数据库系统相继出现,SQL才得以广泛应用。例如,Sybase 与Microsoft公司使用Transact-SQL,而Oracle公司使用PL/SQL。oSQL语言是应用于数据库的语言,本身是不能独立存在的。它是一种非过程性(non-procedural)语言,与一般的高级语言,例如: C、JAVA是大不相同的。一般的高级语言在存取数据库时,需要依照每一行程序的顺序处理许多的动作。但是使用SQL时,只需告诉数据库需

4、要什么数据,怎么显示就可以了。具体的内部操作则由数据库系统来完成。Find Information Using SQL Language5.1 SQL简介SQL的分类oDDL:数据描述语言,用于定义数据库对象(数据库、表、视图、索引),如create database; oDML:数据操纵语言,用于操作数据库对象,如select,insert,update,delete; oDCL:数据控制语言,用于设置或更改数据库用户或角色权限,如grant,deny,revoke。Find Information Using SQL Language5.2 SELECT查询语句o5.2.1 查询分析器o5

5、.2.2 查询语句格式o5.2.3关于演示数据库的说明Find Information Using SQL Language5.2.1 查询分析器在SQL查询分析器中,既可在全文窗口中输入Transact-SQL语句,也可以打开包含Transact-SQL语句的文本文件,执行语句并在结果窗口中,查看结果。o启动SQL查询分析器的方法: 单击标准工具栏的“新建查询”按钮打开查询分析器窗口。o用户在查询窗口中输入的代码可以保存为.sql的文本文件。Find Information Using SQL Language查询窗口Find Information Using SQL Language5.

6、2.2 查询语句格式在在SQL语言中,使用语言中,使用SELECT语句进行数据库的查询,语句进行数据库的查询,应用灵活、功能强大。应用灵活、功能强大。1、基本格式、基本格式SELECT ALL | DISTINCT , FROM , ,. WHERE GROUP BY HAVING ORDER BY ASC | DESC Find Information Using SQL Language SELECT语句的基本格式是由SELECT子句、FROM子句和WHERE子句组成的查询块。整个SELECT语句的含义是:根据WHERE子句的筛选条件表达式,从FROM子句指定的表中找出满足条件记录,再按S

7、ELECT语句中指定的字段次序,筛选出记录中的字段值构造一个显示结果表。如果有GROUP子句,则将结果按的值进行分组,该值相等的记录为一个组。如果GROUP子句带HAVING短语,则只有满足指定条件的组才会显示输出。 提示:SELECT语句操作的是记录(数据)集合(一个表或多个表),而不是单独的一条记录。语句返回的也是记录集合(满足Where条件的),即结果表。语句说明语句说明Find Information Using SQL Language5.2.3 示例数据库说明为了说明【SELECT】语句的各种用法,下面我们以【图书馆数据库】为操作对象进行说明。 在【BOOKSYS】数据库中包含了3

8、个表:o图书信息表BOOKo读者信息表o借书情况表:反映了借阅和归还图书的日期。Find Information Using SQL Language图书信息表记录图书信息表结构Find Information Using SQL Language读者信息表记录读者信息表结构Find Information Using SQL Language图书借阅表记录图书借阅表结构 Find Information Using SQL Language5.3 基于单表的查询 o问题的提出:需要对数据进行哪些维护操作?如何对数据进行查询、统计?o结构化查询语言(Structured Query Langu

9、age)。这种语言的语法结构类似于英语语句,易学易用,书写随意。o基于单表的查询:指from子句中只包含一个表,所有字段均来自一个表。Find Information Using SQL Language查询表中指定的字段SELECT子句后的各个字段的先后顺序可以与原表中的子句后的各个字段的先后顺序可以与原表中的顺序不一致,但在结果表中,字段是按照顺序不一致,但在结果表中,字段是按照SELECT子句后子句后的各个字段的顺序显示。的各个字段的顺序显示。【例例5-1】显示显示BOOK表中所有图书的表中所有图书的书号、书名、书号、书名、出版社。出版社。SELECT bookid, bookname,

10、 publish FROM book Find Information Using SQL Language 通配符“*”的使用在在SELECT语句中,可以使用通配符语句中,可以使用通配符“*”显示所有的字段。显示所有的字段。SELECT * FROM book【例例5-2】 列出列出student_info表表所有的字段。所有的字段。Find Information Using SQL Language 使用单引号加入字符串在SELECT语句中,可以在一个字段的前面加上一个单引号字符串,称为虚拟列名,对后面的字段起说明作用。【例例5-3】显示显示BOOK表中书名、出版社、价格。表中书名、出版

11、社、价格。SELECT 书名书名, bookname ,出版社出版社,publish,price FROM bookFind Information Using SQL Language使用别名在显示结果时,可以指定别名代替原来的字段名称,共有3种方法: 采用字段名称 AS 别名的格式。 采用字段名称 别名 的格式。 采用别名=字段名称 的格式。【例例5-4】 显示显示BOOK表中表中bookid、bookname、publish,并在标题栏种显示,并在标题栏种显示书号书号、书名书名、出版社出版社字样,而不是字样,而不是显示显示bookid、bookname和和publish。SELECT b

12、ookid AS 书号,bookname 书名,出版社=publishFROM bookFind Information Using SQL Language显示表达式的值 o在SELECT语句后面可以是字段表达式,字段表达式不仅可以是算术表达式,还可以是字符串常量、函数等。【例例5-5】 显示显示BOOK表中所有书名和表中所有书名和出版年数出版年数。 SELECT bookname, year(getdate()-year(publishdate) as 出版年数 FROM bookFind Information Using SQL Language使用DISTINCT短语消除重复的记录

13、DISTINCT短语能够从结果表中去掉重复的记录。【例例5-6】查询所有图书所属的查询所有图书所属的出版社出版社。SELECT DISTINCT publish FROM bookFind Information Using SQL Language用WHERE子句查询特定的记录 SQL是一种集合处理语言,所以数据修改及数据检索语句会对表中的所有记录(行)起作用,除非使用WHERE子句来限定查询的范围。o注意WHERE子句必须紧跟在FROM子句之后。SELECT FROM WHERE o这里条件表达式可以是关系表达式(表示大小关系)、逻辑表达式(逻辑与或非运算)、特殊表达式。1、关系表达式用关

14、系运算符将两个表达式连接在一起的式子即为关系表达式,关系表达式的返回值为逻辑值(TRUE、 FALSE),关系表达式的格式为: Find Information Using SQL LanguageWHERE子句中关系表达式常用的关系运算符有 = = !=或。注意: 在关系表达式字符型数据之间的比较是对字符的ASCII码值进行比较。所有字符都有一个ASCII码值与之对应。例如,字母“A”,字母“B” 字母“C”,它们的ASCII码值分别是65、66、67。总体规则:数字大写字母小写字母汉字 字符串的比较是从左向右依次进行。 在SQL Server 2005中,日期字符串按照“年月日”的格式书写

15、并比较,越新的日期越大。Find Information Using SQL Language2、逻辑表达式:表示结果是否成立。用逻辑运算符将两个表达式连接在一起的式子即为逻辑表达式,逻辑表达式的返回值为逻辑真(TRUE)或逻辑假(FALSE),逻辑表达式的格式为: 逻辑运算符有:and or not表示逻辑:与 或 非(取反)3、特殊表达式特殊表达式在比较运算中有一些特殊的用途,具体的格式在使用时给出。 Find Information Using SQL Language关系运算符的使用 【例5-7】列出性别为女的读者姓名、所在部门。SELECT * FROM book WHERE pub

16、lishdate 2001-12-31 -这里引号这里引号不可省不可省略略SELECT name, dept FROM reader WHERE sex=女女【例例5-8】 列出列出2001年以后出版年以后出版的书的情况。的书的情况。Find Information Using SQL Language有关逻辑运算符的使用【例例5-9】列出列出所有书名中所有书名中前前2个字为数据个字为数据的书号、的书号、书名和书名和价格。价格。SELECT bookid,bookname,price FROM book WHERE substring(bookname,1,2)=数据数据【例例5-10】列出列

17、出计算机系计算机系所有所有女女同学的名单。同学的名单。SELECT * FROM reader WHERE dept=计算机系计算机系 AND sex=女女Find Information Using SQL Language请写出相应的SQL命令1、查询、查询所有图书所有图书的的全部信息全部信息。2、查询、查询计算机系男计算机系男同学的借书证号和姓名。同学的借书证号和姓名。3、查询、查询不在不在计算机系的计算机系的女女同学的卡号、姓名、部门。同学的卡号、姓名、部门。说明:以下查询全部基于说明:以下查询全部基于book表。表。Find Information Using SQL Languag

18、e【例例5-11】列出列出刘刘姓作者姓作者或或李李姓作者写的书名及出版社姓作者写的书名及出版社SELECT bookname,publishFROM book WHERE SUBSTRING(editor,1,1)=刘刘 or SUBSTRING(editor,1,1)=李李 【例例5-12】列出所有列出所有3年前年前出版的书出版的书。SELECT * FROM book WHERE ( year(getdate()-year(publishdate) 3Find Information Using SQL Language有关特殊运算符的使用 【例5-13】列出价格不在20-30元之间的所有

19、图书。本例主要学习有关“BETWEENAND”的使用格式,使用“BETWEENAND”的作用是定义表达式在两数之间。格式为:表达式 NOT BETWEEN 表达式1 AND 表达式2 SELECT *FROM book WHERE price NOT BETWEEN 20 AND 30Where price30思考一下,还可以怎么写?Find Information Using SQL Language【例5-14】列出所有未还书的卡号和书号。当需要判断一个表达式的值是否为空值时,可使用关键字“IS NULL”。本例主要学习有关“IS NULL”短语的书写格式。使用“IS NULL”短语的格式

20、为:表达式 IS NOT NULL当使用NOT 关键字,表示不为空。 SELECT cardid, bookid FROM borrow WHERE sdate IS NULLFind Information Using SQL Language【例5-15】列出类别是2和3的读者卡号、姓名、部门。使用IN关键字可以指定一个值表,值表中指定列出所有可能的值,当表达式与值表中的任意一个匹配时,即返回TRUE,否则返回FALSE。使用IN关键字指定值表的格式为: 表达式 IN (表达式1,n)SELECT cardid, name, dept FROM reader WHERE class IN

21、(2,3)“IN 短语”的作用类似于逻辑“或”,有时用IN比OR更方便。例如上述语句也可以写为:SELECT cardid, name, dept FROM reader WHERE class =2 OR class =3-WHERE class=2 or class=3 也行Find Information Using SQL Language【例5-16】列出类别既不是2,也不是3的读者的卡号、姓名和性别。 SELECT cardid, name, sex FROM reader WHERE class NOT IN (2,3)Find Information Using SQL Lan

22、guage使用ORDER BY子句对查询结果排序在SELECT语句中,使用“ORDER BY”子句可以对查询结果进行升序或降序的排列。1、“ORDER BY”子句的基本格式SELECT FROM WHERE ORDER BY ASC|DESC ,上述格式中,“子句表达式1”可以是一个列名、列的别名、表达式或非零的整数值,而非零的整数值则表示字段、别名或表达式在选择列表中的位置。ASC表示升序,为默认值;DESC表示降序,排序时空值(NULL)被认为是最小值。Find Information Using SQL LanguageORDER BY子句应用实例【例5-21】将book表中的图书按出版

23、时间先后顺序。 ORDER BY子句的输出结果仅仅是影响表的逻辑顺序(排序顺序),并没影响表的真正物理顺序(实际顺序)。SELECT *FROM book ORDER BY publishdateFind Information Using SQL Language这种多级排序叫做级联排序。只要在ORDER BY子句后面,按照顺序列出字段的清单,字段之间用逗号分隔,即可实现级联排序的功能。【例5-23】列出2003年前出版的图书清单。要求查询结果按书名降序,书名相同的按价格升序显示。ORDER BY子句和WHERE子句可以一起使用。SELECT * FROM book WHERE publis

24、hdate 5 AND publish=清华大学出版社Find Information Using SQL LanguageMAX和MIN函数的应用MAX和MIN函数分别用于求表达式中所有值项的最大值与最小值,语句格式为: MAX / MIN (ALL|DISTINCT 表达式)其中表达式是常量、列、函数或表达式,其数据类型可以是数字、字符和时间日期类型。ALL表示对所有值进行运算,DISTINCT表示去除重复值、默认为ALL,系统自动忽略NULL值。【例5-26】查找最早出版和最晚出版的日期。 SELECT MIN (publishdate) 最早出版 , MAX (publishdate)

25、 最新出版 FROM bookFind Information Using SQL LanguageAVG函数的应用AVG函数的表达式格式与MAX和MIN的表达式格式一样。求表达式中所有项的平均值。其格式为: AVG(ALL|DISTINCT 表达式)其中表达式是常量、列、函数或表达式,其数据类型只能是int、smallint 、 tinyint 、 bigint 、 decimal、numeric、float、real 、money、smallmoney 。ALL表示对所有值进行运算,DISTINCT表示去除重复值、默认为ALL。AVG自动忽略NULL值。Find Information U

26、sing SQL Language【例5-28】求出清华大学版所有图书的平均价格和平均库存量。SELECT AVG (price) 平均价格, AVG(qty) 平均库存 FROM book WHERE publish=清华大学出版社 Find Information Using SQL LanguageSUM函数的应用SUM函数用于求表达式中所有项的总和。其格式为: SUM(ALL|DISTINCT 表达式)其中表达式是常量、列、函数或表达式,其数据类型只能是int、smallint 、 tinyint 、 bigint 、 decimal、numeric、float、real 、money

27、、smallmoney 。ALL表示对所有值进行运算,DISTINCT表示去除重复值、默认为ALL,SUM 忽略NULL值Find Information Using SQL Language【例5-29】求出(清华出版的)各类图书的总数量。 SELECT SUM (qty) 总数量, FROM book WHERE publish =清华大学出版社Find Information Using SQL Language利用SQL的GROUP BY子句,能够快速而简便地将查询结果表按照指定的字段进行分组,值相等的记录分为一组。GROUP BY子句往往和SQL的聚合函数一起使用。【基本格式】: S

28、ELECT FROM GROUP BY 使用GROUP BY对查询结果进行分组Find Information Using SQL Language【例5-30】统计各个出版社出版的总图书数。SELECT publish as 出版社,COUNT( qty) 图书数量 FROM book GROUP BY publishFind Information Using SQL Language【例5-31】统计各出版社图书的总数和平均价格。 SELECT COUNT(bookid) 图书总数,AVG(price) 平均价格 FROM book GROUP BY publish注意:在select后

29、面的列名必须包含在聚合函数中,或者包含在 GROUP BY 子句中。例:分析下面命令的执行结果。SELECT bookname 书名,AVG(price) 平均价格 FROM book GROUP BY publish注意:group by一定要和聚合函数一起使用Find Information Using SQL Language利用HAVING筛选结果表在实际使用中,往往还要对分组后的结果按某种条件再进行筛选,只输出满足用户指定条件的记录。在SQL中,HAVING子句能完成此功能。“WHERE”子句与“HAVING”子句的区别在于作用对象不同:1、WHERE子句的作用对象是表,是从表中选择

30、出满足筛选条件的记录。2、HAVING子句的作用对象是组,是从组中选择出满足筛选条件的记录。Find Information Using SQL Language【例5-32】将本数不小于2本的每个出版社出版的总图书数显示出来。 SELECT publish 出版社,COUNT(bookid) 总数量 FROM book GROUP BY publish HAVING COUNT(bookid)=2说明: HAVING子句必须和GROUP BY子句配合,且放在GROUP BY子句的后面,表示分组的前提条件。考虑一下:(1)用where子句代替HAVING子句行不行?(2)将QTY库存超过100

31、的每个出版社出版的总图书数显示出来,命令该怎么写?Find Information Using SQL Language5.4 多表查询o前面的查询只涉及一个表。在多数情况下,一个SQL查询语句一次往往牵扯到多个表。o在关系型数据库中,将一个查询同时涉及两个或两个以上的表,称为多表连接查询。o基于多表的查询是通过连接查询来完成的。o例如:在booksys数据库中需要查找借了数据库原理与应用的读者的姓名和借书日期,就需要将图书信息表book、借阅表borrow和读者信息表reader三个表进行连接,才能得到查询结果。 Find Information Using SQL Language多表连接

32、查询:实质是按照一定的条件将几个表连接成一个大表,从大表中取出符合条件的记录。连接条件可通过以下方法定义两个表在查询中的关联方式: 指定每个表中要用于连接的列。典型的连接条件在一个表中指定外键,在另一个表中指定与其关联的键。 指定比较各列的值时要使用的关系运算符,如=、等。Find Information Using SQL Language5.4.1连接谓词 o可以在SELECT语句的WHERE子句中使用比较运算符给出连接条件对表进行连接,对这种表示形式称为连接谓词表示形式。其基本格式为: 表名1.字段名1 表名2.字段名2o连接谓词中的两个列(即字段)称为连接字段,他们必须是可比的,连接谓

33、词中的比较符可以是、=、!=、。o当比较符为时,就是等值连接;若在等值连接中去除结果表中相同的字段名,则为自然连接;若有多个连接条件,则为复合条件连接。若一个表与自身进行连接,称为自连接。 Find Information Using SQL Language【例5-33】采用等值连接的方法,列出每本已借出的书及其借阅情况的详细情况。 SELECT book.*,borrow.* FROM book, borrow WHERE book.bookid = borrow.bookidFind Information Using SQL Language【例5-34】采用自然连接的方法,列出每本图

34、书及其借阅的详细情况。 在上例中,bookid书号字段有两个。如果去掉其中重复的那个字段,则成为了自然连接。在自然连接的条件表达式中,往往是将各表的主键和外键进行等值连接。 SELECT book.bookid,bookname,publish,publishdate, borrow.cardid,borrow.bdate,borrow.sdate FROM book,borrow WHERE book.bookid= borrow.bookidFind Information Using SQL Languageo注意:注意:1.当单个查询需要引用多个表时,所有当单个查询需要引用多个表时,所

35、有列的来源列的来源都必须明确都必须明确。2.在查询所引用的两个或多个表之间,在查询所引用的两个或多个表之间,任何重复任何重复的列名都必须用表名限定的列名都必须用表名限定。3.如果某个列名在查询用到的两个或多个表中不如果某个列名在查询用到的两个或多个表中不重复,则对这一列的引用不必用表名限定。重复,则对这一列的引用不必用表名限定。4.如果所有的列都用表名限定,则能提高查询的如果所有的列都用表名限定,则能提高查询的可读性,建议加上表名可读性,建议加上表名。5.如果使用表的别名,则会进一步提高可读性,如果使用表的别名,则会进一步提高可读性,特别是在表名自身必须由数据库和所有者名称特别是在表名自身必须

36、由数据库和所有者名称限定时。限定时。Find Information Using SQL Languageo练习1:查询所有借书未还的读者的姓名。o练习2:查询所有读者信息及借阅情况。练习一下Find Information Using SQL Languageo练习1:查询所有借书未还的读者的姓名。SELECT nameFROM reader,borrowWHERE reader.cardid=borrow.cardid AND sdate IS NULLo练习2:查询所有读者信息及借阅情况。 SELECT reader.* , borrow.*FROM reader , borrowWHE

37、RE reader.cardid=borrow.cardid练习一下(参考答案)Find Information Using SQL Language若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。【例5-35】采用自身连接的方法,查找不同出版社但图书名称相同的图书的书号、价格和库存量。 SELECT a.bookname,a.bookid,a.publish,a.price,a.qty, b.bookid,b.publish,b.price,b.qty FROM book a,book b WHERE a.bookname

38、=b.bookname AND a.publishb.publishFind Information Using SQL Language在WHERE子句中,若有多个连接条件,则称为复合条件连接。在多表操作中,复合条件连接的使用最为广泛。【例5-36】采用复合条件连接方法,查找借阅了数据结构图书且尚未归还的借书证号、姓名、部门。SELECT reader.cardid,reader.name, reader.deptFROM book,borrow,readerWHERE book.bookid=borrow.bookid AND borrow.cardid=reader.cardid AND

39、 book.bookname=数据结构 AND borrow.sdate is NULLFind Information Using SQL Language例537:查询借书期限超过2个月的所有读者的姓名、所借书籍名和借书日期。 SELECT NAME,BOOKNAME,BDATEFROM BOOK,READER,BORROWWHERE BOOK.BOOKID=BORROW.BOOKID AND READER.CARDID=BORROW.CARDID AND MONTH(GETDATE()-month(bdate) 2 AND SDATE IS NULL或WHERE BOOK.BOOKID=

40、BORROW.BOOKID AND READER.CARDID=BORROW.CARDID AND DATEDIFF(MM, BDATE,GETDATE() 2 AND SDATE IS NULLFind Information Using SQL Language例538:按读者姓名查询指定读者的借还书历史记录。假设读者姓名为“刘勇”。SELECT book.name,bdate,sdateFROM borrow,book,readerWHERE book.bookid=borrow.bookid AND reader.cardid=borrow.cardid AND reader.name

41、=刘勇Find Information Using SQL Language例539:查询指定图书的去向。如指定书名为“数据结构” 。SELECT reader.name,deptFROM borrow,reader,bookWHERE borrow.cardid=reader.cardid AND borrow.bookid=book.bookid AND book.bookname=数据结构 AND sdate IS NULLFind Information Using SQL Language练习利用多表连接查询的方法,实现下面功能,写出SQL语句:o查询借过了图书高等数学或者或者数据结

42、构并且并且已经归还了的读者的姓名、性别、部门。Find Information Using SQL Language5.5子查询子查询是一个子查询是一个SELECTSELECT查询,它查询,它返回单个值返回单个值且嵌套在且嵌套在SELECTSELECT、INSERTINSERT、UPDATEUPDATE、DELETEDELETE语句或其他子查语句或其他子查询中。询中。任何允许使用表达式的地方都可以使用子查询。任何允许使用表达式的地方都可以使用子查询。子查询子查询也称为内部查询或内部选择,而包含子查询的语句也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。也称为外部查询或外部

43、选择。子查询子查询能够将比较复杂的查询分解为几个简单的查询,能够将比较复杂的查询分解为几个简单的查询,而且子查询可以嵌套。嵌套查询的过程是:首先执而且子查询可以嵌套。嵌套查询的过程是:首先执行内部查询,它查询出来的数据并不被显示出来,行内部查询,它查询出来的数据并不被显示出来,而是传递给外层语句,并作为外层语句的查询条件而是传递给外层语句,并作为外层语句的查询条件来使用。来使用。Find Information Using SQL Language【例5-44】查找借阅了书号为TP2001-001的读者情况。 SELECT * FROM reader WHERE cardid = (SELEC

44、T cardid FROM borrow WHERE bookid=TP2001-001 )Find Information Using SQL Languageo连接和子查询可能都要涉及两个或多个表,要注意连接与子查询的区别:连接可以合并两个或多个表中数据,而带子查询的SELECT语句的结果只能来自一个表,子查询的结果是用来作为选择结果数据时进行参照的。o有的查询既可以使用子查询来表达,也可以使用连接表达,例如上面的例子。通常使用子查询表示时可以将一个复杂的查询分解为一系列的逻辑步骤,条理清晰,而使用连接表示有执行速度快的优点。具体使用哪一种要根据具体情况而定。Find Informatio

45、n Using SQL Language可以在许多地方指定子查询。例如:可以在许多地方指定子查询。例如: 使用别名时。使用别名时。 使用使用ININ或或NOT INNOT IN时。时。 在在UPDATEUPDATE、DELETEDELETE和和INSERTINSERT语句中。语句中。 使用比较运算符时。使用比较运算符时。 使用使用ANYANY、SOMESOME或或ALLALL时。时。 使用使用EXISTSEXISTS或或NOT EXISTSNOT EXISTS时。时。 在有表达式的地方。在有表达式的地方。Find Information Using SQL Language使用使用IN或或NO

46、T IN的子查询的子查询IN 子查询用于进行一个给定值是否在子查询结果集中的判断,格式为: 表达式 NOT IN (子查询)当表达式与子查询的结果表中的某个值相等时,IN谓词返回TRUE,否则返回FALSE,若使用了NOT,则返回的值刚好相反。【例5-45】使用子查询来查询数据结构图书外借情况。 Find Information Using SQL Language使用使用IN或或NOT IN的子查询的子查询SELECT bookid,cardid,bdate,sdate FROM borrow WHERE bookid in (SELECT bookid FROM book WHERE bo

47、okname=数据结构)说明:此处只能用in,也不能用,因为子查询得到的结果不是一条记录,而是一个集合。思考一下:如何用多表连接查询实现相同的功能?Find Information Using SQL Language使用使用IN或或NOT IN的子查询的子查询SELECT borrow.bookid,cardid,bdate,sdate FROM borrow,bookWHERE borrow.bookid=book.bookid and bookname=数据结构Find Information Using SQL Language【例5-46】查找计算机系没过借书的读者情况。 SELEC

48、T * FROM reader WHERE dept=计算机系 AND cardid NOT IN ( SELECT cardid FROM borrow )Find Information Using SQL Language【例5-47】 使用多层嵌套子查询来查找借了“数据结构”图书的读者名单。SELECT nameFROM reader WHERE cardid IN (SELECT cardid FROM borrow WHERE bookid IN (SELECT bookid FROM book WHERE bookname=数据结构 ) )Find Information Usi

49、ng SQL Language【例5-48】查找没借“数据库原理与应用”图书的读者情况。 SELECT * FROM reader WHERE cardid NOT IN (SELECT cardid FROM borrow WHERE bookid IN (SELECT bookid FROM book WHERE bookname= 数据库原理与应用 ) )Find Information Using SQL Language在查询的基础上创建新表在查询的基础上创建新表 在在SQL ServerSQL Server中,提供了中,提供了INTOINTO子句,使用子句,使用INTOINTO关键

50、字可以创建新表关键字可以创建新表并将结果行从查询插入新表中,新表可以是一个永久或临时表。并将结果行从查询插入新表中,新表可以是一个永久或临时表。基本格式:基本格式:SELECT SELECT INTO INTO FROM FROM WHERE WHERE 说明:说明: 这是一种常用的创建临时表的方式,这是一种常用的创建临时表的方式,临时表以在表名前加临时表以在表名前加# #或或#)表示)表示,可以用,可以用selectselect查看临时表的内容,但其表名在企业查看临时表的内容,但其表名在企业管理器和查询分析器中看不到。管理器和查询分析器中看不到。 新建表的结构由新建表的结构由SELECTSE

51、LECT列表本身定义,新表的列顺序与列表本身定义,新表的列顺序与SELECTSELECT列列表中的顺序也相同,列名及数据类型也由表中的顺序也相同,列名及数据类型也由SELECTSELECT列表确定。列表确定。Find Information Using SQL Language【例5-60】将借阅了数据结构的读者卡号及书名,插入到新建的表bookreader中。 SELECT borrow.cardid, bookname INTO bookreader FROM book,borrow WHERE book.bookid=borrow.bookid and book.bookname=数据结

52、构Find Information Using SQL Language【例例5-615-61】创建图书创建图书数据结构数据结构的副本,表名为的副本,表名为datastructuredatastructureSELECT * INTO datastructureFROM bookWHERE bookname=数据结构【例例5-625-62】将图书将图书数据库系统数据库系统对应的记录插入表对应的记录插入表datastructuredatastructure中中insert INTO datastructureSELECT * FROM bookWHERE bookname=数据库系统Find Information Using SQL Language本章完成,谢谢大家本章完成,谢谢大家操作练习1、完成例题44-622、将例题44-48改造为多表连接查询,写出相应的查询语句。Find Information Using SQL Language

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号