本篇均为博主学习数据库MysSQL基础篇时的知识点总结,给大家推荐一下超详细的学习网址:MySQL
基础篇知识点
1.MySQL使用小技巧
1.tab自动补齐
2.F12自动调整代码
3.光标放上双击字段名直接出代码
4.使用*号的缺点,不能改变查询结果字段顺序
5.查询前先打开库,查询前用:USE 表名
6.字段用单引号表示,用以区分
7.对哪条代码操作,选中哪条代码
2.关于查询
(1)查询常量值
SELECT 100;
SELECT 'john';
(数据库没有字符与字符串的差别)
(2)查询表达式
SELECT 100%98;
(查询计算结果)
(3)查询函数
SELECT VERSION();
(查询函数返回值)
3.查询结果取别名
方法一:
SELECT 字段名 AS 别名 FROM 表名;
方法二:
SELECT 字段名 别名 FROM 表名;
注意:当别名遇到特殊符号时,要加单/双引号
4.查询结果去重
加DISTINCT去重
SELECT DISTINCT 字段名 FROM 表名;
5.+号的作用
在mysql中,加好仅代表运算符
SELECT 90+100; --如果两个字段都为数值型,则进行运算
SELECT '90'+100; --如果一个是字符型,一个是数值型,尝试将字符型转化为数值型
进行运算,如果转换成功,则进行运算,如果转换失败,将字符型转换为0
SELECT NULL+99; --只要一方为NULL,结果肯定为NULL
6.使用CONCAT实现连接字段
SELECT CONCAT('a','b','c'); --查询结果:abc
7.显示表结构
DESC 表名
8.IFNULL
判断字段是否为空,如果为空返回相应值
SELECT IFNULL(待判断字段名,为空时返回值);
9.筛选条件
一.条件运算符:大于> 小于< 等于= 不等于<> !=
二.逻辑运算符:&& || !
and or not
三.模糊查询:
**like** :
通配符:‘%’:任意多个字符,包含0个字符
‘_’:任意单个字符
注意:当模糊查询出现通配符时
解决:用转义字符
第一种转义
LIKE ' _/_*'; --代表查找第二个字符是‘_’的字段
第二种转义
LIKE '_&*' ESCAPE '&'; --说明'&'是一个转义字符
**BETWEEN and**:
WHERE 字段名 BETWEEN 'a' and 'b'; --筛选出字段在[a,b]区间的数据
注意:包含临界值,且两个值不能颠倒
**IN**:
WHERE 字段名 IN('a','b','c'); --判断字段中的值是否满足列表中的某一项
注意:列表中值类型必须统一或兼容,且不支持通配符
**is null**:
WHERE 字段名 IS NULL; --筛选为空的字段
SHERE 字段名 IS NOT NULL; --筛选不为空的字段
注意:'='不能判断空值,IS NUL 只能用于判空值
**安全等于<<==>>**:
WHERE 字段 <<=>> 'a'; --判断字段等于某一个值
WHERE 字段 <<=>> NULL; --判断字段为空
10.排序查询
语法:
select 查询列表
from 表
【where 筛选条件】
order by 排序列表 【asc | desc】//desc降序,asc升序,默认升序
特点:
1.order by子句可以支持单个字段、多个字段、表达式、函数、别名
2.order by子句一般是放在查询语句的最后面,limit子句除外
11.常用函数
概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1.隐藏了实现细节 2.提高代码的重用性
调用:select 函数名(实参列表)【from 表】;
特点:
1.叫什么(函数名)
2.干什么(函数功能)
分类:
1.单行函数:concat、length、ifnull等
2.分组函数
功能:做统计使用,又称为统计函数、聚合函数、组函数
一.字符函数
1.lenght 获取参数值的字节个数
SELECT LENGTH('john'); --返回4
2.concat 拼接字符串
cancat(a,'_',b); --结果:a_b
3.upper(转换为大写) lower(转换为小写)
SELECT UPPER('a'); --结果:A
SELECT lower('A'); --结果:a
4.substr、substring 截取字符串
注意:索引从1开始
SELECT substr('abcd',3); --结果:cd
SELECT substr('abcd',3,1); --结果:c
5.instr 返回子串第一次出现的索引,如果找不到返回0
SELECT INSTR('abcdef','cd'); --结果:3
SELECT INSTR('acdbcdef','cd'); --结果:2
6.trim 去前后空格
SELECT TRIM(' abc '); --结果:3
也可以实现去前后指定字符
SELECT TRIM('a' FROM 'aaaaooaaaa'); --结果:oo
7.lpad 用指定的字符实现左填充指定长度
SELECT LPAD('abc',5,'*'); --结果:**abc
8.rpad 用指定的字符实现右填充指定长度
SELECT RPAD('abc',5,'*'); --结果:abc**
9.replace 替换
SELECT REPLACE('oxoxoxox','o','x'); --结果:xxxxxxxx
二.数学函数
1.round 四舍五入
SELECT ROUND(1.56); --结果:2
SELECT ROUND(1.567,2) --结果:1.57 (保留两位小数)
2.ceil 向上取整
SELECT CEIL(1.02) --结果:2
3.floor 向下取整
SELECT FLOOR(9.99) --结果:9
4.truncate 截断
SELECT TRUNCATE(1.6999,1); --结果:1.6 (截断保留一位小数,且不会四舍五入)
5.mod 取余
SELECT MOD(10,3); --结果:1
三.日期函数
1.now 返回当前系统日期+时间
SELECT NOW();
2.curdate 返回当前系统日期,不包含时间
SELECT CURDATE();
3.curtime 返回当前时间,不包含日期
4.获取指定部分,年,月,日,小时,分钟,秒
SELECT YEAR('1999-11-16'); 结果:1999
SELECT MONTH('1999-11-16'); 结果:11
SELECT DAY('1999-11-16'); 结果:16
四.其他函数
SELECT VERSION();
SELECT DATABASE(); 查看当前数据库
SELECT USER(); 查看当前用户
五.分组函数
功能:用于统计使用,又称为聚合函数或统计函数或组函数
分类:
sum(求和)、avg(平均值)、max(最大值)、min(最小值)、count(计算个数)
特点:
1、sum、avg一般用于处理数值型
max、min、count可以处理任何类型
2.以上分组函数都忽略null值
3.可以和DISTINCT搭配去重使用
4.count单独介绍
一般使用count(*)用作统计行数
5.和分组函数一同查询的字段要求是group by后的字段
12.分组查询
语法:
select 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】 --分组前的筛选
group by 分组的列表
【order by 子句】
【having 筛选条件】 --分组后的筛选
注意:查询列表必须特殊,要求是分组函数和group by后出现的字段
特点:
1.分组查询中的筛选条件分为两类
数据源 位置 关键字
分组前筛选 原始表 group by前面 where
分组后筛选 分组后的结果集 group by后面 having
**1.分组函数做条件肯定放在having字句中**
**2.能用分组前筛选的就尽量使用分组前筛选**
2.group by 子句支持单个字段分组,多个字段分组(多个字段之间逗号隔开没有顺序要求),表达式或函数(用的较少)
3.也可以添加排序(排序放在整个分组查询的最后)
13.连接查询
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2 有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
为提高语句简洁度,可以为表取别名
格式:WHERE 表名 AS 新表名
注意:如果取了别名,则查询的字段就不能使用原始表名去限定
1.等值连接
1.多表等值连接的结果为多表的交集部分
2.n表连接,至少需要n-1个连接条件
3.多表的顺序没有要求
4.一般需要为表起别名
5.可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
2.非等值连接
笛卡尔积后,按取值范围筛选比如
A表:工资
B表:工资等级 最低工资 最高工资
查询工资的工资等级:
SELECT 工资,工资等级
FROM A,B
WHERE 工资>=最低工资 AND 工资<=最高工资
3.自连接
相当于创了一张相同的表
A表:员工编号 员工姓名 员工上级编号
查询员工姓名和他的上级姓名
分析:执行顺序:A表的员工姓名 → 员工上级编号 → A表的员工编号 → 员工姓名
SELECT a.员工姓名,b.员工姓名
FROM A AS a,A AS b --相当于创了一张b表
WHERE a.员工上级编号=b.员工编号
4.外连接(sql99语法)
语法:
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
分类:
内连接(※):inner
外连接:
左外连接(※):left【outer】
右外连接(※):right【outer】
全外连接:full【outer】
交叉连接:cross(笛卡尔积)
(一)内连接
语法:
select 查询列表
from 表1 别名
inner join 表2 别名 on 连接条件
【inner join 表3 别名 on 连接条件】
分类:
(1)等值
特点:
1.添加排序、分组、筛选
2.inner可以省略
3.筛选条件放在where后面,连接条件放在on后面,提交分离性,便于阅 读
4.inner join连接和sql92语法中的等值连接效果是一样的,都是查询多 表交集
(2)非等值(与sql92一样)
(3)自连接(与sql92一样)
(二)外连接
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
1.外连接的查询结果为主表中的所有记录,如果从表中有和他匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,left outer join左边的是主表(FROM 后面跟主表)
右外连接,right outer join右边的是主表 (FROM 后面跟从表)
3.左外和右外交换两个表的顺序,可以实现同样的效果
14.子查询
含义:
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询
分类:
按查询出现的位置:
select后面:
标量子查询
from后面:
支持表子查询
where或having后面:
标量子查询(单行),列子查询(多行)
exists后面(相关子查询):
表子查询
语法:exists(完整的查询语句) 结果1或0
按结果集的行列数不同:
标量子查询(结果只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般有多行)
一.where或having后面
1.标量子查询(单行子查询)
2.列子查询(多行子查询)
3.行子查询(一行多列)
特点:
(1)子查询放在小括号内
(2)子查询一般放在条件右侧
(3)标量子查询,一般搭配着单行操作符使用 > < >= <= = <>
列子查询,一般搭配着多行操作符使用
in、any/some、all
15.分页查询
应用场景:当显示的数据,一页显示不全,需要分页提交sql请求
语法:
select 查询列表
from 表1
【join type join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段】
limit offset,size;(offset 表示要显示条目的起始索引,从0开始;size表示要显示的条数)
特点:
1.limit放在查询语句的最后
2.公式:
要显示的页数page,每页的条目数size
*select 查询列表
form 表
limit (page-1)size,size;
下面是所有语句执行过程:
16.联合查询
union 联合 合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
........
应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致
特点:
1.要求多条查询语句的查询列数是一致的
2.要求多条查询语句的查询的每一列的类型和顺序最好一致
3.union关键字默认去重,如果使用union all可以包含重复项
17.插入语句
方式一:
语法:
insert into 表名(列名,....)values(值1,,....)
特点:
1.支持插入多行
insert into 表名
values(值1,值2),(值a,值b)
2.支持子查询
insert into 表名
子查询 //将子查询结果集插入表中
方式二:
语法:
insert into 表名
set 列名=值,列名=值
18.修改语句
1.修改单表记录
语法:
update 表名
set 列=新值,列=新值.....
where 筛选条件
2.修改多表记录【补充】
语法:
sql92语法;
update 表1 别名,表2 别名
set 列=值,....
where 连接条件 and 筛选条件
sql99语法:
update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列=值,...
where 筛选条件
19.删除语句
方式一:delete
语法:
1.单表删除
delete from 表名 where 筛选条件
2.多表删除【补充】
sql92语法:
delete 表1的别名,表2的别名
from 表1 别名,表2 别名
where 连接条件
and 筛选条件;
sql99语法:
delete 表1的别名,表2 的别名
from 表1 别名
inner|left|right join 表2 别名 on 连接条件
where 筛选条件
方式二:truncate
语法 truncate table 表名; //删除表的全部数据
注意:
1.假如删除表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,在插入数据,自增长列的值从1开始
2.truncate删除没有返回值,delete删除有返回值(返回受影响行数)
3.truncate删除不能回滚,delete删除可以回滚
4.delete 可以加where条件,truncate不能加
5.truncate删除,效率高一点
10.库的管理
一.库的创建
语法:
create database 【if not exists】库名;
二.库的修改
更改字符集
语法:
ALTER DATABASE 库名 CHARACTER SET 新字符集
三.库的删除
语法:
DROP DATABASE 【IF EXISTS】 库名
21.表的管理
一.表的创建
create table 【IF NOT EXISTS】表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
....
列名 列的类型【(长度) 约束】,
)
二.表的修改
核心语法:
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】
1.修改列名
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;
2.修改列的类型或约束
ALTER TABLE 表名 MODIFY COLUMN 列名 新类型 约束条件;
3.添加列
ALTER TABLE 表名 ADD COLUMN 列名 类型;
4.删除列
ALTER TABLE 表名 DROP COLUMN 列名;
5.修改表名
ALTER TABLE 表名 RENAME TO 新表名;
三.表的删除
语法:
DROP TABLE 【IF EXISTS】 表名;
四.表的复制
1.仅仅复制表的结构
CREATE TABLE 新表名 LIKE 旧表名;
2.复制表的结构+数据
CREATE TABLE 新表名
SELECT * FROM 旧表名
3.复制表的结构+部分数据
CREATE TABLE 新表名
SELECT 复制的字段
FROM 旧表名
WHERE 筛选条件
工作中通用的写法:
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 表名();
22.数据类型
一.整型
分类:
tinyint、smallint、mediumint、int/integer、bigint
字节: 1 2 3 4 8
特点:
1.如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
2.如果插入的数值超出了整型的范围,会报 out of range 异常,并且插入临界值
3.如果不设置长度,会有默认长度
长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用,展示宽度和该类型数字能表示的取值范围是没有关系的,取值范围直接由类型决定
二.浮点型
分类:
1.浮点型
float(M,D)
double(M,D)
2.定点型
dec(M,D)
decimal(M,D)
特点:
1.M:整数部位+小数部位
D:小数部位
如果超过范围,则插入临界值
2.M和D都可以省略
如果是decimal,则M默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度
3.定点型的精度较高,如果要求插入数值的精度较高如货币运算则考虑使用,一般用浮点型
三.字符型
较短的文本:
char(M)
varchar(M)
其他:
binary和varbinary用于保存较短的二进制
enum用于保存枚举
set用于保存集合
较长的文本:
test
blod(较大的二进制)
特点:
M的意思 特点 空间的耗费 效率
char(M) 最大的字符数,可以省略 固定长度字符 比较耗费 高
varchar(M) 最大字符数,不可以省略 可变长度字符 比较节省 低
四.日期型
分类:
date 只保存日期
time 只保存时间
year 只保存年
datetime 保存日期+时间
timestamp保存日期+时间
特点:
字节 范围 时区等影响
datetime 8 1000-9999 不受
timestamp 4 1970-2038 受
选取类型原则:
所选类型越简单越好,能保存数值的类型越小越好
23.常见约束
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
分类:六大约束
NOT NULL:非空,用于保证该字段值不能为空
DEFAULT:默认,用于保证该字段有默认值
PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
CHECK:检查约束【mysql不支持】
FOREIGE KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值
在从表添加外键约束,用于引用主表中某列的值号
添加约束的时机:
1.创建表时
添加列级约束:
语法:
直接在字段名和类型后面追加 约束类型即可
只支持:默认、非空、主键、唯一,可以添加多个列级约束
添加表级约束:
语法:在各个字段最下面
【constraint 约束名】 约束类型(字段名)
外键:FOREIGN KEY(外键字段) REFERENCES 主键表(主键字段)
2.修改表时
添加列级约束:
语法:
ALTER TABLE 表名 MODIFY COLUMN 列名 字段类型 新约束条件;
添加表级约束:
语法:
ALTER TABLE 表名 ADD【constraint 约束名】 约束类型(字段名) 【外键引用】
外键:ALTER TABLE 外键表名 ADD 【constraint 约束名】 FOREIGN KEY(外键字段) REFERENCES 主键表(主键字段)
删除约束:
语法:
使用*表的修改语法*,将类型空着就会有删除的效果
删除主键:
ALTER TABLE 表名 DROP PRIMARY KEY;
删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名
删除唯一:
ALTER TABLE 表名 DROP INDEX 唯一键名
主键和唯一的对比:
保证唯一性 允许非空 一个表可以有多少个 是否允许组合
主键 √ × 至多一个 √,但不推荐
唯一 √ √ 可以有多个 √,但不推荐
外键:
1.要求在从表设置外键关系
2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3.主表的关联列必须是一个key(一般是主键或唯一)
4.插入数据时,先插入主表,再插入从表
删除数据时,先删除从表,再删除主表
列级约束与表级约束的区别:
位置 支持的约束类型 是否可以取约束名
列级约束: 列的后面 语法都支持,但外键没有效果 不可以
表级约束: 所有列下面 默认和非空不支持,其他支持 可以(主键没有效果)
24.标识列
又称自增列
含义:可以不用手动的插入值,系统提供默认的序列值
语法:
创建标识设置标识列:
列名 类型 约束条件 AUTO_INCREMENT
修改表时设置标识列:
ALTER TABLE 表名 MODIFY COLUMN 列名 INT 类型 约束条件 AUTO_INCREMENT;
修改表时删除标识列:
ALTER TABLE 表名 MODIFY COLUMN 列名 INT 类型 约束条件 ;
特点:
1.标识列要求是一个key,不一定是主键
2.一个表至多一个标识列
3.标识列的类型只能是数值型
4.标识列可以通过SET auto_increment_increment=3;设置步长
可以通过手动插入值,设置起始值
一.创建表时设置标识列
25.事务
含义:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
一.事务的创建
隐式的事务:事务没有明显的开启和结束的标记
比如insert、update、delect语句
显式事务:事务具有明显的开启和结束标记
前提:必须设置自动提交功能为禁用:set autocommit=0
步骤1:开启事务
set autocommit=0; --针对当前会话有效
start transaction; 可选的
步骤2:编写事务的sql语句(select insert update delete)
语句1;
语句2
步骤3:结束事务
commit;提交事务
rollback;回滚事务
补充:savepoint 节点名; --设置保存点,放在语句之间
使用:搭配rollback使用
语法:
rollback to 保存点节点名 --回滚到保存点状态
二.delete和truncate在事务使用时的区别
delete支持回滚,trucate不支持回滚
26.视图
含义:虚拟表,和普通表一样使用
特点:1.重用sql语句
2.简化复杂的sql操作,不必知道它的查询细节
3.保护数据,提高安全性
一.创建视图
语法:
creat view 视图名
AS
查询语句
二.修改视图
方式一:
create or replace view 视图名
as
查询语句;
方式二:
alter view 视图名
as
查询语句;
三.删除视图
drop view 视图名,视图名,...;
四.查看视图
方式一:DESC 视图名;
方式二: SHOW CREATE VIEW 视图名;
五.更新视图
视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的。
1.包含以下关键字的sql语句:分组函数、distinct、group by、having、union、或者union all
2.常量视图
3.select包含子查询
4.join
5.from一个不能更新的视图
6.where子句的子查询引用了from子句的表
如果可以更新,语句与表的更新一样
视图与表的区别
创建语法关键字 是否实际占用物理空间 使用
视图 create view 只是保存了sql逻辑 增删改查,一般不能增删改
表 create table 保存了数据 增删改查
27.变量
这部分的详细介绍:MySQL变量
系统变量:全局变量,会话变量
自定义变量:用户变量,自定义变量
一系统变量:
说明:变量由系统提供,不是用户定义,属于服务器层面
注意:如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写默认,则默认session
全局变量作用域:服务器每次启动将为所有的全局变量赋初值,针对于所有会话(连接)有效,但不能跨重启
会话变量作用域:仅仅针对于当前会话(连接)有效
使用的语法:
1.查看所有的系统变量
show global|【session】 variables;
2.查询满足条件的部分系统变量
show global|【session】variables like '%char%';
3.查看指定的某个系统变量的值
select @@globall|【session】.系统变量名;
4.为某个系统变量赋值
方式一:
set global|【session】 系统变量名 = 值
方式二:
set @@global|【session】.系统变量名=值
二.自定义变量:
说明:变量是用户自定义的,不是由系统的
使用步骤:
声明
赋值
使用(查看、比较、运算等)
1.用户变量
作用域:针对于当前会话(连接)有效,同会话变量的作用域
应用在任何地方,也就是begin end
赋值符号:=或:=
(1)声明并初始化
方式一:SET @用户变量名 = 值
方式二:SET @用户变量名:= 值
方式三:SELECT @用户变量名:= 值
(2)赋值(更新用户变量的值)
方式一:通过SET或SELECT
SET @用户变量名 = 值
SET @用户变量名:= 值
SELECT @用户变量名:= 值
方式二:通过SELECT INTO
SELECT 字段 INTO @变量名
FROM 表;
(3)使用(查看用户变量的值)
SELECT @变量名
2.局部变量
作用域:仅仅在定义他的begin end中有效
应用在begin end中的第一句话
(1)声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值; (声明并初始化)
(2)赋值
方式一:通过SET或SELECT
SET 局部变量名 = 值
SET 局部变量名:= 值
SELECT @用户变量名:= 值
方式二:通过SELECT INTO
SELECT 字段 INTO 局部变量名
FROM 表;
(3)SELECT 局部变量名;
对比用户变量和局部变量
作用域 定义和使用位置 语法
用户变量 当前会话 会话中的任何地方 必须加@符号,不用限定类型
局部变量 BEGIN END中 只能在BEGIN END中,且为第一句话 一般不用加@符号,需要限定类型
28.存储过程
这部分的详细介绍:MySQL存储过程
存储过程:类似于java中的方法
好处:
1.提高代码的重用性
2.简化操作
含义:一组预先编译号的SQL语句的集合,理解成批处理语句
好处:
1.提高代码的重用性
2.简化操作
3.减少了编译器次数并且减少了和数据库服务器的连接次数,提高了效率
一.创建语法
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
注意:
1.参数列表包含三部分
参数模式 参数名 参数类型
参数模式:
IN:该参数可以作为输入,该参数需要调用方传入值
OUT:该参数可以作为输出,也就是该参数可以作为返回值
INOUT:该参数即可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
2.如果存储过程体仅仅只有一句话,BEGIN END可以省略
3.存储过程体中的每条SQL语句的结尾要求必须加分号
存储过程的结尾可以使用DELIMITER重新设置
语法:
DELIMITER 结束标记
案例:
DELIMITER $
二.调用语法
CALL 存储过程名(实参列表);
三.删除存储过程
语法:DROP procedure 存储过程名;
四.查看存储过程的信息
SHOW CREATE PROCEDURE 存储过程名;
29.函数
含义:一组预先编译号的SQL语句的集合,理解成批处理语句
函数:类似于java中的方法
好处:
1.提高代码的重用性
2.简化操作
3.减少了编译器次数并且减少了和数据库服务器的连接次数,提高了效率
函数与存储过程的区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:有且仅有1个返回,适合做处理数据后返回一个结果
一.创建语法
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
注意:
1.参数列表包含两部分:参数名、参数类型
函数体:肯定会有return语句,如果没有会报错(如果return语句没有放在函数体2.的最后也不报错,但不建议)
3.函数体中仅有一句话,则可以省略begin end
4.使用delimiter语句设置结束标记
二.调用函数
SELECT 函数名(参数列表)
三.查看函数
SHOW CREATE FUNCTION 函数名;
四.删除函数
DROP FUNCTION 函数名;
30.流程控制结构
顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条
循环结构:程序满足一定条件的基础上,重复执行一段代码
31.分支结构
一.if函数 if else 的效果
SELECT IF(10>5,'大','小'); --结果:大
SELECT IF(10<5,'大','小'); --结果:小
二.case结构
1.作为表达式(应用在任何地方)
使用一:switch case 的效果
case 表达式
when 常量1 then 返回的值1
when 常量2 then 返回的值2
when 常量3 then 返回的值3
......
else 返回的值n
end;
使用二:类似 多重if
case
when 条件1 then 返回的值1
when 条件2 then 返回的值2
.....
else 返回的值n
end;
2.作为独立语句(应用在BEGIN END 中)
使用一:switch case 的效果
case 表达式
when 常量1 then 语句1;
when 常量2 then 语句2;
when 常量3 then 语句3;
......
else 语句n;
end case;
使用二:类似 多重if
case
when 条件1 then 语句1;
when 条件2 then 语句2;
.....
else 语句n;
end case;
特点:
1.可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END中或BEGIN END 的外面,可以作为独立的语句去使用,只能放在BEGIN END中
2.如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE,如果都不满足,则执行ELSE中的语句或值
3.ELSE可以省略,如果ELSE省略了,并且所有WHEN条件都不满足,则返回NULL
3.if结构(应用在BEGIN END中)
功能:实现多重分支
语法:
if 条件1 then 语句1;
else 条件2 then 语句2;
...
【else 语句n;】
end if;
32.循环结构
应用范围:应用在BEGIN END中
分类:while、loop、repeat
循环控制:
iterate 类似于 continue,继续,结束本次循环,继续下一次
语法:iterate 循环标签;
leave 类似于 break,跳出,结束当前所在的循环
语法:leave 循环标签;
1.while
语法:
【标签:】while 循环条件 do
循环体;
end while【标签】;
2.loop
语法:
【标签:】loop
循环体;
end loop 【标签】;
可以用来模拟简单的死循环
3.repeat
语法
【标签:】repeat
循环体;
until 结束循环条件
end repeat 【标签】;