sql的嵌套查询,把一次查询的结果做为表继续进一步查询;内联视图
Mysql的嵌套表查询
嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询可以:
- 出现在Where子句中,
- 出现在from子句中,作为一个临时表使用,
- 出现在select list中,作为一个字段值来返回。
示例
1、出现在where子句中
- 单行子查询 :单行子查询是指子查询的返回结果只有一行数据。当主查询语句的条件语句中引用子查询结果时可用单行比较符号(=, >, <, >=, <=, <>)来进行比较。
select ename,deptno,sal from emp where deptno=(select deptno from dept where loc='NEW YORK');
- 多行子查询:多行子查询即是子查询的返回结果是多行数据。当主查询语句的条件语句中引用子查询结果时必须用多行比较符号(IN,ALL,ANY)来进行比较。其中,IN的含义是匹配子查询结果中的任一个值即可("IN" 操作符,能够测试某个值是否在一个列表中),ALL则必须要符合子查询的所有值才可,ANY要符合子查询结果的任何一个值即可。而且须注意ALL 和ANY 操作符不能单独使用,而只能与单行比较符(=、>、< 、>= 、<= 、<>)结合使用
select stName from Student where stId in (select distinct stId from score where teId=(select teId from teacher where teName='Rona'));
select stName from Student where stId in (select distinct stId from score where score >all (select score from score where stId=(select stId from Student where stName= 'Kaka')));
select stName from Student where stId in (select distinct stId from score where score >any(select score from score where stId=(select stId from Student where stName='Kaka')));
- 多列子查询:当是单行多列的子查询时,主查询语句的条件语句中引用子查询结果时可用单行比较符号(=, >, <, >=, <=, <>)来进行比较;当是多行多列子查询时,主查询语句的条件语句中引用子查询结果时必须用多行比较符号(IN,ALL,ANY)来进行比较。
SELECT deptno,ename,job,sal FROM EMP WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP GROUP BY deptno);
2、内联视图:出现在where子句中,查询结果作为子表(临时表)。示例包含联合查询、嵌套查询
select job_name1,app_name,plugin_name,plugin_version from (select job_name as job_name1, app_name as app_name,plugin_name as plugin_name,plugin_version as plugin_version from plugin_check left join jobs on project_name=job_name) as suibianxie where plugin_name LIKE '%graylog-logback%' AND `plugin_version` < '1.0.27.3' ORDER BY app_name
去重复操作distinct详解
1、作用于单列自然好理解,作用于多列时,是根据多列来去重的,比如下面两列是不重复的
select distinct col1,col2,col3 from table_test
a c
a b
2、且distinct并非是对多列“字符串拼接”后再去重的,而是分别作用于了每一列,比如下面两列是不重复的;下面两列拼接后是相同的,但是并不会被判断会相同
select distinct col1,col2 from table_test
rain m
rai nm
3、distinct必须放在开头
普通视图和内联视图(in-line view)的关系
在select语句里的内联视图(in-line view),即SELECT * FROM (<select clause> ),例如
SELECT *
FROM ( SELECT deptno, count(*) emp_count
FROM emp
GROUP BY deptno ) emp,
dept
WHERE dept.deptno = emp.deptno;
其中,
( SELECT deptno, count(*) emp_count FROM emp GROUP BY deptno )就是所谓的内联视图(in-line view)。
在DML语句里的内联视图(in-line view),例如
nsert into (<select clause> ) values (...),其具体示例如下: insert into (select object_id,object_name,object_type from xxx where object_id<)
values(,'testbyhao','testtype');
普通视图
我们平时说的视图指的是create view语句创建的视图类型,我们暂且称其为普通视图。例如,
CREATE VIEW empvu30
AS SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = ;
普通视图本质上还是内联视图(in-line view),因为在执行包含普通视图的SQL语句时,普通视图都会最终转化为内联视图(in-line view)。例如,
在select语句里的普通视图,例如,
SELECT * FROM empvu30;
最终转化为
SELECT * FROM (SELECT employee_id, last_name, salary FROM employees WHERE department_id = );
在DML语句里的普通视图,例如,
insert into empvu30 values(,‘jak’,);
最终转化为
insert into (SELECT employee_id, last_name, salary FROM employees WHERE department_id = ) values(,‘jak’,);
内联视图(in-line view)和子查询的区别
内联视图(in-line view)(各种类型的视图本质上都是内联视图)不同于子查询的地方在于:
子查询(可以视之为)是一个中间结果集,但是内联视图(in-line view)不可这么认为。这点可以从如
insert into (select object_id,object_name,object_type from xxx where object_id<) values (,'testbyhao','testtype');
时看出,因为一个select语句执行所得的结果集是只能读取而不能被修改的,即不支持DML操作,但是内联视图(in-line view)却又是支持DML操作,所以说从内联视图(in-line view)这个特性来看,它更像是表,只不过内联视图(in-line view)没有实际的数据,视图的全部家当,也就是你创建视图时的SELECT语句,故而我们可以将内联视图(in-line view)视为一张虚拟的表。
注释:
View
A view is a named and validated SQL query which is stored in the Oracle data dictionary. Views do not contain any data - it is just a stored query in the database that can be executed when called. One can think of a view as a virtualtable or mapping of data from one or more tables.
参见:http://www.orafaq.com/wiki/View
下面的实验证明了内联视图(in-line view)更像是表而不是子查询:
为什么说内联视图(in-line view)没有实际执行呢?看统计信息吧:
SQL> set autotrace trace exp stat
SQL> select object_id,object_name,object_type from xxx where object_id<1000;
955 rows selected.
97 consistent gets
这是一个结果集,有955 rows selected(被选择了).
SQL>create table ts as (select object_id,object_name,object_type from xxx where object_id<1000);
SQL> insert into ts values(999,'testbyhao','testtype');
1 row created.
1 consistent gets
SQL> insert into (select object_id,object_name,object_type from xxx where object_id<1000)2 values(999,'testbyhao','testtype');1 row created.1 consistent gets
从这里看出,内联视图(in-line view)的特性更像是表而不是子查询,因为insert into 内联视图(in-line view)时的统计信息说明内联视图(in-line view)没有像子查询那样实际执行而获得一个含有955行数据的结果集。insert into 内联视图(in-line view)时的统计信息显示1 row created.即新创建了一行数据在视图里,这个和insert into 表时的统计信息一样。
注释:
内联视图(in-line view)中内联的意思,在主查询语句中,内联视图(in-line view):
( SELECT deptno, count(*) emp_count FROM emp GROUP BY deptno )
是直接将其源码
( SELECT deptno, count(*) emp_count FROM emp GROUP BY deptno )嵌入主查询语句中,而普通视图,如名为empvu30的视图:
CREATE VIEW empvu30 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 30;是将视图名 empvu30嵌入主查询语句中,而不是其源码
SELECT employee_id, last_name, salary FROM employees WHERE department_id = 30;
所以,内联视图(in-line view)中内联的意思就是直接将内联视图源码嵌入主查询语句里的意思。内联函数中内联的意思也是如此,即直接将内联函数的函数体源码嵌入到类中,而不是在类中只是声明了函数头,没有函数体。这样,可以避免在类中只是声明了函数头而没有函数体时要保护现场后去切换调用函数体的开销,从而提高执行速度。
参考:
1、https://www.cnblogs.com/wangshenhe/archive/2012/11/28/2792093.html
2、http://wiki.jikexueyuan.com/project/sql/sub-queries.html
3、https://blog.csdn.net/sinat_25059791/article/details/69666318
sql的嵌套查询,把一次查询的结果做为表继续进一步查询;内联视图的更多相关文章
- Oracle的分页查询及内联视图和函数处理
1.Oracle的分页常用方式: select * from(select * ,ROWNUM num from table where ROWNUM<=20 ) where num>0; ...
- SQL 多个表之间联合查询
非常少用join,这次学学,并备忘两篇文章! 转自:http://hcx-2008.javaeye.com/blog/285661 连接查询 通过连接运算符能够实现多个表查询.连接是关系数据库模型的主 ...
- mysql连表操作是先连表还是先查询条件
mysql连表操作是先连表还是先查询条件 一.总结 一句话总结: 连表操作时:先根据查询条件和查询字段确定驱动表,确定驱动表之后就可以开始连表操作了,然后再在缓存结果中根据查询条件找符合条件的数据 1 ...
- sql中的内联和外联(简单用法)
有两张表:user和department User表: CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` ...
- sql中内联 和外联 区别
sql中内联 和外联 区别 2007-05-15 17:37 这个概念一般看书不好理解.其实夜简单.有例子就简单了. 比如: 表A(主表) cardid username 16 aa 23 bb 25 ...
- sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询
执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date ...
- [转]sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询
执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date ...
- [sql Server]除非另外还指定了TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
今天遇到一个奇怪的问题,项目突然要从mysql切换到sql server数据库,包含order by 子句的嵌套子查询报错. 示例:select top 10 name,age,sex from ( ...
- ylb:SQL 表的高级查询-多表连接和子查询
ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...
随机推荐
- loadrunner——常见函数
loadrunner——常见函数 分类: LoadRunner 2012-04-11 20:41 703人阅读 评论(0) 收藏 举报 loadrunnersearchweb服务器脚本stringwe ...
- babel使用中不想使用 严格模式 如何去除?
使用babel进行es6转es5时,默认转化之后是严格模式,有些时候我们想去除严格模式. 解决方法如下 安装 babel-plugin-transform-remove-strict-mode 依赖 ...
- 移动端自动化测试(二)之 Appium常用的API(python)函数介绍
上一章节已经介绍了Appium的环境搭建,其实只要掌握了Appium的工作原理,前期的准备工作和安装过程是比较简单的.那么当我们搭建好Appium环境后接下来做些什么呢?通常思路是开始appium的第 ...
- JS图片滚动代码(无缝、平滑)
非常平滑的JS图片滚动特效代码,无缝循环,速度可自定义,鼠标悬停时停止.它的特点是JS和图片地址分离,这样做你就经易的从数据库动态调用每张图片的地址,方便控制,因此它非常的应用. <!DOCTY ...
- Linux下安装Zookeeper
Zookeeper是一个协调服务,可以用它来作为配置维护.名字服务.分布式部署: 下面,我来分享一下在Linux下安装Zookeeper的整个步骤,让大家少走弯路. 一.Zookeeper下载 [ro ...
- WIN8+VS2013编写发布WCF、一(编写)、二(部署)、三(调用)
原文://http://www.cnblogs.com/tntboom/p/4348483.html 引言:上学期因为写服务器用WCF,所以连查资料再瞎调试勉强成功了,但是这学期又到了用WCF的时候, ...
- 基于Thinkphp3.2的qq第三方oauth认证登录扩展类
基于Thinkphp3.2的qq第三方oauth认证登录扩展类,由于腾讯oauth sdk写的太多,不能与thinkphp和好的结合,最终想法讲腾讯oauth sdk写成tp的扩展类先看代码,将代码保 ...
- Hadoop错误1(Text类型与String类型)
在此类的博客中,博主主要记录的是在Hadoop实践过程中遇到的一些错误,先上一个代码 protected void map(Object key,Text value, Context context ...
- GOF设计模式快速学习
这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了.为了和"学习"之间的友谊小船不翻,决定对以往学习过的GOF设计模式做一个简 ...
- [Python网络编程]一个简单的TCP时间服务器
服务器端: 1.创建一个面向网络的TCP套接字对象socket, 2.绑定地址和端口 3.监听 4.当有客户端连接时候,接受连接并给此连接分配一个新的套接字 5.当客户端发送空信息时候,关闭新分配的套 ...