手动整理汇总MySQL基础知识2

8.联结

SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表。可以将多个表联系起来。
1)外键的概念

外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;

 

 

2) 内部联结

目前为止所用的联结称为等值联结,它基于两个表之间的相等测试。这种联结也称为内部联结。

以下语句的结果与上面的语句执行结果是相一致的。
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;

 

 

 3) 联结多个表

SELECT prod_name, vend_name, prod_price, quantity FROM orderitems, products, vendors WHERE products.vend_id = vendors.vend_id AND orderitems.prod_id = products.prod_id AND order_num = 20005;

 

 

 4)自联结

自联结的查询速率比子查询要高。

自联结:

SELECT p1.prod_id, p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = ‘DTNTR‘;

 

 

5)外部联结

如果联结包含了哪些在相关表中没有关联行的行,这种类型的联结称为外部联结。

 

在外部联结中需要考虑左外部联结和右外部联结的问题,二者的区别是表的顺序不同。

左联结

SELECT customers.cust_id, orders.order_num FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

右联结

SELECT customers.cust_id, orders.order_num FROM customers RIGHT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

 

 

9. 组合查询

这种查询使用在执行多个查询并且将结果作为单个查询结果集返回的情况。

组合查询使用的是UNION关键字,在使用的时候需要注意一下几个注意事项:

1)UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔;

2)UNION中的每个查询必须包含相同的列、表达式或聚集函数;

3)列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型。

SELECT vend_id, prod_id, prod_price

FROM products

WHERE prod_price <= 5

UNION

SELECT vend_id, prod_id, prod_price

FROM products

WHERE vend_id IN (1001,1002);

 

 

 10. 全文检索

在使用MySQL进行全文检索的时需要使用MySQL的一个引擎叫MyISAM,该引擎支持全文检索。因此,在设计一个叫productnotes表的时候,特别标注了引擎的名称,在创建其他的表时使用的是另一个叫InnoDB的引擎,这个引擎不支持全文检索。

CREATE TABLE productnotes
(

note_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_date datetime NOT NULL,
note_text text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
)ENGINE = MyISAM;

进行全文检索要使用到的函数是Match()和Against(),

例如:

SELECT note_text FROM productnotes WHERE Match(note_text) Against(‘rabbit‘);

 

 如果是想打分呢,可以这样操作:

SELECT note_text, Match(note_text) Against(‘rabbit‘) AS rank FROM productnotes;

 

 其中的布尔文本搜索可以提供更多的功能,在布尔文本搜索中会使用一些操作符如下所示:

 

 举例说明:

 

 

 

相关文章