mysql学习之旅(八)——子查询

子查询

什么是子查询

案例;
在这里插入图片描述1、SELECT price FROM bookinfo WHERE book_id=‘20150301’;
2、
UPDATE readerinfo SET balance=balance-69*0.05 WHERE card_id=‘120120199901011234’;

或者:
UPDATE readerinfo SET balance=balance-(SELECT price FROM bookinfo WHERE book_id=‘20150301’)*0.05 WHERE card_id=‘120120199901011234’;

其中,(SELECT price FROM bookinfo WHERE book_id=‘20150301’)就是子查询。

因此可知:子查询是指嵌套在其他sql语句内的查询语句。
例:SELECT * FROM table1 WHERE col1 =(SELECT col2 FROM table2);
子查询指嵌套在查询内部,且必须始终出现在圆括号内。子查询的结果作为外层另一个查询的过滤条件。子查询可以添加到SELECT、UPDATE和DELETE等语句中。

使用比较运算符的子查询

比较运算符:=、<、<、>=、<=、<>、!=
案例:
在这里插入图片描述1、SELECT * FROM borrowinfo WHERE book_id=(SELECT book_id FROM bookinfo WHERE book_name=‘计算机基础’);

2、SELECT * FROM bookinfo WHERE price<(SELECT ROUND(AVG(price),2) FROM bookinfo);

3、SELECT * FROM bookinfo WHERE book_category_id<>(SELECT category_id FROM bookcategory WHERE category=‘数据库’);

用ANY、ALL、SOME关键字修饰子查询
ANY、ALL、SOME关键字放在比较运算符的后面
ANY和SOME是同义词,表示满足内层子查询中的任何一个条件。
ALL表示需要同时满足所有内层查询的条件

案例:
查询图书信息表,显示图书类别为’计算机’的所有图书信息。
SELECT * FROM bookinfo WHERE book_category_id =ANY(SELECT category_id FROM bookcategory WHERE parent_id=‘1’)

查看书价大于图书类别编号为4 的任一图书价格的所有图书信息
SELECT * FROM bookinfo WHERE price >ANY(SELECT price FROM bookinfo WHERE book_category_id=‘4’);

查看书价大于图书类别编号为4 的所有图书价格的所有图书信息:
SELECT * FROM bookinfo WHERE price >ALL(SELECT price FROM bookinfo WHERE book_category_id=‘4’);

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

使用[NOT] IN引发的子查询

IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。
NOT IN 与IN的作用相反。

需求:查询图书信息表,显示图书类别为‘医学’的所有图书信息
SELECT * FROM bookinfo WHERE book_category_id IN (SELECT category_id FROM bookcategory WHERE parent_id=‘2’);

需求:查询图书信息表,显示图书类别为不是‘医学’的所有图书信息
SELECT * FROM bookinfo WHERE book_category_id NOT IN (SELECT category_id FROM bookcategory WHERE parent_id=‘2’);

使用exists的子查询

例:SELECT *FROM tables1 WHERE EXISTS(子查询);
判断子查询是否返回行;
如果返回,则子查询结果为TURE,继续执行外部查询
如果没有返回任何行,那么子查询结果为FSLSE,不执行外部查询
案例:
在这里插入图片描述SELECT * FROM bookinfo WHERE EXISTS (SELECT category_id FROM bookcategory WHERE category=‘临床医学’);

插入记录时使用子查询

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。
也就是通过子查询将查询结果写入到另外一个数据表中。
例:INSERT INTO table2 SELECT * FROM table1;

案例1:
在这里插入图片描述
CREATE TABLE readerfee(
book_id INT,
card_id CHAR(18),
return_date DATE,
actual_return_date DATE,
book_free DECIMAL(7,3),
PRIMARY KEY (book_id,card_id)
);

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=‘否’;

案例2:
在这里插入图片描述1、UPDATE borrowinfo SET STATUS=‘是’ WHERE book_id=20190801 AND card_id=‘210210199901011111’;
2、UPDATE readerfee SET actual_return_date=SYSDATE(),book_free=DATEDIFF(SYSDATE(),return_date)*0.2 WHERE book_id =20190801 AND card_id=‘210210199901011111’;

发布了19 篇原创文章 · 获赞 2 · 访问量 1236

猜你喜欢

转载自blog.csdn.net/weixin_38377637/article/details/100149055