MySQL(二)
MySQL(二)
联结
外键,它是表中的一列,也是其他表的主键,定义里两个表之间的关系。
Q:如果数据存储在多个表中,怎样用单条SELECT语句检索出数据?
A:使用联结。简单地说,联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
注:联结并不实际存在于数据库中,只是一种表现形式。
如:
SELECT employees.first_name, jobs.job_title
FROM employees, jobs
WHERE employees.job_id = jobs.job_id;
-- job_id作为employees的外键
-- 要查询的·名·和·工作职称·分别是两个表中的列
若没有where子句也就是联结条件,检索出的结果是,第一个表的每一行和第二个表的每一行配对,得到行的数目将是第一个表中的行数乘以第二个表中的行数。这也叫做笛卡尔积。
内部联结
上面所写的根据外键和另一个表的主键进行匹配的方式叫做等值联结,也叫内部联结,他还有另一种方式表达:
SELECT employees.first_name, jobs.job_title
FROM employees INNER JOIN jobs
ON employees.job_id = jobs.job_id;
就是FROM子句进行了变更,以及用ON替换了WHERE语句。
联结多个表
SQL中可以联结多个表,连接条件在WHERE从句中,使用AND连接。
若连接三个表,则至少需要两个联结条件。
如:
注:联结耗费资源!!!
高级联结
对被联结的表使用表别名和聚集函数。
SELECT e.first_name, jb.job_title
FROM employees AS e, jobs AS jb
WHERE e.job_id = jb.job_id;
-- 使用了表名缩写
-
自连接
-
左连接,LEFT JOIN;
是返回左表和右表中关联字段相等的记录;
就是,返回左表得到全部,以及右表中连接字段相等的记录,不相等的记为空。
-
右连接参考左连接。
-
交叉连接,CROSS JOIN,就是笛卡尔积。
组合查询
执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询
(compound query)。
使用UNION关键字将查询结果组合。
每个SELECT语句之间由UNION连接,并且UNION两侧的SELECT语句必须具有相同的列(顺序可以不同);
UNION在组合两个查询结果时,会默认把重复数据清理只保留一个,若要显示全部需在后面加上ALL;
UNION连接的查询语句中,只能有一个ORDER BY,即使两个ORDER BY一样。
如,
SELECT vend_id,prod_id,prod_price
FROM products
WHERE prod_price <= 5
UNION [ALL]
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002)
ORDER BY vend_id, prod_id;
-- 查找价格<=5 以及 1001,1002商家提供的商品信息
、
全文本查询
通配符、正则表达式都尝试对数据库中所有行进行匹配,耗时,并且很难精确搜索。
使用时,**Match()**指定被搜索的列,**Against()**指定要使用的搜索表达式;
数据是索引的,很快;默认不区分大小写;
排除等级为0(不含待搜索表达式)的行;结果以等级(含待搜索表达式的个数)降序排列。
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST( 'rabbit');
-- 搜索note_text列中rabbit
查询扩展
利用查询扩展,能找出可能相关的结果,即使它们并不精确包含所查找的词。
使用时,在AGAINST里,待搜索表达式后面加上WITH QUERY EXPANSION。
布尔文本搜索
搜索慢,可提供以下功能:
如:
SELECT note_text
FROM productnotes
WHERE MATCH(note_text) AGAINST( '+rabbit -bait' IN BOOLEAN MODE);
-- note_text中,含有rabbit但不含bait的数据
以上源于《MySQL必知必会》
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15105015.html