一.子查询概述
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;