(敲黑板重点来了,前面的内容学过的可以不用温习了,但接下来的内容就非学不可啦
一、使用子查询
1.利用子查询进行过滤
例如与IN操作符结合使用,列出订购物品TNT2的所有客户
输出:
2.作为计算字段使用子查询
例如需要显示customers表中每个客户的订单总数,订单与相互的客户ID存储在orders表中。
输入:
输出:
相关子查询(涉及外部查询的子查询)
WHERE orders.cust_id=customers.cust_id,(完全限定列名)告诉SQL比较orders表中的cust_id与当前正从customers表中检索的cust_id。
二、联结表
SQL最强大的功能之一就是能在数据检索查询的执行中联结表。联结是利用SQL的SELECT能执行的最重要的操作。
联结(join)
联结是一种机制,用来在一条select语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
1.关系表里的概念
关系表的设计是要保证把信息分解成多个表,一类数据一个表,各表通过一定的关系互相关联。
外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
可伸缩性:能够适应不断增加的工作量而不失败。
2.创建联结(必须使用WHERE创建等值联结不然会出现笛卡尔积)
与前面select语句不同的是vend_name在一个表,而prod_name和prod_price在另一个表。
3.内部联结
基于两个表之间相等测试的联结称为等值联结,也叫内部联结。
(使用INNER JOIN创建等值联结)
4.连接多个表
三、创建高级联结
1.使用表别名
2.使用不同类型的联结
自联结,自然联结和外部联结
2.1自联结
自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多。
2.2自然联结
标准的联结返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列值返回一次。
2.3外部联结
与内部联结关联两个表中的行不同的是外部联结还包括没有关联的行。在使用OUTER JOIN时,必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出OUTER JOIN右边的表,LEFT指出OUTER JOIN左边的表)。
3.使用带聚集函数的联结
为说明这一点,请看下面的例子,如果要检索所有客户及每个客户所下的订单数。
3.1INNER JOIN 内部联结
输出结果:
3.2LEFT OUTER JOIN 外部联结
输出结果:
对比发现:左外部联结的结果显示也包含了客户Mouse House,它有0个订单。
4.使用联结和联结条件
四、组合查询
1.组合查询也通常称为并(union)或复合查询。
有两种基本情况,其中需要使用组合查询:
1)在单个查询中从不同的表返回类似结构的数据
2)对单个表执行多个查询,按单个查询返回数据
2.创建组合查询
将UNION换成UNION ALL可以包含不同SELECT子句选中的重复的列
UNION规则
1)UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔。
2)UNION中的 每个查询必须包含相同的列、表达式或聚集函数
3)列数据类型可以不完全相同,但必须兼容
3.对组合查询结果排序
ORDER BY必须出现在最后一条SELECT语句之后
五、全文本搜索
1.为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引; 1.1启用全文本搜索支持:一般在创建表时启用全文本搜索;create table 语句接收fulltext 子句,它给出被索引列的一个逗号分隔的列表;
1.2MySQL根据子句fulltext(note_text)的指示对它进行索引。这里的fulltext索引单个列,如果需要也可以索引多个列;在定义之后,MySQL自动维护该索引。在增加、更新或删除行时,索引随之自动更新;
2.进行全文本搜索:使用match()函数和against()函数执行全文本搜索,其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。
3.使用查询扩展
查询扩展(with query expansion)不止返回包含搜索词的行,还返回与该行相关的行。
select note_text from productnotes where match(note_text) against('anvils' with query expansion) ;
4.布尔文本搜索
布尔搜索可以指定以下搜索条件:
1 要匹配的词 2 要排斥的词(包含该词的行不返回,即使包含指定的词)3 排列提示(词的重要等级)4表达式分组
文本布尔操作符:
如匹配包含heavy但不包含任意以rope开始的词的行:
全文本搜索的使用说明:
1)在索引全文本数据时,短词被忽略且从索引中排除。短词定义为具有3个或3个以下字符的词(可以更改)
2)mysql带有一个内建的非用词表,这些词在全文本搜索中被忽略,
3)mysql规定了一条50%规则,如果一个词出现在50%以上的行中,则将它忽略,不使用与in boolean mode
4)如果表中的行少于3行,全文本搜索不返回结果(因为每次词或者不出现,或者至少50%出现)
5)忽略词中的个单引号