数据库五章其二第三讲 ——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语言中,一个SELECT-FROM语句称为一个查询块。
•如果一个SELECT语句嵌套在另一个SELECT、INSERT、UPDATE或DELETE语句中,则称之为子查询或内层查询;而包含子查询的语句则称为主查询或外层查询。
•执行顺序:先内层后外层;先子查询后主查询
比较运算中使用子查询
•【例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_ID在Borrow表中找王旭所借图书的book_ID
–第3步,依据book_ID在Book表中找到图书名称。
查询借书价格在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】查询2020年1月20日借书的读者姓名和所借图书的编号
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】查询2020年6月7日借阅图书的读者姓名和所借图书名称
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=’王旭’
•内连接的特点:满足连接条件的元组保留到连接的结果中,其中存在不满足连接条件的元组会被舍弃。
表X和Y内连接结果
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.b, Y.b, c
FROM X
LEFT JOIN Y
ON X.b=Y.b
右外连接
•FROM 表1 RIGHT [OUTER] JOIN 表2
ON <连接条件>
•【例】SELECT a, X.b, Y.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