当前位置:   article > 正文

MySQL中的子查询(第八章)_查找没有销售数量的图书,显示图书编号和图书名字

查找没有销售数量的图书,显示图书编号和图书名字

1 子查询的介绍

什么是子查询
子查询定义
使用子查询场合
子查询案例

-- 查找图书价格
SELECT price FROM bookinfo WHERE book_id = 20150301;
-- 更新读者信息的余额
UPDATE readerinfo SET balance = balance - 60 * 0.05 WHERE card_id = '210210199901015555';
  • 1
  • 2
  • 3
  • 4

这里初始信息是:身份证号为’ 210210199901015555’的用户的余额=500,借一本书的费用为图书价格*5%。
更新用户余额信息之后,再次查看用户的余额信息
结果:
![用户余额信息]](https://img-blog.csdnimg.cn/20200604143819113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDA1NjI3OQ==,size_16,color_FFFFFF,t_70)
恢复身份证号为’ 210210199901015555’的用户的余额=500,然后使用子查询的方式:

update readerinfo set balance = balance - (select price from bookinfo where book_id = 20150301) * 0.05 where card_id = '210210199901015555';
  • 1

结果:
![用户余额信息]](https://img-blog.csdnimg.cn/20200604143819113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDA1NjI3OQ==,size_16,color_FFFFFF,t_70)

2 使用比较运算符的子查询

比较运算符分类
比较运算符案例

-- 1.查询借阅信息表, 显示借 《 Spring源码深度解析》这本书的借阅记录
SELECT * FROM borrowinfo WHERE book_id = (SELECT book_id FROM bookinfo WHERE book_name = 'Spring源码深度解析');
  • 1
  • 2

结果:
查询借阅信息表, 显示借 《 Spring源码深度解析》这本书的借阅记录

-- 2.查询图书信息表, 显示图书价格小于图书平均价格的所有图书信息
SELECT * FROM bookinfo WHERE price < (SELECT ROUND(AVG(price),2) FROM bookinfo);
  • 1
  • 2

结果:
查询图书信息表, 显示图书价格小于图书平均价格的所有图书信息

-- 3.查询图书信息表,显示图书类别不是’数据库’的所有图书信息
SELECT * FROM bookinfo WHERE book_category_id != (SELECT category_id FROM bookcategory WHERE category = '数据库');
  • 1
  • 2

结果:
查询图书信息表,显示图书类别不是’数据库’的所有图书信息
用ANY、ALL、SOME关键字修饰子查询
ANY或SOME关键字

-- 查询图书信息表,显示图书类别为’计算机’的所有图书信息
SELECT * FROM bookinfo WHERE book_category_id = ANY(SELECT category_id FROM bookcategory WHERE parent_id = 1);
  • 1
  • 2

结果:
查询图书信息表,显示图书类别为’计算机’的所有图书信息

-- 查询图书信息表,显示价格大于图书类别为4的任意一个价格的所有图书信息(大于子查询的最小值即可)
SELECT * FROM bookinfo WHERE price > ANY (SELECT price FROM bookinfo WHERE book_category_id = 4);
  • 1
  • 2

结果:
查询图书信息表,显示价格大于图书类别为4的任意一个价格的所有图书信息
ALL关键字

-- 查询图书信息表,显示价格大于图书类别为4的所有价格的所有图书信息(大于子查询的最大值)
SELECT * FROM bookinfo WHERE price > ALL (SELECT price FROM bookinfo WHERE book_category_id = 4);
  • 1
  • 2

结果:
查询图书信息表,显示价格大于图书类别为4的所有价格的所有图书信息

3 使用[NOT] IN 或EXISTS的子查询

举例
使用[NOT]IN的子查询

-- 查询图书信息表,显示图书类别为’医学’的所有图书信息。
-- 方式1
SELECT * FROM bookinfo WHERE book_category_id = ANY (SELECT category_id FROM bookcategory WHERE parent_id = 2);
-- 方式2
-- in 后面的子查询返回一个数据列,等于数据列里的任意一个值都是满足条件的。
SELECT * FROM bookinfo WHERE book_category_id IN (SELECT category_id FROM bookcategory WHERE parent_id = 2);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果:
使用ANY或者IN的查询结果
使用NOT IN的子查询
使用[NOT]EXISTS的子查询
案例

-- 查看图书类别表中是否有’临床医学’的类别,如果有,则查看图书信息表。
SELECT * FROM bookinfo WHERE EXISTS (SELECT * FROM bookcategory WHERE category = '临床医学');
  • 1
  • 2

结果:
使用EXISTS的子查询

4 插入记录时使用子查询

INSERT...SELECT语句

案例1

CREATE TABLE readerfee(
	book_id INT ,
	card_id CHAR(18),
	return_date DATE,
	actual_return_date DATE,
	book_fee DECIMAL(7,3),
	PRIMARY KEY(book_id, card_id)
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

将borrowinfo中查询到的数据使用子查询的方式插入到表readerfee中:

INSERT INTO readerfee (book_id, card_id, return_date) SELECT book_id, card_id, return_date FROM borrowinfo WHERE DATEDIFF(SYSDATE(), return_date) > 0 AND STATUS = '否';
  • 1

结果:
使用子查询的方式插入数据
案例2

-- 1.更新借阅信息表,将借阅状态(status)更新为‘是’
UPDATE borrowinfo SET STATUS = '是' WHERE book_id = 20151101 AND card_id = '210210199901012222';
-- 2.更新罚款记录信息表,更新实际还书日期和罚款金额,罚款金额为每超出一天扣0.2元
UPDATE readerfee SET actual_return_date = SYSDATE(), book_fee = DATEDIFF(SYSDATE(), return_date) * 0.2 WHERE book_id = 20151101 AND card_id = '210210199901012222';
  • 1
  • 2
  • 3
  • 4

结果:查看罚款记录信息表:SELECT * FROM readerfee;
在这里插入图片描述
这里我们采用第2种方法:

UPDATE readerfee SET actual_return_date = DATE_FORMAT(SYSDATE(), '%Y-%m-%d'), book_fee = DATEDIFF(SYSDATE(), return_date) * 0.2 WHERE book_id = 20151101 AND card_id = '210210199901012222';
  • 1

结果:
对日期进行格式化,结果正常
罚款信息记录表

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/546038
推荐阅读
相关标签
  

闽ICP备14008679号