目录
一、子查询
1.什么是子查询
2.注意事项
二、联结查询
1.什么是联结
2.内部联结(等值联结)
①WHERE语句
②ON语句
3.自联结
4.自然联结
5.外部联结
三、组合查询
1.什么是组合查询
2.UNION规则
*本节涉及概念来源于图灵程序设计丛书,数据库系列——《MySQL必知必会》
MySQL中SELECT字句的顺序以及具体使用 这篇文章主要讲了SELECT语句简单查询的字句顺序,即如何从单个表中检索数据。下面介绍如何从多个表中获取(查询)到所需信息。
先给出两个表,vendors(供应商信息)、products(产品信息,一个供应商可能提供多种产品)
同一供货商的信息都是相同的,每个产品重复存储此信息是多余的;如果供货商信息改变,只需要在vendors表中改变一次即可。vendors中的主键(vend_id)又叫products中的外键。
主键: 一列的值能够唯一区分表中的每个行。
外键: 某个表中的一列,包含另一个表中的主键值。
一、子查询
1.什么是子查询
子查询是嵌套在其他查询中的查询。这样说有点抽象,举个例子——列出所有来自USA供货商提供的产品名称?
通常情况下分为两步:①vendors表中获取USA供货商的id ②products表中由①的id获取产品名称
使用子查询只需要一条语句:将①放到括号内,与IN操作符结合,子查询总是从内向外处理的。
*虽然子查询一般与IN结合使用,但也可以用于测试等于=、不等于<>等
2.注意事项
①子查询中涉及具有二义性的列名,应该使用完全限定列名(vendors.vend_id),即同时使用表名和列名。这不难理解,一共两个表,不指明是哪个表中的列名,会有歧义的。(示例见下面内部联结)
②使用子查询的时候,应该先测试最内层的查询,确定无错之后,用硬编码数据建立和测试外层查询,确定正确之后再嵌入子查询。
二、联结查询
1.什么是联结
联结用来在一条查询语句中关联表。联结在查询的执行中建立,可以联结多个表返回一组输出。
创建联结,规定要联结的表以及它们如何关联即可。
2.内部联结(等值联结)
例子——输出供应商名字与其提供的产品名字?(分别位于vendors与products表中)
①WHERE语句
其中FROM语句后面跟两个表的名字,WHERE语句使用完全限定表名给出联结条件。(没有联结条件的话会返回笛卡尔积)
一条语句中可以联结的表的数目没有限制,可以通过WHERE...AND...语句联结多个表以及其他过滤条件。
②ON语句
其中FROM语句后面使用INNER JOIN指定两个表的关系,用ON子句给出联结条件。
3.自联结
自联结通常用来替代从相同表中检索数据时使用的子查询语句,有时比处理子查询快得多。也就是这个表自己联结自己。
例子——发现产品id为DTNTR的物品存在问题,想知道生产DTNTR的供货商生产的其他物品是否也存在问题?(均位于表products中,相当于需要查询两次该表)
方法一:使用子查询:①找到生产id为DTNTR的供货商 ②找出该供货商生产的其他产品
方法二:使用自联结
将第一次出现的products命名为表别名p1,第二次命名为p2。通过WHERE语句联结两个表,然后按p2中的prod_id过滤数据。
4.自然联结
书上说:“迄今为止我们建立的每个内部联结都是自然联结,很可能我们永远都不会用到不是自然联结的内部联结”
那等用到了再写吧哈哈哈~
5.外部联结
外部联结:联结包含了那些在相关表中没有关联行的行。
举例——输出所有供货商id以及对应的产品名称?
通过观察表可以注意到,供货商1004、1006并没有提供产品,使用内部联结,输出结果如下:
如果想要输出那些没有产品的供货商,则用外部联结,使用 OUTER JOIN来指定联结类型,用ON子句给出联结条件,在使用的时候要用left(表vendors位于outer join语句的左边)或者right(表products位于outer join语句的右边)来指定包括所有行的表。
(在本例中使用LEFT,即输出表vendors中的所有行)
可以看出,尽管1004、1006并没有提供产品,但外部联结指定输出表vendors中所有的行,即便没有产品的供货商也会检索出来。
三、组合查询
1.什么是组合查询
之前都是单条SELECT语句,MySQL也支持多条查询语句,并将结果作为单个查询结果集返回。
这些组合查询称为并(union)或复合查询,可使用UNION操作符来组合多条SQL查询。使用UNION可以简化复杂的WHERE子句,也会简化从多个表中检索数据的工作。
举例——①输出价格小于等于5的所有产品,②同时也供货商1001、1002提供的所有产品。
例子中组合查询是用相同的表,但UNION是可以应用不同的表的。此例子也可以用多条WHERE子句查询,会更简洁。
当然,如果是更复杂的条件、多个表查询的情况,使用组合查询也许会更简单。
2.UNION规则
①多条语句之间由关键字UNION分隔。
②UNION中的每个查询必须包含相同的列、表达式或聚集函数。
③列数据类型必须兼容:类型不必完全相同,但必须可以隐含转换。
④UNION自动去除重复的行,如果想返回所有匹配行,可以用UNION ALL。
⑤在使用UNION组合查询时,只能使用一条ORDER BY语句,必须出现在最后一条SELECT语句之后,用来排序所有SELECT语句返回的所有结果。这也不难理解,只有一个结果集,所以只有一种排序方法,不可能分开部分排序。