MySql基础看这一篇就够了丨【绽放吧!数据库】

举报
lwq1228 发表于 2021/08/10 14:22:18 2021/08/10
【摘要】 MySql基础看这一篇就够了,适合零基础Mysql小白入门。

1、DQL语言

1.1、基础查询

1、语法

select 查询列表 from 表名;

2、特点

  • 查询列表可以是字段、常量、表达式、函数,也可以是多个
  • 查询结果是一个虚拟表

3、示例

(1)查询单个字段

select 字段名 from 表名;

(2)查询多个字段

select 字段名, 字段名 from 表名;

(3)查询所有字段

select * from 表名;

(4)查询常量

select 常量值;

注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要

(5)查询函数

select 函数名(实参列表);

(6)查询表达式

select 100/1234;

(7)起别名

1as
select 字段名 as 别名, 字段名 as 别名 from 表名;

2、空格
select 字段名 别名, 字段名 别名 from 表名;

(8)去重

select distinct 字段名 from 表名;

(9)加号(+)

作用:做加法运算
select 数值 + 数值; 直接运算
select 字符 + 数值; 先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
select null +; 结果都为null

(10)concat函数

功能:拼接字符
select concat(字符1,字符2,字符3, ...);

(11)ifnull函数

功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
select ifnull(字段名, 0) from 表名;

(12)isnull函数

功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
select isnull(字段名) from 表名;

1.2、条件查询

1、语法

select 查询列表
  from 表名
 where 筛选条件;

2、筛选条件的分类

(1)简单条件运算符

大于:>
小于:<
等于:=
不等于:<>!= 
大于等于:>=
小于等于:<= 
安全等于:<=> 

(2)逻辑运算符

&& and
|| or
!  not

(3)模糊查询

like: 一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符

(4)其他条件查询

between and
in / not in
is null /is not null

1.3、排序查询

1、语法

select 查询列表
  from 表名
 where 筛选条件
 order by 排序列表 【asc | desc;

2、特点

1asc:升序;desc:降序;如果不写默认升序
2、排序列表支持单个字段、多个字段、函数、表达式、别名
3order by的位置一般放在查询语句的最后(除limit语句之外)

1.4、常见函数

1、概述

功能:类似于java中的方法
好处:提高重用性和隐藏实现细节
调用:select 函数名(实参列表);

2、单行函数

(1)字符函数

函数名 说明
concat 连接
substr 截取子串
upper 变大写
lower 变小写
replace 替换
length 获取字节长度
trim 去前后空格
lpad 左填充
rpad 右填充
instr 获取子串第一次出现的索引

(2)数学函数

函数名 说明
ceil 向上取整
round 四舍五入
mod 取模
floor 向下取整
truncate 截断
rand 获取随机数,返回0-1之间的小数

(3)日期函数

函数名 说明
now 返回当前日期+时间
year 返回年
month 返回月
day 返回日
date_format 将日期转换成字符
curdate 返回当前日期
str_to_date 将字符转换成日期
curtime 返回当前时间
hour 小时
minute 分钟
second
datediff 返回两个日期相差的天数
monthname 以英文形式返回月

(4)其他函数

函数名 说明
version 当前数据库服务器的版本
database 当前打开的数据库
user 当前用户
password(‘字符’) 返回该字符的密码形式
md5(‘字符’) 返回该字符的md5加密形式

(5)流程控制函数

1if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2

2case情况1
case 变量或表达式或字段
when 常量1 then1
when 常量2 then2
...
else 值n
end

3case情况2
case 
when 条件1 then1
when 条件2 then2
...
else 值n
end

3、分组函数

(1)分类

函数名 说明
max 最大值
min 最小值
sum
avg 平均值
count 计算个数

(2)特点

1、语法
select max(字段) from 表名;

2、支持的类型
sum和avg一般用于处理数值型
max、min、count可以处理任何数据类型

3、以上分组函数都忽略null

4、都可以搭配distinct使用,实现去重的统计
select sum(distinct 字段) from;

5、count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
count(1):统计结果集的行数

效率上:
MyISAM存储引擎,count(*)最高
InnoDB存储引擎,count(*)count(1)效率 > count(字段)

6、和分组函数一同查询的字段,要求是group by后出现的字段

1.5、分组查询

1、语法

 select 分组函数,分组后的字段
   from 表名
【where 筛选条件】
  group by 分组的字段
【having 分组后的筛选】
 【order by 排序列表】;

2、特点

使用关键字 筛选的表 位置
分组前筛选 where 原始表 group by的前面
分组后筛选 having 分组后的结果 group by 的后面

1.6、连接查询

1、含义

当查询中涉及到了多个表的字段,需要使用多表连接
select 字段1,字段2
  from1,表2,...;

笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件

2、分类

按年代分类:
sql92:等值、非等值、自连接、也支持一部分外连接(用于oracle、sqlserver,mysql不支持)
sql99【推荐使用】:内连接(等值、非等值、自连接)、外连接(左外、右外、全外(mysql不支持))、交叉连接

3、SQL92语法

(1)等值连接

  select 查询列表
    from1 别名,2 别名
   where1.key =2.keyand 筛选条件】
 【group by 分组字段】
【having 分组后的筛选】
 【order by 排序字段】
 
特点:
1、一般为表起别名
2、多表的顺序可以调换
3、n表连接至少需要n-1个连接条件
4、等值连接的结果是多表的交集部分

(2)非等值连接

  select 查询列表
    from1 别名,2 别名
   where 非等值的连接条件
   【and 筛选条件】
 【group by 分组字段】
【having 分组后的筛选】
 【order by 排序字段】

(3)自连接

  select 查询列表
    from 表 别名1, 表 别名2
   where 等值的连接条件
   【and 筛选条件】
 【group by 分组字段】
【having 分组后的筛选】
 【order by 排序字段】

4、SQL99语法

(1)内连接

  select 查询列表
   from1 别名
【innerjoin2 别名 on 连接条件
  where 筛选条件
  group by 分组列表
 having 分组后的筛选
  order by 排序列表
  limit 子句;
  
特点:
1、表的顺序可以调换
2、内连接的结果=多表的交集
3、n表连接至少需要n-1个连接条件

分类:
1、等值连接
2、非等值连接
3、自连接

(2)外连接

  select 查询列表
    from1 别名
left | right | fullouterjoin2 别名 on 连接条件
   where 筛选条件
   group by 分组列表
  having 分组后的筛选
   order by 排序列表
   limit 子句;
   
特点:
1、查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
2left join 左边的就是主表,right join 右边的就是主表,full join 两边都是主表
3、一般用于查询除了交集部分的剩余的不匹配的行

(3)交叉连接

select 查询列表
  from1 别名
 cross join2 别名;
 
特点:类似于笛卡尔乘积

1.7、子查询

1、含义

嵌套在其他语句内部的select语句称为子查询或内查询,外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多,外面如果为select语句,则此语句称为外查询或主查询。

2、分类

(1)按出现位置

select后面:仅仅支持标量子查询
from后面:表子查询
wherehaving后面:标量子查询、列子查询、行子查询
exists后面:标量子查询、列子查询、行子查询、表子查询

(2)按结果集的行列

标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列

3、示例

where或having后面

(1)标量子查询

案例:查询最低工资的员工姓名和工资
1、最低工资
select min(salary) from employees;

2、查询员工的姓名和工资,要求工资=最低工资
select last_name, salary
  from employees
 where salary = (select min(salary) from employees);

(2)列子查询

案例:查询所有是领导的员工姓名
1、查询所有员工的 manager_id
select manager_id from employees;

2、查询姓名,employee_id属于1中结果列表的一个
select last_name
  from employees
 where employee_id in (select manager_id from employees);

1.8、分页查询

1、应用场景

当要查询的条目数太多,一页显示不全

2、语法

select 查询列表
  fromlimitoffset, 】size;

注意:
offset:代表的是起始的条目索引,默认从0开始,
size:代表的是显示的条目数

公式:
假如要显示的页数为page,每一页条目数为size
select 查询列表
  fromlimit (page - 1) * size, size;

1.9、联合查询

1、含义

union:合并、联合,将多次查询结果合并成一个结果

2、语法

查询语句1
unionall】
查询语句2
unionall...

3、意义

  • 将一条比较复杂的查询语句拆分成多条语句
  • 适用于查询多个表的时候,查询的列基本是一致

4、特点

  • 要求多条查询语句的查询列数必须一致
  • 要求多条查询语句的查询的各列类型、顺序最好一致
  • union 去重,union all包含重复项

2、DML语言

2.1、插入语句

1、方式一

insert into 表名 (列名1,列名2...) values(1,2...);
insert into 表名 values(1,2...);

2、方式二

insert into 表名
   set 列名1=1,列名2=2...;

3、方式一和方式二比较

方式一支持一次插入多条,方式二不支持
方式一支持子查询,方式二不支持

2.2、修改语句

1、修改单表记录

update 表名
   set 列名1=1,列名2=2...
 where 筛选条件;

2、修改多表记录

(1)sql92语法

update1 别名1,2 别名2
   set 列名1=1,列名2=2...
 where 连接条件
   and 筛选条件;

(2)sql99语法

update1 别名2
 inner|left|right join2 别名2
    on 连接条件
 where 筛选条件;

2.3、删除语句

1、单表删除

delete from 表名 【where 筛选条件】 【limit 条目数】;

2、多表删除

(1)sql92语法

delete 别名1,别名2
  from1 别名1,2 别名2
 where 连接条件
   and 筛选条件;

(2)sql99语法

delete 别名1,别名2
  from1 别名2
 inner|left|right join2 别名2
    on 连接条件
 where 筛选条件;

3、清空表

truncate table 表名; 会删除表中所有数据,不可加where语句

4、delete和truncate区别

  • delete可以加where,truncate不可加where
  • truncate删除,效率比delete略高
  • 假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始。
  • truncate删除没有返回值,delete删除有返回值
  • truncate删除不能回滚,delete删除可以回滚

3、DDL语言

3.1、库的管理

1、库的创建

create databaseif not exists】 库名;
默认数据库服务器字符集

2、库的修改

更改库的字符集
alter database 库名 character set gbk;

3、库的删除

drop databaseif exists】 库名;

3.2、表的管理

1、表的创建

create tableif not exists】 表名{
	列名 列的类型【(长度) 约束】,
	列名 列的类型【(长度) 约束】,
	...
	列名 列的类型【(长度) 约束】
}

2、表的修改

修改列名:
alter table 表名 change column 旧列名 新列名 列的类型【(长度) 约束】;

修改列的类型或约束:
alter table 表名 modify column 列名 列的新类型【(长度) 约束】;

添加新列:
alter table 表名 add column 新列名 列的类型【(长度) 约束】 【first|after 字段名】;

删除列:
alter table 表名 drop column 列名;

修改表名:
alter table 旧表名 rename to 新表名;

3、表的删除

drop tableif exists】 表名;

4、表的复制

仅仅复制表的结构:
create table 新表名 like 原表名;

复制表的结构+数据:
create table 新表名 select * from 原表名;

仅仅复制某些字段不带数据:
create table 新表名 select 列名1,列名2...列名n from 原表名 where 1 = 2;

3.3、数据类型

1、整型

分类:
tinyintsmallintmediumintint/integerbigint

特点:
①如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
②如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值
③如果不设置长度,会有默认的长度,长度代表了显示的最大宽度,如果不够会用0在左边填充,但是必须搭配zerofill使用

2、小数

分类:
浮点型:float(M,D)double(M,D)
定点型:dec(M,D)decimal(M,D)

特点:
M:整数部位+小数部位
D:小数部位
①如果超出范围,则插入临界值
②M和D都可以省略,如果是decimal,则M默认为10,D默认为0;如果是floatdouble,则会根据插入的数值的精度来决定精度
③定点型的精度较高,如果要求插入设置的精度较高,如货币运算等,则考虑使用

原则:
所选择的类型越简单越好,能保存数值的类型越小越好

3、字符型

分类:
较短的文本:char(M)varchar(M)
较长的文本:textblob(较大的二进制数据)

其他:
较短的二进制:binaryvarbinary
枚举类型:enum,只能选一个值,不区分大小写
集合类型:set,和enum类似,但是可以选多个值,不区分大小写

特点:
M:最大的字符数
char:固定长度的字符,耗费空间,效率高,M可以省略,默认值为1
varchar:可变长度的字符,节省空间,效率低,M不可以省略

4、日期型

分类:
date:只保存日期
time:只保存时间
year:只保存年
datetime:保存日期+时间,1000-9999,支持的时间范围大
timestamp:保存日期+时间,1970-2038,支持的时间范围较小,和实际时区有关

3.4、常见约束

含义:一种限制,用于限制表中的数据,为了保证表中数据的准确和可靠性
分类:六大约束
	not null:非空,用于保证该字段的值不能为空,比如姓名、学号等
	default:默认,用于保证该字段有默认值,比如性别
	primary key:主键约束,用于保证该字段的值具有唯一性,并且非空,比如学号、员工编号等
	unique:唯一约束,用于保证该字段的值具有唯一性,可以为空
	check:检查约束【mysql中不支持】,比如年龄、性别
	foreign key:外键约束,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值,比如:员工表的部门编号等
	
添加约束的时机:
	创建表时
	修改表时
	
约束的添加分类:
	列级约束:
		六大约束语法上都支持,外键约束没有效果
	表级约束:
		除了非空、默认,其他的都支持
		
create table tab_test{
	列名1 类型1 列级约束,
	列名2 类型2,
	表级约束
}

show index from 表名; #查看索引

1、创建表时添加约束

添加列级约束:
语法:直接在字段名和类型后面追加约束类型即可
只支持:主键、默认、非空、唯一
create table tab_test(
	列名1 类型1 primary key,
	列名2 类型2 unique,
	列名3 类型3 default 默认值,
	列名4 类型5 not null
)

添加表级约束:
语法:在各个字段的最下面
【constraint 约束名】 约束类型(字段名)

create table tab_test(
	列名1 类型1 not null,
	列名2 类型2 default 默认值,
	constraint pk primary key(列名1), #主键
	constraint uq unique(列名2), #唯一键
	constraint ck check(gender='男' or gender='女'), #检查
	constraint fk foreign key(列名) references 从表(从表列名) #外键
)

通用的写法:
create table if exists stuinfo(
	id int primary key,
	stuname varchar(20) not null,
	sex char(1),
	age int default 18,
	seat int unique,
	majorid int,
	constraint fk_stu_major foreign key(majorid) references major(id)
)

主键和唯一约束的比较:
主键:保证唯一性,不可为空,一个表至多有一个,允许多列组合但不推荐
唯一:保证唯一性,可以为空,一个表可以有多个,允许多列组合但不推荐

外键:
1、要求在从表设置外键关系
2、从表的外键列的类型和主表关联列的类型要求一致或兼容,名称无要求
3、主表的关联列必须是一个key(一般是主键或唯一键)
4、插入数据时,先插入主表,再插入从表;删除数据时,先删除从表,再删除主表

2、修改表时添加约束

添加非空约束:
alter table 表名 modify column 列名 类型 not null;

添加默认约束:
alter table 表名 modify column 列名 类型 default;

添加主键约束:
列级:alter table 表名 modify column 列名 类型 primary key;
表级:alter table 表名 add primary key(列名);

添加唯一约束:
列级:alter table 表名 modify column 列名 类型 unique;
表级:alter table 表名 add unique(列名);

添加外键约束:
alter table 表名 add foreign key(列名) references 主表名(主表列名);

添加列级约束:
alter table 表名 modify column 列名 类型 新约束;
添加表级约束:
alter table 表名 addconstraint 约束名】 约束类型(字段名) 【外键的引用】;

3、修改表时删除约束

删除非空约束:
alter table 表名 modify column 列名 类型 【null;

删除默认约束:
alter table 表名 modify column 列名 类型;

删除主键约束:
列级:alter table 表名 modify column 列名 类型;
表级:alter table 表名 drop primary key;

删除唯一约束:
alter table 表名 drop index 键名称;

删除外键约束:
alter table 表名 drop foreign key 外键名称;

3.5、标识列

又称为自增长列,含义:可以不用手动插入值,系统提供默认的序列值

特点:
1、标识列必须和主键搭配吗?不一定,但要求是一个key
2、一个表中至多只能有一个标识列
3、标识列的类型只能是数值型
4、标识列可以通过set auto_increment_increment=3;设置步长,也可以通过手动插入值设置起始值

1、创建表时设置标识列

create table if exists 表名(
	id int primary key auto_increment,
	name varchar(20)
)

show variables like '%auto_increment%';

设置步长:
set auto_increment_increment=3;

2、修改表时设置标识列

alter table 表名 modify column 列名 类型 primary key auto_increment;

3、修改表时删除标识列

alter table 表名 modify column 列名 类型 primary key;

3.6、级联删除/置空

级联删除:
alter table 从表名 add constraint 外键名 foreign key(列名) references 主表名(主表主键列名) on delete cascade;

级联置空:
alter table 从表名 add constraint 外键名 foreign key(列名) references 主表名(主表主键列名) on delete set null;

4、TCL语言

TCL:Transaction Control Language 事务控制语言
事务:
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行

存储引擎:

概念:
1、在mysql中的数据用各种不同的技术存储在文件(或内存)中
2、通过show engines;来查看mysql支持的存储引擎
3、在mysql中用的最多的存储引擎有:innodb、myisam、memory等。其中innodb支持事务,而myisam、memory等不支持事务

4.1、事务的ACID属性

1、原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

2、一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另外一个一致性状态

3、隔离性(Isolation)

事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发额其他事务是隔离的,并发执行的各个事务之间不能互相干扰,跟设置的隔离级别有关

4、持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

4.2、事务的创建

隐式事务:事务没有明显的开启和结束的标记,比如insertupdatedelete语句
显式事务:事务具有明显的开启和结束标记,前提:必须先设置自动提交功能为禁用

步骤一:开启事务
set autocommit=0; #只对当前事务有效
start transaction; #可选的,使用set autocommit=0; 默认开启事务

步骤二:编写事务中的sql语句(selectinsertupdatedelete)
语句1;
语句2;
...

步骤三:结束事务
commit; #提交事务
rollback; #回滚事务

deletetruncate在事务使用时的区别:delete支持回滚,truncate不支持回滚。

4.3、数据库的隔离级别

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致以下各种并发问题:
脏读:对于两个事务T1T2T1读取了T2更新但还没有被提交的字段,之后,若T2回滚,T1读取的内容就是临时且无效的。
不可重复读:对于两个事务T1T2T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一个字段,值就不同了。
幻读:对于两个事务T1T2T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后,如果T1再次读取同一个表,就会多出几行。

数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使他们不会相互影响,避免各种并发问题。

查看各修改数据库隔离级别:
mysql5.7及以前:
设置当前mysql连接隔离级别:
设置数据库系统全局隔离级别:

mysql8.0:
select @@transaction_isolation;
https://www.cnblogs.com/myseries/p/10748912.html

read uncommitted:会出现脏读、不可重复读、幻读
read committed:不会出现脏读,会出现不可重复读、幻读
repeatable read:不会出现脏读、不可重复读,会出现幻读
serializable:不会出现脏读、不可重复读、幻读

mysql中默认隔离级别是:repeatable read
oracle中默认隔离级别是:read committed

4.4、savepoint的使用

设置保存点,与rollback搭配使用。

set autocommit=0;
start transaction;
语句1;
...
savepoint a; #设置保存点
语句2;
...
rollback to a; #回滚到保存点

4.5、视图

含义:虚拟表,和普通表一样使用
mysql5.1版本出现的新特性,是通过表动态生成的数据

创建视图:
create view 视图名 as 查询语句;

修改视图:
方式一:create or replace view 视图名 as 查询语句;
方式二:alter view 视图名 as 查询语句;

删除视图:
drop view 视图名1,视图名2,...;

查看视图:
desc 视图名;
show create view 视图名;

视图的更新(更新视图中的数据):
1、插入数据
insert into 视图名 values(1,2,...);
2、更新数据
update 视图名 set 列名=,... where 条件;
3、删除数据
delete from 视图名 where 条件;

具备以下特点的视图是不允许更新的:
1、包含以下关键字的sql语句:分组函数、distinctgroup byhavingunion或者union all
2、常量视图
3select中包含子查询
4join或逗号的形式 表连接
5from一个不能更新的视图
6where子句的子查询引用了from子句中的表

4.6、变量

系统变量:
	全局变量
	会话变量
自定义变量:
	用户变量
	局部变量

1、系统变量

说明:变量由系统提供,不是用户定义,属于服务器层面
注意:如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认是session

使用的语法:
1、查看所有的系统变量
show global variables; #查看全局变量
showsession】 variables; #查看会话变量

2、查看满足条件的部分系统变量
show global |session】 variables like '%名%';
例如:show global variables like '%char%';

3、查看指定的某个系统变量的值
select @@global |session.系统变量名;
例如:select @@global.autocommit;

4、为某个系统变量赋值
方式一:set global |session】 系统变量名=;
方式二:set @@global |session.系统变量名=;

作用域:
全局变量:服务器每次启动将所有的全局变量赋初始值,针对于所有的会话(连接)有效,但不能跨重启
会话变量:仅仅针对于当前会话(连接)有效

2、自定义变量

说明:变量是用户自定义的,不是由系统定义的
使用步骤:声明、赋值、使用(查看、比较、运算等)

1、用户变量
	作用域:针对于所有的会话(连接)有效,同于会话变量的作用域
	可以应用于任何地方,如放在begin end里面或外面

    赋值操作符:= 或 :=
    声明并初始化:
        set @用户变量名=;
        set @用户变量名:=;
        select @用户变量名:=;

    赋值(更新用户变量的值):
    方式一:通过setselect
        set @用户变量名=;
        set @用户变量名:=;
        select @用户变量名:=;
    方式二:通过select into
        select 字段 into 变量名 from 表名;

    使用(查看用户变量的值):
        select @用户变量名;
	
2、局部变量
	作用域:仅仅在定义它的begin end中有效
	应用在begin end中的第一句话
	
    声明:
    declare 变量名 类型;
    declare 变量名 类型 default;

    赋值:
    方式一:通过setselect
        set 局部变量名=;
        set 局部变量名:=;
        select @局部变量名:=;
    方式二:通过select into
        select 字段 into 局部变量名 from 表名;
    使用:
        select 局部变量名;	

4.7、存储过程和函数

存储过程和函数:类似于java中的方法
好处:
1、提高代码重用性
2、简化操作

1、存储过程

含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

语法:
1、创建语法:
delimiter 结束标记
create procedure 存储过程名(参数列表)
begin
	存储过程体(一组合法的SQL语句)
end 结束标记

注意:
(1)、参数列表包含三部分:参数模式 参数名 参数类型
参数模式:
	IN:该参数可以作为输入,也就是说该参数需要调用方传入值
	OUT:该参数可以作为输出,也就是说该参数可以作为返回值
	INOUT:该参数既可以作为输入又可以作为输出,也就是说该参数既需要传入值,又可以返回值
(2)、如果存储过程体仅仅只有一句话,begin end可以省略
(3)、存储过程体中的每条SQL语句的结尾要求必须加分号,存储过程的结尾可以使用delimiter重新设置
	语法:delimiter 结束标记
	案例:delimiter $
	
2、调用语法:
call 存储过程名(实参列表);

3、删除语法:
drop procedure 存储过程名;

4、查看语法:
show create procedure 存储过程名;

2、函数

含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

与存储过程的区别:
存储过程:可以有0个返回,也可以有多个返回值,适合做批量插入、批量更新
函数:有且仅有1个返回,适合做处理数据后返回一个结果

语法:
1、创建语法:
delimiter 结束标记
create function 函数名(参数列表) returns 返回类型
begin
	函数体(一组合法的SQL语句)
end 结束标记

注意:
(1)、参数列表包含两部分:参数名 参数类型
(2)、函数体:肯定会有return语句,如果没有会报错,如果return语句没有放在函数体的最后也不报错,但不建议
(3)、如果函数体仅仅只有一句话,begin end可以省略
(4)、函数体中的每条SQL语句的结尾要求必须加分号,函数的结尾可以使用delimiter重新设置结束标记
	语法:delimiter 结束标记
	案例:delimiter $
	
2、调用语法:
select 函数名(实参列表);

3、删除语法:
drop function 函数名;

4、查看语法:
show create function 函数名;

4.8、流程控制结构

1、分支结构

1if函数:实现简单的双分支
	语法:select if(表达式1,表达式2,表达式3)
	说明:如果表达式1成立,则if函数返回表达式2的值,否则返回表达式3的值
2case结构
	情况1:类似于java中的switch语句,一般用于实现的等值判断
	语法:
		case 变量|表达式|字段
		when 要判断的值 then 返回的值1 或 语句1;
		when 要判断的值 then 返回的值2 或 语句2;
		...
		else 要返回的值n 或 语句n;
		end case;
		
	情况2:类似于java中的多重if语句,一般用于实现区间判断
	语法:
		case
		when 要判断的条件1 then 返回的值1 或 语句1;
		when 要判断的条件2 then 返回的值2 或 语句2;
		...
		else 要返回的值n 或 语句n;
		end case;
	
	特点:
	(1)可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,begin end中或begin end的外面;如果作为独立的语句去使用,只能放在begin end中
	(2)如果when中的值满足或条件成立,则执行对应的then后面的语句,并结束case;如果都不满足,则执行else中语句或值
	(3else可以省略,如果else省略了,并且所有where条件都不满足,则返回null
3if结构
	实现多重分支
	if 条件1 then 语句1;
	elseif 条件2 then 语句2;
	...else 语句n;end if;
	
	只能在begin end中使用

2、循环结构

分类:whilelooprepeat
循环控制:
	iterate类似于continue,继续,结束本次循环,继续下一次循环
	leave类似于break,跳出,结束当前所在的循环

1while结构(类似于java的while),先判断后执行
	【标签:】 while 循环条件 do
		循环体;
	end while 【标签】;

2loop结构,没有条件的死循环,一般结合循环控制语句leave使用
	【标签:】 loop
		循环体;
	end loop 【标签】;	
	
	可以用来模拟简单的死循环

3repeat结构(类似java的do while),先执行后判断
	【标签:】 repeat
		循环体;
	until 结束循环的条件
    end repeat 【标签】;	

【绽放吧!数据库】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/285617

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。