MySQL必知必会(三)

第十四章:使用子查询

SQL还允许创建子查询,即嵌套在其他查询中的查询。

利用子查询进行过滤

包含子查询的select语句难以阅读和调试,特别是它们较为复杂时更是如此。
但是,将子查询分解为多行并且适当地进行缩进,能极大地简化子查询的使用。
子查询的数目没有限制,不过在实际使用中由于性能的限制,不嵌套太多的子查询。

作为计算字段使用子查询

逐渐增加子查询来建立查询。

第十五章:联结表

什么是,为什么用,如何编写联结的select语句
SQL的强大性:可以在数据检索查询的执行中联结(join)表。联结是利用SQL的SELECT能执行的最重要的操作。
关系表
外键:为某个表中的一列,它包含另一个表的主键值。定义了2个表之间的关系。
优势
1.信息不重复,不浪费时间和空间
2.如果有一个信息改动,只需要改变一个表中的单个记录。相关表的数据不用改动。
3.数据无重复,显然数据是一致的,使得处理数据更简单。
总结
关系数据可以有效地存储和方便地处理,可伸缩性远比非关系数据库要好。
可伸缩性
能够适应不断增加的工作量而不失败。
设计良好的数据库或应用程序称为伸缩性好。
如果数据存储在多个表中,怎么样用单条select语句检索数据。
使用联结。联结是一种机制,用来在一条select语句中关联表。
联结由MySQL根据需要建立,它存在于查询的执行当中。
创建联结
需要规定要联结的所有表以及它们如何关联。
完全限定列名:在引用的列可能出现二义性,必须使用完全限定列名(用一个点分割的表名和列名),如果引用一个没有用表名限制的具有二义性的列名,MySQL将返回错误。
举例:
select a,b,c
form 表1,表2
where 表1.c=表2.c
order by a,c
由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数*第二个表中的行数。
要保证所有的联结都有where子句
否则MySQL将返回比想要的数据多得多的数据。
有时会听到返回称为叉联结的笛卡尔积的联结类型。
等值联结:基于2个表之间的相等测试。这种联结称为内部联结。
内部联结
INNER JOIN 指定,联结条件用特定的ON子句而不是WHERE子句给出。
首先INNER JOIN语法。
联结多个表
对联结的表个数无限制。
首先在from后边列出所有表,然后再定义表之间的关系。
MySQL在运行时关联指定的每个表以处理联结。这种处理可能可能耗资源。不要链接不必要的表。表越多,性能下降越厉害。

第十六章:创建高级联结

使用表别名
别名除了应用于列名和计算字段外,SQL还允许给表名起别名。
有2个理由:
1.缩短SQL语句
2.允许在单条SELECT语句中多次使用相同的表
注意
表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机
使用不同类型的联结
除了内部联结这种简单的联结之外,还有其他的方式:
1.自联结
用自联结代替从相同表中检索数据时使用的子查询语句。
2.自然联结
3.外部联结
OUTER JOIN指定联结类型。使用时必须使用RIGHT或者LEFT关键字指定包括其所有行的表(right指出的是OUTER JOIN 右边的表),而LEFT指出的是OUTER JOIN左边的表。
举例:
from customers LEFT INNER JOIN orders
意思:从FROM子句的左边表(customers)中选择所有行。
外部联结的类型:左联结和右联结
唯一差别:所关联的表的顺序不同。
联结的使用条件
1.注意所使用的联结类型。一般使用内部联结,但使用外部链接也是有效的。
2.保证使用正确的联结条件,否则将返回不正确的数据
3.应该总是提供联结条件,否则会得出笛卡尔乘积。
4.一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。最好使用前测试测试。

第十七章:组合查询

UNION将多条select语句组合成一个结果集。
组合查询
2种情况需要使用它:
1.在单个查询中从不同的表返回类似结构的数据;
2.对单个表执行多个查询,按单个查询返回数据;
创建组合查询
UNION操作符来组合数条SQL查询。利用UNION,可给出多条SELECT语句,将它们的结果组合成单个结果集。
使用UNION:
所需要做的就是给出每条select语句,在各条语句之间放上关键字UNION。
UNION规则
必须由2条或2条以上的select语句组成,语句之间用关键字UNION分割。
使用UNION ALL ,MySQL不取消重复的行。

第十八章:全文本搜索

并非所有的引擎都支持全文本搜索。
2个最常用的是MyISAM和InnoDB.
前者支持,后者不支持。
为进行全文本搜索,必须索引被搜索的列,而且随着数据的改变不断地重新索引。
启动全文本搜索支持
创建表时,根据子句FULLTEXT(note_text)的指示对它进行索引。这个表中有一个名为note_text的列,为了进行全文本搜索,根据子句FULL_TEXT的指示对它进行索引。
不要再导入数据时使用FULLTEXT,更新索引需要花时间,虽然不多,但是毕竟要花时间。如果正在导入数据到一个新表,此时不应该启用FULLTEXT索引,要先导入所有数据,然后再修改表。
2个函数
Match() 指定被搜索的列
Against() 指定要使用的搜索表达式
使用全文本搜索返回以文本匹配的良好程度排序的数据。2个行都包含词rabbit,但是作为第3个字的等级,比作为第20个字的行高,具有较高等级的行先返回。
由于数据是索引的,全文本搜索很快
布尔文本搜索
MySQL支持全文本搜索的另外一种形式,称为布尔形式。即使没有FULLTEXT索引也可以使用。
看不下去了…

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值