子查询、连表、组合
# 使用子查询
# 使用子查询进行过滤
下面这个例子意义不大,只是简单的演示一下什么是子查询
SELECT * FROM `comment` WHERE shareID IN (SELECT shareID FROM `comment` WHERE shareID > 10)
# 作为计算字段使用子查询
下面这个例子其实意义也不大,这里统计shareID在另外一个表出现的次数
SELECT shareID,(SELECT COUNT(*) FROM `share` WHERE `comment`.shareID = `share`.userID) FROM `comment`
# 连结表
# WHERE的重要性
其实就是连表查询,一般情况下,连表查询的结果会进行笛卡尔积运算
SELECT shareID,`share`.title FROM `comment`,`share`
所以一般我们需要进行where来避免出现重复的值
SELECT shareID,`share`.title FROM `comment`,`share` WHERE `comment`.shareID = `share`.ID
# 内部连结
我们可以使用INNER JOIN
和 ON
来进行内部连结操作
SELECT shareID,`share`.title FROM `comment` INNER JOIN `share` ON `comment`.shareID = `share`.ID
# 连结多个表
这个就没啥好说的,MySQL支持连多个表来进行查询操作,这里我直接用书上的例子来进行测试了。
# 高级联结
# 使用别名
我们可以对连结的表使用别名,可以使用 AS
关键词,在查询的时候可以使用这些别名来进行查询
# 自联结
这个就是最简单的连表查询,这里就不过多介绍了
# 自然联结
标准的联结(前一章中介绍的内部联结)返回所有数据,甚 至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。其实这个操作一般都是我们自己来完成,一般都是加上一些限定条件来避免检索出重复的数据。
# 外部联结
许多联结将一个表中的行与另一个表中的行相关联。但有时候会需 要包含没有关联行的那些行。这个时候就需要使用外部联结。内联结的参考上面那个例子,下面我们使用外联结来进行操作,
外部联结包括左外联结和右外联结。下面这里我们使用左外联结来进行演示:
SELECT shareID,`share`.title FROM `comment` LEFT OUTER JOIN `share` ON `comment`.shareID = `share`.ID
这里我们其实就可以看到,我们这里返回了很多没用空数据
# 带聚集函数的联结
我们可以把函数与连结结合起来
# 组合查询
多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语 句。MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个 查询结果集返回。这些组合查询通常称为并(union)或复合查询 (compound query)
# 创建组合查询
这里我们可以使用 UNION
关键词来进行组合查询。比如我们这里把两次查询的结果进行合并。
SELECT shareID,content FROM `comment` WHERE shareID = 11
UNION
SELECT shareID,content FROM `comment` WHERE shareID = 8
2
3
UNION的规则
- UNION必须由两条或两条以上的SELECT语句组成,语句之间用关 键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个 UNION关键字)。
- UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过 分析 155 图灵社区会员 臭豆腐(StinkBC@gmail.com) 专享 尊重版权116 第 17 章 组 合 查 询 各个列不需要以相同的次序列出)。
- 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以 隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
UNION从查询结果集中自动去除了重复的行,如果不希望删除,我们可以使用 UNION ALL
# 对组合结果进行排序
注意,这里我们只能进行一次排序。而且必须放在最后一条SELECT之后
SELECT shareID,content FROM `comment` WHERE shareID = 11
UNION
SELECT shareID,content FROM `comment` WHERE shareID = 8
ORDER BY shareID
2
3
4