首页 > 数据库技术 > 详细

MySQL学习笔记(四)

时间:2018-05-06 22:42:55      阅读:209      评论:0      收藏:0      [点我收藏+]

一、索引

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以提高数据库中特定数据的查询速度。

索引的分类:

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 LIKEf%;
/*获取以f开头的存储过程的信息*/
SHOW FUNCTION STATUS LIKEf%;
/*查看存储过程和函数信息*/
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;
  SELECTA >=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学习笔记(四)

原文:https://www.cnblogs.com/niniya/p/8987903.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!