数码资讯
MySQL的子查询操作的详细描述
继续做好以下准备工作: 建立一个新的测试数据库库。 语句创建数据库; 创建测试表表和表; 创建表的表 ( customer_id varchar(10)不为空, varchar(10)不为空的城市, 主键(customer_id) )发动机= InnoDB默认的字符集utf8; 创建表的表 ( or
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
继续做好以下准备工作:
建立一个新的测试数据库库。
语句创建数据库;
创建测试表表和表;
创建表的表
(
customer_id varchar(10)不为空,
varchar(10)不为空的城市,
主键(customer_id)
)发动机= InnoDB默认的字符集utf8;
创建表的表
(
order_id INT NOT NULL auto_increment,
customer_id varchar(10),
主键(order_id)
)发动机= InnoDB默认的字符集utf8;
插入测试数据;
插入表(customer_id,市)值('163 ','hangzhou);
插入表(customer_id,市)值('9you,上海);
插入表(customer_id,市)值('tx ','hangzhou);
插入表(customer_id,市)值('baidu ','hangzhou);
插入表(customer_id)值('163);
插入表(customer_id)值('163);
插入表(customer_id)值('9you);
插入表(customer_id)值('9you);
插入表(customer_id)值('9you);
插入表(customer_id)值('tx);
在准备工作完成后,表1和表像下面这样:
MySQL SELECT * FROM表>;
------------- ---------- + + +
| customer_id |市|
------------- ---------- + + +
| 163 |杭州|
| 9you |上海|
|百度|杭州|
| TX |杭州|
------------- ---------- + + +
4行(0秒)
mysql select * from表>;
---------- ------------- + + +
| order_id | customer_id |
---------- ------------- + + +
| 1 | 163 |
| 2 | 163 |
| 3 | 9you |
| 4 | 9you |
| 5 | 9you |
| 6 | TX |
---------- ------------- + + +
7行(0秒)
准备工作大致相同。让我们今天开始总结。
一个问题
现在您需要查询所有杭州用户的所有订单号,这个SQL语句是如何编写的首先,你可以写这个:
选择table2.customer_id,table2.order_id从表上加入表表。customer_id = table2.customer_id在表1.市= 'hangzhou;
我们可以达到我们需要的结果,但是我们也可以写这个:
选择customer_id,order_id从表2 customer_id在哪里(选择customer_id从表1);
呃在()括号中的SELECT语句是什么问题是,语法是什么,怎么做,所以这个博客开始围绕这个问题开始。
子查询是什么
总之,子查询是:
如上图所示,查询被称为内部查询,和内部的查询称为相对于内部查询外部查询。查询可以包含任何条款,一般选择可以包括,如不同组,秩序,限制,加入联盟,等等,但相应的外部查询必须有下列语句:选择,插入,选择,顺序,或。
我们可以使用子查询在WHERE和HAVING子句将查询结果作为判断条件。
使用的比较进行查询
子查询返回标量(值)、行、列或表。这些被称为标量子查询,子查询的行,列和表。
当一个查询返回一个标量,我们可以直接判断和比较用子查询的WHERE或HAVING子句的结果。例如,我现在有更customer_id,市和订单比用户发送命令,以及如何编写SQL语句。
首先,我写了SQL的一般步骤:
理解需求;
获得更多的customer_id,市和相应数量的订单比为用户发送的订单数量
查看到底需要什么字段信息。
最后,你需要customer_id,城市,和订单号等信息。
分析哪些字段涉及这些字段信息;
它涉及到表表和表表。
这些表是如何关联的;
表表和表表之间的关联在于customer_id场。
打破需求,获得小需求。
TX用户所需的订单数量是必需的;
其他用户所需的订单数量;
比较订单数量。
确定每个小需求的过滤条件;
得到了每个小需求的结果,得到了最终的结果。
最后,我将编写SQL语句:
选择table1.customer_id,市计数(order_id)
从表1和表
在表1。customer_id = table2.customer_id
在table1.customer_id <> 'tx
集团通过customer_id
具有计数(order_id)>
(select count(order_id))
从表2
在customer_id = 'tx
集团通过customer_id);
子查询中使用上面的查询,和外部查询与子查询的结果进行了比较分析。如果子查询返回一个标量值(A值),那么你可以使用外部查询:=,>,=,符号进行比较判断;如果子查询返回的是不是一个标量值,而外部查询使用比较运算符与子查询的结果进行比较,它将抛出异常。
使用任何查询
我们使用比较器进行子查询,即查询只能返回一个标量值。但是如果子查询返回的集合
没问题,我们可以用任何,,一些,或所有确定的子查询返回的结果。这是子查询任何的使用总结。
Any keywords must be used together with the comparison operators summarized above; the any keyword means that any value in the column returned by subqueries is returned to TRUE if the comparison result is TRUE.
它像10 > >任何(11, 20, 2,30)。因为10比2,判断将回到真实。只要10与集合中的任何一个相比较,true就会在返回时返回true。
例如,我现在寻找身份,数字城市,和比customer_id TX或9you更多订单用户订单。
我可以得到以下SQL语句来完成需求。
选择table1.customer_id,市计数(order_id)
从表1和表
在表1。customer_id = table2.customer_id
在表1。customer_id <> 'tx'and表customer_id <> '9you。
集团通过customer_id
具有计数(order_id)>
(任何
select count(order_id)
从表2
在customer_id = 'tx'or customer_id = '9you
集团通过customer_id);
任何一个词的意义都能更好地理解,直译就是任何一个,只要条件满足任何一个,它就返回真。
在子查询中使用
使用子查询,我们经常会遇到当我们每天写SQL,意味着一个指定的值在这个集合,以及如何返回真;否则,它返回false。
在是=是的别名中,在=中使用,我们都可以用它来代替它。
有了,就一定不会有。不在是不一样的任何,不在和全部都是意义。下面将对所有内容进行总结。
使用一些子查询
有些是任何一个的别名,使用较少。只有理解任何一个的意思是好的,这里不做大量的总结。请参考上面任何部分的摘要。
使用所有的子查询
所有必须使用比较运算符,意味着所有的值列中的子查询返回的,如果比较结果为真,则返回true。
它像10 >全部(2, 4, 5,1)。因为10比集合中的所有值都大,所以这个判断将返回true。如果10(20, 3, 2,1, 1),在这种情况下,判决将返回到false,因为小于入侵的总和。
所有的同义词不在,不等于集合中的所有值,这很容易与<。
标量子查询
子查询可以分为标量子查询和多值查询的基于查询的返回值的个数。用比较为子查询时,它需要一个标量子查询;如果它是一个多值查询,抛出的比较是个例外。
多值查询
多值查询对应一个标量子查询,子查询返回和多值列,一排,或一个表,构成了一套。我们一般使用的话,任何,所有,和一些判断外部查询和子查询的结果。如果字如任何,,所有的,有些是查询与标量,空的结果将得到。
独立的子查询
一个独立的子查询是一个查询,没有外部查询,外部查询是什么首先看下面的两个SQL语句。
SQL语句1:获取所有杭州客户的订单号。
选择order_id
从表2
customer_id在哪里
(选择customer_id
从表1
在城市'hangzhou);
SQL语句2:将该城市的用户作为杭州,并有一个订单。
选择*
从表1
在城市'hangzhou'and存在
(选择*
从表2
在表1。customer_id =表customer_id);
以上两个sql语句,虽然示例的例子不是很恰当,但足以说明这里的问题。
对于SQL语句1,我们复制子查询单独,也可以单独执行,即子查询无关的外部查询。
SQL语句2、我们可以复制子分开,我们不能分开执行。因为SQL语句2子查询依赖于外部查询的一些领域,从而导致外部查询的子查询的依赖。
子查询,大多数时候都会考虑到效率的问题。当我们执行一个SELECT语句,我们可以添加解释关键字看到查询类型,查询中使用的索引和其他信息。例如,使用这:
解释选择order_id
从表2
customer_id在哪里
(选择customer_id
从表1
在城市'hangzhou);
如果我们使用独立的子查询,如果该子集最大遍历数为n的收集和外部查询的最大遍历数M,我们能记住它为O(m+n)。如果相关子查询的使用,一些穿越次数可达到O(M + M×N)。你可以看到,效率下降;所以,当你使用子查询,你必须考虑到子查询的相关性。
有关解释的更多解释,请参阅。
相关子查询
相关子查询是指查询是指外部查询的列,即子查询,可以计算出每行一个外部查询。但在MySQL中,动态优化也会有所不同,随着形势的变化,使用相关子查询是执行性能的最简单的地方。和SQL语句的优化一个非常大的话题。只有通过实际的经验积累才能更好地理解如何优化它。
至于SQL的性能,我在这里什么也不能说。如果我们只是阅读别人的文章来考虑性能问题,我们真的感觉不到什么。我们需要一个实际的项目来更好地理解。
EXISTS谓词
存在是一个非常好的谓词,它允许数据库有效地检查是否有指定的查询谓词返回true或false,取决于子查询返回一行。不像其他的谓词逻辑表达,存在不返回未知无论输入子查询返回的行。因为存在,未知是错误的。或者上面的语句,城市的用户是杭州,并且有一个命令。
选择*
从表1
在城市'hangzhou'and存在
(选择*
从表2
在表1。customer_id =表customer_id);
通过解释,您将得到以下内容:
我们可以清楚地看到,有一个相关的子查询(相关子查询)。你可以看到,存在和非常相似,那么它们之间有什么区别
主要区别存在于三的判断值logic.exists总是返回true或false的谎言,和,除了真实的、虚假的价值,它可能还不为空值。但在过滤器中,未知的处理相同的方式是错误的,所以在使用,如使用存在,SQL优化器会选择相同的执行计划。
说的和存在几乎是一样的,但是我们不得不谈论不存在和不存在。对于输入列表的空值,不存在也不完全不同。当输入列表包含null值时,总是返回true和未知值,因此不将得到不正确且不未知的,即false和未知值。
MySQL > select'c'not在(A,B,null) G;
看看上面的代码,看看结果,你会感到惊讶的。
派生表
正如上面提到的,一个表也可以在子查询返回的值返回。如果虚拟表的子查询返回输入到FROM子句中的子查询,虚拟表成为一个派生表,语法结构如下:
从(子查询表达式)为derived_table_alias
因为派生表是一个完整的虚拟表,所以它不能也不能物理化。
总结
最后总结一下,当然有很多东西或子查询,不是一篇文章可以概括的,这里只有一些基本概念,常用的知识进行了总结,在子查询使用更新、删除和插入语句中的用法,我不是在这里有关,一般是相似的。知识这东西,进行,无头,或需要适当的深度适可而止,挖掘的深度,但不超过2,在2如何定义、捕捉。嗯,这篇文章是到目前为止,我们会看到下一个。
建立一个新的测试数据库库。
语句创建数据库;
创建测试表表和表;
创建表的表
(
customer_id varchar(10)不为空,
varchar(10)不为空的城市,
主键(customer_id)
)发动机= InnoDB默认的字符集utf8;
创建表的表
(
order_id INT NOT NULL auto_increment,
customer_id varchar(10),
主键(order_id)
)发动机= InnoDB默认的字符集utf8;
插入测试数据;
插入表(customer_id,市)值('163 ','hangzhou);
插入表(customer_id,市)值('9you,上海);
插入表(customer_id,市)值('tx ','hangzhou);
插入表(customer_id,市)值('baidu ','hangzhou);
插入表(customer_id)值('163);
插入表(customer_id)值('163);
插入表(customer_id)值('9you);
插入表(customer_id)值('9you);
插入表(customer_id)值('9you);
插入表(customer_id)值('tx);
在准备工作完成后,表1和表像下面这样:
MySQL SELECT * FROM表>;
------------- ---------- + + +
| customer_id |市|
------------- ---------- + + +
| 163 |杭州|
| 9you |上海|
|百度|杭州|
| TX |杭州|
------------- ---------- + + +
4行(0秒)
mysql select * from表>;
---------- ------------- + + +
| order_id | customer_id |
---------- ------------- + + +
| 1 | 163 |
| 2 | 163 |
| 3 | 9you |
| 4 | 9you |
| 5 | 9you |
| 6 | TX |
---------- ------------- + + +
7行(0秒)
准备工作大致相同。让我们今天开始总结。
一个问题
现在您需要查询所有杭州用户的所有订单号,这个SQL语句是如何编写的首先,你可以写这个:
选择table2.customer_id,table2.order_id从表上加入表表。customer_id = table2.customer_id在表1.市= 'hangzhou;
我们可以达到我们需要的结果,但是我们也可以写这个:
选择customer_id,order_id从表2 customer_id在哪里(选择customer_id从表1);
呃在()括号中的SELECT语句是什么问题是,语法是什么,怎么做,所以这个博客开始围绕这个问题开始。
子查询是什么
总之,子查询是:
如上图所示,查询被称为内部查询,和内部的查询称为相对于内部查询外部查询。查询可以包含任何条款,一般选择可以包括,如不同组,秩序,限制,加入联盟,等等,但相应的外部查询必须有下列语句:选择,插入,选择,顺序,或。
我们可以使用子查询在WHERE和HAVING子句将查询结果作为判断条件。
使用的比较进行查询
子查询返回标量(值)、行、列或表。这些被称为标量子查询,子查询的行,列和表。
当一个查询返回一个标量,我们可以直接判断和比较用子查询的WHERE或HAVING子句的结果。例如,我现在有更customer_id,市和订单比用户发送命令,以及如何编写SQL语句。
首先,我写了SQL的一般步骤:
理解需求;
获得更多的customer_id,市和相应数量的订单比为用户发送的订单数量
查看到底需要什么字段信息。
最后,你需要customer_id,城市,和订单号等信息。
分析哪些字段涉及这些字段信息;
它涉及到表表和表表。
这些表是如何关联的;
表表和表表之间的关联在于customer_id场。
打破需求,获得小需求。
TX用户所需的订单数量是必需的;
其他用户所需的订单数量;
比较订单数量。
确定每个小需求的过滤条件;
得到了每个小需求的结果,得到了最终的结果。
最后,我将编写SQL语句:
选择table1.customer_id,市计数(order_id)
从表1和表
在表1。customer_id = table2.customer_id
在table1.customer_id <> 'tx
集团通过customer_id
具有计数(order_id)>
(select count(order_id))
从表2
在customer_id = 'tx
集团通过customer_id);
子查询中使用上面的查询,和外部查询与子查询的结果进行了比较分析。如果子查询返回一个标量值(A值),那么你可以使用外部查询:=,>,=,符号进行比较判断;如果子查询返回的是不是一个标量值,而外部查询使用比较运算符与子查询的结果进行比较,它将抛出异常。
使用任何查询
我们使用比较器进行子查询,即查询只能返回一个标量值。但是如果子查询返回的集合
没问题,我们可以用任何,,一些,或所有确定的子查询返回的结果。这是子查询任何的使用总结。
Any keywords must be used together with the comparison operators summarized above; the any keyword means that any value in the column returned by subqueries is returned to TRUE if the comparison result is TRUE.
它像10 > >任何(11, 20, 2,30)。因为10比2,判断将回到真实。只要10与集合中的任何一个相比较,true就会在返回时返回true。
例如,我现在寻找身份,数字城市,和比customer_id TX或9you更多订单用户订单。
我可以得到以下SQL语句来完成需求。
选择table1.customer_id,市计数(order_id)
从表1和表
在表1。customer_id = table2.customer_id
在表1。customer_id <> 'tx'and表customer_id <> '9you。
集团通过customer_id
具有计数(order_id)>
(任何
select count(order_id)
从表2
在customer_id = 'tx'or customer_id = '9you
集团通过customer_id);
任何一个词的意义都能更好地理解,直译就是任何一个,只要条件满足任何一个,它就返回真。
在子查询中使用
使用子查询,我们经常会遇到当我们每天写SQL,意味着一个指定的值在这个集合,以及如何返回真;否则,它返回false。
在是=是的别名中,在=中使用,我们都可以用它来代替它。
有了,就一定不会有。不在是不一样的任何,不在和全部都是意义。下面将对所有内容进行总结。
使用一些子查询
有些是任何一个的别名,使用较少。只有理解任何一个的意思是好的,这里不做大量的总结。请参考上面任何部分的摘要。
使用所有的子查询
所有必须使用比较运算符,意味着所有的值列中的子查询返回的,如果比较结果为真,则返回true。
它像10 >全部(2, 4, 5,1)。因为10比集合中的所有值都大,所以这个判断将返回true。如果10(20, 3, 2,1, 1),在这种情况下,判决将返回到false,因为小于入侵的总和。
所有的同义词不在,不等于集合中的所有值,这很容易与<。
标量子查询
子查询可以分为标量子查询和多值查询的基于查询的返回值的个数。用比较为子查询时,它需要一个标量子查询;如果它是一个多值查询,抛出的比较是个例外。
多值查询
多值查询对应一个标量子查询,子查询返回和多值列,一排,或一个表,构成了一套。我们一般使用的话,任何,所有,和一些判断外部查询和子查询的结果。如果字如任何,,所有的,有些是查询与标量,空的结果将得到。
独立的子查询
一个独立的子查询是一个查询,没有外部查询,外部查询是什么首先看下面的两个SQL语句。
SQL语句1:获取所有杭州客户的订单号。
选择order_id
从表2
customer_id在哪里
(选择customer_id
从表1
在城市'hangzhou);
SQL语句2:将该城市的用户作为杭州,并有一个订单。
选择*
从表1
在城市'hangzhou'and存在
(选择*
从表2
在表1。customer_id =表customer_id);
以上两个sql语句,虽然示例的例子不是很恰当,但足以说明这里的问题。
对于SQL语句1,我们复制子查询单独,也可以单独执行,即子查询无关的外部查询。
SQL语句2、我们可以复制子分开,我们不能分开执行。因为SQL语句2子查询依赖于外部查询的一些领域,从而导致外部查询的子查询的依赖。
子查询,大多数时候都会考虑到效率的问题。当我们执行一个SELECT语句,我们可以添加解释关键字看到查询类型,查询中使用的索引和其他信息。例如,使用这:
解释选择order_id
从表2
customer_id在哪里
(选择customer_id
从表1
在城市'hangzhou);
如果我们使用独立的子查询,如果该子集最大遍历数为n的收集和外部查询的最大遍历数M,我们能记住它为O(m+n)。如果相关子查询的使用,一些穿越次数可达到O(M + M×N)。你可以看到,效率下降;所以,当你使用子查询,你必须考虑到子查询的相关性。
有关解释的更多解释,请参阅。
相关子查询
相关子查询是指查询是指外部查询的列,即子查询,可以计算出每行一个外部查询。但在MySQL中,动态优化也会有所不同,随着形势的变化,使用相关子查询是执行性能的最简单的地方。和SQL语句的优化一个非常大的话题。只有通过实际的经验积累才能更好地理解如何优化它。
至于SQL的性能,我在这里什么也不能说。如果我们只是阅读别人的文章来考虑性能问题,我们真的感觉不到什么。我们需要一个实际的项目来更好地理解。
EXISTS谓词
存在是一个非常好的谓词,它允许数据库有效地检查是否有指定的查询谓词返回true或false,取决于子查询返回一行。不像其他的谓词逻辑表达,存在不返回未知无论输入子查询返回的行。因为存在,未知是错误的。或者上面的语句,城市的用户是杭州,并且有一个命令。
选择*
从表1
在城市'hangzhou'and存在
(选择*
从表2
在表1。customer_id =表customer_id);
通过解释,您将得到以下内容:
我们可以清楚地看到,有一个相关的子查询(相关子查询)。你可以看到,存在和非常相似,那么它们之间有什么区别
主要区别存在于三的判断值logic.exists总是返回true或false的谎言,和,除了真实的、虚假的价值,它可能还不为空值。但在过滤器中,未知的处理相同的方式是错误的,所以在使用,如使用存在,SQL优化器会选择相同的执行计划。
说的和存在几乎是一样的,但是我们不得不谈论不存在和不存在。对于输入列表的空值,不存在也不完全不同。当输入列表包含null值时,总是返回true和未知值,因此不将得到不正确且不未知的,即false和未知值。
MySQL > select'c'not在(A,B,null) G;
看看上面的代码,看看结果,你会感到惊讶的。
派生表
正如上面提到的,一个表也可以在子查询返回的值返回。如果虚拟表的子查询返回输入到FROM子句中的子查询,虚拟表成为一个派生表,语法结构如下:
从(子查询表达式)为derived_table_alias
因为派生表是一个完整的虚拟表,所以它不能也不能物理化。
总结
最后总结一下,当然有很多东西或子查询,不是一篇文章可以概括的,这里只有一些基本概念,常用的知识进行了总结,在子查询使用更新、删除和插入语句中的用法,我不是在这里有关,一般是相似的。知识这东西,进行,无头,或需要适当的深度适可而止,挖掘的深度,但不超过2,在2如何定义、捕捉。嗯,这篇文章是到目前为止,我们会看到下一个。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。