第十五章 联结表
创建连接
-- 利用where进行联结查询
SELECT
v.vend_name,
p.prod_name,
p.prod_price
FROM
vendors v,
products p
WHERE
v.vend_id = p.vend_id
ORDER BY
p.prod_name
内部连接
-- 内部连接
SELECT
v.vend_name,
p.prod_name,
p.prod_price
FROM
vendors v
INNER JOIN products p ON v.vend_id = p.vend_id
ORDER BY
p.prod_name
利用内连接完成之前子查询时完成的任务,查询订购了TNT2产品的客户
-- 内部连接
SELECT
c.*
FROM
customers c
INNER JOIN orders o ON o.cust_id = c.cust_id
INNER JOIN orderitems oi ON oi.order_num = o.order_num
WHERE
oi.prod_id = 'TNT2';
第十六章 创建高级联结
使用不同类型的联结
-- 查询生产DTNTR号产品的生产商旗下所有的产品
-- 使用子查询
SELECT
p.prod_id,
p.prod_name
FROM
products p
WHERE
vend_id = ( SELECT vend_id FROM products WHERE prod_id = 'DTNTR' );
-- 使用联结查询
SELECT
p1.prod_id,
p2.prod_name
FROM
products p1,
products p2
WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR'
外部联结
SELECT
c.cust_id,
c.cust_name,
o.order_num
FROM
customers c
left join orders o on o.cust_id = c.cust_id;
-- left join 只会返回左边表的全部数据,然后再补齐右边表的
第十七章 组合查询
SELECT
p.vend_id,
p.prod_id,
p.prod_price
FROM
products p
WHERE
prod_price <= 5 UNION
SELECT
p.vend_id,
p.prod_id,
p.prod_price
FROM
products p
WHERE
p.vend_id IN ( 1001, 1002 );
union语句会自动将两个语句查询结果中重复的行去重,如果不想的话,可以使用union all 来防止去重。
第十八章 全文本搜索
全文本搜索
通配符与正则表达式匹配的性能较低,通常会匹配表的所有行,而且这些搜索极少使用索引,且返回的结果不智能化。在使用全文本搜索时,mysql不需要分别查看每个行,不需要分析和处理每个词。
为了进行全文本搜索,必须在被搜索的列建立索引,在建立索引后,使用match()与against()完成搜索,match指定被搜索的列,against指定要使用的搜索表达式。传递给match()的值必须与fulltext()定义中的相同,如果指定多个列,则必须列出他们,次序也需正确。
启用全文本搜索可以在建立表时指定,FULLTEXT(note_text),指定对该列进行索引,如果需要也可以指定多个列。如果正在导入数据到一个新表,不应该开启fulltext索引,应该先导入所有数据,然后再修改表,定义fulltext,这样有助于更快导入数据,因为如果建表时指定,mysql会自动维护索引,在增加、更新或删除行时,索引也会随之更新,会花费时间。
全文本搜索会对结果排序,具有较高等级的行先返回,以文本匹配的良好程度排序数据。如果指定多个搜索项,则包含多数匹配词的那些行将具有比包含较少词的那些行高的等级值。全文搜索有的功能可以用LIKE实现,但是全文搜索提供了LIKE不能提供的功能(结果自动排序),而且由于数据是索引的,全文本所有还相当快。
————————————————
版权声明:本文为优快云博主「忘记时间的小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/wangjian530/article/details/80554785
如果要支持全文本搜索的话,需要在建表语句中添加FULLTEXT语句,引擎使用MyISAM。
SELECT
note_text
FROM
productnotes
WHERE
MATCH(note_text) Against('rabbit');
-- 全文本搜索
like虽然也可以完成,但是like返回的数据不是特别有用的顺序,匹配度相对于使用FULLTEXT不够高。全文本搜索的一 个重要部分就是对结果排序。具有较高等级的行先返回(因为这些行很可能是你真正想要的行)。
使用查询扩展
查询扩展用来设法放宽所返回的全文本搜索结果的范围。
SELECT
note_text
FROM
productnotes
WHERE
MATCH ( note_text ) Against ( 'anvils' WITH QUERY EXPANSION );
虽然会返回一些无用的数据,但尽可能的返回了可能与查询条件有关的行。
布尔文本搜索
布尔文本搜索可以提供以下细节
即使没有FULLTEXT索引也可以使用,但性能非常差
SELECT
note_text
FROM
productnotes
WHERE
MATCH ( note_text ) Against ( 'heavy -rope*' IN BOOLEAN MODE );
会把查询结果里,rope单词为开头的行也给剔除出结果集
十九章插入数据 二十章更新和删除数据 略
第二十一章 创建和操纵表
利用CREATE TABLE创建表 必须给出以下信息
- 新表的名字,在CREATE TABLE之后给出;
- 表列的名字和定义,用逗号分开。
NOT NULL代表字段必须有值,不能为空
AUTO_INCREMENT表示自动增长
PRIMARY KEY为设置表的主键
可以加 DEFAULT来设置默认值
更新表
第二十二章 视图
视图是虚拟的表。只包含动态检索出来的数据。
-- 创建视图
CREATE VIEW produccustomers AS SELECT
c.cust_name,
c.cust_contact,
oi.prod_id
FROM
customers c,
orders o,
orderitems oi
WHERE
c.cust_id = o.cust_id
AND o.order_num = oi.order_num;
-- 通过查询视图可以提高sql的重用性
SELECT * FROM produccustomers p where p.prod_id = 'TNT2';
视图的更新视情况而定
第二十三章 使用存储过程
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
优点
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
缺点
- 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
- 存储过程的性能调校与撰写,受限于各种数据库系统。
创建存储过程
-- 创建存储过程
CREATE PROCEDURE productpricing ( ) BEGIN
SELECT
AVG( p.prod_price ) priceAverage
FROM
products p;
END;
创建一个名为‘productpricing’的存储过程,如果接受参数,那就把参数加在括号内。
BEGIN和END限定存储过程的开始和结尾,过程只是一个SELECT语句。
CALL productpricing();
使用存储过程。
DROP PROCEDURE productpricing;
删除存储过程。
带参数的存储过程
-- 创建带参数的存储过程
CREATE PROCEDURE productpricing ( OUT pl DECIMAL ( 8, 2 ), OUT ph DECIMAL ( 8, 2 ), OUT pa DECIMAL ( 8, 2 ) ) BEGIN
SELECT
MIN( p.prod_price ) INTO pl
FROM
products p;
SELECT
MAX( p.prod_price ) INTO ph
FROM
products p;
SELECT
AVG( p.prod_price ) INTO pa
FROM
products p;
END;
为了调用这个存储过程,必须指定3个变量名
-- 调用存储过程
CALL productpricing ( @priceLow, @priceHigh, @priceAverage );
-- 查找变量的结果
SELECT
@priceLow,
@priceHigh,
@priceAverage;
-- 在这里 IN表示输入的参数 OUT表示输出的结果
CREATE PROCEDURE orderTotal ( IN oNumber INT, OUT oTotal DECIMAL ( 8, 2 ) ) BEGIN
SELECT
Sum( oi.quantity * oi.item_price ) into oTotal
FROM
orderitems oi
WHERE
oi.order_num = oNumber;
END;
CALL orderTotal(20005,@total);
select @total;
建立智能存储过程
CREATE PROCEDURE ordertotal2 ( IN onumber INT, IN taxable BOOLEAN, OUT ototal DECIMAL ( 8, 2 ) ) BEGIN
DECLARE
total DECIMAL ( 8, 2 );
DECLARE
taxrate INT DEFAULT 6;
SELECT
SUM( oi.item_price * oi.quantity )
FROM
orderitems oi
WHERE
oi.order_num = onumber INTO total;
IF
taxable THEN
SELECT
total + ( total / 100 * taxrate ) INTO total;
END IF;
SELECT
total INTO ototal;
END;
CALL ordertotal2(20005,1,@total);
SELECT @total;
第二十四章 使用游标
第二十五章 触发器