详解MySQL子查询(嵌套查询)、联结表、组合查询

论坛 期权论坛 脚本     
niminba   2021-5-23 03:16   1184   0

一、子查询

MySQL 4.1版本及以上支持子查询

子查询:嵌套在其他查询中的查询。

子查询的作用:

1、进行过滤:

实例1:检索订购物品TNT2的所有客户的ID

= +

一般,在WHERE子句中对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。
注意:列必须匹配 ——在WHERE子句中使用子查询(如这里所示),应该保证SELECT语句具有与WHERE子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。

示例2:返回订购产品TNT2的客户列表

该实例更为有效的方法是采用联结进行查询:

注意:具体关于联结的内容下文会整理到。

2、创建计算字段:

相关子查询:涉及外部查询的子查询。当列名可能有多义性时必须使用该语法。
实例:显示customers 表中每个客户的订单总数

总结:
子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列
子查询建立(和测试)查询的最可靠的方法是逐渐进行, 这与MySQL处理它们的方法非常相同。首先,建立和测试最内层的查询。然后,用硬编码数据建立和测试外层查询,并且仅在确认它正常后才嵌入子查询。这时,再次测试它。对于要增加的每个查询,重复这些步骤。这样做仅给构造查询增加了一点点时间,但节省了以后(找出查询为什么不正常)的大量时间,并且极大地提高了查询一开始就正常工作的可能性。

二、联结表

联结表是SQL最强大的功能之一

1、一些相关的基础知识储备:

关系表:保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系(relational))互相关联。节省时间和存储空间,同时方便数据的修改、更新。因此,关系数据库的可伸缩性远比非关系数据库要好。
可伸缩性(scale):能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好。
联结:联结是一种机制,用来在一条SELECT语句中关联表,可以联结多个表返回一组输出。

联结不是物理实体——它在实际的数据库表中不存在。联结由MySQL根据需要建立,它存在于查询的执行当中。
在使用关系表时,仅在关系列中插入合法的数据非常重要。为防止这种情况发生,需要维护引用完整性,它是通过在表的定义中指定主键和外键来实现的。

2、基础联结:

 实例1:

这两个表用WHERE子句正确联结:WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。注意:在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)。
在一条SELECT语句中联结几个表时,相应的关系是在运行中构造的,在数据库表的定义中不存在能指示MySQL如何对表进行联结的东西。在联结两个表时,实际上是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起。

笛卡儿积:由没有联结条件的表关系返回的结果。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。有时也被称为叉联结。

实例2:显示编号为20005的订单中的物品

应该保证所有联结都有WHERE子句,否则MySQL将返回比想要的数据多得多的数据。
MySQL在运行时关联指定的每个表以处理联绐U9%=;j?~2Bn3j"_"[kn7"_rn3j"_'"_V6z//n3b 5O>jCBrjz// 7B3jVz/"[B3j^rz/иU9%=;jB#~>RB3j6Wj%=;>]!IC>n7v ;n7v jv[k3b6WV6j3U9%=;>Bn6W4)U9%=;~zsn*:77j3 zp&r'273U9%=8133yU9%=;4(Σ?%=;3"Ck!Ivn3j U9%=8139%=;j7?3"A]!IC>3"Cj zs{r?vj273.7733"gU9%=8133b]!I4({kB#~zs:K4(4(顽4(rRU9%=;B#~^Rv=IH gC>rrB;vM1 S>B; ;zsn7crR7Z?:K"3>#R>7Z?:K>"jkv=IH gC> =IH gC>r%M1 S>j&r'zs:K4(&gj53C~3_~SB#~VB#3ro疒r'&* zsr'G^"GVg?k>+^n{7j rv{瞒gjR2

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP