数据库小白笔记
文章目录
数据库的启动
数据库的启动
MySQL80图形化界面启动:
打开计算机管理,服务中找MySQL80,双击弹出窗口,点击启动
MySQL80命令行启动:
win+R 输入cmd打开dos命令窗口
net start MYSQL80可以开启MySQL服务
开启后mysql -h 127.0.0.1 -u root -p打开数据库
net start 可以查看当前运行的所有服务
net stop MYSQL80可以关闭MySQL服务
如果出现拒绝访问就是权限不够,需要再左下角搜索框输入cmd,右键以管理员身份运行,这样权限更大
如果想要在cmd(较低权限的cmd)直接使用mySql命令,需要配置环境变量,此电脑,右击属性,高级系统设置,环境变量,系统变量里找path,双击打开,新建,把MySQL默认的C盘下的一个bin文件的路径加进去,点击确定,配置完成,
配置完路径后就可以在cmd(较低权限)运行mysql -h 127.0.0.1 -uroot -p打开数据库 注意-p后不要加空格,输入的是自己的数据库密码
数据库基本命令
新建数据库的命令
create database database_name;
(database_name)是参数,写你想创建的数据库名称,下文相同
查看数据库的命令
show databases;
注意:这里是databases(加s)
选择数据库命令
use database_name;
展示当前数据库中的表命令
show tables;
删除数据库命令
drop database database_name; drop:终止,下降,推动,掉下.液滴
在当前数据库下创建表
create table table_name(parameter_name parameter_type , parameter_name parameter_type , ... );
()里的参数表示表的字段(表的每一列表示一个字段),首先是字段名称,然后字段数据类型,用逗号隔开,table_name表示你想创建的表的名称,
parameter_name表示字段名,parameter_type表示字段类型,下同
查看表的结构
desc table_name; description:描述
向指定表中插入记录
insert into table_name values(parameter,parameter, ...); #参数要符合表的字段设置
查询当前会话 最后一个insert指令插入的记录的自增主键值(只适用自增主键,查询出来的是当前会话最后一个用insert插入的记录,而不是整个数据
库最后一个用insert插入的)
select last_insert_id( );
查询指定表的全部记录
select * from table_name; *是参数,表示全部
查询指定表中的指定字段内容
select table_field_name from table_name; field:域,字段
查询指定表中符合条件的字段内容
select table_field_name from table_name where 条件;
查询指定表中符合条件的所有记录
select * from table_name where 条件
模糊条件查询
举例: select * from table_name where name like '%班';
模糊查询的通配符
通配符有 _ % [] ^ 其中 _ 只能替代单个字符 % 可以替代多个字符,[]表示筛选一个范围,例如[0-9]就是满足0-9的范围的字符,^非 就是除了指定
的内容以外, 但是MySQL中like似乎只支持 _ % 两种通配符
此外通配符可以被转义,以方便作为普通字符来成为查询条件, 但是根据使用的数据库软件不同,转义的方式也不同
在指定的数据库中创建表
create table database_name.table_name (parameter_name parameter_type , ...);
md5是MySQL内置的非对称加密函数,可以用来加密指定内容
insert into table_name values(md5(parameter)); parameter:参数指的是需要加密的内容
列的类型定义
在创建表的时候,列(字段)的类型后边可以加(),小括号里写的数字表示这个数据显示的宽度(指定的只是显示的宽度,并不会影响数据类型原本所占的
字节数),一般配合zerofill使用,zerofill顾名思义,就是位数不够的时候,用0补齐,如果不指定,就是默认宽度
例如: create table table_name(id int(20) zerofill);
整数类型:整数类型是数据库中最基本的数据类型,标准SQL中支持INTEGER和SMALLINT这两种类型,
MySQL数据库不仅支持这两种类型,还扩展了TINYINT,MEDIUMINT,BIGINT
整数类型后可以加unsigned,来扩大该整数类型对应得数据范围,如果这个整数类型使用了zerofill
MySQL会自动为这个整数类型加unsigned,因为符数不可能前边用0补齐
整数类型后还可以加auto_increment属性,这个属性只用于整数类型,它可以让这一列的数据自增,
默认情况下,auto_increment值每行增加1,对于任何想要使用auto_increment的列,应该定义NOT NULL,
或者定义为unique,primary key
对于已经定义了auto_increment的列,第二次(注意这里是第二次)插入的时候可以不指定这一列的数据,
MySQL会自动根据上一行的这列数据加1,那么插入的时候不指定某一列的数据,插入的命令格式为:
insert into table_name (field_name) values (value); field(字段)_name依次为要
指定插入的列的名称,后边value依次表示要插入的数据
浮点类型和定点类型
数据表中用浮点类型和定点类型来存储小数,浮点类型就是单精度浮点数(float)和双精度浮点数(double),此外,定点数类型就是decimal(小数
的,十进制数),定点类型的数据比浮点类型的数据精确度更高,可以满足银行等需要高度精确的要求
MySQL浮点类型和定点类型的数据可以用类型后加(M,D)来表示,使用定点类型尤其要注意加上,M表示该值的总共长度,D表示小数点后边的长度,
M和D又被称为精度和标度
使用decimal类型的数据,精度M默认为10,标度D默认为0,所以如果不指定的话,小数部分就会被舍弃,使用decimal类型时候一定要注意
指定(M,D),decimal类型的数据,M取值范围是1到65,D取值范围0到30
浮点类型的数据一般不需要指定(M,D) M表示总长度,D表示小数点后的长度,那么M-D就是整数部分(小数点前)的长度,对于decimal只要整数部分
和小数部分的位数不超过指定的范围,那么精度就不会损失,但是浮点数据本身精度就有限,所以就算指定(M,D),也不会提高它们的精度,这也是为
什么之后的版本会放弃浮点类型数据指定(M,D)的原因
举例:对于decimal类型的数据,指定M,D(22,21),就是意味着整数部分只有1位
这个时候,如果强行存入整数部分有两位的数据,精度就会丢失,所以使用时候要注意考虑全面
日期和时间类型
日期和时间类型是数据库中为了方便存储日期和时间设计的,数据库有多种表示日期和时间的数据类型,其中,YEAR类型表示年,DATE类型表
示日期,time类型表示时间,datetime和timestamp(时间戳)表示日期和时间 stamp:邮票,印记
插入日期时间时,日期年月日和时间时分秒可以使用":-_/"中的任意字符来分隔,但是如果单独插入时间(时分秒),就要用":"分隔,否则就
会报错
MySQL本身也提供了获取时间的函数:
curdate() 获取当前的date,可以直接插入date类型中
now() 获取当前的datetime,可以直接插入datetime或者timestamp类型中
time() 获取参数给定时间串中的时分秒,可以直接插入time类型中
year(),month(),day(),minute(),second(),获取给定时间串中的对应值
字符串类型
char类型和varchar类型
char和varchar类型在使用时候都必须指定最大长度char(M) varchar(M) 因为在数据库中,这两种类型都没有默认参数
char类型的值长度是固定的,在使用时候指定的最大长度可取值范围是(0-255),存储值时,如果长度不够会用空格右填充到指定长度
varchar类型的长度是可以变化的,在使用时候指定的最大长度可取值范围是(0-65535),在存储值时,按照值的实际长度在指定的最大
长度内分配内存空间,varchar类型实际占用的空间为字符串的实际长度加1,综合来看,这样可以有效节约系统空间
text类型
text类型是特殊的字符串类型,包括tinytext,text,mediumtext,longtext类型,存储长度依次从小到大
这四种text类型都无需在后边加小括号指定长度
enum和set类型
enum类型又被叫做枚举类型,在创建表的时候,enum类型的取值范围以列表的形式指定,基本形式如下:
field_name enum('parameter',....) field:字段名(列名)
enum类型的值只能取列表中的一个元素,其取值列表中最多能有65535(两个字节能存储的无符号数的最大值)个值,
列表中每个值都有一个顺序排列的编号,MySQL存入的是这个编号,而不是列表中的值,默认编号从1开始
set类型的取值范围以列表的形式指定,其基本形式: field_name set(parameter...)
set和enum类型的区别是,enum类型的值只可以取给定的选项中的一个元素,set类型可以取给定的选项中多个元素,
set类型的值最多有64个元素组成,set类型存储时,将64个选项对应64位,如果选这个选项,这个选项就是1,否则为0
二进制类型
二进制类型存储的是原始的二进制数据(比如图片,视频,exe文件等)
包括binary,varbinary,bit,tinyblob,blob,mediumblob和longblob
binary(M) 字节数为M,允许长度为0-M的固定长度(M)二进制字符串与varbinary(M)对应
列的完整性约束
完整性约束条件是对字段进行限制,要求用户对该属性进行的操作符合特定的要求,如果不满足完整性约束条件,数据库系统将不再执行用户的操作
主键约束
主键是表的一个特殊字段,能唯一标识该表中的每条记录,每个记录的主键都不同(唯一性,非空值),主键可以是单一的字段,也可以是多个字段的组合,
单一字段做主键: create table table_name(field_name type primary key)
多个字段组合做主键 create table table_name(field1_name type, field2_name type, ...primary key(field1_name,field2_name));
给主键定义一个名字
create table table_name(field1_name type, field2_name type, ...constraint pk_name primary key(field1_name,field2_name));
外键约束
设置外键约束的两个表具有父子关系(外键可以为空)
其语法格式: create table table_name(paraName paraType foreign key (paraName) references table2Name(field_name));
注意:语法格式中,table2指的是外键作为主键的表(父表),field_name就是父表主键字段的名称,paraName是子表要设置外键的字段名
非空约束 NOT NULL 语法格式:create table table_name(field1_name type NOT NULL);
唯一约束 unique 语法格式:create table table_name(field1_name type unique);
自增约束 auto_increment 一个数据库表中只能有一个字段使用自增约束,并且该字段为整数类型,且自增约束不能单独使用,必须同时将该字段设置主键
约束或者唯一约束,默认情况下,自增约束会在上一条记录的值(或者最大记录值))上加1,已经存在的最大值记录包括曾经存在过的,因为数据库
会记录最大值,即便已经删除这条最大值记录,自增约束也会在已经被删除的最大值基础上增加,在最大值的基础上增加,是因为在设置为主键
或者唯一约束的情况下,都不能出现重复值
默认约束 default 语法格式 create table table_name(field_name type default default_value);
调整列的约束
使用show keys(或者index) from table_name; 这个命令可以查看指定表的键信息
新增主键,外键,唯一键的语法命令:
alter table table_name add constraint constraint_name unique(要增加的约束,这里用唯一键举例) key (field_name)
注意:constraint constraint_name 这是给约束起一个名字,方便删除约束操作,也可以不给约束起名字
删除约束语法命令
删除主键 alter table table_name drop primary key (一个表只能有一个主键,所以可以直接使用这条命令删除主键)
外键或者唯一键 alter table table_name drop index 约束名;
约束名可以自己定义,如果没有定义,可以用show查看keys信息看约束名
修改,按照上述内容,先删除再新增即可(修改的语法比较复杂,所以可以用这种方式)
修改默认值,自增,和非空约束的语法命令:
alter table table_name modify field_name type constraint...; 这里相当于重新定义了这个列的属性 type指的是列的类型,constraint指的是列的约束
数据库索引的概念
索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录,是提高数据库性能的重要方式
在MySQL中,所有的数据类型都可以被索引
索引类型包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引等
数据库底层索引实现主要有两种存储类型,B(BTREE)树和哈希(HASH)索引,InnoDB和MyISAM使用BTREE索引,而MEMORY存储引擎可以使用BTREE和
HASH索引,默认用BTREE,在没有指定的情况下,数据库使用的引擎是InnoDB
索引的优缺点: 优点-可以提高检索数据的速度 缺点-创建和维护索引需要耗费时间,占用内存,增删改数据时,需要动态维护索引,造成数据的维护速
度降低
综合评价:索引可以提高查询的速度,但是会影响插入记录的速度,因为在有索引的表插入记录时,数据库系统会按照索引排序,这样就降低了插入记录的
速度,插入大量记录时的速度影响更加明显,这种情况下,可以考虑先删除表中的索引,然后插入数据,插入完成后再创建索引
查看索引情况的命令 explain select查询语句; 例如: explain select * from table_name where 条件; explain:解释
普通索引
普通索引就是创建索引时,不附加任何限制条件(唯一,非空等限制),该类型的索引可以创建在任何数据类型的字段上
创建表的同时定义索引命令语法 []中括号括起来的表示可写可不写 | 竖线表示或,多个选择 比如下边index和key都可以
create table table_name(field_name type,...,index(或者key) [index_name] (field_name [(length)] [ASC|DESC]));
index_name是索引名,可以省略 field_name指索引对应的字段的名称,该字段必须在前面已经定义好的
ASC表示升序 DESC表示降序 指的是按照索引查询记录时,排列的顺序,如果不指定默认是升序
在已经创建好的表上创建索引命令语法:
create index index_name on table_name(field_name [(length)] [ASC | DESC]);
alter table table_name add index index_name (field_name [(length)] [ASC | DESC]);
唯一索引
唯一索引就是在创建索引时,限制索引的字段值必须是唯一的,唯一索引可以比普通索引更加快速的查询记录
创建表的时候定义索引:
create table table_name(field_name type,...unique index | key [index_name] (field_name [(length)] [ASC | DESC]));
在已经存在的表上创建索引
create unique index index_name on table_name (field_name [(length)] [ASC | DESC]);
alter table table_name add unique index | key index_name (field_name[(length)] [ASC | DESC]);
全文索引
全文索引主要对字符类型建立基于分词的索引,主要是基于CHAR,varchar,和text的字段上,以便更加快速的查询数据量大的字符串类型的字段,
全文索引是以词为基础的,MySQL默认的分词是所有非字母和数字的特殊符号都是分词符,全文索引的搜索执行方式不区分大小写,如果全文索引
所关联的字段为二进制的数据类型,就以区分大小写的搜索方式执行
根据全文索引字段进行全文检索:
select * from table_name where match(列名) against('关键字');
创建表的时候定义索引:
create table table_name(field_name type,...fulltext index | key [index_name] (field_name [(length)]));
在已经存在的表上创建索引:
create fulltext index index_name on table_name(field_name);
alter table table_name add fulltext index | key index_name(field_name [(length)]);
注意:MySQL对于中文分词的全文检索需要特殊配置
MySQL8中文分词支持,首先配置文件my.cnf或者my.ini(Windows 10默认路径 C:\ProgramData\MySQL\MySQL Server8.0)中增加如下配置
项,同时重启MySQL80服务
[mysqld]
ngram_token_size=2
create table table_name(field_name type,...FULLTEXT index index_name(field_name) with parser ngram);
中文分词加上with parser
多列索引
多列索引是指在创建索引时关联的字段不是一个字段,而是多个字段,虽然可以通过所关联字段进行查询,但是只有查询条件中使用了所关联字段的
第一个字段,多列索引才会被使用
创建表的同时定义多列索引命令语法
create table table_name(field_name type,...,index(或者key) [index_name] (field1_name [(length)] [ASC|DESC],field2_name[(length)] [ASC|DESC],field3_name [(length)] [ASC|DESC]...));
索引的隐藏
MySQL8开始支持隐藏索引,隐藏索引提供了更人性化的数据库操作
隐藏索引就是让索引暂时不可见,不会被优化器使用,默认情况下索引是可见的,隐藏索引可以用来测试索引的性能,验证索引的必要性时不需要删
除索引,可以先将索引隐藏,如果优化器性能无影响,就可以删除索引
alter table table_name alter index index_name invisible #隐藏索引
alter table table_name alter index index_name visible #取消隐藏
删除索引
之所以要删除索引,是因为有时候索引降低了表的更新速度,影响数据库的性能
drop index index_name on table_name;
表的插入
插入完整数据记录,插入部分数据记录,插入多条数据记录,插入JSON结构的数据记录
使用insert into语句插入多条记录
insert into table_name(field_name1,field_name2) values (value,value),(value,value)...;
更新表中的数据记录
更新特定数据记录
update table_name set field1=value1,field2=value2,...where 条件;
更新所有数据记录
update table_name set field1=value1,field2=value2,...;
update table_name set field1=value1,field2=value2,...where 1=1;
删除表中的记录
delete from table_name where 条件;
数据查询
单表查询
select field1,field2,...from table_name where condition(条件) | group by field [having 条件] | order by fieldn [ASC | DESC];
DISTINCT查询
去重查询,查询结果不会显示重复的数据 distinct:明显的,不同的
select distinct field_name from table_name;
in查询
需要查询的数据限定在某个集合中的时候
select field1,field2,...from table_name where field_name in(value1,value2,value3....); ()里的就是集合,当指定字段符合集合才会被查询
not in查询
反向查询非集合中的数据
select field1,field2,...from table_name where field_name not in(value1,value2,value3....); 当指定字段不在集合中才会被查询
not in反向查询如果集合中出现NULL,就什么也查不出来,即查询结果为空,in查询使用NULL也要慎重
between...and查询
between:在,,,之间
需要查询的数据限定在某个范围中的时候,用来判断字段的数值是否在指定范围内 (只针对数字类型)
select field1,field2... from table_name where field_name between minValue(最小值) and maxValue(最大值);
not between...and查询
需要查询的数据限定在某个范围 之外 的时候,用来判断字段的数值是否在指定范围之外 (只针对数字类型)
select field1,field2... from table_name where field_name not between minValue(最小值) and maxValue(最大值);
注意:MySQL数据库,and 和 or 关键字可以单独使用,也可以[配合其它关键字一起使用
like模糊查询
只用字符串中的一部分特征查找含有特征字符串的信息,使用like模糊查找,需要配合通配符使用,like支持的通配符有两个 _ %
_ 该通配符能匹配单个字符 %该通配符可以匹配任意长度字符串
select field1,field2... from table_name where field_name like value;
对查询结果排序
在MySQL中,从表中查询的结果可能是无序的,使用关键字order by对记录进行排序 order:命令,顺序
select field1,field2... from table_name order by field_name[ASC | DESC]; 默认ASC升序排序
简单分组查询
MySQL提供了统计函数来方便用户统计,可以更方便进行统计数,计算和,计算平均数,计算最大值和最小值,而不是查询所有数据
Mysql通过SQL语句group by来实现分组
select function(),field_name from table_name where 条件 group by field_name;
count(*) *可以统计分组字段的记录个数,包括值为NULL的记录
count(field) 指定字段,不会包括值为NULL的记录
统计分组查询
因为关键字group by关键字单独使用时,默认显示出每个分组的第一条记录,所以一般和统计函数(group_concat)配合使用
select group_concat(field_name) from table_name group by field_name;
联合查询 (联合多个表查询)
内连接查询
(两张表指定字段匹配的行才显示的查询叫内连接查询) inner join inner:内部的
select * from table1_name as a inner join table2_name as b where a.field_name = b.field_name(条件自行更改); a,b是给两个表起的别名
select * from table1_name as(可省略) a inner join table2_name as b on a.field_name = b.field_name(条件自行更改); a,b是给两个表起的别名
外连接查询
(外连接查询要求所操作表至少返回一个操作表的全部数据记录,即使这个表中的某条记录与另一个表没有匹配) outer join
select * from table1_name left | right outer join table2_name on condition(条件); left和right关键字用来指定参考表
注意: 外连接不可以使用where关键字,内连接可以使用where关键字
left 左外连接 指新关系执行匹配条件时,以关键字left outer(可省略outer) join左边的表为参考表,左外连接的结果包括左表(参考表)的所
有行,而不仅仅是连接所匹配的行,如果左表某行在右表没有匹配行,则在相关联的结果行中,右表的对应行均为空值
right 右外连接 以right outer join右边的表为参考表,右外连接的结果包括右表(参考表)的所有行,而不仅仅是连接所匹配的行,如果右表某
行在左表没有匹配行,则在相关联的结果行中,左表的对应行均为空值
合并查询
(在MySQL中通过关键字union来实现合并操作,即通过将多个select语句的查询结果合并在一起,组成新的关系)
select * from table1_name union | union all select * from table2_name union | union all select * from table3_name ......;
union 和 union all 的区别
union all就是将结果集直接合并在一起
union则是将union all后的结果再执行一次distinct,去除重复的记录后的结果
如果合并查询时,指定查询的列,那么多个表查询语句的列数一定要相同,因为合并查询最后显示的结果是按照第一个表的查询语句的列为参考的子
查询(子查询指的是在一个查询中间嵌套了其它查询,即在一个select语句的where或者from子句包含另一个select查询语句,外层的select称为
主查询,where子句中的select查询称为子查询,也叫嵌套查询)
理论上子查询可以出现在查询语句中任意位置,但实际应用中多是from和where语句中,查询语句中可以使用in,any,all和exists等关键字,还有
比较运算符
示例:select * from table1_name where field_name = (select * from table2_name where ...);
注意: 使用 = 运算符时,子查询的结果不能大于1条,否则究竟 = 哪一个呢? 除非使用or关键字
in关键字
一个查询语句的条件可能在另一个查询语句的结果里 not in 用法和in相同,表示不在...结果里
select * from table1_name where field_name in (select ......);
exists关键字 exists:存在
exists关键字后的参数是一个任意的子查询,系统对子查询进行运算以判断子查询是否返回行,如果至少返回一行,说明存在查询结果,exists的
结果为true,此时外层语句将执行查询,若子查询没有返回任何行,返回为空,说明不存在查询结果,exists的结果为false,此时外层查询语句将
不会执行
any关键字
使用关键字any时,只要满足内层查询语句返回的结果中的任意一个就可以通过该条件来执行外层查询,any关键字通常和比较运算符一起使用,例
如>any表示大于任何一值,=any表示等于任何一值
all关键字
关键字all表示要满足内层查询的所有结果才能执行外层查询
视图操作
视图概念
视图就是从一个或者多个表中导出来的表,视图像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户可以不看整个数据库表的数
据,而只关心自己需要的数据,可以起到简化查询的效果,最重要的是,视图可以保障数据库系统的安全性,一些表中的隐私数据可以不提供给
用户查看
创建视图
create(或者replace) view view_name[columnlist] as select statement;
其中,create表示创建新的视图,replace表示替换已经存在的视图,view_name表示视图名字,columnlist表示属性列,
select statement表示查询语句
查看视图
可以像查看表一样查看视图
使用 describe | desc view_name 来查看视图 show create table_name | view_name;
更新(修改)视图
更新视图可以使用insert,update,delete以及alter等,
注意视图中包含sum(),count(),max(),min()等函数,或者union,group by等关键字不能更新,包含子查询不能更新,视图对应
的表存在没有默认值的列而且该列没有包含在视图里不能更新
删除视图
drop view view_name1,view_name2 ...; 删除多个视图用(逗号)隔开
触发器
触发器(trigger)的基本概念
当我们对一个表进行数据操作时,需要同步对其它的表执行相应的操作,正常情况下,如果我们使用sql语句进行更新,需要执行很多条,所以我
们可以使用触发器来简化这个过程
创建触发器
create trigger trigger_name before | after trigger_event on table_name for each row trigger_stmt
trigger_name表示要创建的触发器名before和after参数指定触发器执行的时间,前者在触发事件之前执行,后者在触发事件之后执行触发器语句
trigger_event表示触发事件,即触发器执行条件,包含delete,insert,update(只有这三个)语句 参数table_name表示触发事件的操作表名称
参数for each row表示任何一条记录的操作满足触发事件都会触发该触发器
参数trigger_stmt表示激活触发器后要执行的语句,执行语句中如果要引用更新记录后的字段,对于insert语句,只有new是合法的,表示当前已插
入的记录,对于delete语句,只有old是合法的,表示当前删除的记录,而update可以和new(更新后)以及old(更新前)同时使用
另外,注意不能有同名触发器,对于具有相同触发条件和程序动作的给定表,不能有两个触发器,因此,对于有经验的用户,要先查看已有的触发器
如果触发器包含多条执行语句,需要多加两个关键字 begin 和 end 这两个关键字之间是要执行的多个执行语句的内容,执行语句之间用分号隔
开,但是一般使用 ; 分号来作为语句的结束符号,当有多条执行语句时,可能需要换行书写,为了解决这个问题,可以使用关键字delimiter语句,
更改定界符,当触发器创建完毕后,再换回分号结束符 例如: delimiter $$ 可以将结束符设置为$$
create trigger trigger_name before | after trigger_event on table_name for each row begin trigger_stmt end
查看触发器
show triggers语句查看触发器 show triggers;
查看系统表triggers实现查看触发器
use information_schema; select * from triggers;
删除触发器
drop trigger trigger_name;
存储过程和函数概述
存储过程和函数是在数据库中定义的一些sql语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的sql语句,存储过程和函数可以避免重
复编写相同的sql语句,而且存储过程和函数是在MySQL服务器中存储执行的,可以减少客户端和服务器端的数据传输
创建存储过程
create procedure procedure_name(proc_param[])
begin
routine_body routine_body表示存储过程的过程体代码,可以使用begin和end表示开始和结束
end
proc_param表示参数, [in | out | inout] param_name type 三个部分组成一个参数,参数可以有多个或者没有,但是注意没有参数的时候
括号不能省略
其中 in 表示输入类型,out表示输出类型,inout表示既输入又输出类型 type表示参数类型,可以是Mysql支持的任意一个数据类型
使用call来调用存储过程
定义变量
declare variable_name[ , ...] type [default value];
declare: 声明 可以同时定义多个变量 type表示变量类型 default value可以将默认值设置为value,没有使用default子句,默认值为null
示例: 定义变量名为cid,cie 默认值为10 的两个int类型变量 declare cid,cie int default 10;
MySQL控制台支持一种用户变量,这种变量不需要声明 用户变量使用 @ 符号开头即可, 这种@开头的用户变量在当前会话中有效(即在当前窗口中
有效)示例:存储过程参数有out类型,调用时需要一个变量来接受,所以使用用户变量 call procedure_name(@name);
查询用户变量示例 select @name;
用户变量可以直接使用select语句查询
select @.... , @...; 可以同时查询多个用户变量
变量赋值
set语句为变量赋值
set variable_name=expr[,variable_name=expr]; set用来为变量赋值,参数expr为赋值表达式,可以同时为多个变量赋值,使用逗号隔开各
个变量赋值语句
在SQL语句中,set语句中的一个=号是赋值的意思,而没有set,一个=号是等于的意思,比如while ...=...
示例: set cid=88,cie=66;
select...into...语句为变量赋值
select col_name[ , ...] into var_name[ , ...] from table_name where condition;
col_name表示查询的字段名称,参数var_name是变量的名称,table_name是表的名称,condition指的是查询条件
删除存储过程
如果确定存储过程存在,可以直接删除
drop procedure proce_name;
或者使用更加安全的删除方式(不确定存储过程是否存在)
drop procedure if exists proce_name; exists:存在
光标使用详解
查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录, 有些书上将光标称为游标, 光标的使用包括:声明光标,
打开光标,使用光标,关闭光标
声明光标
光标必须声明在处理程序之前,并且声明在变量和条件之后
声明光标
在MySQL中,可以使用declare关键字来声明光标,其基本语法如下:
declare cursor_name cursor for select _statement;
cursor_name: 光标变量名,建议cursor_开头 cursor: 光标,游标 statement: 陈述 这里select statement是指select语句的意思
打开光标
在MySQL中,使用关键字open来打开光标, 其基本语法如下:
open cursor_name; 其中,参数cursor_name表示光标的名称
使用光标
在MySQL中,使用关键字fetch来使用光标 fetch: 取来
fetch cursor_name into var_name[ , var_name ......];
参数var_name表示将光标中的select语句查询出来的信息存入该参数中,var_name必须在声明光标之前就定义好
通过select var_name[, var_name...]; 可以查询var_name中的信息
declare continue handler for not found set var_name=1; 这条命令将 (结束标志) 绑定到游标上,这里比较难以理解,
var_name是变量名,需要提前定义 handler: 处理程序 handle: 句柄
if语句详解
if语句用来进行条件判断,根据条件执行不同的语句,其语法格式如下:
if search_condition then statement_list
elseif search_condition then statement_list ...
else statement_list
end if;
search: 搜寻 condition: 条件 search_condition表示条件判断语句,参数statement_list表示不同条件的执行语句
case语句使用详解
case语句语法格式:
case case_value
when when_value then statement_list
when when_value then statement_list
else statement_list
end case;
其中,参数case_value表示条件判断的变量 参数when_value表示变量的取值 statement_list表示不同的执行语句
loop语句使用详解
loop: 环形,循环 label: 标签,标记
loop语句可以使用某些特定的语句重复执行,实现一个简单的循环,但是注意loop语句本身没有停止循环,只有遇到leave语句等才能停止循环
loop语句语法格式:
[begin_label:] loop
statement_list
end loop [end_label]
其中,参数begin_label和参数end_label分别为循环开始和结束的标签,这两个标签必须相同,而且都可以省略(我没有找到省略loop循环标签后, 跳
出loop循环的办法), 之所以使用标签,是为了方便循环嵌套时区分循环层次,但是在只有一层循环时,也可以使用标签来退出循环, 所以强烈建议不
要省略标签, 养成良好的编程习惯, 注: 标签名不需要提前声明定义, 可以直接写标签, 像用户变量一样
leave语句使用详解
leave语句主要用来跳出循环控制, 效果类似于break, 其语法格式为:
leave label; 其中,label表示循环的标签
iterate语句使用详解iterate: 迭代
iterate语句也是用来跳出循环的,但是iterate语句是结束本次循环,进入下一次循环, 就像continue
语法格式
iterate label; 参数label表示循环的标签
repeat语句使用详解
repeat: 重复
repeat语句是有条件控制的循环语句, 当满足特定条件的时候就会跳出循环
语法格式:
[begin_label: ] repeat
statement_list
until search_condition
end repeat [end_label];
其中, statement_list表示要循环的执行语句(注意: statement_list语句必须在until语句之前,否则会报错), 参数search_condition表示结束循环的条件
在判断until之前,会执行一次循环体, 类似do...while, 不同的是until是满足条件结束循环, do...while是满足条件继续执行循环
while语句使用详解
while语句也是有条件的循环语句, 但跟repeat语句不同的是,while语句是当满足条件时执行循环内的语句
while语句语法格式:
[begin_label: ]while search_condition do
statement_list
end while [end label];
其中,参数statement_list是需要循环的执行语句,search_condition是满足循环执行的条件
查看存储过程
show status语句可以查看存储过程的状态,show create语句可以查看存储过程的定义, 此外, 用户也可以通过查询
information_schema数据库下的Routines表来查看存储过程的信息
status: 状态,地位 schema: 架构 routines: 常规,日常活动 pattern: 模仿,图案,样品 routine: 常规,日常的
show status查看存储过程状态,语法格式:
show procedure status [like 'pattern'];
其中,参数like 'pattern'用来匹配存储过程的名称
show create语句查看存储过程的定义,语法格式:
show create procedure procedure_name;
从information_schema数据库下的routines表来查看存储过程
存储过程和函数的信息都存储在information_schema数据库下的routines表中,可以通过查询该表的记录来查询存储过程和函数的信息,其基本语法
格式如下:
select * from information_schema.routines where routine_name=' procedure_name';
其中,字段routine_name存储的是存储过程和函数的名称, 参数procedure_name表示要查询的存储过程和函数的名称
数据库的存储引擎
数据库的存储引擎指的是表的类型,存储引擎指定了表的类型,即如何存储和索引数据,是否支持事务等,同时存储引擎决定了表在计算机中的存储方式
show engines查看数据库支持的存储引擎
show engines; engines:引擎
在创建表时,如果没有指定存储引擎,表的存储引擎将为默认的存储引擎
查看当前MySQL版本的默认存储引擎的命令:
show variables like 'default_storage_engine'; variable:变量 storage:存储
InnoDB存储引擎
InnoDB是MySQL数据库默认的一种存储引擎,InnoDB给MySQL的表提供了事务,回滚,崩溃修复能力和多版本开发控制的事务安全,InnoDB是MySQL第一
个提供外键约束的表引擎,InnoDB对事务的处理能力也是MySQL其它存储引擎无法比拟的, InnoDB存储的优势在于提供了良好的事务管理,崩溃修复能
力和并发控制,缺点是其读写效率稍差,占用的数据空间也较大
MyISAM存储引擎
MyISAM存储引擎也是MySQL的常见存储引擎,曾经MyISAM是MySQL的默认存储引擎,但是在MySQL5.6版本后,默认存储引擎改为了InnoDB存储引擎
MyISAM存储引擎的表存储成三个文件,文件的名字和表名相同,或者名包括frm,MYD和MYI,其中,frm为扩展名的文件存储表的结构,MYD为扩展名的
文件存储数据,是MyData的缩写,MYI为扩展名的文件存储索引,是myIndex的缩写,支持静态型,动态型和压缩型三种存储格式,压缩型需要myiampack
工具创建
MEMORY存储引擎
MEMORY存储引擎是MySQL的一种特殊存储引擎,其使用存储在内存中的内容来创建表,而所有的数据也存储在内存中,这些特性都是与InnoDB和
MyISAM存储引擎不同,MEMORY存储引擎的优势在于数据的快速处理,但是数据容易丢失,生命周期短,使用的时候要特别小心
MEMORY存储引擎默认使用哈希(HASH)索引,其速度要比B型树(BTREE)索引快,如果使用者希望使用B型树索引,可以在创建索引时选择使用
其它
在数据库中#就是注释,相当于C++中的//
comment也可以用来注释,一般用于创建表中注释 create table table_name(id int(11) unsigned primary key comment'主键');
修改某个表的注释
alter table table_name comment '修改后的注释内容'; table_name 指表名
修改某个字段的注释
alter table table_name modify column field_name field_type comment '修改后的注释内容'; table_name 指表名 field_name指字段名 field_type指字段类型
#也可以用来注释,使用方法是 #注释内容# 但是show create无法查看 # 注释的内容,所以推荐使用comment注释
数据库的命令是不区分大小写的,数据库的命名也是不区分大小写的,也就是说一个数据库的名称为school
使用SCHOOL也可以操作这个数据库,不同数据库不可以重名,意味着如果有school数据库,就不能创建SCHOOL数据库