【MySQL 第八天 子查询|比较运算符|插入记录子查询|表和表互查】
【1】mysql子查询
子查询的引入
-- 身份证号为`52242855555`的用户,今天借了一本图书编号为`4454545`的图书。完成下列需求
-- 更新读者信息表得到余额
-- 先将这个数据插入图书信息表 更新以下他的价格
insert into bookinfo(book_id) values('4454545');
update bookinfo set price = price+23.33 where book_id=4454545;
-- 查看这条数据
select price from bookinfo where book_id =4454545;
-- 插入身份信息到读者信息表
insert into readerinfo(card_id) values('52242855555');
-- 由于该读者借了书 就要给钱 所以扣钱 更新他的钱 通过查询的方式获取数据 即子查询
update readerinfo set balance = balance- 0.05*(select price from bookinfo where book_id =4454545)
where card_id=52242855555;
子查询:(select column_name from tab_name where column_name = value)
【2】mysql比较运算符子查询
先插入数据,在演示
-- 向bookparent 插入数据
insert into bookparent(book_name,parent_id)values('眼科学',2),('临床医学',2);
-- 向bookinfo 插入数据
insert into bookinfo(book_id,book_copy_id,book_name,author,price,store,press,pubdate)
values
(20151101,6,'临床诊断学','小明,小红等',115,10,'人民出版社','2015-06-01'),
(20151102,6,'临床诊断学1','小明1,小红1等',115.5,10,'人民出版社1','2015-07-01');
-- 将readerinfo 的52242855555的余额改为500
update readerinfo set balance = 500 where card_id ='52242855555';
-- 向 borrowinfo 插入一条数据
insert into borrowinfo(book_id,card_id,borrow_date,return_date,status)
values(20151101,'52242855555','2017-10-10','2017-11-10','否');
开始演示子查询,设计多个表之间的联系
-- 查询借阅信息表,显示借《C++》这本书的借阅记录
-- 通过书名 获取book_id 通过book_id查看信息
select *from borrowinfo where book_id =(select book_id from bookinfo where book_name ='C++');
-- 查询图书信息表,显示图书价格小于图书平均价格的图书信息
-- 先求平均价格 并保留两位小数
select *from bookinfo where price<(select round(AVG(price),2) from bookinfo);
-- 查询图书信息表,显示图书类别不是'数据库'的所有图书信息
-- 在bookparen获取'数据库'的类别ID即可
select *from bookinfo where book_copy_id <>(select book_id from bookparent where book_name ='数据库');
【1.1】any\all\some关键字修饰子查询
-- 查询图书信息表 bookparent 显示图书类别为'计算机'的所有图书信息
select *from bookinfo where book_copy_id = ANY(select book_id from bookparent where parent_id = 1);
-- 查询图书信息表 bookparent 显示图书类别为'计算机'的所有图书信息
select *from bookinfo where book_copy_id = some(select book_id from bookparent where parent_id = 1);
【3】mysql [NOT]IN或exists的子查询
-- 查询图书信息表 ,显示图书类别为'医学'的所有图书
select *from bookinfo where book_copy_id = any(select book_id from bookparent where parent_id = 2);
异曲同工之妙 相当于 =等于in 仅在这里具有可比性
-- 查询图书信息表 ,显示图书类别为'医学'的所有图书
select *from bookinfo where book_copy_id in (select book_id from bookparent where parent_id = 2);
-- 查询图书信息表 ,显示图书类别不是为'医学'的所有图书
select *from bookinfo where book_copy_id not in (select book_id from bookparent where parent_id = 2);
-- 查看图书信息表中是否有`临床医学`的类别,如果有,查看图书信息表
select *from bookinfo where exists(select book_id from bookparent where book_name ='临床医学');
【4】mysql插入记录使用子查询
-- 创建罚款记录信息表
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)
);
-- 查询没有还书的 信息 使用datediff(系统时间,还书时间)>0 计算时间间隔天数
-- 现在时间-还书时间 >0 代表已经到了还书时间
select sysdate();
select book_id,card_id,return_date from borrowinfo where datediff(sysdate(),return_date)>0
and status = '否';
-- 将没有还书的信息插入到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 = '否';
UPDATE borrowinfo set status ='是' WHERE book_id =1 and card_id ='52214685259788';
update readerfee set actual_return_date=sysdate(),book_fee = DATEDIFF(SYSDATE(),return_date)*0.2
WHERE book_id =1 and card_id ='52214685259788';
select *from readerfee ;
越到后面越重要,下一节别错过啊:/😕😕😕