资讯专栏INFORMATION COLUMN

MySQL——子查询

leone / 610人阅读

摘要:什么是子查询在一个查询之中嵌套了其他的若干查询在查询条件中是一个不确定的值,而是一个来自另一个查询的结果。

什么是子查询

在一个查询之中嵌套了其他的若干查询

在where查询条件中是一个不确定的值,而是一个来自另一个查询的结果。


语句

ex:查询大于公司平均工资的员工姓名:

select avg(sal) from emp;   /* avg(sal)=2000 */
select * from emp where sal >= 2000;
/* 将上面的语句合并 */
select * from emp where sal >= (select avg(sal) from emp);

ex:查询出工资比anthony还要高的全部雇员信息:

select sal from emp where name="anthony"; /* anthony的工资为10000 */
select * from emp where sal >= 10000;
/* 将上面的语句合并 */
select * from emp where sal >= (select sal from emp where name="anthony");  
注意事项

子查询要用括号括起来

将子查询放在运算符的右边(增加可读性)

对单行子查询使用单行运算符

对多行子查询使用多行运算符

子查询的分类

根据子查询的结果来划分的

单行单列子查询

返回查询结果包含一行数据,看作是一个值,使用在where之后

使用单行记录比较运算符:=; >; <; <=;>=;<>

多行单列子查询

返回查询结果可能多行或者零行,看作是多个值,使用在where之后

使用多行比较运算符:

IN

与返回列表中的任意一个值相等
ex:查询工资等于部门经理的员工信息

select sal from emp where job ="manager";  /* 先查询部门经理的工资 */

ANY

与返回的任意一个值比较

=ANY:此时和in操作一样

>ANY:大于子查询中最小的值

ALL

与返回的值每一个值比较

>ALL:大于查询中最大的值

多列子查询

返回查询结果的结构是单行或多行,看作是一张临时表,使用在from之后

性能:笛卡尔积的数量

select d.deptno,d.dname,temp.c,temp.a
from dept d join 
 (select deptno,count(empno) c,avg(sal) a from emp group by deptno) temp        
on using(deptno);  
union/union all

join用于把表横向连接,union/union all用于把表纵向连接
注意:

union内部的select语句必须拥有相同数量的列

-列也必须拥有兼容的数据类型

每条select语句中的列的顺序必须相同

union结果集中的列名总是等于union中第一个select语句中的列名

union操作符选取不同的值,如果允许重复的值,使用union all(性能高)

select empno,ename,dname from emp left join dept using(deptno)
union 
select empno,ename,dname from emp right join dept using(deptno);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/49082.html

相关文章

  • MySQL查询(IN)碰到的问题,深入分析

    摘要:在项目中碰到一个的慢查询,查阅之后发现是因为中使用了子查询,也许大部分有开发经验的人都会语重心长的告诉你千万别用,使用或者代替它。 在项目中碰到一个SQL的慢查询,查阅之后发现是因为SQL中使用了IN子查询,也许大部分有开发经验的人都会语重心长的告诉你千万别用IN,使用JOIN或者EXISTS代替它。好吧,我承认我不喜欢这句话,因为任何事物都有它存在的理由,所以今天来探讨一下IN关于子...

    Alfred 评论0 收藏0
  • 自制小工具大大加速MySQL SQL语句优化(附源码)

    摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...

    Yu_Huang 评论0 收藏0
  • 自制小工具大大加速MySQL SQL语句优化(附源码)

    摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...

    zhunjiee 评论0 收藏0
  • 自制小工具大大加速MySQL SQL语句优化(附源码)

    摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...

    Hujiawei 评论0 收藏0
  • MySql查询性能优化

    摘要:如果缓存的是关联查询的结果,那么其中的一个表发生变化,整个缓存就失效了。例如上面用代替关联查询比随机的关联更加高效。优化关联查询,要确保或者子句中的列上有索引,并且在建立索引时需要考虑到关联的顺序。 避免向数据库请求不需要的数据 在访问数据库时,应该只请求需要的行和列。请求多余的行和列会消耗MySql服务器的CPU和内存资源,并增加网络开销。例如在处理分页时,应该使用LIMIT限制My...

    魏宪会 评论0 收藏0
  • MySQL中EXPLAIN结果的参数详解

    摘要:子查询中的第一个。查询中同时使用两个或更多索引,然后对索引结果进行合并,再读取表数据。系统表,表中只有一行数据子查询中的返回结果字段组合是主键或唯一约束。显示可能应用在这张表中的索引。通过收集到的统计信息判断出不可能存在结果。 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法,在select语句前加上e...

    Anonymous1 评论0 收藏0

发表评论

0条评论

leone

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<