mysql day3:分组,子查询,联结与全文本搜索
分组数据:
GROUP BY:SELECT Continent,SUM(Population) AS Pop_Conti FROM country GROUP BY Continent;
GROUP BY指示MySQL分组数据,然后返回每个组的聚集结果。
- GROUP BY 后的列可以为任意数目个,这意味着可以进行嵌套分组,数据将在最后规定的分组上进行汇总。
- GROUP BY 后的每个列都必须是可被检索的列或者返回列的表达式。并且在SELECT子句中用AS指定的别名不可以在同一句的GROUP BY中使用。
- GROUP BY不会屏蔽NULL,其将作为一个单独的分组(行)出现,所有的NULL值都将进入这一个组
- 在 列名后加上WITH ROLLUP关键字可以增加一行总计。(目前还不知道如何给这一行合适的命名??其部分列将显示为NULL)
过滤分组:HAVING
HAVING就是针对分组的WHERE。支持所有WHERE的操作符和用法,用在GROUP BY之后,起到类似于WHERE的效果。可以认为:WHERE针对行过滤,而HAVING针对分组过滤。
至此归纳子句的语序:子句正确的语序为SELECT-AS-FROM-WHERE-GROUP BY-HAVING-ORDER BY-LIMIT
%——————————————————————————————————————————————————————%
子查询
SELECT Name FROM Country WHERE Code IN (SELECT Code FROM (另一个表名) WHERE Population > 10000000);
可以用子查询在同一个表内起相当于WHERE的过滤作用,但WHERE不能处理跨表格的过滤,而子查询可以。
注意,在使用子查询时,若嵌套在WHERE内,内层查询SELECT的返回列应当与外层WHERE子句中的列保持一致。
同样的,子查询还可以出现在SELECT后,作为查询结果而出现。
我把此归纳为:(实际列--函数返回为列--查询结果为列)在子句中的等价性
%——————————————————————————————————————————————————————%
联结表(联结通过查询语句创建,其基础是存储在不同表中的相同列,如主键和外键)
关系表:将不同类的信息分表存储,并只将一个表的主键存储在另一个表中作为外键,这样既能通过合理的查找语句联结信息,又能方便的管理和维护不同类别的信息。
通过查询创建联结:SELECT (列1),(列2),(列3) FROM (表1),(表2) WHERE 表1.主键=表2.外键 ORDER BY (列1),(列2);
可以将分属表1和表2的多个列一起查询出来。注意:由于主键和外键的列名理应是相同的,他们必须被表名所完全限定。
若没有以上的where子句,将形成表1行数*表2行数条结果,而完全无视了主键——外键带来的对应关系信息,这是违背事实的。
这类利用主键和外键的等值关系建立的联结成为等值联结或者内部联结,可以用如下的另一种方式实现:
SELECT (列1),(列2),(列3) FROM (表1) INNER JOIN (表2) ON 表1.主键=表2.外键;
这类语法是更加被提倡的形式。
多个表的联结的语法形式是类似的,需要注意WHERE子句条件的完整性。
通过联结表的形式可以更有效的完成部分子查询的功能。
%——————————————————————————————————————————————————————%
创建高级联结
在一个子句中,可以使用已经被定义过的表别名和列别名来代替其本身,便于缩短语句和多次使用相同的表。
需要注意的是,该别名不返回至客户机,在其他的语句中将不再能使用这一别名。
(这就是我在day2尝试用别名引用时失败的原因……)
高级联结包括自联结,自然联结和外部联结。
自联结:将同一个表给予两个别名并进行联结,通常用来代替子查询语句。
自然联结:对某一个表使用通配符*,而对其他的表指定具体的列,以防止在不同的表中重复出现的用于联结的列被检索出多次。通常的联结都是自然联结。
外部联结:在FROM子句中将INNER JOIN改为LEFT/RIGHT OUTER JOIN,将那些没有与外键匹配的主键对应的条目的相应列也检索出来,其无对应部分为NULL.
带聚集函数的联结:合理使用聚集函数和分组函数,使其返回值与实际列的含义相匹配。
%——————————————————————————————————————————————————————%
组合查询
使用情景:
- 单个查询对多个表使用,返回类似结构的数据
- 对单个表执行多次查询,并按单次查询返回数据
使用UNION:在不同的SELECT语句之间放上关键字UNION
- UNION的每个查询必须包含相同的列,表达式或者聚集函数
- UNION默认去除重复值,如果需要保留,可以使用UNION ALL
- 在UNION的最后才可以使用一条ORDER BY语句来进行统一排序。
%——————————————————————————————————————————————————————%
全文本搜索:智能化搜索文本内容而非模式化的匹配字符串
- 在创建表时启用全文本搜索支持
- 使用Match (被搜索列) Against (搜索表达式)进行全文本搜索
- 用在WHERE子句中:只返回匹配的结果
- 用在SELECT中将搜索结果作为一行返回:未匹配行返回0,匹配程度越高返回值越大,可以借此排序。(注意这样做将返回所有行,起不到搜索的效果)
- 使用查询拓展:在Match中,表达式后加上WITH QUERY EXPANSION,返回匹配行和匹配词相关行
- 布尔文本搜索:在Match中,表达式后加上IN BOOLEAN MODE,可以添加绝对不能出现的词语(优先级比匹配词高),方法是在表达式中添加’-屏蔽词‘。其他的操作符参考文档。
- 短词,次数过多的词,内建非用词,无词分隔符的语言均会对结果造成影响

浙公网安备 33010602011771号