> 文档中心 > 数据库五章其二第三讲 ——SQL

数据库五章其二第三讲 ——SQL

目录

       本人会用几天时间把在学校学到的整个数据库知识全盘托出,如果能看懂并且明白我接下来所写的博文,相信对你数据库提升、对行业软件理解、以后工作有很大帮助。

由于SQL部分内容实在太多,我会把整个第二章分成四个小部分来细讲

目录​​​​​​​

          其二第三讲:SQL

 2.3.2嵌套子查询

•思考:查询和王旭同一天出生的读者的信息

•分析:查询王旭的生日

子查询 

•在SQL语言中,一个SELECT-FROM语句称为一个查询块。

•如果一个SELECT语句嵌套在另一个SELECT、INSERT、UPDATE或DELETE语句中,则称之为子查询或内层查询;而包含子查询的语句则称为主查询或外层查询。

•执行顺序:先内层后外层;先子查询后主查询

比较运算中使用子查询

•【例2.54】查询售价最高的图书的名称

各种子查询

 带有IN的子查询

•【例2.56】查询与“C语言”在同一出版社的图书信息

 【例2.57】查询王旭所借图书的图书编号

读者表

•【例2.58】查询“王旭”所借的图书的名称

•查询过程:

•SOME(子查询)  

•表示子查询的结果集合中某一个元素

•【例2.57】查询除最低价格外的所有图书

•【例2.58】查询价格最低的图书信息

ALL(子查询)

•表示子查询的全部结果

•【例2.59】查询书价最高的图书的信息

EXISTS子查询

•【例2.60 】查询借阅了图书的读者的姓名

•【例2.61】查询被借出的图书的信息 

表连接的语法格式

•Select  ……  FROM  表1

•JOIN  表2

    ON 

•其中表1,表2是需要连接的两张表, JOIN 表示连接,inner表示内连接,outer表示外连接,缺省情况就是内连接。ON后面接。

•【例2.62】查询2020年1月20日借书的读者姓名和所借图书的编号 

表内连接的语法格式

•Select…FROM  表1    

    JOIN  表2    

    ON 

•连接条件的一般格式为:

• [][] [][]

•两个表的连接列必须是可比较的,即是语义相同的列,否则比较将是无意义的。

•当比较运算符为等号(=)时,称为等值连接,使用其他运算符的连接称为非等值连接。

•【例2.63】查询王旭所借图书的书号和借阅时间 

•【例2.64】查询2020年6月7日借阅图书的读者姓名和所借图书名称 

•【例2.65】查询每个读者所借的图书的信息,要求显示读者姓名,图书名称,借出日期 

•注意:多表的同名列前面必须加表名前缀。

•             即:表名.列名

给表起别名 

•在SQL语句中,可以类似为列取别名那样为表取别名,格式:

•  [ AS ]

•注意:当为表指定了别名时,在查询语句中的其他地方,所有用到表名的地方都要使用别名,不能再使用原表名。

•【例2.66】查询’王旭’所借图书的书名 

•内连接的特点:满足连接条件的元组保留到连接的结果中,其中存在不满足连接条件的元组会被舍弃。 

 表X和Y内连接结果

 表外连接

 左外连接 

•FROM 表1 LEFT [OUTER] JOIN 表2

    ON

 右外连接

•FROM 表1 RIGHT [OUTER] JOIN 表2

    ON

 例:统计每个读者所借阅的图书的数量,要求显示读者姓名和借阅数量


2.3.2嵌套子查询

思考:查询和王旭同一天出生的读者的信息

分析:查询王旭的生日

SELECT birthdate FROM Reader WHERE name=’王旭’

那么可不可以使用这个查询结果呢?当然可以!

SELECT * FROM Reader WHERE birthdate=(SELECT birthdate FROM Reader WHERE name=’王旭’)

子查询 

SQL语言中,一个SELECTFROM语句称为一个查询块

如果一个SELECT语句嵌套在另一个SELECTINSERTUPDATEDELETE语句中,则称之为子查询或内层查询;而包含子查询的语句则称为主查询或外层查询。

执行顺序:先内层后外层;先子查询后主查询

比较运算中使用子查询

2.54】查询售价最高的图书的名称

SELECT name FROM Book WHERE price=(SELECT MAX(price) FROM Book)

各种子查询

 带有IN的子查询

2.56】查询与“C语言”在同一出版社的图书信息

SELECT * FROM Book WHERE publish IN (SELECT publish FROM Book WHERE name=’C语言’)

 2.57】查询王旭所借图书的图书编号

读者表

 借阅情况表         

SELECT book_ID FROM Borrow WHERE reader_ID IN ( SELECT reader_ID FROM Reader WHERE    name=‘王旭’)

2.58】查询“王旭”所借的图书的名称

SELECT name FROM Book WHERE book_ID IN(SELECT book_ID FROM Borrow WHERE reader_ID IN     (SELECT reader_ID FROM ReaderWHERE  name='王旭‘ )    )

查询过程:

1步,查询“王旭”的reader_ID

2步,依据reader_IDBorrow表中找王旭所借图书的book_ID

3步,依据book_IDBook表中找到图书名称。

查询借书价格在20-40之间的读者的姓名

select name from reader where reader_id in(select reader_id from borrow where book_id in(select book_id from book where price between 20 and 40))

查询‘胡晓丽’借阅‘计算机文化基础’的日期

select borrowdate from borrow where reader_id in(select  reader_id from reader where name='胡晓丽')and book_id in(select book_id from book where name='计算机文化基础')

查询借书价格在20-40之间的读者的姓名 

select name from reader where reader_id in(select reader_id from borrow where book_id in (select book_id from bookwhere price between 20 and 40  ))

SOME(子查询)  

表示子查询的结果集合中某一个元素

2.57】查询除最低价格外的所有图书

SELECT * FROM Book  WHEREprice!=(SELECT min(price) FROM Book)

SELECT * FROM Book WHERE    price>SOME(SELECT price FROM Book)

 •2.58】查询价格最低的图书信息

SELECT * FROM Book WHEREprice=(SELECT min(price) FROM Book)

SELECT * FROM Book WHERE   NOT( price>SOME(SELECT price FROM Book))

ALL(子查询)

表示子查询的全部结果

2.59】查询书价最高的图书的信息

SELECT * FROM Book WHERE      price=(SELECT max(price) FROM Book)

SELECT * FROM Book WHERE price >=ALL(SELECT price FROM Book)

EXISTS子查询

判断子查询是否存在结果 当子查询存在结果时,EXISTS(子查询)返回值为true,否则返回值为false 先外层查询,后内层查询;将外层的值代入内层进行查询,根据内层查询是否存在结果,判断外层的元组是否保留在结果集中。

 2.60 查询借阅了图书的读者的姓名

     SELECT name FROM reader WHERE      EXISTS ( SELECT * FROM borrow WHERE   borrow.reader_id=reader.reader_id)

2.61】查询被借出的图书的信息 

SELECT * FROM Book WHERE EXISTS(SELECT * FROM Borrow WHERE Borrow.book_ID=Book.book_ID)

表连接的语法格式

Select  ……  FROM  1

JOIN  2

    ON  <连接条件>

其中表1,表2是需要连接的两张表, JOIN 表示连接,inner表示内连接,outer表示外连接,缺省情况就是内连接。ON后面接<连接条件>

2.62】查询2020120日借书的读者姓名和所借图书的编号 

SELECT  Name, book_ID FROM Reader JOIN BorrowON Reader.reader_ID =Borrow.reader_IDWHERE borrowdate= ‘2020-1-20‘

表内连接的语法格式

Select…FROM  1    

    JOIN  2    

    ON  <连接条件>

连接条件的一般格式为:

[<表名1.>][<列名1>] <比较运算符> [<表名2.>][<列名2>]

两个表的连接列必须是可比较的,即是语义相同的列,否则比较将是无意义的。

当比较运算符为等号(=)时,称为等值连接,使用其他运算符的连接称为非等值连接

2.63】查询王旭所借图书的书号和借阅时间 

SELECT  book_ID, borrowdateFROM Reader JOIN Borrow ON Reader.Reader_id =Borrow.Reader_idWHERE name=’王旭’

2.64】查询202067日借阅图书的读者姓名和所借图书名称 

SELECT Reader.name, Book.name FROM Book JOIN Borrow ON Book.book_ID=Borrow.Book_ID JOIN Reader ON Reader.reader_ID=Borrow.reader_ID WHERE borrowdate=‘2020-6-7’

2.65】查询每个读者所借的图书的信息,要求显示读者姓名,图书名称,借出日期 

SELECT Reader.name AS 姓名,Book.name AS 图书名称,    Borrow.Borrowdate AS 借出日期 FROM Reader JOIN Borrow ON Reader.Reader_id = Borrow.Reader_id  JOIN BookON Borrow.book_ID=Book.book_ID

注意:多表的同名列前面必须加表名前缀。

•             即:表名.列名

给表起别名 

SQL语句中,可以类似为列取别名那样为表取别名,格式:

<源表名>  [ AS ] <表别名>

注意:当为表指定了别名时,在查询语句中的其他地方,所有用到表名的地方都要使用别名,不能再使用原表名。

2.66】查询’王旭’所借图书的书名 

SELECT   B.name FROM Book B    JOIN   Borrow W    ON   B.book_ID=W.book_ID    JOIN Reader R    ON R.Reader_id=W.Reader_id    WHERE R.name=’王旭’

内连接的特点:满足连接条件的元组保留到连接的结果中,其中存在不满足连接条件的元组会被舍弃。 

 XY连接结果

SELECT   a,    X.b,    Y.b,    c FROM  X  JOIN  Y  ON  X.b=Y.b

 表外连接

和内连接相对的就是外连接 外连接的特点:满足连接条件的元组保留到连接的结果中,其中不满足连接条件的元组也会显示到连接结果中。 外连接分类

左外连接 

FROM 1 LEFT [OUTER] JOIN 2

    ON <连接条件>

2.70】SELECT   a,  X.bY.b,  c

       FROM  X 

     LEFT JOIN  Y 

      ON  X.b=Y.b

 右外连接

FROM 1 RIGHT [OUTER] JOIN 2

    ON <连接条件>

】SELECT  a,  X.bY.b,  c

       FROM   X

       RIGHT JOIN   Y  

       ON  X.b=Y.b

 例:统计每个读者所借阅的图书的数量,要求显示读者姓名和借阅数量

SELECT name,COUNT(book_id)FROM Reader left JOIN Borrow ON Reader.Reader_id =Borrow.Reader_idgroup by  Reader.Reader_id ,name

例:统计,每本书被借阅的次数,要求显示书名和被借阅的次数 

SELECT name,COUNT(reader_id)FROM bookleft JOIN Borrow ON book.book_id =Borrow. book_idgroup by book.book_id ,name

数据库五章其二第四讲 ——SQL_熬夜程序员-CSDN博客知道SQL怎么学么?https://blog.csdn.net/rej177/article/details/122765634?spm=1001.2014.3001.5502