这份笔记,还是大二学数据库时候的笔记。
博客地址
zyzcos.gitee.io
00-基础概念
- sql:标准的结构化查询语言(由DBMS编译完成)
- DB:DataBase(数据库,实际上在硬盘上以文件形式存在)
- DBMS:DataBase Management System (数据库管理系统 MYSQL ORACLE DB2 …)
表
- 表:table
- 行:数据 / 记录
- 列:字段(字段三元素:字段名、数据类型、相关的约束)
SQL语句
- DQL(数据查询语言):查询语句、凡是select都是DQL语句 (select)
- DML(数据操作语言):insert delete update 对表数据的增删改 (insert delete update)
- DDL(数据定义语言):create drop alter 对表结构的增删改 (create drop alter)
- TCL(事务控制语言):commit提交事务,rollback回滚事务
- DCL(数据控制语言):grant授权 revoke撤销权限等
DOS命令窗口使用mysql
- 登录:mysql -u root -p
- 查看有什么数据库:show databases
- 创建表:create database 表名
- 使用表:use 表名
- 展示表:show tables
- 查询表结构:desc 表名
- 初始化数据:执行初始化语句脚本: source 脚本文件路径
sql脚本
- 后缀名为 .sql
- 脚本的使用:在DOS命令窗口中: source 脚本路径
MYSQL常用命令
- select database(); 查看当前数据库
- \c 结束一条语句
- show create table 表名 查看创建表的语句
字符串用单引号
字段值可以参与数值运算
常见数据类型
- int 整数型
- bigint 长整型
- float 浮点型
- char 定长字符串
- varchar 可变长字符串
- data 日期类型
- BLOB 二进制大对象(存储图片、视频等流媒体信息)Binary Large OBject
- CLOB 字符大对象(存储较大文本,可存储4G字符串) Character Large OBject
CRUD
- create
- retrieve(检索)
- update
- delete
01-简介
1.什么是SQL
一种操作数据库的语言
2.SQL可以做什么?
* 数据查询、获取、插入、更新、修改、删除
* 创建数据库
* 在数据库中创建表、创建存储过程、创建视图
* 设置表、存储过程、视图的权限
3.SQL的重要命令
- SELECT:从数据库获取数据
- UPDATE:更新数据库中的数据
- DELETE:从数据库中删除数据
- INSERT INTO:向数据库插入新的数据
- CREATE DATABASE:创建新数据库
- ALTER DATABASE:修改数据库
- CREATE TABLE:从创建新表
- ALTER TABLE:该表数据库表
- DROP TABLE:删除表
- CREATE INDEX:创建索引
- DROP INDEX:删除索引
02-查询、排序、条件语法
-
SELECT 用于向数据库中选取数据
语法:
SELECT column_name1,column_name2 FROM table_name;
-
**SELECT DISTINCT **用于列出不同的值 去重
语法:
SELECT DISTINCT column_name1,column_name2 FROM table_name;
-
WHERE 用于提取满足指定条件的记录
语法:
SELECT column_name,column_name FROM table_name WHERE column_name operator value;
例子:从table1中选出属性country中值为cn的url
SELECT url FROM TABLE1 WHERE country='cn'
其中opreator的可用运算符有:
运算符 描述 = 等于 <> 不等于。**注释:**在 SQL 的一些版本中,该操作符可被写成 != > 大于 < 小于 >= 大于等于 <= 小于等于 BETWEEN 在某个范围内 LIKE 搜索某种模式 IN 指定针对某个列的多个可能值 -
OR和AND 用于多过滤条件(AND 优先级大于 OR)
语法+例子: 列出contry为cn 且 年龄大于18 的人的名字
SELECT name FROM people_table WHERE country='CN' AND age>18
ADN和OR 还可以嵌套使用 比如说 :列出年龄大于18 国家是cn或者us的人名
SELECT name FROM people_table WHERE age>18 AND (contry='cn' OR contry='us')
-
ORDER BY 用于排序
语法:默认为ASC 升序
SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC;
例子: 按age的降序 给整个表进行排序
SELECT * FROM table_people ORDER BY age DESC
例子: 先按照sex进行降序排序 当sex一样的时候,按照age进行升序排序
SELECT * FORM table_people ORDER BY sex DESC, age
例子:按照所选字段的第1个字段升序排序 不建议使用
SELECT NAME AGE FROM TABLE_NAME ORDER BY 1;
-
INSERT INTO 用于向表插入新记录(也可以插入一个表)
语法: 不指定插入的位置(可以多行插入)
INSERT INTO table_name VALUES (value1,value2,value3,value4...),(value1,value2,value3,value4...),....
语法:指定插入的文位置
INSERT INTO table_name(column1,column2,column3...) VALUES (value1,value2,value3...)
语法:插入一个表(将表2的左右记录插入到表1中)
INSERT INTO table_name1 SELECT * FROM table_name2;
-
UPDATE 用于更新表已存在的记录(修改)
语法:如果没有where 整个表的column1 column2的值都会被改变
UPDATE table_name SET column1=value1,column2=value2... WHERE some_column=some_value
例子:更新table_people,将所有contry为us的记录中 其money改为1 name改为son
UPDATE table_people SET money=1, name='son' WHERE contry='us'
-
DELETE 用于删除表中记录
语法:
DELETE FROM table_name WHERE some_column=some_value
例子:删除 已经死亡 且 国籍为null的记录
DELETE FROM table_name WHERE (isdead=1 AND contry=null)
例子:删除所有
DELETE * FROM table_name
-
IN 用于条件筛选的
语法:列出 年龄为18或者36的人名
SELECT NAME FROM TABLE_NAME WHERE AGE IN (18,36);
语法:列出年龄不为18和36的人名
SELECT NAME FROM TABLE_NAME WHERE AGE NOT IN (18,36);
-
BETWEEN 用于条件筛选的
语法:列出年龄在18到36之间的人名(包括18和36) 左边小值 右边大值
SELECT NAME FROM TABLE_NAME WHERE AGE BETWEEN 18 AND 36;
-
LIKE 用于模糊查询 _代表一个字符 %代表任意多个字符
语法:列出开头为A的人名
SELECT NAME FROM TABLE_NAME WHERE NAME LIKE 'A%';
语法:列出第二个字母为A的人名
SELECT NAME FROM TABLE_NAME WHERE NAME LIKE '_A';
语法: 列出第一个字母为_的人名(使用转义字符)
SELECT NAME FROM TABLE_NAME WHERE NAME LIKE '\_';
-
IS NULL 和 IS NOT NULL
语法:列出国籍为空的人名
SELECT NAME FROM TABLE_NAME WHERE COUNTRY IS NULL;
03-SQL语句的执行顺序
SELECT 5
字段
FROM 1
表名
WHERE 2
条件
GROUP BY 3
....
HAVING 4
....
ORDER BY 6
....
LIMIT 7(limit语句是SQL语句中,最后一个执行的)
...
04-处理函数
1.多行处理函数(分组函数)
特点
- 多行处理,一行结果
- 多行处理函数,自动忽略字段值为NULL的
- 不能运用于WHERE子句当中(会1111报错)why???
- 因为 group by是在执行where之后才执行的
- 而分组函数 在group by 后面才执行的
- 于此同时,就解释了为什么叫分组函数
类别
-
count(字段值):计数
语法:统计记录的条数
SELECT count(*) FROM TABLE_NAME
语法:统计国籍不为NULL的条数
SELECT count(country) FROM TABLE_NAME
-
sum(字段值):求和
语法:求工资总和
SELECT sum(sal) FROM TABLE_NAME
-
avg(字段值):求平均值
-
max(字段值):求最大值
-
min(字段值):求最小值
2.单行处理函数
特点
- 单行处理、单行结果
类别
-
ifnull(可能为NULL的数据,被当做什么处理)
语法:将字段值为null的设置为‘cn’ 且列出其名字 和 国籍
SELECT name ifnull(country,'cn') FROM TABLE_NAME
05-分组查询
group by 和 having
单字段值分组查询
-
语法:
GROUP BY :按照某个字段或者某些字段进行分组
HAVING:对分组之后的数据进行再次过滤
例子:找出每个工作岗位的最高薪资
SELECT job,max(sal) FROM table_name GROUP BY job;
例子:找出每个国家的最高年龄
SELECT max(age),country FROM table_name GROUP BY country;
例子:找出每个部门平均薪资,且显示平均薪资大于等于2500的
SELECT deptno,avg(sal) FROM table_name GROUP BY deptno having avg(sal)>2500
错误例子:name没有意义
SELECT name,max(age),country FROM table_name GROUP BY country;
-
注意:当sql语句中有group by的时候,select只能跟分组函数和分组字段
-
当sql语句中,没有group by的时候,整个表会自成一组;
多字段值分组查询
-
例子:找出不同部门中每个工作岗位的最高薪资
SELECT deptno,job,max(sal) FROM table_name GROUP BY deptno,job;
注意:
分组进行筛选的时候,优先考虑where筛选后再分组 效率较高
分组进行筛选的时候,其次考虑分组后 再用having筛选
06-多表查询
什么是链接查询?
就是多表查询
链接查询的分类
-
按照语法年代分
- SQL92语法(一些老的DBA还在用)
- SQL99语法(常用)
- SQL92语法(一些老的DBA还在用)
-
其他
-
内连接(inner join INNER可以省略)
-
等值链接(体现在限制条件中)
99语法: 查询每个人对应的职位以及部门名称 a表中拥有人和职位和部门编号 b表中拥有部门编号和部门名称
SELECT a.name a.job , b.depname FROM table_a AS a INNER JOIN table_b AS b ON a.depno = b.depno
92语法:
SELECT a.name a.job , b.name FROM table_a AS a , table_b AS b WHERE a.depno = b.depno
-
非等值链接(体现在限制条件中)
99语法: 查询每个人的工资等级 a表中有人和工资 b表中有工资等级以及对应的最高最低值
SELECT a.name , b.grade FROM table_a AS a INNER JOIN table_b AS b ON a.sal BETWEEN b.lowest AND b.heighest
92语法:
SELECT a.name , b.grade FROM table_a as a , table_b as b WHERE a.sal BETWEEN b.lowest AND b.heighest
-
自链接(将一张表 看成 两张表 来链接查询)
99语法:查询每个员工的上级领导 表中有每个员工的编号 员工名字 以及 员工上级的编号
SELECT a.name , b.name FROM table_a AS a INNER JOIN table_a AS b ON b.manage = a.id
-
-
外连接(outer join OUTER可以省略)
-
左外链接(左链接) 左边为主表
99语法:查询出所有员工的上级领导(相较于自链接而言,不会忽略主表中的a.mange=NULL的记录)
SELECT a.name , b.name FROM table_a as a LEFT JOIN table_b as b ON a.manAge = b.id
-
右外连接(右链接)
99语法:查询出所有员工的上级领导(相较于自链接而言,不会忽略主表中的a.mange=NULL的记录)
SELECT a.name , b.name FROM table_b as b RIGHT JOIN table_a as a ON a.manAge = b.id
-
-
全连接 = 左连接 + 右链接 + 去重
- 很少使用,作为了解即可
- FULL OUTER JOIN
-
内外链接的区别
- 内连接:
- A,B两表进行内链接查询, A,B两表处于平等地位,没有主副之分
- 外链接:
- A,B两表进行外查询,A,B两表处于不平等地位,有主副之分,主要查询主表,捎带查询副表。当副表中的数据不能和主表的匹配,则副表自动模拟出与主表NULL进行匹配
笛卡尔乘积现象
当进行多表查询时,如果没有添加限制条件,就会出现笛卡尔积现象
内外链接、全连接等的Venn diagram解释:
https://blog.csdn.net/u014204541/article/details/79739980
多表查询
....
a表
(left/right)jion
b表
on 条件1
(left/right)join
c表
on 条件2
...
意为:a表和b表通过条件1链接后,再和c通过条件2链接
07-union
union:将两个表链接起来
- 前提条件:两个表的列数要一致,不然会报错
- 语法:
select e.name from table_a e union select d.name from table_b d;
08-limit
limit(重点,分页查询全靠它)
- 它是mysql特有的语句
- 作用:用于提取结果数据中的某一部分
- 语法:limit startIndex,length
取出工资前5的人名以及其工资select e.name,e.sal from table_a e order by e.sal desc limit 0,5;
使用limit进行分页
- 每一页pageSize条记录
第pageNo页:limit ( pageNo - 1 ),pageSize;
09-表操作
创建表
语法格式:
create table 表名(
字段名1 数据类型 约束条件,
字段名2 数据类型 约束条件,
字段名3 数据类型 约束条件,
字段名4 数据类型 约束条件,
);
复制表
语法格式:将查询到的表 创建成一个新表
create table 表名 as select语句;
删除表
delete:删除表格上面的数据,但是不删除物理空间
删除大表: truncate table 表名(表被截断,不可回滚,永久丢失,但是保留表头)
10-约束
约束的分类
-
非空约束(not null):约束的字段不能为空
-
唯一约束(unique):约束的字段不能重复
-
单字段约束**(列级约束)**:
字段 数据类型 unique;
-
多字段联合约束**(表级约束)**:
unique(字段1,字段2....);
-
-
主键约束(primary key):约束的字段既不能为空,又不能重复
-
主键的作用:
- 表的三范式中,第一范式要求表必须有主键
- 主键值是这行记录在当前表中的唯一标识
-
主键的分类:
- 根据主键字段的字段数量来划分
- 单一主键(推荐使用)
- 复合主键(多个字段联合添加主键约束)(不推荐使用,违反了三范式)
- 根据主键性质来划分
- 自然主键(主键值最好是一个和业务没有任何挂钩的自然数)
- 业务主键(不推荐使用,因为主键最好不要跟记录有关联。)
- 根据主键字段的字段数量来划分
-
一个表只能由一个主键约束
-
主键值自增
id int primary key auto_increment;
-
-
外键约束(foreign key):
-
语法: 学生表t_student 中的外键calssno 参考与班级表t_class中的cno
create table t_student( foreign key(classno) references t_class(cno), );
-
外键一般引入的是主键,即使不是主键,也必须具有唯一性
-
-
检查约束(check):Oracle数据库有,MYSQL没有
11-存储引擎
-
完整的建表语句
CREATE TABLE '表名'( 'id' int(11) DEFAULT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8
-
存储引擎是MYSQL特有的,指的是表的存储方式
-
MYSQL的默认存储引擎是InnoDB
MYSQL存储引擎的分类
- 查看当前版本MYSQL支持的存储引擎
show engines \G
MyISAM
- 是MYSQL中最常见的引擎
- 不支持事务
- 其用三个文件来表示一个表
- 格式文件 — 存储表结构**(.FRM)**
- 数据文件 — 存储表数据**(.MYD)**
- 索引文件 — 存储表索引**(.MYI)**
- 优点:
- 灵活的 AUTO_INCREMENT 字段处理
- 可被压缩文件节省存储空间,并且可以转化为只读表,提高检索效率
- 缺点:
- 不支持事务
InnoDB
- 是MYSQL中的默认引擎,最安全
- 支持事务
- 数据库目录用**.FRM文件格式表示;使用tablespace存储表内容**,无法被压缩,无法转化为只读
- 在MySQL服务器崩溃后提供自动恢复
- 支持行级锁、级联删除、更新
MEMORY
- 数据库目录用**.FRM**文件格式表示;
- 表数据、索引存储在内存中(断电丢失数据)
- 表级锁
- 不能包含CLOB BLOB字段
- 检索很快!
12-事务
什么是事务?
-
一个事务 是 一个完整的业务逻辑单元,不可再分
-
银行的转账系统,这就是一个事务
update t_account set balance = balance - 1000 where actno = 'act001' update t_account set balance = balance + 1000 where actno = 'act002'
-
-
事务只包含DML语句(delete insert update),且其中的DML语句只能全部成功或者全部失败
事务的特性:ACID
- A:原子性 事务时最小的工作单元,不可再分
- C:一致性 事务必须保证多条DML语句同时成功或同时失败
- I:隔离性 事务与事务之间必须有隔离
- D:持久性 最终数据必须持久化到硬盘文件中,事务才算成功
关于事务的隔离性:
- 第一级别:读未提交(read uncommitted)
- 对方数据还未提交,当前事务就可以读取到对方未提交的数据
- 缺点:存在脏读(Dirty read)现象。
- 第二级别:读已提交(read committed)
- 对方数据提交,当前事务就可以读取到对方已提交的数据
- 缺点:不可重复读,不能读取到历史记录,只能读取到最新数据。存在幻读现象
- 第三级别:可重复读(repeatable read)
- 解决了不可重复读问题
- 缺点:事务A读取到的数据是开启事务A时的表的内容,若事务B对该表进行操作的话,不影响事务A里面的表的内容。存在幻读现象
- 第四级别:序列化读 / 串行化读 (serializeable)
- 每次只能处理一个事务,解决了所有问题
- 缺点:效率低,事务需要排队
设置事务隔离等级
> 设置
set global transaction isolation level read uncommitted/其他
> 查看
select @@global.tx isolation
oracle默认二档起步,mysql默认三档起步
事务的原理:
利用MYSQL食物日志undolog文件,udolog属于逻辑日志,它记录的是sql执行相关的信息,当回滚发生的时候,数据库会工具undolog的内容做与之前相反的工作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UX0MxahD-1642854504136)(E:\02-数据库的深入学习\笔记-SQL\事务原理图.png)]
事务的操作
-
mysql默认自动提交,所以要通过开启事务,来关闭自动提交
start transaction //用来开启事务 DML //sql语句 commit/rollback //用于结束事务
redo日志
防止缓存到硬盘的过程中,只执行了一部分而发生mysql宕机问题。mysql具有redo日志。可以重启mysql后,重新将数据持久化到硬盘中
13-索引
数据库中的两种检索方式
- 全表扫描 (效率较低)
- 根据索引检索(效率较高)
什么是索引
相当于一本书的目录,可以通过目录快速找到对应的资源
什么时候考虑添加索引
- 当数据量庞大时
- 该字段很少的DML操作
- 该字段常常出现在where语句中
- 注意:
- 主键会自动添加索引,主键索引效率非常高。
- unique也会自动添加索引
如何使用索引
-
创建索引对象
create index 索引名称 on 表名(字段名)
-
删除索引对象
drop index 索引名称 on 表名
索引的分类
- **单一索引:**单一字段添加索引
- **复合索引:**多个字段联合添加一个索引
- **主键索引:**主键会自动添加索引
- **唯一索引:**unique也会自动添加索引
索引的实现原理
- 添加索引后,底层构建了一个B+Tree(进行排序、分区等)
- 通过树的搜索,找到目标字段值
- 通过该目标字段值的物理地址,找到整条记录
注意:
索引不是万能的,索引也需要维护!
索引的底层原理——B + Tree
当进行like模糊查询的时候,索引会失效。
如果字段是字符的话 会通过hash函数,使其唯一且可排序
00-索引拓展
什么是索引
快速找到目标字段值,提高查询速度
索引的分类
- MYSQL根据存储引擎对索引进行分类
- InnoDB主键使用聚簇索引
- MyISAM所有的索引都是非聚簇索引
非聚簇索引
-
什么是非聚簇索引
- 在二叉树存储数据中,叶子存储着数据的主键值和数据所在行地址
-
非聚簇索引工作原理
//创建表 create table 'stu'( 'id' int(11) not null, ) //创建索引 create index id_index on s(id); //进行查询 SELECT * FROM stu s WHERE s.id=1;
- 先在索引树找到id
- 这个索引id存储在叶子上,同时叶子上还会存储着数据的地址信息
聚簇索引
- 什么是聚簇索引
- 在二叉树存储数据中,叶子还存储着索引和其数据
- 这样的话 就不需要根据数据地址 再去寻找其数据 从而提高了效率
聚簇索引和非聚簇索引的区别 以及 存储引擎区别
-
索引类型与存储引擎的关系
-
InnoDB可以创建【聚簇索引】和【非聚簇索引】
-
MyISAM 只可以创建 【非聚簇索引】
-
-
叶子节点存储的内容
- 非聚簇索引:存储着【主键值】以及【该主键值数据的地址信息】
- 聚簇索引:存储着【主键值】以及【该主键的数据信息】
-
关于索引的问题
-
MyISAM 允许表中可以没有主键和索引
-
InnoDB 自动将主键设置为聚簇索引 , 若没有主键,则会将一个唯一且非空的字段设置为索引
若在没有 , 则会自动生成一个6字节的主键,但对于用户不可见
-
-
关于自动增长问题
- MyISAM、InnoDB 自动增长 都必须是索引
- 当使用组合索引时 :
- MyISAM:自动增长 不一定是第一列,可以是多列排序后递增
- InnoDB: 自动增长 一定是第一列
-
关于count函数
- MyISAM : 存有总的行数
- InnoDB:没有存储总行数,但是使用where的时候,两者一致
-
关于全文索引
- MyISAM 支持FULLTEXT类型的全文索引
- InnoDB 不支持
-
关于删除表问题
- InnoDB DELETE:一条一条删除数据;truncate:截断 不可回滚
- MyISAM DELETE:会创建临时表,在临时表进行删除,然后使用临时表覆盖原表
聚簇索引和非聚簇所以的适用场合
-
大前提:索引能够大大地提升查询速度,但是对存储空间和CPU使用率影响很大
-
适用场合参考条件:
-
数据频繁修改的表,不应该设置索引;
-
不是经常作为【检索字段】、【分组字段】、【排序字段】的字段,不应该设置索引;
-
![](https://i-blog.csdnimg.cn/blog_migrate/ba702f9329ee255aa3534ab94de9f6c4.jpeg)
14-视图
什么是视图
> 站在不同角度去看数据
视图的使用
-
创建视图:将table_a中的name,age,sex创建为一个视图
create view myview as select name,age,sex from table_a;
-
删除视图:
drop view myview;
-
对视图的操作:
select * from myview;
对视图的操作会影响原表数据
视图的作用
* 仅仅给数据操作者,其需要操作的数据,隐藏了表的**其他数据**并起到**保密作用**。
15-数据三范式
数据三范式的作用:
降低数据冗余
第一范式
必须有主键,并且每个字段原子不可分性
第二范式
- 建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。(不能用于联合主键)
- 多对多关系的处理方法:三张表,关系表两个外键。
第三范式
- 建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
- 一对多关系的处理方法:两张表,多的表加外键。
注意:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。
- 一对一关系处理方法:
- 共享主键
- 外键+唯一(相当于老师所说的引用)
16-存储过程
什么是存储过程
> 将多个SQL语句封装成一个函数,用函数的形式调用。
DELIMITER // -- 设置//为结束符号
create procedure 存储过程名(参数类型 变量名 变量类型)
-- 参数类型
-- in为写入类型参数 存储过程内,外部传进来的值 在内部中操作 对外部的值的本身不受影响
-- out为写出类型参数 存储过程内, 外部传来的值对内部的值没有影响 内部操作 对外部有影响
begin
xxxx;
xxxxx;
xxxx; -- 存储过程的主体
end // -- 结束语句
DELIMITER; -- 取消//为结束符号
- 如果没有DELIMITER。遇到第一个;就结束了
- 所以DELIMITER意义为:从现在开始 //为结束符号
call 存储过程名称(参数)
mysql变量
-
局部变量
declare 变量名 变量类型 [default value] set c=a+b; -- 赋值 select name into v_name from emp where emp_id='1'; -- 将获取的值,放在v_name中
- 数据的定义,必须放在最前端【在所有数据使用之前】
-
用户变量【在整个数据库实例中有效】
set @变量名=变量值 select @变量名;=变量值 select @变量名;=字段名 from 表名 where 条件 -- 动态加载
控制语句
IF ELSEIF ELSE END IF;
CASE 判断值
WHEN xxx THEN xxxx
WHEN xxx THEN xxx
ELSE xxxx
END CASE
外键**。
第三范式
- 建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
- 一对多关系的处理方法:两张表,多的表加外键。
注意:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。
- 一对一关系处理方法:
- 共享主键
- 外键+唯一(相当于老师所说的引用)
16-存储过程
什么是存储过程
> 将多个SQL语句封装成一个函数,用函数的形式调用。
DELIMITER // -- 设置//为结束符号
create procedure 存储过程名(参数类型 变量名 变量类型)
-- 参数类型
-- in为写入类型参数 存储过程内,外部传进来的值 在内部中操作 对外部的值的本身不受影响
-- out为写出类型参数 存储过程内, 外部传来的值对内部的值没有影响 内部操作 对外部有影响
begin
xxxx;
xxxxx;
xxxx; -- 存储过程的主体
end // -- 结束语句
DELIMITER; -- 取消//为结束符号
- 如果没有DELIMITER。遇到第一个;就结束了
- 所以DELIMITER意义为:从现在开始 //为结束符号
call 存储过程名称(参数)
mysql变量
-
局部变量
declare 变量名 变量类型 [default value] set c=a+b; -- 赋值 select name into v_name from emp where emp_id='1'; -- 将获取的值,放在v_name中
- 数据的定义,必须放在最前端【在所有数据使用之前】
-
用户变量【在整个数据库实例中有效】
set @变量名=变量值 select @变量名;=变量值 select @变量名;=字段名 from 表名 where 条件 -- 动态加载
控制语句
IF ELSEIF ELSE END IF;
CASE 判断值
WHEN xxx THEN xxxx
WHEN xxx THEN xxx
ELSE xxxx
END CASE