sql子查询
一、子查询入门:
1、单值子查询:
单值子查询的唯一限制:子查询的返回值必须只有一行记录,而且只能有一列(又被称为标量子查询)。
可以使用在select语句的列表、表达式中,以及where语句中等。
例1:select 1 as f1,2,(select min(fyearpublished) from t_book),(select max(fyearpublished) from t_book) as f4 from dual;
2、列值子查询:
列值子查询可返回一个多行多列的结果集(又称为表子查询)。
可以使用在select语句的from子句中、insert语句、连接、in子句等。
例1:select t_reader.fname,t2.fyearpublished,t2.fname
from t_reader,(select * from t_book where fyearpublished < 1800) t2;
表子查询可以看做一张临时表,所以引用子查询中列的时候必须使用子查询中定义的列名,也就是如果子查询中为列定义了别名,那么在引用的时候也要使用别名。
例2:select t_reader.fname,t2.fyear,t2.fname,t2.f3
from t_reader,(select fyearpublished as fyear,fname,1+2 as f3 from t_book where fyearpublished < 1800) t2;
二、select列表中的标量子查询:
例1:select fid,fname,(select max(fyearpublished) from t_book where t_book.fcategoryid = t_category.fid)
from t_category;
这里的子查询与前面的不同,这个子查询必须依赖于外部查询的字段,也就是可以直接单独直行,而这里的子查询是依赖于外部查询中的t_category.fid这个字段的,是无法单独执行的。
三、where子句中的标量子查询:
例1:select freaderid from t_readerfavorite
where fcategoryid=(
select fid from t_category where fname='story'
);
例2:检索每种类型中最早出版的图书:
select t_category.fid,min(t_book.fyearpublished)
from t_category
inner join t_book on t_category.fid=t_book.fcategoryid
group by t_category.fid;
在上一句的基础上,加上书籍名称:
select t_category.fid,t_book.fyearpublished
from t_category
inner join t_book on t_category.fid=t_book.fcategoryid
where t_book.fyearpublished=
(
select min(t_book.fyearpublished) from t_book where t_book.fcategoryid=t_category.fid
);
首先在两个表内进行自连接,再在where子句中使用子查询来过滤数据。
四、集合运算符与子查询:
1、in运算符:
例:检索出所有图书出版年份内入会的读者信息:
select * from t_reader
where fyearofjoin in
(select fyearpublished from t_book);
2、any和some运算符:
在sql中any和some是同义词,基本用法也相同。any必须和其他比较运算符共同使用,而且必须将比较运算符放在any关键字之前,所比较的值也需要匹配子查询中的任意一个值:
例:any和=运算符共同使用的例子,检索出所有图书出版年份内入会的读者信息。“=any”等价于in
select * from t_reader
where fyearofjoin =any
(select fyearpublished from t_book);
any还可以和大于、小于、大于等于、小于等于等比较运算符共同使用。
例:检索出会员出生之前出版的图书。
select * from t_book
where fyearpublished<any
(select fyearofbirth from t_reader);
注意:any运算符不能和固定的集合相匹配,如:select * from t_book where fyearpublished<any(2001,2003,2005);
3、all运算符:
all运算符要求比较的值需要匹配子查询中的所有值,不能单独使用,同样不能与固定值匹配。
例:检索出所有会员入会之前出版的图书:
select * from t_book
where fyearpublished<all
(select fyearofjoin from t_reader);
注意:如果匹配的集合为空,也就是子查询没有返回任何数据的时候,不论与什么比较运算符搭配使用all的返回值将永远是true。
4、exists运算符:
这个是单目运算符,不与列匹配,也不要求匹配的集合是单列。exists是用来检查每一行是否匹配子查询,可以认为exists就是用来测试子查询结果是否为空的,如果结果集为空则匹配结果为false,否则匹配结果为true。
例:测试是否存在山东省的读者:
select * from t_book where exists
(select * from t_reader where fprovince='ShanDong');
例:检索在1950年以前出版的图书的图书类别:
select * from t_category where exists
(select * from t_book
where t_book.fcategoryid=t_category.fid and t_book.fyearpublished<1950);
五、子查询在其他类型sql语句中的应用:
1、在insert语句中的应用:
例:insert into t_readerfavorite(fcategoryid,freaderid)
//为t_reader表中每一个读者都在t_readerfavorite表中创建一条fcategoryid等于1的记录
select 1,fid from t_reader
where not exists
(select * from t_readerfavorite where t_readerfavorite.fcategoryid=1 and t_readerfavorite.freaderid=t_reader.fid);
2、在update语句中的应用:
例:将所有同类书本数超过3本的图书的出版日期更新为2005:
update t_book b1
set b1.fyearpublished=2005
where(select count(*) from t_book b2 where b1.fcategoryid=b2.fcategoryid)>3;
3、在delete语句中的应用:
例:将所有同类书本数超过3本的图书删除:
delete from t_book b1
where(select count(*) from t_book b2 where b1.fcategoryid=b2.fcategoryid)>3;
sql子查询的更多相关文章
- sql子查询 嵌套SELECT语句
嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele ...
- SQL子查询/嵌套查询
sql子查询 嵌套SELECT语句 嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为 ...
- SQL 子查询,连接查询复习
use lianxi0720 go --创建部门表 create table bumen ( bcode int primary key,--部门编号 bname ), --部门名称 bceo ), ...
- Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图
子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...
- sql子查询在insert、update、delete中的应用
子查询可以应用在INSERT.UPDATE以及DELETE等语句中,合理的使用子查询将能够简化功能的实现并且极大的提高SQL语句执行的效率 用到的表: CREATE TABLE `t_readerfa ...
- SQL 子查询 EXISTS 和 NOT EXISTS
MySQL EXISTS 和 NOT EXISTS 子查询语法如下: SELECT … FROM table WHERE EXISTS (subquery) 该语法可以理解为:将主查询的数据,放到子查 ...
- SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE
1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...
- SQL查询优化思维即SQL子查询
一. 什么叫子查询 定义及分类 子查询又称内部查询,而包含子查询的语句称之外部查询(又称主查询).所有的子查询可以分为两类,即相关子查询和非相关子查询. 非相关子查询是独立于外部查询的子查询,子查询总 ...
- PL/SQL 子查询
一.概述 在一个SQL语句中嵌套另一个SQL语句成为子查询.包括单行子查询,多行子查询,多列子查询. 注意,当在DDL语句中引用子查询时,可以带有Order By子句:但是当在where子句.Set子 ...
随机推荐
- .net 4.5 webform 提取ModelState错误信息
.net4.5以后,webform也可以使用模型绑定和模型验证. user实体: public class User { [Required] [Display(Name = "用户ID&q ...
- VMware虚拟机下为Ubuntu添加磁盘
20G的磁盘还是不够用啊,正好复习下磁盘分区和逻辑卷. 关闭虚拟机,打开VMware,右键虚拟机点击设置,点下下方的添加,就可以添加磁盘了. 进入虚拟机,查看: root@ubuntu:/# fdis ...
- Django入门实战【3步曲】
环境准备 junhongdeMacBook-Air:site-packages junhongchen$ python -V Python 2.7.10 junhongdeMacBook-Air: ...
- grpc 入门(一)--hello world
一,从rpc接口的定义说起,下面给一个最简单的grpc示例--hello world 在这个rpc横行的世界里,实现一个rpc很重要的一件事就是定义一个好接口,一个好的接口定义会让你省去很多麻烦.熟悉 ...
- 运维架构服务监控Open-Falcon
一. 介绍 监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题.监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择.当公司刚 ...
- Zabbix实战-简易教程--动作(Actions)--自动注册
一.概述 之前已经讲述了自动发现功能,自动注册和自动发现非常类似,但是比自动发现更精确.因为自动注册,是在Agent上自定义元数据,然后Agent将元数据发送给server进行匹配,如果匹配一致,则进 ...
- Java多线程与并发编程学习
一.线程三大特性 多线程有三大特性,原子性.可见性.有序性 1.1 什么是原子性 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.一个很经典的例子就是银行账户转账 ...
- 使用 webpack + react + redux + es6 开发组件化前端项目
因为最近在工作中尝试了 webpack.react.redux.es6 技术栈,所以总结出了一套 boilerplate,以便下次做项目时可以快速开始,并进行持续优化.对应的项目地址:webpack- ...
- [bzoj1500 维修数列](NOI2005) (splay)
真的是太弱了TAT...光是把代码码出来就花了3h..还调了快1h才弄完T_T 号称考你会不会splay(当然通过条件是1h内AC..吓傻)... 黄学长的题解:http://hzwer.com/28 ...
- hdu_2444The Accomodation of Students(二分图的判定和计算)
hdu_2444The Accomodation of Students(二分图的判定和计算) 标签:二分图匹配 题目链接 题意: 问学生是否能分成两部分,每一部分的人都不相认识,如果能分成的话,两两 ...