当前位置: 代码迷 >> SQL >> SQL 札记(三)
  详细解决方案

SQL 札记(三)

热度:34   发布时间:2016-05-05 11:22:53.0
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。	
  相关解决方案