SQL 笔记(三)


1. 组合查询
包含或取消重复的行(使用UNION 时,重复的行被自动取消)
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);
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
| 1003 | FC | 2.5 |
| 1002 | FU1 | 3.42 |
| 1003 | SLING | 4.49 |
| 1003 | TNT1 | 2.5 |
| 1001 | ANV01 | 5.99 |
| 1001 | ANV02 | 9.99 |
| 1001 | ANV03 | 14.99 |
| 1002 | FU1 | 3.42 |
| 1002 | OL1 | 8.99 |
+---------+---------+------------+

对组合查询拍讯
在UNION 组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。

2. 全文本搜索
MySQL 支持几种基本的数据库引擎。两个最常使用的为MyISAMySQL和InnoDB,前者支持全文本搜索,
而后者不支持。
为了使用全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表进行适当
的设计后,MySQL 会自动进行所有的索引和重新索引。
在索引之后,SELECT可与Match() 和 Against() 一起使用以实际执行搜索。

启用全文本搜索支持
在创建表时启用,create table 语句时接受 FULL TEXT 子句,它给出被索引列的一个逗号分隔的列表。

create table sample (
-> 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) // 在定义后MySQL 自动维护该索引
-> )ENGINE=MyISAM;

进行全文搜索
Match() 指定被搜索的列,Against() 指定要使用的搜索表达式。
select note_text from productnotes where Match(note_text) Against('rabbit');
+---------------------------------------------------------------------------------------------------------------------+
| note_text |
+---------------------------------------------------------------------------------------------------------------------+
| Customer complaint: rabbit has been able to detect trap, food apparently less effective now. |
| Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait. |
+---------------------------------------------------------------------------------------------------------------------+

查看计算的权重
select note_id, note_text , Match(note_text) Against('rabbit') as rank from productnotes;

使用查询扩展
select note_text from productnotes where Match(note_text) against('anvils');
select note_text from productnotes where Match(note_text) against('anvils' WITH QUERY EXPANSION);

布尔文本搜索
及时没有FULLTEXT 索引也可以使用
为了匹配heavy 但不包含rope 开始的词的行
select note_text from productnotes where
-> Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE);

全文本boolean 操作符
+ 包含
- 排除
> 包含,而且增加等级值
< 包含,且减少等级值
() 把词组成子表达式
~ 取消一个词的排序值
* 词尾的通配符
"" 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)

3. 插入数据
如果数据检索式最重要的,则可以通过
insert low_priority into 降低 insert 的优先级。

插入多条数据,只要insert 语句中的列名(和次序)相同,可以如下组合各语句:
insert into customers(cust_name,
cust_address,
cust_city,
cust_state)
values(
'Pep',
'',
''
),
(
'Pep',
'',
''
)

插入检索出来的数据
insert into customers() select cust_id,.... from custnew;

4. 更新和删除数据
如果想从表中删除所有行,不要使用DELETE。可以使用TRUNCATE TABLE。
该语句不是逐行删除,而是删除表,再构建一个空表。

更新和删除的知道原则:

5. 创建和操纵表
主键: primary key() 多个值由逗号隔开。
PRIMARY KEY(order_num, order_item)

AUTO_INCREMENT 每个表只允许一个auto_increment,而且它必须被索引。

如何获得 auto_increment 的值?
select last_insert_id();

默认值:
MySQL 与大多数DBMS 不一样,MySQL不允许使用函数作为默认值,它只支持常量。

混用存储引擎一个大缺陷是外键不能跨引擎。

6. 更新表
添加列
alter table vendors add vend_phone char(20);

删除列
alter table vendors drop column vend_phone,

ALTER TABLE 的一种常见用途是定义外键。
alter table orderitems add constraint fk_orderitems_orders foreign key(order_num)
refferences order (order_num)

7. 删除表
drop table customers2;

8. 重命名表
rename table customers2 to customers;

9. 使用视图(view)

10. 存储过程
可以将存储过程视为批处理文件。

执行存储过程
call productpricing(@pricelow, @pricehigh, @priceaverage);

创建存储过程
create procedure productpricing()
-> begin
-> select Avg(prod_price) as priceaverage from products;
-> end;

改变命令行客户机的分隔符
delimiter //
create procedure productpricing()
begin
select Avg(prod_price) as priceagerage from products;
end //

// 恢复分隔符
delimiter ;

调用 call productpricing();
call productpricing();
+--------------+
| priceaverage |
+--------------+
| 16.133571 |
+--------------+

删除存储过程, 删除的时候只给出存储过程名
drop procedure productpricing;
drop procedure if exists

创建带参数的存储过程
create procedure productpricing(
-> out pl decimal(8,2),
-> out ph decimal(8,2),
-> out pa decimal(8,2))
-> begin
-> select min(prod_price) into pl from products;
-> select max(prod_price) into ph from products;
-> select avg(prod_price) into pa from products;
-> end;

参数类型
IN OUT INOUT

11. 游标的使用(MySQL的游标只能用于存储过程)
a. 在能够使用之前,必须定义它。
b. 一旦声明之后,必须打开游标以供使用。
c. 对于填有数据的游标,根据需要取出检索各行。
d. 在结束游标使用时,必须关闭游标。

create PROCEDURE processorders()
BEGIN
Declare ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;

打开游标
OPEN ordernumbers;

关闭游标
CLOSE ordernumbers;

使用游标数据

12. 触发器
触发器是MySQL响应DELETE, INSERT, UPDATE 语句而自动执行的一条MySQL语句。
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';

只有表才支持触发器,视图不支持。(临时表也不支持)

触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个出发器。因此,每个表最多支持
6个触发器(每条insert update 和 delete 的之前和之后)。单一触发器不能与多个事件或多个表关联。

删除触发器
drop trigger newproducts;
触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。
在insert 触发器代码内,可以引用一个名为NEW 的虚拟表,访问被插入的行。
create trigger neworder after insert on orders for each row select NEW.order_num;

DELETE 触发器代码内。可以引用一个名为OLD的虚拟表。访问被删除的行。

13. 管理事物
事物处理用来管理insert、update和delete 语句。不能回退select 语句。事物处理中可以使用
create 或drop 操作。但是也不能回退。

14. 更改默认的提交行为。
set autocommit = 0;

15. 全球化和本地化
SHOW CHARACTER SET;
显示系统所有可用的字符集。

查看所支持校对的完整列表。使用如下语句:
SHOW COLLATION;

显示所用的字符集和校对:
show variables like 'character%';
show variables like 'collation%';

创建表时指定字符集和校对:
create table mytable(
column1 INT,
column2 varchar(10)
) DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;

为列指定默认的字符集
create table mytable(
column1 INT,
column2 varchar(10) character set latin1 collate latin1_general_ci
) DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;

可以再select 语句中使用collate 指定一个备用的校对顺序。
select * from customers order by lastname, firstname collater latin1_general_cs;
(一种临时区分大小写的技术。)

16. 安全管理
管理用户 MySQL 数据库有一个名为user 的表,它包含所有的用户账号。user 表有一个名为user 的列。
它存储用户登录名。

创建用户账号
create user ben identified by 'zhang';
重命名用户
rename user ben to bforta;

删除用户
drop user bforta;

设置访问权限,查看用户账号的权限
GRANT 要求你至少给出以下信息:
要授予的权限、被授予访问权限的数据库或表、用户名
grant select on carshcouse.* to bforta;
show grants for bforta;

取消权限的语句
REVOKE select on crashcourse.* from beforta;

GRANT 和REVOKE可在几个层次上控制访问权限:
整个服务器,使用GRANT ALL 和 REVOKE ALL
整个数据库,使用 ON database.*
特定的表,使用 ON database.table
特定的列
特定的存储过程

简化多次授权:
GRANT SELECT, INSERT ON crashcourse.* TO bforta;

更改口令:
SET PASSWORD FOR bforta = PASSWORD('zzy');
在不指定用户名时,SET PASSWORD 是更新当前登录用户的口令。

17. 数据库维护
进行数据库维护 ANALYZE TABLE
analyze table orders;
+-----------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------------+---------+----------+----------+
| sqltest2.orders | analyze | status | OK |
+-----------------+---------+----------+----------+

check table 用来针对许多问题对表进行检查。
changed 检查最后几次检查依赖改动过的表。
extended 执行最彻底的检查。
fast 只检查未正常关闭的表。
medium 检查所有被删除的链接并进行键检验。
quick 只进行快速扫面。

MyISAM 表访问产生不正确和不一致的结果,可能需要用repair table来修复相应的表。
如果从一个表中删除大量的数据,应该使用optimize table 来回收所用的空间。从而优化
表的性能。

诊断启动问题:
MySQL 服务器自身通过在命令行执行mysqld 启动。

18. 改善性能
like 很慢,一半来说最好使用fulltext 而不是 like。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值