MySQL基本概念及高级应用

定义

​ 储存数据的仓库,高效的储存和处理数据的介质(硬盘,内存)

分类

储存数据的大小分类(了解)

​ 巨型数据库: DB2 IBM

​ 大型数据库: Oracle oracle

​ 中型数据库: mysql sqlServer miscsoft

​ 小型数据库: access micsoft

根据数据库的模型分类:

​ 1 关系型数据库

​ 关系型数据库,是一种建立在关系模型上的数据库

​ 关系模型:

​ 1.1 数据结构:值由行和列组成的二维表结构

​ 1.2 SQL指令:structured(结构化) Query(查询)

​ L(language)语言,对数据库或者数据进行操作(增删改查)

​ 1.3 完整性约束:非空约束,唯一约束…..用来保证数据的完整性

​ 2 非关系型数据库:

​ 采用键值对的方式存储

​ 常见非关系型数据库:redis mongodb memercached

​ 关系型与非关系型的区别:

​ 1.结构不同

​ 2.关系型数据库存储在硬盘,非关系型数据库存储在内存中

​ 3.非关系型数据库效率高,查询速度快,常用来做缓存

SQL指令:

​ Structured query language 结构化查询语言

​ 对所有关系型数据库都可以进行操作mysql(开源,免费)

​ 名词解释:

​ 数据库:DataBase

​ 数据库的组成:Database + DatabaseManageSystem DB+DBS

​ 数据库管理员:DBA DataBase Admin

​ DDL : Data Definition language 数据库定义语言(主要针对数据 库的创建,删除,修改,表的创建,删除,修改),常见指令:create(创 建)drop(删除) alter(修改)

​ DML : Data Manipulation language 数据操作语言(主要针对表的数据进 行操作,表里面的数据新增insert、删除delete、修改update)

​ DQL : Data Query Language 数据查询语言(针对表里面的数据进行查询操 作)

​ Select from where

​ DCL : Data control 数据控制语言(针对用户权限进行修改的操作 grant revoke)

Mysql介绍

Mysql是一个C(lient)/S(server)端软件:

​ 1.启动服务端 net Start mysql56(安装时已经执行)

​ 2.先与服务端建立连接,用到用户名和密码:

​ mysql -uroot -p

​ 3.发送sql指令到mysql系统,mysql根据sql指令进行操作,返回一个结果集, 显示在客户端

​ 4.退出,关闭连接,释放资源,quit/exit

​ 停止mysql服务:net stop mysql56

DDL

​ 数据定义语言(不区分大小写,不区分单引号和双引号)

创建数据库

​ create database 数据库名 [库选项]

​ 库选项:

​ 字符编码集: charset utf8

​ 校对集(了解):collate

​ 校对集有三种模式:

​ mysql支持哪些校对集:show collation

​ _bin:binary 二进制,按位比较,严格区分大小写

​ _ci:对大小写不敏感,不区分大小写,默认校对集

​ _cs:对大小写敏感:严格区分大小写

查看数据库

​ show databases;##查看所有数据库

​ //模糊查询 占位符 %

​ show databases like ‘%26’; ##’%a%’字母a的数据库名

​ //模糊查询 占位符 _

​ show databases like ‘_a’;找以a结尾并且名字长度只有两个的数据库,_表示只占一个字符

​ 查看数据库的创建语句:

​ show create database 数据库名;

​ 修改

​ 1.数据库名不能修改

​ 2.修改字符编码集

​ alter database 数据库名 charset 编码集;

删除数据库(慎用)

​ drop database 数据库名;

​ 在数据库里面新建表:对表进行操作:

​ 注释: –注释内容

​ #注释内容

使用数据库:

​ use 数据库名;

创建表

​ create table [if not exists] 表名(

​ 字段名1 字段类型 [约束],

​ 字段名2 字段类型 [约束]

​ ……

​ )[engine = innodb] charset utf8;

​ 数据库的存储:

​ innodb:支持事务(常用,默认存储)

​ mysiam:不支持事务/支持全文索引

查看表

​ 查看所有表:show tables;

​ 模糊查询:show tables like ‘%t’;–%占位符

​ 模糊查询:show tables like ‘_t’;

查看表的创建语句

​ show create table 表名;

修改表

​ 修改表名:

​ rename table 表名 to 新表名;

​ 增加字段:

​ alter table 表名 add 字段名 数据类型 [约束]

​ 修改字段:

​ alter table 表名 modify 字段名 数据类型 [约束]

​ 删除字段:

​ alter table 表名 drop 字段名;

​ 修改字段名:

​ alter table 表名 change 旧字段名 新字段名 数据类型;

查看表结构

​ desc 表名;

删除表(慎用)

​ drop table 表名1,表名2,表名3….;

DML

​ 三个主要关键字: insert delete update

新增数据

insert into 表名 values(数据1,数据2,…);

​ 数据1,数据2…是一张表中一行的所有数据,如果不是全部会报错
​ insert into表名(字段名1,字段名…..) values(数据1,数据2…)

注意:可以使用default表示使用默认值

查看数据:(查询)

​ Select 字段1,字段….* from 表名;
​ *代表所有字段

修改数据

​ Update 表名 set 字段名 = 新数据 where 条件;
​ 更新数据时,常常需要跟where条件,如果没有条件,表示该
​ 字段所有数据都更新;

删除数据

​ Delete from 表名where 条件;

​ 删除时常常跟where条件,如果不跟条件,就会清空整个表数据;

数据类型

​ 为了方便对数据的统一管理,规定了数据类型

​ SQL:三种数据类型 数字型 字符串类型 时间日期类型

​ java: byte(1字节) short(2字节) int(4字节) long(8字节)

数字型(number):

整数型:
tinyint(迷你整型):占一个字节,-128 +127,无符号(全为正,从0开始)0-255
smallint(小整形):占2个字节
mediumint(中整形):占3个字节
int(整形):占4个字节
bigint(大整形):占8个字节
注意:如果要使用无符号位数据,在数据类型后面添加约束(无符号位约束 unsingned);
小数型

​ 浮点小数

​ 单精度浮点数:float 占4个字节

​ 双精度浮点数:double 占8个字节

​ float(M,D):M表示数据的总长度,D表示小数的位数整数的位数(M D)
​ 对于float和double来说,都存在精度损失,float的将有效位数 在7位左右,double在15位左右,常常很少用;默认M为10;整数 部分长度超过范围不能存入小数,小数超过范围会四舍五入;
​ 精确小数

​ (decimal);decimal(M,D)
​ M的最大值为65,D的最大值30,小数位支持30位

时间日期类型

​ DateTime: yyyy.MM.dd HH:mm:ss

​ Date: yyyy.MM:dd

​ Time: HH:mm:ss

​ Timestamp(时间戳): yyyy:MM:dd HH:mm:ss

​ Year(年):最大支持2150

​ 注意:如果当前行的数据被修改,那么时间戳会记录当前的修改时间(时间戳 字段会自动改变成当前的修改时间).

字符串类型:

​ char(L):L表示所能存储的最大字符个数 定长

​ varchar(L):表示所能粗存储的最大字符个数 变长

​ varchar:在初始分配容量的时候,根据给定的的长度分配,但是具体占多少空 间,由最终存入的数据来确定.
​ 定长:效率高,占用磁盘空间大,浪费空间
​ 变长:效率低,节省磁盘空间

    如何来选择 char/varchar?
        如果基本确定该字段的长度,如L手机号,身份证号,采用char
        如果长度不确定的时候,采用varchar,地址...姓名
    L的最大值?
        char(L):L的最大值是255,在Mysql中规定,一条记录的最大存储字节						个数为65535
        使用varchar的时候,会额外占用1-2个字节来存储具体存储数据长度
            数据的长度:还需要一个字节来存储null;	
        在实际开发过程中,如果字符长度超过255,不采用varchar,使用					text,blob;

blob,text,set,enum(这些是扩展的类型,自看书)

约束

​ 光靠我们数据类型来约束字段约束很单一,sql 引入了其他约束

​ Null/not null

​ primary key(主键)

​ unique key(唯一键)

​ default(默认值)

​ comment( 描述)

​ auto_ increment( 自增长)

​ set(检查约束)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
例:
create table if not exists stu(
id int primary key auto_increment,
`name` varchar(5) not null default '无名',
sex set('男','女') comment '性别',
stuid char(15) not null unique comment '学生id'
)engine=innodb charset utf8;

NUll/not null:
null 代表该字段可以为null
not null 该字段不允许为null,默认为null
Comment(描述):
对字段起解释说明的作用
在创建表的时候在字段约束里面写上comment'解释说明的内容',comment 约束一般放在最后;在表的创建语句中查看
Default(默认值)
例: ssex char(3) default "男"
主键约束(primary key):
用来唯一区分一行数据内容的字段,主键的内容不能重复
增加主键:一张表只能有一个主键,有多个字段组成的主键叫复合主键.
复合主键一般不常用,常用的是逻辑主键:
逻辑主键:在开发过程中,常常把与业务不相关的字段(新增一个与业务 不相关的字段作为主键,这个主键叫做逻辑主键)
1.在创建表的时候添加
直接在需要设置主键的字段后面添加主键约束 primary key
2.在创建表的时候添加
在所有字段及类型写完之后,在末尾添加
add primary key(字段1,字段2)
可以设置多个字段作为主键(复合主键)
3.在创建表完成之后修改字段为主键
alter table 表名 add primary key(字段);
如果表中已经存在数据,设置为主键的字段里面的数据必须保证不重复.
修改主键/删除主键:
主键不能修改,只能删除后新增
alter table 表名 drop primary key;
自增长(auto_increment):
一张表只能有一个自增长字段,通常给主键 ;默认值为0,每次+1
删除自增长:alter table 表名 modify 字段 数据类型 [约束]
唯一键(unique key):可以设置多个,数据不能重复;添加唯一键:
1.在创建表的时候添加,在字段后面添加约束unique[key]
2.在创建表的时候,在创建表语句的最后加上
unique key(字段1,字段2....);
3.在表创建成功之后,给表增加唯一键
alter table 表名 add unique key(字段1,字段2...);
唯一键不会判断null,主键会判断null,主键不能为null;
更新/删除唯一键:
alter table 表名 drop unique key;#错误方式
alter table 表名 drop index 字段名;

索引

​ 系统根据某种状况,将当前字段的数据(或者是未来可能新增的数据)单独建立 一个文件
​ 该文件的内容可以快速匹配要查询的数据(表中的记录),就像书的目录.
​ 作用:增加查询效率

常见的索引

​ 主键索引:primary key ,在新增主键的时候,会同时增加主键的索引文件
​ 唯一键索引:unique key,在新增唯一键的时候,会增加唯一键索引文件
​ 普通索引:index
​ 增加普通索引:alter table 表名 add index(字段名);
​ 全文索引:mysql不支持,英文,中文

表与表之间的关系

一对一关系:
    在表A中的一条记录对应表B中的唯一一条记录
一对多(多对一):
    在表A中的一条记录,在表B中可以找到一条或者多条记录
        与之相匹配,同时,在表B中的每一条记录,都只能在表
        A中找到唯一的一条记录与之匹配,那么我们就说这种关系
        是一个一对多的关系.
多对多的关系:
    表A中的记录在表B中有多条记录与之相匹配,同时,在表B中的一条
        记录,与表A中的多条记录相匹配,表A和表B构成多对多的关系.
    如何表A和表B的关系?
        借助中间表,在中间表中分别存储表A的主键和表B的主键
            例:学生和老师的关系.

DQL:

介绍

Data Query Language数据查询语言
简单查询: select * from表名
完整查询语句:
Select[select选项]字段1,字段2…/* from 数据源

​ [where子句]

​ [group by子句]

​ [having子句]

​ [orderby子句]

​ [limit子句]
​ Select 选项:
​ 包含两:如果不写,默认值为ALL
​ ALL:查询出来的数据全部保留
​ Distinct(去重):去掉重复的数据,只针对查询出来的结果内容完全一样才能 进行去重

数据源

​ 单表数据源:表名
​ 多表数据源:
​ 查询出来的结果(子查询):

where子句

​ 用来对查询结果进行筛选,

​ 比较运算符:> >= =(等于) < <= != like between A and B 在A和B之间(包 含A和B) in 在什么里面
​ 逻辑运算符(多个条件之间的连): and(与),or(或),非(not)!
​ 判断不为空:is not null
​ 判断为空:is null
​ in子句: in/not in
​ 原理

where是查询语句中唯一一个从磁盘取出数据,并进行一条一条的比对,如果满 足条件,则将该条数据放进内存,不符合条件则舍去;

Group by

分组 按照某一个字段将数据进行分组

分组的目的:统计数据信息 (每组有多少人)…
如何统计?

多字段分组

​ group by 字段1,字段2,先按照字段1进行分组后,在分组后字段2再进行分组

使用group by之后会默认按照升序排列

聚合函数

​ 1.找

最大值 max(字段)

最小值 min(字段)

平均值 avg(字段)

统计总数 count(字段),求

总和 sum(字段)

count([distinct] 字段):如果加上distinct,会对字段进行去重

Having子句

​ 对分组后的统计结果进行筛选,having后常常跟聚合函数

Oder by 子句

​ 排序 后面跟字段,默认为升序排序,升序排列为asc
​ asc可以省略,如果想按照降序排列,在排列的字段
​ 后面加上desc;也可以多字段排序.

Limit子句

用来限制数据显示的条数,后面跟的int的数据
数据:
Limit 数字1;表示数据显示的条数;
Limit 数字1,数字2;数字1表示从第(数字1+1)条
数据开始,显示 数字2 条数据;
作用?用来做分页查询:
当前页码 为 nowpage,每条显示50条数据;
当前为1的时候,limit 0,50;
当前为2的时候,limit 50,50;
当前为3的时候,limit 100,50;
(当前页码-1)*50,50

取别名

​ 字段 [as] 别名

多表数据源

​ 连接查询:将多张表的记录进行连接(按照某一种条件进行连接,
​ 连接后的数据可能会大于当前的数据)
​ 什么时候用?用户查看的数据来自多张表的时候使用
​ 连接查询分为4种:
​ 交叉连接、内连接、外连接、自然连接

交叉连接(cross join)

​ 基本语法结构: from 左表 cross join 右表
​ from 左表,右表
​ 交叉连接:用左表中的每一条数据都会与右表中
​ 的每一条数据进行匹配,并且会保留所有结果,产生笛卡尔积(交叉查询没用)
​ 千万不要用!!!!!!!!!!!

内连接(inner join)

​ 基本语法:from 左表 [inner] join 右表 on 连接条件
​ 基本语法: from 左表 [inner] join 右表 on 连接条件
​ 内连接:
​ 用左表中的每一条数据与右表中的数据根据连接,条件进行匹配,如果匹 配的结果在左表和右表中相同就保留该条记录,否则直接舍去;

外连接(outter join)

​ 左外连接 : left [outter] join

​ 基本语法结构:from 左表 left join 右表 on 连接条件

​ 用左表的每一条数据,与右表中的每一条数据根据连接条件进行匹 配,如果匹配的结果在左表中存在,则保留,右表没有的数据则 置空
​ 右外连接 : right [outter] join
​ 基本语法结构: from左表right join 右表on连接条件
​ 用左表的每一条数据与右表中的每一条数据根据连接条件进行匹配, 如匹配的结果在右表中存在则保留,左表没有的数据则置空;

​ 左外链接和右外链接可以互相转换,如果有多张表:可以继续在后面跟连接(左 外,右外,内连接)
​ From 第一张表 join 第二张表 on 连接条件 join 第三张表 on 连接条件;

自然连接(nature join)

​ 系统根据相同的字段名自动进行连接;

​ 基本语法结构: from 左表 nature[left/right] join 右表

子查询(sub query)

一条select 语句里面包含了另外一条select语句;
按照select出现的位置来分:
From子句后面: from (select语句);
Where 子查询: where 条件(select 语句)
Exists(存在):Exists (select 语句):

​ 注意:in 和not in比较重要

​ 根据select 查询的结果来分:
​ 标量子查询:子查询的结果是一个一行一列
​ 列子查询:子查询返回的结果是一列多行
​ 行子查询:子查询返回的结果是一行多列
​ 以上三个都跟在where后面
​ 表子查询:子查询返回的结果是多行多列

​ 表子查询
​ 返回的结果是一个二维表(多行多列),跟在from后面

​ 注意:使用表子查询的时候需要给查询出来的表取别名

​ Exists(存在)子查询:跟在where后面,exist是对后面的语句进行
​ 某一条件判断,如果该子查询有数据,就返回1,否则返回0

1
2
3
4
5
例:
1.查询所有的学生信息,前提是在班级id为1的班级存在的情况下;
Select id from cla where id =1;
2.查所有学生信息
Select * from stu where exists(Select id from cla where id =1);

外键

外面的键(键不在自己表中,如果一个表的一个字段(主键除外)是其他表的主键
,那么这个件叫外键(foreign key))
设置外键:
在创建表之后设置外键
Alter table 表名 add foreign key(外键字段) references 父表(主键字段)
父表
把这个作为主键的表作为父表
子表
拥有外键的表叫做子表
添加的前提:子表中存在的数据必须保证在父表中存在才能添加成功
外键的作用:
对子表的约束:子表中新插入的数据必须在父表中存在记录才能进行插入
对父表的约束:如父表中的数据被子表引用,那么父表不能进行更新和删除
外键的约束:
restrict:严格模式,如果父表中的数据被子表引用,那么
将不允许修改和删除(默认);
Cascade(级联):级联模式,如果父表中的数据被子表引用,
父表中的数据删除,子表中的数据也会被删除,父表中的
数据更新,子表也会更新;在更新时使用;
set NULL:置空模式,如果附表中的数据被子表所引用,父表中的数据删除,子 表的记录会设置为null,父表中的数据更新,子表也会设置为null;
常用方式:在更新时使用级联模式,在删除时,使用setNULL模式,如下所示.

1
alter table stu add FOREIGN key (C_id) REFERENCES cla (id) ON delete set null ON update cascade ;//删除时置空,更新时级联

视图(view)

是一个有结构但是没有结果(表中没有数据)的虚拟表

创建视图

​ Create view 视图名 as select 语句

​ create view my_ view as select stu.id, name, number, sex, age, height, cname , room from stu join cla on stu.c_ id = cla.id;

​ 注意:
​ select 语句里面必须明确字段,不能使用 * ;

查看视图
show tables;
show create view 视图名;
使用视图:
当普通表一样使用,但是视图只用于查询,在视图中不要进行删除和修改;
视图作用:
1.可以使用SQL语句,方便查询
2.可以针对不同的客户,定制不同需求的表格
3.可以保证数据的安全
视图修改
alter view 视图名 as select 新的语句
alter view my_view as SELECT product.name from product
视图的删除
drop view 视图名;
蠕虫复制
从现有的数据中去获得数据,并进行新增操作
表创建的高级操作:
1.复制表结构:
create table 自定义表名 like 需要复制的数据库名.表名
2.复制数据
insert into 表名(字段) select 字段/* from 表名
例:
insert into 829test.user_copy select * from 829test.user

​ 作用:
​ 1.用来做测试(压力测试)
​ 2.可以让表中的数据迅速的膨胀到一定的数量级

1
2
3
4
5
例子:
create table student_copy like query26.student;
insert into student copy select from query26.student;
--从自己表中取出数据,在进行插入操作
inserts into student copy select from student copy ;

变量

​ 系统变量:系统已经定义好的变量
​ 查看系统变量:
​ show variables;
​ 查看某一个系统变量
​ select @@变量名;
​ 更改系统变量:
​ Set @@变量名 = 值;
​ 自定义变量:
​ Set @变量名 = 初始值;
​ 查看变量:
​ select @变量名;
​ 修改变量:
​ Set @变量名 = 新的值;
​ 分支:
​ if 条件判断 then
​ 执行的语句
​ end if;
​ 循环:
​ while 条件判断 do
​ 循环体;
​ end while;

​ iterator = continue;
​ leave = break;

事务

一系列将要连发生的操作
使用:
1.开启事务: start transaction;
2.进行事务的操作:
2.1.张三的账户 -500
2.2.李四的账户 +500
3.提交事务
3.1.commit;如果事务操作没有出现异常,则将事务
进行的操作更新到数据库
3.2.rollback;回滚,回到事务操作前的状态;
作用:

保证数据的一致性
原理:

事务的操作会先保存到事务操作日志里面,如果提交事务的时候,使用的commit, 则将日志里面的记录永久的更新到数据库,如果提交事务的时候使用 rollback,则删除当前事务的操作日志;

√事务的四大特性:ACID

​ 原子性(Atomic):事务的操作应该看成一个不可分割的整体,进行
​ 事务操作的时候,要么一起成功,要么一起失败

​ 一致性(consistency):事务操作的前后,要保持数据的一致性;

​ 隔离性(isolation):多个事务之间是相互隔离,互不干扰;

​ 持久性(durability):事务一旦提交,将永久修改,不能改变;

事务的隔离级别

​ 读未提交(read uncommitted),读已提交(read committed)
​ 可重复读(repeatabel read ),串行化读(serializable);
​ mysql的隔离级别为可重复读:
​ 查看mysql的隔离级别: select @@tx_isolation;
​ 修改mysql的隔离级别:
​ 只针对会话级别的修改,当次连有效
​ set session transaction isolation level 隔离级别

    读未提交会产生数据的脏读(读出来的数据没有什么用);
    
    读已提交只能提取事务中已经提交的数据,不可重复读,两读取到的
        数据不一样
        
    幻读:一个事务在进行读取操作,另外一个事务对其进行修改或者
        插入操作,会造成两的数据不一致性;
    串行化读,效率极低,一般不使用(默认隔离级别 为 可重复读)

触发器(trigger)

事先为某张表绑定逻辑处理代码,在达到某种触发条件的时候,
执行这段代码;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
创建触发器:
create trigger 触发器名 触发时间 触发事件类型 on 触发的表 for each row
begin
执行的逻辑;
end
触发时间:有两种时间:before after;
触发事件类型:
insert(插入数据的时候触发)
update(更新的时候触发)
delete(删除的时候触发)
修改结束符:delimiter $$
查看触发器::show triggers;
修改/删除:
drop trigger 触发器名;`

对于新增数据操作,原来不存在这条数据,新的就用new.字段
对于删除和修改数据操作,原来存在这条数据,获取里面的字段
的数据,old.字段
例如:
create trigger my_stu after delete on stu for each row
begin
update teacher set taccount='qwer' where tid=old.sid;
end

SQL函数

​ 系统函数(聚合函数)
​ length() 求的字节长度
​ substring() 求字符串长度
​ substring() 截取
​ 调用函数:
​ select 函数名(实际参数);

​ 函数必须有返回值!

​ 创建函数:

​ create function 函数名(参数列表) returns 返回值类型

​ begin

​ 函数体;

​ return 值;

​ end

​ 参数列表:变量1 数据类型,变量名2 数据类型

​ 调用函数:select 函数名(实参);

​ 删除函数:drop function 函数名;

​ Set@变量名 是一个全局变量

​ 局部变量:

​ Declare 变量名 数据类型;

​ Declare 变量名 数据类型 default 默认值;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#例如下所示:
#创建 1+...+n的函数
create function my_function(num int) returns int
begin
declare i int default 0;
declare sum int default 0;
while i<=num do
set sum = sum + i;
set i=i+1;
end while ;
return sum;
end
#查看
select my_function(100);

过程

procedure 储存过程,简称过程,他是用来对数据进行处理的一种方式,可以理解 成没有返回值的函数;

​ 创建过程:

​ create procedure 过程名(参数列表)

​ begin

​ 执行体;

​ end

​ 删除过程:

​ drop procedure 过程名;

​ 调用过程:

​ call 过程名(实参);

过程虽然没有返回值,但是有参数,参数的数据类型,比函数更加严格,除了SQL里 面提供的数据类型以外,还额外规定了只供过程使用的三种数据类型.

​ in:由过程外面传递到里面使用,相当于java中的值传递;

​ out:由过程外面传递到过程里面使用,但是在过程里面使用时,会先将原来 的数据清空,类似于java的引用传递;

​ inout:由过程外面传递到过程里面使用,过程里面进行改变,外面的值也会改 变,典型的引用传递;

参数列表: 过程数据类型 变量名 数据类型

in 数据类型可以传递值,也可以传递变量;

out/inout 只能传递变量,不能传递值;

过程里面的全局变量的修改是滞后的(在过程结束前进行修改)

返回int类型的随机数 floor(rand()*100)

1
2
3
4
5
6
7
8
9
10
11
#例如下所示
#创建
create procedure my_test(in num int)
begin
while num>0 do
select * from teacher;
set num=num-1;
end while;
end
#调用
call my_test(5);

注:过程里面的全局变量的修改是滞后的(在过程结束前进行修改)

游标

作用:

​ 游动的标识,是SQL中对数据进行处理的一种方法,用来的对查询出来的结 果集进行一条一条的取出数据进行操作;类似于Java中的集合,一条一 条的取出数据就想相当于对集合进行遍历;

声明游标:

​ declare 游标名 cursor for select 语句;

​ 注:(不能使用select *,必须写明具体的字段)

使用游标

  1. 打开游标 : open 游标名;

  2. 取出数据 : fetch 游标名 into var1,var2,var3…..;

  3. 关闭游标 : close 游标名;

具体使用如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
create procedure my_cursor()
begin
#注:所有的declare声明的变量必须在
#最开始的时候进行声明
declare row_tid int;
declare row_taccount varchar(20);
declare row_tpassword varchar(20);
#声明一个标志,默认为1
declare state int default 1;
#声明游标
declare getanimal cursor for
select tid,taccount,tpassword from teacher;
declare continue handler for not found set state=0;
#打开游标
open getanimal;
#循环取出数据
while state<>0 do
fetch getanimal into row_tid,row_taccount,row_tpassword;
select row_tid,row_taccount,row_tpassword;
end while;
#关闭游标
end

#查看一下
call my_cursor();
注:
Exit handler:发生异常之后,后面的不在执行
continue handler:发生异常后,继续向下执行
undo handler:发生异常之后什么都不做,mysql不支持

查询结果赋变量

  1. set @变量名 = (select 语句);

    := 在SQL中表示赋值

  2. select @变量名 :=字段 from……

  3. select 字段 into @变量名 from …..

  4. select 字段 from ……. into @变量名

三大范式

​ 范式(Normal format):离散数学里面的一种范式;

​ 终极目的:是为了更好的存储数据,凡是能通过关系查出来的数据,绝对不再重复储存

​ 六大范式:要满足第二层范式,必须先满足第一范式,要满足后面一层的范式,就必须满足前面的范式,一层比一层严格,对于数据库来说,除了保证数据的不重复存储之外,还应该保证查询效率,综合考虑,数据块只需要满足前三种范式即可;

1.列的原子性:数据在取出来使用时,不需要再进行二次拆分

2.行的唯一性:每张表都应该有主键用来进行区分每一行的内容

3.表中的每一个字段都必须与主键直接相关而非间接相关