MYSQL 数据查询.多表子查询

一.子查询概述

1.子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。

 子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。

 子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。

2.根据子查询的返回结果分:

子查询返回一个值 (= >  >=   <   <=)

列子查询(子查询结果为一列)(in、all、exists)

行子査询(子査询结果为一行)

表子査询(子査询结果为多行多列)(in)

3.语法格式:

                select * from 表1 where 列1 = (select 列2 from 表2 [where 条件] );    

注意:列1、列2 名称可以不同,但是字段值一致

二.简单实例:

图书管理数据库有读者reader图书book借阅数据表 读者表reader有读者证号dzzh、姓名xm、性别xb、身份sf、电话号码dhhm字段 

图书表book有条形码txm、书名sm、分类号flh,作者zz,出版社cbs,出版日期cbrq,售价sj,典藏类别dclb,在库zk,币种bz字段

借阅表borrow有借阅编号jyid、读者证号dzzh、条形码txm、借阅日期jyrq、还书日期hsrq五个字段。 当读者借阅图书时,在借阅数据表中添加一条记录,还书日期设置为NULL,图书的在库zk字段被设置为0. 当读者归还图书时,将其对应借阅记录的还书日期设置为当天的日期,并修改图书的在库zk字段为1.

 问题:

第一题 查询曾经借过图书的读者的读者证号和姓名

第二题 查询曾经没有被借阅的图书的条形码和书名

第三题 查询与孙思旺借过相同图书的读者的读者证号和姓名,按读者证号升序排列

第四题 查询借阅过李白全集的读者所借过的其他图书的书名 按书名升序排列

代码:

1.
select dzzh,xm from reader where reader.dzzh in (select dzzh from borrow);

2.
select txm,sm from book where book.txm not in (select txm from borrow);

3.
select dzzh,xm from reader where reader.dzzh in (select dzzh from borrow 
where txm in (select txm from borrow 
where borrow.dzzh=(select dzzh from reader 
where xm='孙思旺'))) 
and dzzh!='006' order by dzzh asc;

4.
select sm from book where book.txm in (select txm from borrow
where borrow.dzzh in (select dzzh from borrow 
where borrow.txm=(select txm from book where sm='李白全集')))
and sm!='李白全集' order by sm asc;

猜你喜欢

转载自blog.csdn.net/m0_62428181/article/details/127266809