资讯专栏INFORMATION COLUMN

MySQL子查询类型

caige / 2724人阅读

摘要:实验表如下子查询分类查询对象的关系上分类相关子查询非相关子查询从特定谓词分类操作符操作符允许我们在子句中规定多个值。指定一个子查询,检测行的存在。结果类型为,如果子查询包含行,则返回。

实验表如下:
t4

t5

子查询分类: 查询对象的关系上分类:

1、相关子查询
select * from t4 where t4.id4 = any ( select t5.id5 from t5 where t5.b5 = t4.b4);

2、非相关子查询
select * from t1 where a1 = any (select a2 from t2 where t2.a2 = 10);

从特定谓词分类:

1、IN 操作符
IN 操作符允许我们在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

select * from t4 where t4.id4 in (1,3);

2、ALLANYSOME操作符
SOME 是与 ANY 等效的 ISO 标准。
以 > 比较运算符为例,>ALL 表示大于每一个值。换句话说,它表示大于最大值。例如,>ALL (1, 2, 3) 表示大于 3。>ANY 表示至少大于一个值,即大于最小值。因此 >ANY (1, 2, 3) 表示大于 1。

select * from t5 where t5.id5 > any ( select id4 from t4 where t4.id4>5);

select * from t5 where t5.id5 > ALL ( select id4 from t4 where t4.id4>5);

3、EXISTS操作符
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
EXISTS 指定一个子查询,检测行的存在。语法:EXISTS subquery。参数 subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型为 Boolean,如果子查询包含行,则返回 TRUE。

select * from t5 where exists ( select * from t4 where t4.id4>t5.id5);

转化成同义的IN语句:
select * from t5 where id5 in ( select id5 from t4 where t4.id4>t5.id5);

从语句的构成分类:

1、SPJ查询:
选择:select * from t4 where t4.id4=1;
投影: select id4, b4 from t4;
连接:select * from t4, t5 where t4.id4 = t5.id5;

2、group by子查询:
我们拥有下面这个 "Orders" 表:

O_Id    OrderDate   OrderPrice    Customer
1           2008/12/29  1000        Bush
2           2008/11/23  1600        Carter
3           2008/10/05  700         Bush
4           2008/09/28  300         Bush
5           2008/08/06  2000        Adams
6           2008/07/21  100         Carter

现在,我们希望查找每个客户的总金额(总订单)。
我们想要使用 GROUP BY 语句对客户进行组合。
我们使用下列 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
结果集类似这样:

Customer    SUM(OrderPrice)
Bush        2000
Carter      1700
Adams       2000

让我们看一下如果省略 GROUP BY 会出现什么情况:
SELECT Customer,SUM(OrderPrice) FROM Orders
结果集类似这样:

Customer    SUM(OrderPrice)
Bush        5700
Carter      5700
Bush        5700
Bush        5700
Adams       5700
Carter      5700

3、其他:
TOP-N : SELECT TOP 50 PERCENT * FROM Customers;
mysql 不支持 等价于Mysql中 select * from t4 limit 10;

LIMIT & order by: select * from t4 order by id4 desc limit 2,5;

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

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

相关文章

  • 自制小工具大大加速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命令【explain】

    摘要:前言只有光头才能变强刷面试题的时候,不知道你们有没有见过这两个命令和反正我就见过了之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。读懂命令结果命令输出的结果有列包含一组数字,表示查询中执行子句或操作表的顺序。 前言 只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了).. 之前虽然知道这两个命令大概什么意思...

    Cc_2011 评论0 收藏0
  • 面试前必须知道的MySQL命令【explain】

    摘要:前言只有光头才能变强刷面试题的时候,不知道你们有没有见过这两个命令和反正我就见过了之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。读懂命令结果命令输出的结果有列包含一组数字,表示查询中执行子句或操作表的顺序。 前言 只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了).. 之前虽然知道这两个命令大概什么意思...

    IamDLY 评论0 收藏0
  • MySQL Explain详解

    摘要:因为只有一行,所以优化器的其余部分可以将此行中列的值视为常量。将包含已使用的时间最长的关键部分。要想强制使用或忽视列中的索引,在查询中使用或者。 MySQL Explain详解 简介 执行计划(query Execution plan) 语法 explain select * from table explain 中的列 expain出来的信息有10列,分别是id,select...

    honmaple 评论0 收藏0

发表评论

0条评论

caige

|高级讲师

TA的文章

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