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]

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

时间: 2024-11-25 20:35:49

MySQL学习笔记(四)的相关文章

MySQL学习笔记(四):存储引擎的选择

一:几种常用存储引擎汇总表 二:如何选择 ? MyISAM:默认的MySQL插件式存储引擎.如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性.并发性要求不是很高,那么选择这个存储引擎是非常适合的.MyISAM是在Web.数据仓储和其他应用环境下最常使用的存储引擎之一. ? InnoDB:用于事务处理应用程序,支持外键.如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新.删除操作,那么InnoDB存储引擎应

MySQL学习笔记四:字符集

1.字符集就是字符和其编码的集合,查看数据库支持的字符集 show character set 2.查看服务端启动时默认的字符集 mysql> show variables like 'character_set_%'; +--------------------------+-------------------------------------------+ | Variable_name | Value | +--------------------------+------------

mysql学习笔记 第四天

mysql引擎: archive(档案)[数据插入以后不能被修改,只读] blackhole[这种写操作是删除数据,读操作是返回空白记录] CSV[在储存数据时以逗号作为数据项之间的分隔符] example[示例(存根)储存引擎] Falcon[用来进行处理事务的储存类型] federated[用来访问远程数据表的储存引擎] InnoDB[具备外键支持功能的事务处理引擎] memory[内存里的数据表] merge[用来管理多个MyISAM数据表构成的数据表集合(merg-myisam)] my

MySql学习笔记(一)之DQL常用查询

MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前,我们先做一些准备工作. 需要安装的软件如下: 1.mysql,版本可以选择5.1或者5.5,安装过程可以参考博客:http://www.cnblogs.com/ixan/p/7341637.html 2.mysql图形化管理软件:Navicate,sqlyog(二选一,推荐使用sqlyog). 本文

Mysql学习笔记(三)对表数据的增删改查。

写在前面:(一些牢骚,可以直接跳到分割线后) 太过敏感的人不会快乐,不幸的是我正是这种性格的人. 从培训机构毕业后,迫于经济方面的压力,和当时的班里的一个同学住在了一起,我们在一个公司上班.谁知道这都是不开心生活的源头,从每天早晨开始心情就很糟糕.他是个脾气很慢的人,我是个急脾气,特别是在早上上班的时候.由此种种吧,实在是不胜枚举.算了,还是不说了,太痛苦了,我不太喜欢说别人的坏话.我是学心理学的,已经用各种方法去安慰自己,但是都不太奏效. 回想以往和朋友的交往中,我虽然不算十分合群的人,但绝对

mysql学习笔记 第五天

使用分区数据表: 分区数据表和merge数据表具有相似的作用,但是分区数据表确确实实是一个数据表 ,不像merge是列出数据表的逻辑关系,并且分区数据表可以包括像myisam以外的 的数据表.创建分区数据表: create table 里给出数据列和索引,然后用partition by 定义一个用来把数据行分配 到各个分区的分区函数:[将数据表分成四个区] create table log_partition( dt datetime not null, info varchar(100) no

MySQL学习笔记-事务相关话题

事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都不保存. InnoDB存储引擎中的事务完全符合ACID的特性. 原子性(atomicity) 原子性是指整个数据库事务是不可分割的工作单位.只有使事务中所有的数据库操作执行都成功,才算整个事务成功.如果事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行

MySQL学习笔记—触发程序

MySQL学习笔记-触发程序 触发程序是与表有关的命名数据库对象,当表上发生特定事件时,将触发执行相应的触发程序. CREATE TRIGGER语法 CREATE TRIGGER语法: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象. 触发程序与命名为tbl_name的表相关.tbl_na

Mysql学习笔记(二)数据类型 补充

原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与varchar char与varchar的类型相似,但是他们的保存方式和检索方式不同... char的存储结构是固定长度的存储...即指定了几个字节,那么就占用几个字节,如char(4),那么无论存入的是什么字串,那么都占用四个字节...char的 可表示长度范围为0-255的任何值,当保存的字节不

Mysql学习笔记(八)索引

原文:Mysql学习笔记(八)索引 PS:把昨天的学习内容补上...发一下昨天学的东西....五月三日...继续学习数据库... 学习内容: 索引.... 索引的优点: 1.通过创建唯一索引,可以保证数据库每行数据的唯一性... 2.使查找的速度明显加快... 3.当使用分组和排序进行查询时,可以缩短时间... 索引的缺点: 1.维护索引需要耗费数据库的资源... 2.索引需要占用磁盘空间... 3.对表进行增删改的时候,由于索引的存在,时间会有所增加... 索引的分类... 普通索引和唯一索引