详解MySQL⼦查询(嵌套查询)、联结表、组合查询
⼀、⼦查询
MySQL 4.1版本及以上⽀持⼦查询
⼦查询:嵌套在其他查询中的查询。
⼦查询的作⽤:
1、进⾏过滤:
实例1:检索订购物品TNT2的所有客户的ID
= +mysql语句多表查询
⼀般,在WHERE⼦句中对于能嵌套的⼦查询的数⽬没有限制,不过在实际使⽤时由于性能的限制,不能嵌套太多的⼦查询。
注意:列必须匹配 ——在WHERE⼦句中使⽤⼦查询(如这⾥所⽰),应该保证SELECT语句具有与WHERE⼦句中相同数⽬的列。通常,⼦查询将返回单个列并且与单个列匹配,但如果需要也可以使⽤多个列。
⽰例2:返回订购产品TNT2的客户列表
该实例更为有效的⽅法是采⽤联结进⾏查询:
java信息系统编程软件注意:具体关于联结的内容下⽂会整理到。
2、创建计算字段:
相关⼦查询:涉及外部查询的⼦查询。当列名可能有多义性时必须使⽤该语法。
实例:显⽰customers 表中每个客户的订单总数
double click翻译总结:
⼦查询最常见的使⽤是在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在运⾏时关联指定的每个表以处理联结。这种处理可能是⾮常耗费资源的,因此应该仔细,不要联结不必要的表。联结的表越多,性能下降越厉害。
等值联结:基于两个表之间的相等测试,也被称为内部联结。(最经常使⽤的联结⽅式)
实例:
ANSI SQL规范⾸选INNER JOIN语法。此外,尽管使⽤WHERE⼦句定义联结的确⽐较简单,但是使⽤明确的联结语法能够确保不会忘记联结条件,有时候这样做也能影响性能。
3、⾼级联结:
实例1:给表起别名(同给列起别名⽤法⼀样)
注意:表别名只在查询执⾏中使⽤。与列别名不⼀样,表别名不返回到客户机。
使⽤表别名的主要原因之⼀是能在单条SELECT语句中不⽌⼀次引⽤相同的表
实例2:查询⽣产ID为DTNTR的物品的供应商⽣产的其他物品
上述解决⽅法为⾃联结,⾃联结通常作为外部语句⽤来替代从相同表中检索数据时使⽤的⼦查询语句。该实例也可⽤⼦查询来解决。虽然最终的结果是相同的,但有时候处理联结远⽐处理⼦查询快得多。在解决问题时,可以试⼀下两种⽅法,以确定哪⼀种的性能更好。
⾃然联结:排除多次出现,使每个列只返回⼀次。⼀般我们⽤到的内部联结都是⾃然联结。
实例3:⾃然联结
php源码怎么上传到服务器⾃然联结⼀般是通过对表使⽤通配符(SELECT *),对所有其他表的列使⽤明确的⼦集来完成的。
外部联结:联结包含了那些在相关表中没有关联⾏的⾏。
实例4:检索所有客户,包括那些没有订单的客户
⽤法与内部联结相似,使⽤了关键字OUTER JOIN来指定联结的类型。但是,与内部联结关联两个表中的⾏不同的是,外部联结还包括没有关联⾏的⾏。
存在两种基本的外部联结形式:左外部联结和右外部联结。在使⽤OUTER JOIN语法时,必须使⽤RIGHT或LEFT关键字指定包括其所有⾏的表(RIGHT指出的是OUTER JOIN右边的表,⽽LEFT 指出的是OUTER JOIN左边的表)。上⾯的例⼦使⽤LEFT OUTER JOIN从FROM ⼦句的左边表(customers表)中选择所有⾏。
注意:MySQL不⽀持简化字符*=和=*的使⽤,尽管这两种操作符在其他DBMS中很流⾏。
实例5:检索所有客户及每个客户所下的订单数(包括没有下任何订单的客户
聚集函数可以⽅便地与各种联结类型⼀起使⽤
使⽤联结和联结条件:
1. 1. 注意所使⽤的联结类型。⼀般我们使⽤内部联结,但使⽤外部联结也是有效的。
2. 2. 保证使⽤正确的联结条件,否则将返回不正确的数据。
3. 3. 应该总是提供联结条件,否则会得出笛卡⼉积。
4. 4. 在⼀个联结中可以包含多个表,甚⾄对于每个联结可以采⽤不同的联结类型。虽然这样做是合法的,⼀般也很有⽤,但应该在⼀起测试它们前,分别测试每个联结。这将使故障排除更为简单。
三、组合查询
组合查询:执⾏多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询。
为何需要组合查询?
1. 在单个查询中从不同的表返回类似结构的数据;
2. 对单个表执⾏多个查询,按单个查询返回数据;
3. 使⽤组合查询可极⼤地简化复杂的WHERE⼦句,简化从多个表中检索数据的⼯作。
1、创建组合查询
关键字:UNION操作符
实例1:得到价格⼩于等于5的所有物品的⼀个列表,并且包括供应商1001和1002⽣产的所有物品(不考虑价格)。
UNION指⽰MySQL执⾏两条SELECT语句,并把输出组合成单个查询结果集。该解法与where prod_price<=5 OR vend_id in(1001,1002);等效
使⽤并时需要注意的规则:
vue在线教程>数据库架构有哪几种1. 1. UNION必须由两条或两条以上的SELECT语句组成,语句之间⽤关键字UNION分隔(因此,如果组合4条SELECT语句,将要使⽤3个UNION关键字)。
2. 2. UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。
3. 3. 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的⽇期类型)
4. 4. 使⽤UNION的组合查询可以应⽤不同的表
在⼀些简单的例⼦中,使⽤UNION可能⽐使⽤WHERE⼦句更为复杂。但对于更复杂的过滤条件,或者从多个表(⽽不是单个表)中检索数据的情形,使⽤UNION可能会使处理更简单。
UNION默认从查询结果集中⾃动去除重复的⾏,如果想返回所有匹配⾏,可使⽤UNION ALL⽽不实UNION。
注意:UNION⼏乎总是完成与多个WHERE条件相同的⼯作。UNION ALL为UNION的⼀种形式,它完成WHERE⼦句完成不了的⼯作。如果确实需要每个条件的匹配⾏全部出现(包括重复⾏),则必须使⽤UNION ALL⽽不是WHERE
实例2:对组合查询结果排序
在⽤UNION组合查询时,只能使⽤⼀条ORDER BY⼦句,它必须出现在最后⼀条SELECT语句之后。对于结果集,不存在⽤⼀种⽅式排序⼀部分,⽽⼜⽤另⼀种⽅式排序另⼀部分的情况,因此不允许使⽤多条ORDER BY⼦句。该ORDER BY⼦句对所有SELECT语句返回的所有结果进⾏排序。
以上所述是⼩编给⼤家介绍的MySQL⼦查询(嵌套查询)、联结表、组合查询详解整合,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论