Nysql学习笔记

MySql学习
1.GRANT和REVOKE命令
	1.1创建MYSQL用户并进行授权
		用来管理访问权限,同时还可以用来创建和删除用户。语法命令格式:
			GRANT priv_type [(column_list)][,priv_type [(column_list)]] ...
				ON [object_type]{tbl_name | * | *.* | db_name.*}
				TO user [IDENTIFIED BY [PASSWORD] 'password']
					[,[IDENTIFIED BY [PASSWORD] 'password']] ...
			[WITH with_option [with_option] ...]
		例如:
			添加用户为jack,口令为jack,登录地址限制为本地,授权SELECT、DELETE、
			UPDATE和INSERT.

			GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO 'jack'@'localhost'
			IDENTIFIED BY 'jack';

			也可以对MySQL用户每小时服务器的连接次数、更新次数、查询次数和用户连接数设定一个上限。
			我们还是添加一个jack用户,他每小时最多能发出100次查询命令(在这100次查询中,最多只有50次恒心命令),每小时最多连接10次,用户连接数不限制。
			GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO 'jack'@'localhost'
			IDENTIFIED BY 'jack' WITH
			MAX_QUERIES_PER_HOUR 100
			MAX_CONNECTIONS_PER_HOUR 10
			MAX_UPDATES_PER_HOUR 50
			MAX_USER_CONNECTIONS 0;
	1.2收回权限和删除用户
		REVOKE priv_type [(column_list)][,priv_type [(column_list)]] ...
				ON [object_type]{tbl_name | * | *.* | db_name.*}
				FROM user [,user] ...
		REVOKE ALL PRIVILEGES,GRANT OPTION FROM user[,user]...
		例如:
			收回上面添加的jack用户的所有权限,
				REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'jack';
			REVOKE语句会回收某个用户的权限,但不会删除用户,如果要删除用户就要到mysql.user表中删除对应的记录。
		使用FLUSH命令让mysql重新加载权限表。
			例如
				FLUSH PRIVILEGES;
	1.3修改密码
		可以使用UPDATE语句修改密码,比如将jack这个用户的密码更改为111111,代码如下。
		use mysql;
		update user set Password=PASSWORD('111111') where user='jack';
		flush privileges;

		更改密码的第二种方法:
			SET PASSWORD FOR 'jack' = PASSWORD('222222');

		更改密码的第三种方法:
			GRANT USAGE ON '*'.'*' TO 'jack' IDENTIFIED BY '111111';

		忘记root密码执行方法:
			mysqld --skip_grant_tables
			mysql -u root
			FLUSH PRIVILEGES;
			重启mysql服务。
2.Mysql优化
	2.1选取最适用的字段属性
		将表中字段的宽度设置得尽可能小,另外在尽可能的情况下,应该尽可能的吧字段设置为NOT NULL,这样在执行查询的时候数据库就不用去比较NULL的值。
		对于某些字段,例如'省份'或者性别,可以将他们设置为ENUM类型,在MySQL中,ENUM类型被当做数值类型数据来处理,而数值类型数据处理器来的速度要比文本类型快的多。
	2.2链接负载
		back_log参数用来设置MySQL所有的链接数量。该参数只针对到来的TCP/IP连接的侦听队列的大小。
	2.3最大并发连接数
		此参数确定并发数据库连接的最大数值,默认值100.可以通过查看max_used_connections参数来检查数据库打开的并发连接的最大数值。执行SHOW STATUS可以得到这个参数。
	2.4守护进程用户
		MySQL守护进程应该按非root用户的权限运行,在攻击者通过MySQL安全漏成功的入侵服务器时,这样能够将破坏程度降到最低。虽然常见的做法是以用户mysql的身份运行服务器,但也可以以存在的任何用户省份来运行。只要该用胡是数据目录的拥有者就可以。
		例如,假定使用用户phpchinadb运行守护进程:
			./bin/mysql_safe -user=phpchinadb &
	2.5权限
		工作中,经常使用简化权限来提查询速度,
	2.6使用join来代替子查询Subquesries
		JOIN之所以更有效,是因为MySQL不需要在内存中创建临时表来完成子查询,逻辑上需要多步骤的查询工作。
	2.7表的优化
		如果一个表已经用了一段时间,随着更新个删除操作的发生,数据将会变得支离破碎。这样会增加在该表中查询所花的时间,可以使用如下语句修复:
			OPTIMIZE TABLE tablename;
		或者在命令提示符下输入:
			myisamchk -r table;
	2.8使用索引
	2.9优化的查询语句
		索引虽能优化查询,但有时也不起作用。所以,在查询的时候请注意,最好在相同的字段间进行比较,应避免在查询中让MySQL进行自动类型装换,因为装换过程会使索引对于优化的查询无效。
	2.10使用默认值
		在尽可能的地方使用列的默认值,只有在默认值不同的时候才插入数据这样可以减少执行INSERT语句所花的时间。

3.MySQL中SQL语句的应用
	创建示例表:
		create database student;
		use student;
		create table shop(
			article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
			dealer CHAR(20) DEFAULT '' NOT NULL,
			price  DOUBLE(16,2)	DEFAULT '0.00' NOT NULL,
			PRIMARY KEY(article,dealer)
		);
		insert into shop values
		(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
		(3,'C',1.69),(3,'D',1.25),(4,'D',19.95)
	3.1、SQL语句的基本应用
		(1)增加记录
			INSERT INTO 表名(字段名,字段名) values (值,值);
		(2)删除记录
			DELETE FROM 表名 WHERE 条件;
		(3)修改记录
			UPDATE 表名 SET 字段=值,字段=值 WHERE 条件;
		(4)查询记录
			SELECT 字段,字段 FROM 表名 where 条件;
	3.2、常用列的最大值
		select MAX(artical) as articale FROM shop;
	3.3、拥有某列的最大值的行
		select article,dealer,price from shop where price=(select max(price) from shop);
		或者
		select article,dealer,price from shop order by price desc limit 1;
	3.4、按组排列的最大值
		select article,max(price) as price from shop group by article;
	3.5、提取某列在组间的最大值
		select article,dealer,price from shop s1 where price=(select max(s2.price) from shop s2 where s1.article=s2.article);
	3.6、使用用户变量
		select @min_price:=min(price),@max_price:=max(price) from shop;

		select * from shop where price=@min_price or price=@max_price;

	3.7、使用AUTO_INCREMENT
		create table animal(
			id MEDIUMINT NOT NULL AUTO_INCREMENT,
			name CHAR(30) NOT NULL,
			PRIMARY KEY (ID)
		) ;

		INSERT INTO animals(anme) values
		('dog'),('cat'),('penguin'),
		('lax'),('whale'),('ostrich');
	3.8常用的字符串函数
		(1)、CONCAT(str1,str2,...)	
			select concat('M','y',"SQL");
				MySQL;
		(2)、CONCAT_WS(separator,str1,str2,...)
		代表CONCAT With Separator,是CONCAT()的特殊形式,其中,第一个参数是其他参数的分隔符,分隔符的位置要放在链接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数。
			select concat_ws(',','M','y',"SQL");
				M,y,SQL;

		(3)、LENGTH(str)
			select LENGTH('MYSQL');
				5;
		(4)、LEFT(STR,LEN)
			返回字符串str最左边的len个字符串,代码如下:
			select LEFT('MySQL5.0',2);
				My
		(5)、RIGHT(str,len)
			该函数将返回字符串str最右边的len个字符,代码如下:
			select RIGHT("MySQL5.0",2)
				.0
		(6)、SUBSTRING(str,pos)
			该函数将返回从字符串str的起始位置至pos位置为止的字符串
			select SUBSTRING("MySQL5.0",2);
				ySQL5.0
	LEFT,RIGHT,SUBSTRIING三个函数对于多字节字符串只运算一次,即它们会把汉字认成一个字符。
		(7)、REPALCE(str,from_str,to_str);
		该函数返回字符串str,其中子字符串from_str将被字符串to_str代替,如下
			select REPLACE("www.shopnc.net",'.net','.cn');
				www.shopnc.cn
		(8)、REPEAT(str,count)
		该函数将返回由重复count次的字符串str组成一个字符串。如果count <=0,则返回一个空字符串,如果str或count是NULL,则返回NULL;
		(9)、REVERSE(str)
			该函数返回返回颠倒字符顺序的字符串str。
	3.9、常用的日期和时间函数
		(1)、TO_DAYS(date)
			给出一个日期date,返回一个天数(从0年开始到data的天数),如下:
			select TO_DAYS('2008-08-08');
				733627;
			查询最近15天内的会员注册信息,代码如下:
			select * from nc_number where TO_DAYS(NOW())-TO_DAYS(FROM_UNIXTIME(regist_time)) <=15
		(2)、CURRENT_DATE(),CURRENT_TIME()
		取得当前的日期和时间
		(3)、FROM_UNIXTIME(),UNIX_TIMESTAMP()
		时间戳转换函数:
			FROM_UNIXTIME将时间戳转换为年月日时分秒格式
			UNIX_TIMESTAMP将年月日时分秒转换为时间戳
		(4)、UTC_DATE(),UTC_TIME(),UTC_TIMESTAMP()
			获得当前UTC的日期时间。
		(5)、YEAR(),MONTH(),DAY(),HOUR(),MINUTE(),SECOND()
		以上函数将返回所需的年、月、日、时、分、秒。
		(6)、ADDDATE()
			在起始时间上加上一定的天数。
			select ADDDATE('2011-04-13',3);
				2011-04-16;
		(7)、SUBDATE()
			起始时间减去一定的天数
			select SUBDATE('2011-04-13',3);
				2011-04-10
		(8)、DATEDIFF(D1,D2)
			返回起始时间d1和结束时间d2的天数
	3.10、导入数据
		(1)、LOAD DATA INFILE
			LOAD DATA INFILE语句用于将定界文本文件导入到MySQL表中。
			格式如下:
				LOAD DATA [LOW_PRIORITY | CONCURRENT][LOCAL] INFILE 'filename'
				[REPLACE | IGNORE ] INTO TABLE table_name
				[CHARACTER SET charset_name]
				[FIELDS 
				[TERMINATED BY 'character'][[OPTIONALLY]ENCLOSED BY 'character']
				[ESCAPED BY 'character']
				]
				[LINES 
				[STARTING BY 'character'][TERMINATED BY 'xharacter']
				]
				[IGNORE number lines][SET column_name = expression,...]
			例如:
				LOAD DATA LOCAL INFILE 'shop.txt' INTO TABLE shop FIELDS TERMINATED BY ',' ENCLOSED BY '\' ESCAPE BY '\\' LINES TERMINATED BY '\n';
			注意:
			* : 如果不使用LOCAL,则执行用户必须拥有FILE权限。
			* : 使用LOAD DATA LOCAL INFILE语句时,要设置local-infile=0选项启动MySQL的守护进程。
		(2)、mysqlimport
		语法如下:
			mysqlimport [options] database textfile1[textfile2 ... textfileN]

		一些mysqlimport选项:
			-c:当目标文件中字段的数量或者顺序与表不匹配时,应当使用此选项。
			-C:假设双方都支持压缩,此选项将在客户端和服务器之间压缩数据流。如果要加载的目标文件个数据库不在相同的服务器上,该选项最为有效。
			-#:此选项用于在调试时创建跟踪文件。
			-d:此选项在导入目标文件的数据之前删除目标表中的内容。
			-f:此选项包括mysqlimport,即使在发生错误的时候也要继续执行。
			-h:连接服务器主机地址。
			-i:忽略目标文件中与表中已有记录有相同主键或唯一键的记录。
			-L:此选项指定目标文件位于客户端,默认情况下,认为此文件位于数据库服务器中。因此,如果远程执行次命令,而且没有文件上传到数据库,则需要包含此选项。
			-P:如果目标MySQL服务器运行在非标准端口,则需要用此选项来指定该端口。
			-r:覆盖表中有相同主键或者唯一键的已有记录。
			-s:只输出错误信息。
			-S:如果在启动mysql服务器时声明了非默认的socket文件,则应当包括此选项。
			-v:输出大量关于其行为可能有用的信息。
			-V:输出并退出版本信息。
	3.11、导出数据
		(1)、SELECT INTO OUTFILE将查询的结果输出到文本文件中;
			例如:
				SELECT * INTO OUTFILE '/tmp/data.txt' FROM shop;

			注意:
				*:如果没有指定目标文件路径,则是用当前数据库的目录。
				*:执行用户必须拥有目标表的选择权限。
				*:如果指定了目标文件路径,则MySQL守护进程拥有者必须拥有写入目标目录的足够权限。
				*:次语句执行后有一个意外的副作用是谁都可以读/写目标文件。因此,如果要编写备份过程的脚本,则要在查询结束时以编程的方式修改文件的权限。
				*:如果目标文本文件已经存在,则查询失败。
		(2)、mysqldump
4.MySQL数据库开发
	1.数据类型
		1.1、数值类型列
			数值类型列涉及整数类型与浮点类型两类。
			MySQL提供了5种数据类型,分别是TINYINT、SAMLLINT、MEDIUMINT、INT(INTEGER)和BIGINT

			浮点类型数据列包括:FLOAT、DOUBLE和DECIMAL
			*:FLOAT[(M,D)]:小浮点数。M是小数的总位数,D是小数点后面的为数。
			*:DOUBLE[(M,D)]:普通浮点数,M是小数的总位数,D是小数点后面的为数。
			*:DECIMAL[(M[,D])]:压缩的"严格"定点数,M是贤淑位数的总数,D是小数点后面的位数。小数点和负数的'-'号不包括在M中。
		1.2、字符串类型列

			列类型					存储需求
			CHAR(M)					M个字节,0<=M<=255
			VARCHAR(M)				L+1个字节,L<=M且0<=M<=65535
			BINARY(M)				M个字节,0<=M<=255
			VARBINARY(M)			L+1个字节,L<=M且0<=M<=255
			TINYBLOB,TINYTEXT		L+1个字节,其中L<28
			BLOB,TEXT 				L+2个字节,其中L<216
			MEDIUMBLOB,MEDIUMTEXT	L+3个字节,其中L<224
			LONGBLOB,LONGTEXT		L+4个字节,其中L<232
			ENUM('value1','value2',....)	1或2个字节,取决于枚举值的个数(最多65535个值)
			SET('value1','value2',...)	1,2,3,4或8个字节,取决于SET成员的数目(最多64个成员)

			CHAR是一种固定长度的类型,而VARCHAR是一种可变长度的类型。在CHAR(M)类型的数据列内,每个值要占M个字节,若小于M,则MySQL会在她的右边用空格来补足,但是在查询时,这些空格会被去掉。而在VARCHAR(M)类型的数据列里,除了存放数据所占用的字节外,还要再占用一个字节来记录起内容长度,多余的空格将会在以后的插入过程中被去掉。
	2.字符集支持
		使用SHOW CHARACTER SET语句列出可用的字符集。
		校对规则一般有如下特征:
			*:两个不同的字符集不能有相同的校对规则。
			*:每个字符集都有一个默认的校对规则。例如utf8默认的校对规则是utf8_general_ci.
			*:存在校对规则的约定,它们以与其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。
	3.索引的使用
		3.1、数据库索引
			索引的优点:
				查询优化
				唯一性
				文本搜索
		3.2、主要索引介绍
			*:主键索引:用于根据主键自身的唯一性来唯一标识每条记录。因此,该键必须是该记录所表示的实体拥有的唯一值,或者是数据库生成的唯一值。
			*:唯一索引:与主键索引一样,唯一索引也可以防止创建重复的值,但是不同之处在于每一个表只能有一个主键索引,但是可以有多个唯一索引。
			*:常规索引:你可能经常希望针对非主键索引甚至非唯一索引的字段的搜索进行优化,这种情况很常见,所以应当可以通过为这些字段建立索引来优化这种搜索。
			*:全文索引:全文索引提供了一种高效的方法搜索存储在CHAR,VARCHAR或TEXT数据类型中的文本。
		3.3、索引的最佳实践
			*:只对WHERE和ORDER BY子句中需要的列添加索引。
			*:如果创建诸如INDEX(firstname,lastname)的索引时,就不要创建INDEX(firstname),因为MySQL能搜索索引前缀。
			*:对于准备创建索引的列要使用属性NOT NULL,这样就永远不会存储NULL值了。
			*:对于不使用索引的查询,使用选项-log-long-format来记录日志。然后检查日志文件,从而查询进行相应的调整。
			*:EXPLAIN语句有助于确定MySQL如何执行查询,展示表是如何连接的,以及按照怎样的顺序进行连接。这对于确定如何编写优化的查询及是否应当增加索引非常有用。

			添加索引的建议:
			*:最好使用唯一化的索引。一般情况下,当查询优化程序发现某个数据在超过30%的行里都有出现时,通常会不使用索引而进行全盘扫描。
			*:索引长度要尽量短。如果要对一个字符串的类型字段添加索引,如有可能,应指定一个前缀长度,不如给一个char(50)型的字段添加索引,如果他的前10个字节不同而后面的基本相同,那么可以只对者前10个字节创建索引,这样减少了索引所占空间有可以加快检索速度。
			*:要充分利用最左侧前缀。如果对某表中的c1,c2,c3的三个列创建一个复合索引,索引项的顺序为c1,c2,c3,那么这个复合索引适用于以下的检索条件:
				c1,c2,c3
				c1,c2
				c1
			*:不宜建立过多的索引。
			*:查看日志记录。将慢查询记录到日志文件内,通过查看记录的内容决定是否添加索引来优化语句。
	4.事务处理
		4.1、非事务实现方法
			在非事务处理的环境里,我们可以通过锁定数据表来解决并发类问题。
			锁定数据表就是在执行操作的开始和末尾分别加上LOCK TABLES和UNLOCK TABLES语句,先把会用到的有关数据表全部锁定,然后执行要进行的SQL操作,最后再解除对表的锁定。
		4.2、事务实现方法
			1.BEGIN、COMMIT、ROLLBACK方法
			 	首先执行BEGIN来禁用自动提交模式,进入事务处理过程,如果事务提交过程未出现错误执行COMMIT将事务写入数据库,如果提交出错执行ROLLBACK取消修改的数据提交。
			 2.SET AUTOCOMMIT方法
			 	事务处理的另一种方法就是使用SET语句来改变自动提交模式的方法,语法如下:
			 	SET AUTOCOMMIT=0;//关闭自动提交模式
			 	SET AUTOCOMMIT=1;//开启自动提交模式
	5.外键与数据的完整性
		声明外键的语法如下:
			FOREIGN KEY('index_name')
			PEFERENCES 'tbl_name' ('index_columns')
			[ON DELETE ACTION]
			[ON UPDATE ACTION]
			各自段说明:
				*:index_name为子表的外键字段名,tbl_name为父表名称,index_columns为外键所关联的父表字段。
				*:ON DELETE用来说明当父记录被删除时,子表怎样变化。它分为以下几种情况:
					1.ON DELETE CASCADE:当父记录被删除时,与之关联的子表记录也会被删除,也就是级联删除;当多个表关联时,我们只须删除一个父表,剩下的级联删除操作InnoDB会为我们自动完成。
					2.ON DELETE NULL:当父记录被删除时,子表中与之匹配的外键将会被设置为NULL(注意,当这个外键字段允许为NULL值时,它也不能置为主键,因为主键是不能为NULL的)
					3.ON DELETE NO ACTION:指定如果试图删除某一行,而该行的键被其他表中的外键所引用,则会产生一个错误并回滚DELETE语句。
				*:ON UPDATE用来说明当父记录被更新时,子表怎样变化。它分为以下几种情况:
					1.ON UPDATE CASCADE:当父表被关联键值更改时,与之关联的子表外键也会被更改。
					2.ON UPDATE NULL:当父表某行被更改时,子表中与之匹配的外键将被设置为NULL.
					3.ON UPDATE NO ACTION:当父表被关联键值更改时,若子表中有外键与之关联,则产生一个错误并回滚UPDATE语句。
				在定义外键时需要注意两点:
					*:构成外键关系的父表列与子表列都必须被索引的,否则不可以创建外键。
					*:父表索引与子表索引相对应的数据列的类型必须是兼容的。
	6.数据库内部语句和语法
		6.1、ALTER DATABASE语法
			ALTER {DATABASE | SCHMA} {db_name}
				alter_specification[,alter_specification]...

			alter_specification:
				[DEFAULT] CHARACTER SET charset_name
				|[DEFAULT] COLLATE 	collation_name

			ALTER DATABASE用于更改数据库的全局特性,这些特性存储在数据库目录的db.opt文件中。要使用ALTER DATABASE,需要获得数据库的ALTER权限。CHARACTER SET用于更改默认数据库的字符集,COLLATE用于更改数据库默认的校对规则。
			例如:
				ALTER DATABASE 'shop' CHARACTER SET utf8 COLLATE utf8_genneral_ci;
		6.2、ALTER TABLE语法
			ALTER [IGNONE] TABLE tbl_name
				alter_specification [,alter_specification]

			alter_specification:
				ADD [COLUMN] column_definition [FIRST | ATLER col_name]
				| ADD [COLUMN] (column_definition,...)
				| ADD INDEX [index_name] [index_type] (index_col_name,...)
				| ADD [CONSTRAINT [symbol]] PRIMERY KEY [index_type](index_col_name,...)
				| ADD [CONSTRAINT [symbol]] UNIQUE [index_name] [index_type](index_col_name,...)
				| ADD [FULLTEXT|SPATIAL][index_name](index_col_name,...)
				| ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_key](index_col_name,...)[refrence_definition]
				| ADD [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
				| CHANGE [COLUMN] old_col_name column_definition
				[FIRST|AFTER] col_name
				| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
				| DROP [COLUMN] col_name
				| DROP PRIMARY KEY
				| DROP INDEX index_name
				| DROP FOREIGN KEY fk_symbol
				| DISABLE KEYS
				| ENABLE KEYS
				| RENAME [TO] new_tbl_name
				| ORDER BY col_name
				| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
				| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name】
				| DISCARD TABLESPACE
				| IMPORT TABLESPACE
				| table_options
				| partition_options
				| ADD PARTITION partition_definition
				| DROP PARTITION partition_names
				| COALESCE PARTITION number
				| REORGANIZE PARTITION partition_names INTO (partition_definitions)
				| ANALYZE PARTITION partition_names
				| CHECK PARTITION partition_names
				| OPTIMIZE PARTITION partition_names
				| REBUILD PARTITION partition一names
				| REPAIR PARTITION partition_names				
			ALERT TABLE用于更改表的结构。
			几种常见的操作:
				(1)、添加列
					ALTER TABLE ADD [COLUMN] column_definition

					alter table 'product' add column 'price' int default '0' null after 'count';
				(2)、增加索引
					ALTER TABLE ADD[INDEX | PRIMARY KEY | FULLTEXT ][index_name][index_type](index_col_name,...)

					ALTER TABLE 'product' ADD INDEX 'p_count_key' ('count');
				(3)、增加外键
					ALTER TABLE ADD FOREIGN KEY [index_name](index_col_name,...)
					只有InnoDB支持外键
				(4)、更改表信息
					CHANGE olc_col_name column_definition

					对列进行重命名
					ALTER TABLE 'product' CHANGE price new_price INTEGER NOT NULL;

					只修改列类型:
					ALTER TABLE 'product' CHANGE price price BGIINT NOT NULL;

					当使用MODIFY来改变列的类型的时候补血药重命名:
					ALTER TABLE 'product' MODIFY price BIGINT NOT NULL;
				(5)、停止更新、重新创建索引
					ALTER TABKE ... DISABLE KEYS首先让MySQL停止更新表中的非唯一索引,然后使用ALTER TABLE ... ENABLE KEYS 重新创建丢失的索引,在进行大批量数据插入操作前建议先禁用索引,插入完后在更新索引,这样可以加快执行速度。
				(7)、分区
					ALTER TABLE即可以用来对带分区的表进行重新分区(包括添加、取消、合并和拆分各分区),也可以用来对分区进行维护。
					对带分区的表使用partion_options子句和ALTER TABLE可以对表进行重新分区,假设有一个按照以下方式创建的带分区的表,代码如下:
						CREATE TABLE t1(
						id INT,
						year_col int
						)
						PARTITION BY RANGE(year_col)
						(
							PARTITION p0 VALUES LESS THAN (1991),
							PARTITION p1 VALUES LESS THAN (1995),
							PARTITION p2 VALUES LESS THAN (1999),
						);
						可以在表中增加一个新的分区片p3,该分区用于存储小于2002的值,添加方法如下:
							ALTER TABLE t1 ADD PARTITION p3 VALUES LESS THAN (2002);

						DROP PARTITION用于取消一个或者多个RANGE或LIST分区。DROP PATITION命令不能用于HASH或KEY分区,当用于这两个分区时,应使用COALESCE PARTITION.如果被取消的分区其名称列于patition_names清单中,则存储在此分区中的数据也会被取消。例如,如果一定义了表t1,则可能采用如下方法取消名称为p0和p1的分区:
							ALTER TABLE DROP PARTITION p0,p1;
						ADD PARTITION和DROP PATITION目前不支持IF [NOT] EXISTS,它们也不可能对一个分区或一个一份去的表进行重命名。如果希望对一个分区进行重命名,则必须先取消分区在重新建立分区;如果希望对一个以分区的表进行重新命名,也必须取消所有分区,然后对表进行重命名,在添加被取消的分区。

						COALESCE PARTITION可以用于使用HASH或KEY分区的表,一边使用number来减少分区的数目。例如,假设使用下列方法创建了表t2:
							CREATE TABLE T2(
								name VARCHAR(20),
								started DATE
							)	
							PARTITION BY HASH(YEAR(started))
							PARTITIONS(6);
						可以使用以下命令把t2使用的分区数目有6个减少到4个:
							ALTER TABLE t2 COALESCE PATITION 2;
						包含在最后一个number分区中的数据将被合并到其余的分区中。在此情况下,分区4和分区5将被合并到前4个分区中(编号为0、1、2和3的分区)。
						如果要更改部分分区,但不更改所有的分区,可以使用REORGANIZE PARTITION。这个命令有多种使用方法:
						□把多个分区合并为一个分区。通过把多个分区的名称列入partition_names清单,并为
						partition_definition提供一个单一的定义,可以实现这个功能。
						□把一个原有的分区拆分为多个分区。通过为partition_names命名一个分区,并提供多
						个partition_definitions,可以实现这个功能。
						□更改使用VALUES LESS THAN定义的分区子集的范围或更改VALUES IN定义的分区
						子集。
						□对于没有明确命名的分区,MySQL会自动提供默认名称p0、pi、p2等
		6.3、CREATE DATABASE语法
			CREATE{DATABASE | SCHEMA } [IF NOT EXISTS] db_name 
				[create_specification[,create_specification]...]

			create_specification:
				[DEFAULT] CHARACTER SET charset_name
				|[DEFAULT] COLLATE collation_name

		6.4、CREATE INDEX语法
			CREATE INDEX命令用于向表中添加索引,语法如下:
				CREATE [UNIQUE | FULLTEXT|SPATIAL] INDEX index_name
					[USING index_type]
					ON tbl_name (index_col_name,...)
				index_col_name:
					col_name [(length)] [ASC|DESC]
			创建一个多列索引时,各列名称以逗号隔开即可。
			CHAR和VARCHAR列可以全部或者只用列的一部分来创建索引。创建索引时使用col_name(length)语法只对指定长度的前缀进行索引,这样可以减少索引文件的大小,节省磁盘空间,并能提高insert与delete的索引速度。
				BLOB,TEXT列也可以编制索引,单必须指定前缀长度。
				例如:
					CREATE INDEX index_p_name ON product (p_name(10));
			FULLTEXT索引只能对CHAR,VARCHAR和TEXT列创建索引,并且只能针对MyISAM表。
		6.5、CREATE TABLE语法
			CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
				[(create_definition,...)]
				[table_options] [select_statement]

			或
			CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
				[(] LIKE old_tbl_name [)];

			create_definition:
			 	column_definition
				|[CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name, ...) 
				| KEY [index_name] [index_type] (index_col_name,..)
				| INDEX [index_name] [index_type] (index_col_name,...)
				| [CONSTRAINT [symbol]] UNIQUE [INDEX]
					[index_name] [index_type] (index_col_name,...)
				| [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...)
				| [CONSTRAINT [symbol]] FOREIGN KEY
					[index_name] (index_col_name,...) [reference_definition]
				| CHECK (expr)
				
			column_definition:
				col_name type [NOT NULL | NULL] [DEFAULT default_valueJ
				[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] 
				[COMMENT 'string'] [reference_definition]

			type:
				TINYINT[(length)) [UNSIGNED] [ZEROFILL]
				| SMALLINT[(length)] [UNSIGNED] [ZEROFILL] 
				| MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] 
				| INT[(length)] [UNSIGNED] [ZEROFILLJ
				| INTEGER!(length)] [UNSIGNED] [ZEROFILL]
				| BIGINTl(length)] [UNSIGNED] [ZEROFILL]
				| REAL [(length,decimals)] [UNSIGNED] [ZEROFILLJ
				| DOUBLE[(length,decimals >] [UNSIGNED] [ZEROFILL] 
				| FLOAT[(length,decimals> [UNSIGNED] [ZEROFILL] 
				| DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
				| NUMERIC(length,decimals > [UNSIGNED] [ZEROFILL] 
				| DATE
				| TIME
				| TIMESTAMP
				| DATETIME
				| CHAR(length) 【BINARY | ASCII | UNICODE]
				| VARCHAR(length) (BINARY]
				| TINYBLOB
				| BLOB
				| MEDIUMBLOB
				| LONGBLOB
				| TINYTEXT [BINARY]
				| TEXT [BINARY]
				| MEDIUMTEXT [BINARY]
				| LONGTEXT [BINARY]
				| ENUM(valuel,value2,value3,...)
				| SET{valuel1,value2,value3,...)
				| spatial_type
			index_col_name:
				col_name [(length)] [ASC | DESC]
			
			reference_definition:
				REFERENCES tbl_name [(index_col一name,...]
					[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
					[ON DELETE reference_option] 
					[ON UPDATE reference_option]
			reference_option:
				RESTRICT | CASCADE | SET NULL | NO ACTION
			
			table_options: table_option [table_option] ...

			table_option:
					{ENGINE|TYPE} = engine_name
				| AUTO_INCREMENT = value 
				| AVG_ROW_LENGTH = value
				| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] 
				| CHECKSUM = {0 | 1}
				| COMMENT = 'string'
				| CONNECTION = 'connec_string'
				| MAX_ROWS = value
				| MIN_ROWS = value
				| PACK_KEYS = {0 | 1 | DEFAULT}
				| PASSWORD = 'string'
				| DELAY_KEY_WRITE = {0 | 1}
				| ROW_FORMAT = {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDAN|COMPACT} 
				| UNION = (tbl_name[,tbl_name]...)
				| INSERT_METHOD = { NO | FIRST 丨 LAST }
				| DATA DIRECTORY = 'absolute path to directory'
				| INDEX DIRECTORY = 'absolute path to directory'

			partition—options: 
				PARTITION BY
					[LINEAR] HASH(expr)
					| [LINEAR] KEY(column_list> 
					| RANGE(expr) 
					| LIST(column—list)
				[PARTITIONS num]
				[ SUBPARTITION BY
					  [LINEAR] HASH(expr)
					| [LINEAR] KEY(column_list)
					[SUBPARTITIONS(num)]
					]
					[(partition_definition) ,[(partition_definition)],...]
			partition_definition:
				PARTITION partition_name
					[VALUES {
							LESS THAN (expr) | MAXVALUE 
							| IN (value_list) }]
					[[STORAGE] ENGINE [=] engine-name]
					[COMMENT [=] 'comment_text']
					[DATA DIRECTORY [=] 'data_dir']
					[INDEX DIRECTORY [= 'index_dir']
					[MAX_ROWS [=] max_number_of_rows] 
					[MIN_ROWS [=] min_number_of_rows]
					[TABLESPACE [=] (tablespace_name)] 
					[NODEGROUP [=] node_group_id] 
					[(subpartition_definition) , [(subpartition_definition)],...]
			subpartition_definition: 
				SUBPARTITION logical_name
					[[STORAGE] ENGINE [=] engine-name] 
					[COMMENT [=] 'comment_text'] 
					[DATA DIRECTORY [=] 'data_dir']
					[INDEX DIRECTORY [=] 'index_dir'] 
					[MAX_ROWS [=] max_number_of_rows] 
					[MIN_ROWS [=] min_number_of_rows]
					[TABLESPACE [=] (tablespace_name)]
					[NODEGROUP [=] node_group_id]
			select—statement:
					[IGNORE | REPLACE】 [AS] SELECT ... (Some legal select statement)

			当创建表个时候,可以使用TEMPOPARY临时表。只有在当前连接的情况下,TEMPOPARY表才是可用的,但是不可见。当链接关闭时,TEMPOPARY表被自动取消,

			每个表都可以创建一个AUTO_INCREMENT自增列,当插入一个NULL值或0时,该列会自动加1且该列必须被定义一种整数类型。可以设置--sql-mode服务器选项或吧sql-mode系统变量指定为NO_AUTO_VALUE_ON_ZERO(即执行SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO'),这样就可以把0存储到AUTO_INCREMENT列中,同事不会生成一个新的序列值。

			DEFAULT字句用于为列指定一个默认值。默认值必须为一个常数,不能为函数或表达式。但是有一种情况例外,可以对TIMESTAMP列指定CURRENT_TIMESTAMP为默认值。注意,MySQL日期列的默认值不能被设置为函数,如NOW()或CURRENT_DATE.BLOB和TEXT列不能被赋予默认值。

			PRIMARY KEY是一个唯一的KEY,一个表最多有一个PRIMARY KEY。

			可以使用SHOW INDEX FROM talbe查看表的索引情况。

			*:AUTO_INCREMENT:可以用ALTER TABLE tbl_name AUTO_INCREMENT = N来重新设置AUTO_INCREMENT的值。

			*:CHARACTER SET:用于为表指定一个默认的字符集。CHARSET与CHARACTER SET同义.

			*:COLLATE:用于为表指定一个默认的校验规则.

			*:CHECHSUM:如果希望MySQL随时对所有行进行实时校验求和,则应该把此项设置为1.这样做,表的更新速度会略慢些,但是更容易找到受损的表。CHECKSUM TABLE语句用于报告校验求和(仅限于MyISAM).

			*:COMMIT:用于表的注释,最长60个字符。

			*:MAX_ROWS:用于储存表中的行数目的最大值。这不是一个硬性限制,而更像一个指示语句,指示出表必须能存储至少这么多行。

			*:MIN_ROWS:用于存储表中的行数目的最小值。

			*:PACK_KEYS:如果希望索引更小,则把此选项设置为1,这样做通常会是更新速度变慢,同时阅读速度加快。设置为0,取消所有关键字压缩。把此选项设置为DEFALT时,存储引擎只压缩长的CHAR和VARCHAR列。

			*:DELAY_KEY_WRITE:如果要延迟对关键字的更新,乳等到表关闭的后在更新,则把此项设置为1,如果想复制现有表中的结构与数据创建一个新表,则可以执行CREATE TABLE ... SELECT语句:
				CREATE TABLE new_table SELECT * FROM table;
			注意,该语句不会自动创建任何索引,如果希望为一创建的表建立索引,则应在SELECT语句前指定索引,语法如下:
				CREATE TABLE new_table (PRIMARY KEY ('ID')) SELECT * FROM table;

			也可以明确的为一个已生成的列指定类型,语法如下:
				CREATE TABLE newtable (A TINYINT NOT NULL) SELECT p_count+1 as a FROM table;
			要想复制原表中定义的所有列属性和索引,可以用LIKE创建一个空表,语法如下:
				CREATE TABLE new_table LIKE table;
	6.6 RENAME TABLE语法
		RENAME TABLE tb1_name to new_tb1_name
			[,tb1_name2 TO new_tb1_names] ...

7、数据库操作语句和语法
	7.1、DELETE 语法
		单表删除语法:
			DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
				[WHERE where_definition]
				[ORDER BY ...]
				[LIMIT row_count]
		多表删除语法:
			DELETE [LOW_PRIORITY] [QUICK] [IGNORE]  tbl_name[.*][,tbl_name[.*] ...] 
			FROM table_references
				[WHERE where_definition]
	7.2、DO语法
		DO expr [,expr]...

		DO用于执行表达式,但不返回任何结果。DO是SELECT expr的简化表达方式,不返回结果,速度较快。
	7.3、HANDLER语法
		HANDLER tbl_name OPEN [AS alias]
		HANDLER  tbl_name READ index_name { = | >= | <= | <} (value1,value2,...)
			[WHERE where_condition][LIMIT ...]
		HANDLER  tbl_name READ index_name { FIRST | NEXT | PREV | LAST} 
			[WHERE where_condition][LIMIT ...]
		HANDLER  tbl_name READ { FIRST | NEXT } (value1,value2,...)
			[WHERE where_condition][LIMIT ...]

		HANDLER tbl_name CLOSE

		HANDLER语句提供了通往表存储引擎接口的直接通道,可用于MyISAM和InnoDB表。HANDLER...OPEN语句用于打开一个表,通过HANDLER...READ语句建立读取表的通道,且不会被其他线程共享,也不会关闭,直到线程调用HANDLER...CLOSE或线程中止时为止。如果使用一个别名打开表,则使用其他HANDLER语句时必须使用次别名,而不能使用表名。
			使用HANDLER语法打开与关闭产品表的语法如下:

			HANDLER nc_product OPEN;

			HANDLER nc_product CLOSE;

			使用别名打开:
			HANDLER nc_product OPEN as V;

			HANDLER V CLOSE;

		如果被指定的索引满足给定的值并且符合WHERE条件,在没有LIMIT时,HANDLER ...READ只取出一行。例如取出价格大于1200元的商品,由于没有使用LIMIT,因此他只取得符合条件的一行结果,代码如下:
			HANDLER nc_product READ index_p_price > (1200);

			'index_p_price'是p_price列的索引名称,此处不可以写成p_price>1200.

			如果加上WHERE条件,取出商品价格高于1200元的并且库存少于10的前4条信息你,代码如下:

			HANDLER nc_product READ index_p_price > (1200)
			where p_price < 10 limit 4;

			如果使用PRIMERY KEY为条件时,应使用带引号的标识符'PRIMARY',大妈如下

			HANDLER tbl_name READ 'PRIMARY' > (...);
	7.4、INSERT语法
		INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [INGORE]
			[INTO] tbl_name [(col_name,...)]
			VALUES ({expr | DEFAULT},...),(...),...
			[ON DUPLICATE KEY UPDATE col_name=expr,...]

			或

			INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [INGORE]
				[INTO] tbl_name
				SET col_name={expr | DEFAULT},...
				[ON DUPLICATE KEY UPDATE col_name=expr,...]
			或
			INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY ] [INGORE]
				[INTO] tbl_name [(col_name,...)]
				SELECT ...
				[ON DUPLICATE KEY UPDATE col_name=expr,...]
		INSERT命令有三种形式。分别是:
			*:INSERT INTO 表名(字段名,字段名)VALUES(值,值)
			*:INSERT INTO 表名 SET 字段名=值
			*:INSERT INTO 表名 SELECT ...

		INSERT用于向一个已有的表中插入新行
			*:IGNORE关键词用于在执行INSERT时把出现的错误当成警告来处理。
			*:ON DUPLICATE KEY UPDATE用于批量插入与更新。如果要插入的UNIQUE索引或者PRIMARY KEY值已存在,则进行UPFATE更新操作,如果不存在,则执行INSERT插入操作。

	7.5、LOAD DATA INFILE语法
		*:各列以TAB分割,各行以换行分隔,数值的顺序与导入表中的顺序一致。
		*:LOCAL关键字表示该命令会从本地读取文件,并将文件上传到服务器,如果没有LOCAL,命令将会从服务器读取该文件。
		语法如下:
			LOAD DATA [LOW_PRIORYTY | CONCURRENT ][LOCAL] INFILE 'file_name.txt' 
			[REPLACE | IGONRE]
			INTO TABLE tbl_name
			[FIELDS
				[TERMINATED BY 'string']
				[[OPTIONALLY] ENCLOSED BY 'char']
				[ESCAPED BY 'char']
			]
			[
				LINES
					[STARTING BY 'string']
					[TERMINATED BY 'string']
			]
			[IGNORE number LINES]
			[(col_name_or_user_var,...)]
			[SET col_name = expr,...]

	7.6、FIELDS分隔符
		*:TERMINATED BY 为字段分隔符,默认是tab(\t);
		*:ENCLOSED BY 字段括起字符。
		*:ESCAPED BY 转义字符,默认的是反斜杠(\);
		*:LINES关键字指定了每行记录的分隔符,默认为'\n'是换行符;
		*:LOAD DATA INFILE 默认的导入规则如下:
			a. 在新行处寻找行的边界。
			b. 不会跳过任何行的前缀。
			c. 在制表符处把行分解为字段。
			d. 不希望字段被包含在任何引号字符之中。
			e. 出现制表符、新行或者在'\'前有'\'时,则作为字段值的一部分的文字字符。
		*:与之相反,SELECT ... INTO OUTFILE默认导入规则如下:
			a. 把字段之间写入制表符。
			b. 不把字段包含在任何引号字符中。
			c. 当字段中出现制表符、新行或'\'时,则是用'\'进行转义。
			d. 在行的末尾插入新行。
	7.7、REPLACE语法
		REPLACE的语法规则如下:

		REPLACE [LOW_PRIORITY | DELAYED]
			[INTO] tbl_name [(col_name,...)]
			VLAUES ({EXPR | DEFUAL},...),(...),...
		或
		REPLACE [LOW_PRIORITY | DELAYED]
			[INTO] tbl_name
			SET col_name={expr | DEFAULT},...
		或
		REPLACE [LOW_PRIORITY | DELAYED]
			[INTO] tbl_name [(col_name,...)]
			SELECT ...
		RELACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或者UNIQUE的索引的新纪录具有相同的值,则在新纪录被插入之前,就记录会被删除。注意,除非表中有一个PRIMARY KEY或UNIQUE索引,否则使用一个REPLACE语句是没有意义的。
	7.8、SELECT语法
	7.9、TRUNCATE语法
	7.10、UPDATE语法
		UPDATE [LOW_PRIORATY][IGNORE] tbl_name
		SET col_name1=axpr1[,col_name2=axpr2 ...]
		[WHERE where_definition]
		[ORDER BY ...]
		[LIMIT row_count]
	7.11、EXPLAIN语法
		EXPLAIN tbl_name;

		或者
		EXPLAIN SELECT select_options

		EXLPAIN tbl_name 语句和DESCRIBE tbl_name语句意义相同,用于显示表结构信息。EXPLAIN SELECT select_options用来取得SELECT语句的相关信息。MYSQL会解释如何运行该SELECT语句,显示的结果包括如何连接、连接的顺序、使用索引等信息。从而优化SQL提供参考。下面展示各种信息的解释:
			*:ID:MySQL查询的序列号;
			*:Select_type:所使用的查询类型,主要有以下几种:
				1)、DEPENDENT SUBQUERY:子查询内层的第一个SELECT,依赖于外部查询的结果集。
				2)、DEPENDENT UNION:子查询中的UNION,	且为UNION中从第二个SELECT开始的后面所有的SELECT,同样依赖于外部查询的结果集。
				3)、PRIMARY:子查询的最外层查询,注意并不是主键查询。
				4)、SIMPLE:除子查询或UNION查询之外的查询;
				5)、SUBQUERY:子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集。
				6)、UNCACHEABLE SUBQUERY:结果集无法缓存的子查询。
				7)、UNION:UNION语句中第二个select开始后面的所有SELECT,第一个SELECT为PRIMARY.
				8)、UNION RESULT:UNION中的合并结果。
			*:Table:显示这一步缩放问的数据库中表的名称。
			*:Type:告诉我们对表的访问方式,下面列出了几种常见的类型。
				1)、system:系统表,表中只有一行数据。
				2)、const:读常量,最多只会有一条匹配记录,由于是常量,所以实际上只须读一次。
				3)、eq_ref:最多只会有一条匹配结果,一般是通过主键或者唯一索引来访问的。
				4)、ref:表关联不是基于主键或唯一索引的查询。
				5)、index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行合并,在读取表数据。
				6)、index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引。
				7)、unique_subquery:子查询中的返回结果字段组合是主键或唯一约束。
				8)、range:使用索引进行范围扫面;
				9)、index:全索引扫面,只扫描索引树,比All块。
				10)、all:全表扫描。
			*:Possible_keys:该查询可以利用的索引。
			*:Key:MySQL解释器实际使用的索引。
			*:Key_len:被选中索引的索引键长度。
			*:Ref:字段显示了哪些字段或常量被用来和key配合从表中查询记录。
			*:Rows:显示MySQL认为他执行查询时必须检查的行数。
			*:Extra:查询中每一步实现的额外细节信息:
				1)、Using filesort:MySQL匹配完所有WHERE字句后,还需要额外进行拍训才可能得到结果,在这种情况下,一般建议优化以下SQL语句。
				2)、Using temporary:MySQL需要穿讲一个临时表来容纳结果。如查询语句包含可以按不同情况列列出的GROUP BY和ORDER BY字句,在这种情况下,也建议优化SQL语句。

	8.存储过程
		8.1.创建存储过程
			语法如下:
				create procedure sp_name([proc_parameter[,...]])
				begin
					statement block
				end

			存储过程的参数一般由三个不分组成。第一部分in、out或者inout.in表示向存储过程中传入参数,out表示向存储过外传出参数;inout表示定义的参数不仅可以传入存储过程,还可以被存储过程修改后传出存储过程。默认为传入存储过程。第二部分为参数名,第三部分为参数的类型。

			由于存储过程内部的语句要以分号结束,所以在定义存储过程前应将语句结束标志";"更改为其他字符,并且该字符在存储过程中出现的几率应该也比较第。可以用关键字delimiter来更改。

		8.3、调用存储过程
			call sp_name();

		8.4、删除存储过程
			drop procedure sp_name;

		8.5、其他常用命令
			1)、show procedure status;
			2)、show create procedure sp_name;













猜你喜欢

转载自blog.csdn.net/u011489205/article/details/79173607