MySQL学习笔记
Posted 泥泥呀的学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习笔记相关的知识,希望对你有一定的参考价值。
一、索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以提高数据库中特定数据的查询速度。
索引的分类:
1、普通索引,允许在定义索引的列中插入重复值和空值。
唯一索引,索引列的值必须是唯一,但允许有空值。
2、单列索引,一个索引只包含单个列,一个表可以有多个单列索引。
组合索引,指在表的多个字段组合上创建索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合。
3、全文索引,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。mysql中只有myisam存储引擎支持全文索引。
4、空间索引,是对空间数据类型的字段建立的索引。创建空间索引的列,必须将其声明为not null,空间索引只能在myisam存储引擎的表中创建
索引设计原则:
1、索引会占用磁盘空间,所以索引并非越多越好
2、避免对经常更新的表进行过多的索引
3、数据量小的表最好不要使用索引
4、在不同值较多的列上建立索引,不要在不同值少的列上建立索引
5、当唯一性是某种数据本身的特征时,指定唯一索引
创建索引:
[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name[lenght]) [ASC|DESC]
UNIQUE、FULLTEXT、SPATIAL:可选参数,分别表示唯一索引、全文索引、空间索引
INDEX、KEY:意思相同,都是用来表示创建索引
index_name:可选参数,用来指定索引名称
col_name:用于创建索引的数据列,该列必须从表中定义的多列中选择
length:可选参数,表示索引的长度,只有字符串类型的字段才能指定长度
ASC、DESC:指定升序或降序的索引值存储
创建表时创建索引:
/*创建普通索引*/
CREATE TABLE sd ( id INT NOT NULL UNIQUE, NAME CHAR (30) NOT NULL, YEAR DATE, INDEX (ID) );
/*创建唯一值索引,索引名称为un_id*/ CREATE TABLE sd1 ( id INT NOT NULL UNIQUE, NAME CHAR (30) NOT NULL, YEAR DATE, UNIQUE INDEX UN_ID(ID) );
/*创建组合索引,索引名称为inna*/ CREATE TABLE sd2 ( id INT NOT NULL UNIQUE, name CHAR (30) NOT NULL, year DATE, UNIQUE INDEX inna(ID,name) );
在已存在的表上创建索引:
ALTER TABLE sd ADD INDEX D(year);
/*查看索引*/ ALTER TABLE sd DROP INDEX id_2;
table:表名
Non_unique:1代表非唯一索引,0代表唯一索引
key_name:索引名称
seq_in_index:该字段在索引中的位置,单列索引该值为1,组合索引为每个字段在索引定义中的顺序
column_name:定义索引的列名称
sub_part:索引的长度
null:该字段是否能为空
index_type:索引类型
/*用create index 创建索引*/
CREATE INDEX na ON sd(name);
删除索引:
/*删除名为id的索引*/ ALTER TABLE sd drop id;
/*删除名为na的索引*/ DROP INDEX na ON sd;
二、存储过程和函数
1、创建存储过程的语句主体:
CREATE PROCEDURE sp_name ([proc_parameter])
[characteristics...]routine_body
sp_name:存储过程的名称
proc_parameter:存储过程的参数,语句为:[IN|OUT|INOUT] param_name type ,in表示输入参数,out表示输出参数,inout表示既可以是输入也可以输出。param_name为参数名称,type为参数类型。
characteristics:指定存储过程的特性。
可以取值:LANGUAGE SQL 说明routine_body部分由mysql语句组成。
[NOT] DETERMINISTIC 说明存储过程执行的结果是否正确,DETERMINISTIC表示结果确定。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果不确定,相同的输入可能得到不同的 输出。
{CONTAINS SQL| NO SQL | READS SQL DATA | MODIFIES SQL DATA} ,指明子程序使用SQL语句的限制。CONTAINS SQL 表明子程序包含sql语句,但不包含读写数据的语句,NO SQL表明子程序不包含sql语句,READS SQL DATA 表明子程序包含读数据的语句,MODIFIES SQL DATA 表明子程序包含写数据的语句,默认为CONTAINS SQL。
SQL SECURITY{DEFINER | INVOKER} 指明谁有权限来执行。DEFINER 表示只有定义着才能执行,INVOKER表示拥有权限的调用者可以执行。默认为DEFINER。
COMMENT\'string\' 注释信息,可以用来描述存储过程或函数。
routine_body:是sql代码的内容,可以用BEGIN.......END来表示sql代码的开始和结束。
调用存储过程的语句主体
CALL sp_name([parameter[...]])
/*创建存储过程*/ DELIMITER // CREATE PROCEDURE fa (in a int ,in b int) BEGIN SELECT a+b; END// DELIMITER; /*调用存储过程*/ CALL fa(3,4);
使用DELIMITER//语句的作用是将mysql的结束符设置为//,因为mysql默认‘’;‘’为结束符,为了避免与存储过程中的sql语句结束符相冲突,需要改变存储过程的结束符。
2、创建存储函数的语句主体
CREATE FUNCTION func_name ([func_parameter])
RETURNS type
[characteristic...] routine_body
RETURNS type:表示函数返回数据的类型
调用存储函数:方法与使用mysql的内部函数一样。
/*创建存储函数*/ DELIMITER// CREATE FUNCTION fl (a VARCHAR(30)) RETURNS INT BEGIN RETURN (SELECT userid FROM sales WHERE orderid = a); END// DELIMITER; /*调用存储函数*/ SELECT fl(\'4196439032\');
3、查看存储过程和存储函数
/*获取以f开头的存储过程的信息*/ SHOW PROCEDURE STATUS LIKE\'f%\';
/*获取以f开头的存储过程的信息*/ SHOW FUNCTION STATUS LIKE\'f%\';
/*查看存储过程和函数信息*/ SELECT * FROM information_schema.ROUTINES; /*查看名称为fa的信息*/ SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME=\'fa\';
mysql中存储过程和函数的信息都存储在information_schema数据库中的ROUTINES表中。
4、修改存储过程和函数
使用alter语句用于修改存储过程或函数的特性
ALTER {PROCEDURE|FUNCTION} sp_name [characteristic...]
- sp_name:表示存储过程或函数的名称
- characteristic:指定存储函数的特性
- 可取值: CONTAINS SQL 表示子程序包含sql语句,但不包含读或写数据的语句
- NO SQL 表示子程序中不包含sql语句
- READS SQL DATA 表示子程序中包含读数据的语句
- MODIFIES SQL DATA 表明子程序包含写数据的语句
- SQL SECURITY{DEFINER | INVOKER} 指明谁有权限来执行。DEFINER 表示只有定义着才能执行,INVOKER表示拥有权限的调用者可以执行
- COMMENT\'string\' 注释信息,可以用来描述存储过程或函数
5、删除存储过程和函数
DROP {procedure|FUNCTION}[if EXIT] sp_name
三、 流程控制语句
1、if语句
IF expr_condition THEN statement_list [ELSEIF expr_condition THEN statement_list]... [ELSE statement_list] END IF
2、case语句
/*case语句的第一种写法*/
CASE case_expr WHEN when_value THEN statement_list [WHEN when_value THEN statement_list]... [ELSE statement_list] END CASE
case_expr参数表示条件判断的表达式,决定了哪一个when子句会被执行,when_value参数表示表达式可能的值,如果某个when_value的值与case_expr的值相同,则被执行。
/*case语句的另一种写法*/
CASE WHEN expr_condition THEN statement_list [WHEN expr_condition THEN statement_list ] ... [ELSE statement_list ] END CASE
when语句逐个执行,直到某个expr_condition为真时执行对应的then语句。如果没有条件匹配则执行else
3、loop语句、leave语句
loop语句用来重复执行某些语句,与if和case相比,loop只是创建一个循环操作的过程,并不进行条件判断。loop内的语句一直重复执行直到循环被退出,跳出循环过程使用leave子句。
[loop_label:]LOOP statement_list END LOOP [ loop_label]
loop_label:表示loop语句的标注名称
statement_list:表示需要循环执行的语句
/*创建一个名为SA的存储过程*/ DELIMITER// CREATE PROCEDURE SA() BEGIN /*定义变量a,以 DECLARE 关键字声明的变量,只能在存储过程中使用,称为存储过程变量*/ DECLARE a int DEFAULT 0; add_loop: LOOP SET a=a+1; IF a>=20 THEN LEAVE add_loop; END IF; SELECT\'A >=20\'; /*打印A>=20*/ END LOOP add_loop; END// DELIMITER; /*调用存储过程*/ CALL SA();
4、iterate语句
iterate语句意为“再次循环”,将执行顺序转到语句段开头处,只可以出现在loop、while、repeat语句内。
/*创建存储过程,f=0,若f<10,重复执行f+1,当f>=10且小于20时,打印f*/ CREATE PROCEDURE SJ6() BEGIN DECLARE f INT DEFAULT 0; my_loop:LOOP set f=f+1; IF f<10 THEN ITERATE my_loop; /*一直循环到f=10,才跳出iterate,执行下面语句,然后再进入loop循环*/ ELSEIF f>20 THEN LEAVE my_loop; END if; SELECT f; END LOOP my_loop; END; /*调用存储过程*/ CALL SJ6();
结果为f:10,11,12,13,14,15,16,17,18,19
5、repeat语句
repeat语句创建一个带条件判断的循环语句,每次语句执行完毕后,会对条件表达式进行判断,如果表达式为真,则循环结束,否则重新执行循环中的语句。
语句格式为:
[repeat_label:]REPEAT statement_list UNTIL expr_condition END REPEAT [repeat_label]
CREATE PROCEDURE SJ7() BEGIN DECLARE d INT DEFAULT 0; REPEAT SET d=d+1; UNTIL d>=10 END REPEAT; END;
6、while语句
while语句创建一个带条件判断的循环语句,与repeat不同,while在执行语句时,先对指定的表达式进行判断,如果为真,则执行循环内的语句,否则退出循环。
[while_label]:WHILE expr_condition DO statement_list END WHILE [while_label]
CREATE PROCEDURE SJ8() BEGIN DECLARE g INT DEFAULT 0; WHILE g<0 DO SET g=g+1; END WHILE; END
四、视图
视图是一个虚拟表,是从数据库中一个或多个表中导出的表。视图也可从已存在的视图的基础上定义。视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化;若基本表的数据发生变化,则这种变化也自动反映到视图中。
视图的作用:1、简单化:经常被使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部条件。
2、安全性:通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既不能看见也取不到。
3、逻辑数据独立性:视图可帮助用户屏蔽真实表结构变化带来的影响。
1、创建视图
CREATE [OR REPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW view_name[(column_list)] AS SELECT_statement [WITH[CASCADED|LOCAL]CHECK OPTION]
- CREATE:表示创建视图
- REPLACE:表示替换已经创建的视图
- ALGORITHM:表示视图选择的算法。取值UNDEFINED表示mysql将自动选择算法;MERGE表示将使用的视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分;TEMPTABLE表示将视图的结果存入临时表,然后用临时表来执行语句
- view_name:为视图名称
- column_list:为属性列
- SELECT_statement:表示select语句
- [WITH[CASCADED|LOCAL]CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内。CASCADED为默认值,表示更新视图时要满足所有相关视图和表的条件,LOCAL表示更新视图时满足该视图本身定义的条件即可。
/*创建视图,列名称为id,date*/ CREATE VIEW view_s(id,date)AS SELECT userid, orderdate from sales; /*从视图中查询数据*/ SELECT * from view_s;
/*在多个表上创建视图*/ CREATE VIEW view_sc AS SELECT sales.orderdate,city.city FROM sales,city WHERE sales.userid=city.userid;
2、查看视图
DESCRIBE view_sc;
SHOW TABLE STATUS LIKE \'view_sc\'
3、修改视图
修改视图的语句与创建视图的语句完全一样。当视图已经存在时,修改语句对其进行修改,当视图不存在时,创建视图。
CREATE [OR REPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW view_name[(column_list)] AS SELECT_statement [WITH[CASCADED|LOCAL]CHECK OPTION]
修改视图的另一种语句,alter语句。
ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW view_name[(column_list)] AS SELECT_statement [WITH[CASCADED|LOCAL]CHECK OPTION]
/*创建视图*/ CREATE VIEW view_aa AS SELECT * FROM aa; /*修改视图*/ CREATE OR REPLACE VIEW view_aa(var) AS SELECT * FROM aa;
4、更新视图
更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据,对视图的更新实际上是对其基本表进行更新。
/*创建表aa的视图*/ CREATE VIEW view_aa AS SELECT * FROM aa; /*通过视图插入数据*/ INSERT INTO view_aa VALUES(178); 结果:表aa,视图view_aa都增加一条数据 /*通过视图删除数据*/ DELETE FROM view_aa where num=178; 结果:表aa,视图view_aa都删除一条数据 /*在表aa中更新数据*/ UPDATE aa SET num=54; 结果:表aa,视图view_aa都更新了数据
5、删除视图
DROP VIEW[IF EXISTS] view_name[,view_name]... [RESTRICT|CASCADED]
以上是关于MySQL学习笔记的主要内容,如果未能解决你的问题,请参考以下文章