Mysql


二、数据库的相关概念
DBMS、DB、SQL

三、数据库存储数据的特点
四、初始MySQL
	MySQL产品的介绍        
	MySQL产品的安装          ★        
	MySQL服务的启动和停止     ★
	MySQL服务的登录和退出     ★      
	MySQL的常见命令和语法规范      
五、DQL语言的学习   ★              
	基础查询        ★             
	条件查询  	   ★			
	排序查询  	   ★				
	常见函数        ★               
	分组函数        ★              
	分组查询		   ★			
	连接查询	 	★			
	子查询       √                  
	分页查询       ★              
	union联合查询	√			
	
六、DML语言的学习    ★             
	插入语句						
	修改语句						
	删除语句						
七、DDL语言的学习  
	库和表的管理	 √				
	常见数据类型介绍  √          
	常见约束  	  √			
八、TCL语言的学习
	事务和事务处理                 
九、视图的讲解           √
十、变量                      
十一、存储过程和函数   
十二、流程控制结构       

一、为什么学习数据库?

1.1 数据库的好处

1.持久化数据到本地
2.可以实现结构化查询,方便管理

1.2 数据库相关概念

1、DB:数据库,保存一组有组织的数据的容器
2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
3、SQL:结构化查询语言,用于和DBMS通信的语言

1.3 数据库存储数据的特点

1、将数据放到表中,表再放到库中
2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。
4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
5、表中的数据是按行存储的,每一行类似于java中的“对象”。

1.4 MySQL产品的介绍和安装

1.4.1 MySQL服务的启动和停止

方式一:计算机——右击管理——服务
方式二:通过管理员身份运行
net start 服务名(启动服务)
net stop 服务名(停止服务)

1.4.2 MySQL服务的登录和退出

方式一:通过mysql自带的客户端
只限于root用户

方式二:通过windows自带的客户端
登录:
mysql 【-h主机名 -P端口号 】-u用户名 -p密码

退出:
exit或ctrl+C

1.4.3 MySQL的常见命令

1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名
3.查看当前库的所有表
show tables;
4.查看其它库的所有表
show tables from 库名;
5.创建表
create table 表名(

	列名 列类型,
	列名 列类型,
	。。。
);
6.查看表结构
desc 表名;


7.查看服务器的版本
方式一:登录到mysql服务端
select version();
方式二:没有登录到mysql服务端
mysql --version
或
mysql --V

1.4.4 MySQL的语法规范

1.不区分大小写,但建议关键字大写,表名、列名小写
2.每条命令最好用分号结尾
3.每条命令根据需要,可以进行缩进 或换行
4.注释
	单行注释:# 注释文字
	单行注释:-- 注释文字
	多行注释:/* 注释文字  */

二、DQL语言的学习

2.1 SQL的语言分类

DQL(Data Query Language):数据查询语言
	select 
DML(Data Manipulate Language):数据操作语言
	insert 、update、delete
DDL(Data Define Languge):数据定义语言
	create、drop、alter
TCL(Transaction Control Language):事务控制语言
	commit、rollback

2.2 SQL的常见命令

show databases; 查看所有的数据库
use 库名; 打开指定 的库
show tables ; 显示库中的所有表
show tables from 库名;显示指定库中的所有表
create table 表名(
	字段名 字段类型,	
	字段名 字段类型
); 创建表

desc 表名; 查看指定表的结构
select * from 表名;显示表中的所有数据

2.3 进阶1:基础查询

语法:
SELECT 要查询的东西
【FROM 表名】;

类似于Java中 :System.out.println(要打印的东西);
特点:
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
②要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数
③给查询的变量起别名:SELECT 字段名 [AS] 别名
④去重 SELECT DISTINCT 字段名
⑤"+"号的作用:运算符,字符+数字的时候会将字符转为0,null+数值的结果为null
⑥两个字符字段的合并使用函数concat,例 SELECT CONCAT(last_name,first_name)
⑦显示表的结构:DESC 表名
⑧IFNULL(字段名,返回值)
注:
	1、要查询某个库的数据时,需要在最前面加入"USE 库名",保证操作都是在该库里面进行;
	2、"`"的使用情况,在关键字与字段名冲突时使用"SELECT `NAME` FROM 表名"

2.4 进阶2:条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:
select 
	要查询的字段|表达式|常量值|函数
from 
	表
where 
	条件 ;

分类:
一、条件表达式
	示例:salary>10000
	条件运算符:
	> < >= <= = != <>

二、逻辑表达式
示例:salary>10000 && salary<20000

逻辑运算符:

	and(&&):两个条件如果同时成立,结果为true,否则为false
	or(||):两个条件只要有一个成立,结果为true,否则为false
	not(!):如果条件成立,则not后为false,否则为true

三、模糊查询
示例:last_name like 'a%'
like,between and, is null,is not null,in
like通常与通配符搭配使用:1、% 任意多个字符;2、_ 匹配一个字符 (可使用转义字符\或者ESCAPE)
between and:包括临界值,另外between 120 and 100 等价于 字段名>=120 and 字段名<=100
in:字段名 in (可能值1,可能值2,....)
<=:安全等于

2.5 进阶3:排序查询

语法:
select
	要查询的东西
from
	表
where 
	条件
order by排序的字段、表达式、函数、别名 【asc\desc】
order by支持单个字段名、多个字段名
order by一般放在查询语句的最后面,limit子句除外

2.6 进阶4:常见函数

一、单行函数
1、字符函数
	concat拼接
	substr截取子串 substr(字符,位置,字符数)
	upper转换成大写
	lower转换成小写
	trim去前后指定的空格和字符
	ltrim去左边空格
	rtrim去右边空格
	replace替换
	lpad左填充
	rpad右填充
	instr返回子串第一次出现的索引
	length 获取字节个数
	
2、数学函数
	round 四舍五入
	rand 随机数
	floor向下取整
	ceil向上取整
	mod取余
	truncate截断
3、日期函数
	now当前系统日期+时间
	curdate当前系统日期
	curtime当前系统时间
	str_to_date 将字符转换成日期
	(系统录入的年份格式不一定是统一标准的"%Y-%m-%d",需要转化。)
	date_format将日期转换成字符
	datediff计算两个日期的相差天数
4、流程控制函数
	if 处理双分支
	case语句 处理多分支
		when 情况1 then 处理等值判断
		when 情况2 then 处理条件判断(多重IF)
	
5、其他函数
	version版本
	database当前库
	user当前连接用户

二、分组函数

	sum 求和
	max 最大值
	min 最小值
	avg 平均值
	count 计数

	特点:
	1、以上五个分组函数都忽略null值,除了count(*)
	2、sum和avg一般用于处理数值型
	3、max、min、count可以处理任何数据类型
    	4、都可以搭配distinct使用,用于统计去重后的结果 count(distinct 字段)
	5、count的参数可以支持:字段、*、常量值,一般放1,建议使用 count(*)统计行数
	6、和分组函数一同查询的字段要求是GROUP BY之后的字段

2.7 进阶5:分组查询

语法:
select 查询的字段,分组函数
from 表
group by 分组的字段

特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、分组筛选
注:WHERE一定要放FROM后面
			针对的表			位置			关键字
分组前筛选:	原始表			group by的前面		where
分组后筛选:	分组后的结果集	 group by的后面	having

4、可以按多个字段分组,字段之间用逗号隔开
5、可以支持排序
6、having后可以支持别名

2.8 进阶6:多表连接查询

笛卡尔乘积:如果连接条件省略或无效则会出现
解决办法:添加上连接条件

一、传统模式下的连接 :等值连接——非等值连接

1.等值连接的结果 = 多个表的交集
2.n表连接,至少需要n-1个连接条件
3.多个表不分主次,没有顺序要求
4.一般为表起别名,提高阅读性和性能,如果起别名,就不能用原来的表名

二、sql99语法:通过join关键字实现连接

含义:1999年推出的sql语法
支持:
内连接:等值连接、非等值连接、自连接
外连接:左外、右外、全外
交叉连接:实际上就是笛卡尔乘积。

外连接:用于查询一个表里面另外一个表没有的部分,内连接查询的是交集部分。
特点:
	1、外连接查询的是主表中的所有记录,用主表中的每条案例去匹配从表中的所有案例,如果从表中有匹配的,则显示匹配部分,如果没有就显示NULLL;
	2、左外连接,JOIN LEFT左边的是主表,右外连接右边的是主表;
	3、左外和右外交换两个表的顺序,可以实现同样的效果。
	4、结果筛选时,常用主键的信息,因为主键非空。
	5、全外连接结果:交集+表1有而表2没有的部分+表2而有表1没有的部分

语法:

select 字段,...
from 表1
【inner|left outer|right outer|cross】join 表2 on  连接条件
【inner|left outer|right outer|cross】join 表3 on  连接条件
【where 筛选条件】
【group by 分组字段】
【having 分组后的筛选条件】
【order by 排序的字段或表达式】

好处:语句上,连接条件和筛选条件实现了分离,简洁明了!

三、自连接

案例:查询员工名和直接上级的名称

sql99

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;

sql92

SELECT e.last_name,m.last_name
FROM employees e,employees m 
WHERE e.`manager_id`=m.`employee_id`;

2.9 进阶7:子查询

含义:

一条其他语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。
在外面的查询语句,称为主查询或外查询。

分类:

按照子查询出现的位置分类:
	1、SELECT后面:仅仅支持标量子查询;
	2、FROM后面:支持表子查询;
	3、WHERE或HAVING后面:支持标量、行、列子查询;
	4、EXISTS后面:支持表子查询。
按照查询结果分类:
	1、标量子查询:一行一列,又叫单行子查询;
	2、列子查询,又称多行子查询;
	3、行子查询;
	4、表子查询(相关子查询)。

特点:

1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
① 单行子查询
	结果集只有一行
	一般搭配单行操作符使用:> < = <> >= <= 
	非法使用子查询的情况:
		a、子查询的结果为一组值
		b、子查询的结果为空

② 多行子查询
	结果集有多行
	一般搭配多行操作符使用:any、all、in、not in
	in: 属于子查询结果中的任意一个就行
	any和all往往可以用其他查询代替

③ SELECT:只支持标量子查询

④ EXIST(表子查询):存在返回1,不存在返回0,布尔类型

2.11 进阶8:分页查询

应用场景:

实际的web项目中需要根据用户的需求提交对应的分页查询的sql语句,一页显示不全,需要多页显示。

语法:

select 字段|表达式,...
from 表
【where 条件】
【group by 分组字段】
【having 条件】
【order by 排序的字段】
limit 【起始的条目索引,默认从0开始】 条目数;

特点:

1.起始条目索引从0开始

2.limit子句放在查询语句的最后

3.公式:select * from  表 limit (page-1)*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page

2.12 进阶9:联合查询

引入:
union 联合、合并

语法:

select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
select 字段|常量|表达式|函数 【from 表】 【where 条件】 union  【all】
.....
select 字段|常量|表达式|函数 【from 表】 【where 条件】

特点:

1、多条查询语句的查询的列数必须是一致的
2、多条查询语句的查询的列的类型几乎相同
3、union代表去重,union all代表不去重

三、 DML语言

3.1 插入

语法:

1、insert into 表名(字段名,...) values(值1,...),(值2...);
2、insert into 表名 set 字段=值,字段=值....;

两种方式的区别:

1、方式一支持多行插入,方式二不支持;
2、方式一后面可以接select语句;

特点:

1、字段类型和值类型一致或兼容,而且一一对应
2、可以为空的字段,可以不用插入值,或用null填充
3、不可以为空的字段,必须插入值
4、字段个数和值的个数必须一致
5、字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致

3.2 修改

修改单表语法:

update 表名 set 字段=新值,字段=新值
【where 条件】

修改多表语法:

update 表1 别名1,表2 别名2
set 字段=新值,字段=新值
where 连接条件
and 筛选条件

3.3 删除

方式1:delete语句

单表的删除: ★

delete from 表名 【where 筛选条件】

多表的删除:

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

方式2:truncate语句(清空)

truncate table 表名

两种方式的区别【面试题】

1.truncate不能加where条件,而delete可以加where条件
2.truncate的效率高一丢丢
3.truncate 删除带自增长的列的表后,如果再插入数据,数据从1开始
	delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始
4.truncate删除不能回滚,delete删除可以回滚
5.truncate没有返回值(几行受影响),而delete有返回值

四、 DDL语句

4.1 库和表的管理

库的管理:

一、创建库
create database [if not exists] 库名
二、删除库
drop database [if exist] 库名
三、更改库的数据集
alter database 库名 character set gbk/utf-8;

表的管理:

# 1.创建表
CREATE TABLE IF NOT EXISTS stuinfo(
	stuId INT,
	stuName VARCHAR(20),
	gender CHAR,
	bornDate DATETIME
);
DESC studentinfo;

# 2.修改表 alter
语法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段类型】;

	# ①修改字段名
	ALTER TABLE studentinfo CHANGE  COLUMN sex gender CHAR;
	# ②修改表名
	ALTER TABLE stuinfo RENAME [TO]  studentinfo;
	# ③修改字段类型和列级约束
	ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;
	# ④添加字段
	ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
	# ⑤删除字段
	ALTER TABLE studentinfo DROP COLUMN email;

# 3.删除表

DROP TABLE [IF EXISTS] studentinfo;

# 4、复制表
	1、复制表的结构:creat table 表名 like 表名
	2、复制表的结构+任意数据:creat table 表名 select语句

4.2 常见类型

整型:

tinyint,samallint,mediumint,int/integer,bigint(1、2、3、4、8个字节)

特点:	
	①.如果不设置有符号或无符号,默认有符号,无符号需要关键字unsigned
	②.如果插入数值超过整数范围,会插入临界值
	③.如果不设置长度的话,会有默认长度,长度是指显示的宽度,未达到的部分用0填充左边,需要显示的话,需要添加关键字zerofill

小数:

浮点型:float(M,D);double(M,D);
定点型:dec(M,D)或者decimal(M,D);

特点:
	1、M=整数长度+小数长度,D=小数长度,超出部分用临界值代替;
	2、M、D可以省略,但是decimal默认为(10,0),double和float会随着插入值的精度而变化。
	3、定点型的精度较高,当要求保存的精度较高如货币运算时,使用定点型。

# 注:使用原则为越简单的类型越好,保存的值越小越好。

字符型:

较短的文本:char(M),varchar(M) 其中M为字符数,范围在0~255之间
较长的文本:text(还能细分),Blob(二进制文本)
其他:
	binary,varbinary 保存较短的二进制字符
	enum("a","b"...) 用于保存枚举型
	set("a","b",...) 用于保存集合

char和varchar的区别:
1、char保存固定长度的文本,如性别只有"男"和"女",存储效率较高,但占用空间大
2、varchar保存可变长度的文本,如姓名,存储效率较低,但占用空间较小
3、对于char而言,M可省去,默认为1,对varchar而言,不可省略

enum和set的区别:
enum一次只能插入一个值,如"a",但set能一次插入一个集合"a,b",且都不区分大小。

日期型:

date(只保存日期),time(只保存时间),year(只保存年份)
datetime,timestamp:保存日期+时间

datetime和timestamp区别:
1、保存长度,datetime保存4个字节,timestamp保存8个字节
2、范围,datetime为1000-9999,timestamp为1970-2038
3、时区和系统得影响,datetime不会,而timestamp会

注:# 查看和设置时区
show variables like "time_zone"
set time_zone = "+9:00" # 设置为东九区

4.3 常见约束

六个常见约束:

NOT NULL:非空
DEFAULT:默认,保证该字段有默认值
UNIQUE:保证字段的唯一性,且可为空。
CHECK:检查约束【mysql不支持】
PRIMARY KEY:主键,保证字段的唯一性,且非空
FOREIGN KEY:外键,从表引用主表中某列的值

添加约束的时机:

1、创建表的时候
2、修改表的时候

约束的添加分类:

1、列级约束:六大约束在语法上都支持,但FOREIGN KEY没有效果
2、表级约束:除了默认、非空,都支持

列级约束写法:

create table 表名(
	id int primary key,
	name varchar(20) not null,
	gender char(1) check(gender="男" or gender="女"),
	seat int unique,
	age int default 18
)

表级约束写法:

create table 表名(
	[constraint 约束名] 约束类型(字段名)
	constraint primary primary key(key),
	constraint ck check(gender="男" or gender="女"),
	constraint uq unique(seat),
	constraint fk_从表名_主表名 foreign key(key) references 主表名(key)
)

推荐写法:除了外键之外,都推荐列级约束写法。

主键和唯一的区别:

类型唯一性非空是否允许组合
主键允许,但不推荐
唯一×允许,但不推荐

外键的特点:

1、需要在从表中设置外键关系
2、从表的外键列和主表的关联列的类型要相同或者兼容,对名称无要求
3、主表的关联列必须是一个Key(一般是非空或者主键)
4、插入数据时,应当先插入主表,再插入从表
5、删除数据时,应当先删除从表,再删除主表

修改表时添加约束:

1、添加列级约束:alter table 表名 modify column 字段名 类型 约束
2、添加表级约束:alter table 表名 add [constraint key_name] 约束类型(key)

修改表时删除约束:

1、删除非空:alter table 表名 modify column 字段名 类型 null
2、删除默认约束:alter table 表名 modify column 字段名 类型
3、删除唯一:alter table 表名 drop index key_name;
4、删除主键:alter table 表名 drop primary key;
5、删除外键:alter table 表名 drop foreign key key_name;

4.4 标识列

标识列,又称自增长列,可以不用手动的插入值,系统提供默认的序列。

1、在设置表的时候创建标识列:
create table 表名(
	id int primary key auto_increment,
	....
)

设置自增长的步长:

show variables like "auto_increment";
set auto_increment_increment = 3;

若想设置自增长的起始值:

insert into 表名(id) values(起始值,..);

特点:

1、标识列不一定要和主键搭配,但一定要和key搭配;
2、一个表只能有一个自增长列;
3、标识列的类型只能为数值型;
2、在修改表示添加标识列
alter table 表名 modify column 字段名 int primary key auto_increment;
3、在修改表示删除标识列
alter table 表名 modify column 字段名 int;

4.5 数据库事务

含义

通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态

MySQL存储引擎(了解):

概念:MySQL中的数据利用不同的技术存储在内存中;
展示MySQL中的存储引擎:show engines;
常见的存储引擎:innodb、myisam、memory等,其中innodb支持事务,而myisam、memory不支持

特点

原子性(ACID):要么都执行,要么都回滚
一致性:保证数据的状态操作前和操作后保持一致
隔离性:多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
持久性:一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改

相关步骤:

1、开启事务
2、编写事务的一组逻辑操作单元(多条sql语句)
3、提交事务或回滚事务

事务的分类:

隐式事务,没有明显的开启和结束事务的标志

比如insert、update、delete语句本身就是一个事务

显式事务,具有明显的开启和结束事务的标志

1、开启事务
取消自动提交事务的功能
	
2、编写事务的一组逻辑操作单元(多条sql语句)
select、insert、update、delete
只支持DQL和DML语句,DDL不构成事物
	
3、提交事务或回滚事务
commit和rollback,只能选择一个作为结束条件。

使用到的关键字

set autocommit=0;
start transaction;
commit;
rollback;

savepoint  节点名 # 设置保存点
rollback to 节点名 # 回滚到保存点

事务的隔离级别:

事务并发问题如何发生?

当多个事务同时操作同一个数据库的相同数据时

事务的并发问题有哪些?

脏读:一个事务读取到了另外一个事务未提交的数据,一般出现在更新的时候;
不可重复读:同一个事务中,多次读取到的数据不一致;
幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据,一般出现在插入删除的时候

如何避免事务的并发问题?

通过设置事务的隔离级别(mysql中默认repeatable read)
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免脏读
3、REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读
4、SERIALIZABLE可以避免脏读、不可重复读和幻读

设置隔离级别:

set names gbk # 设置编码
set session|global  transaction isolation level 隔离级别名;

查看隔离级别:

select @@tx_isolation;

视图

含义:理解成一张虚拟的表

视图和表的区别:

	使用方式	占用物理空间

视图	完全相同	不占用,仅仅保存的是sql逻辑

表	完全相同	占用

视图的好处:

1、sql语句提高重用性,效率高
2、和表实现了分离,提高了安全性

视图的创建

语法:
CREATE VIEW  视图名
AS
查询语句;

# # 视图的增删改查

1、查看视图的数据 ★
SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';

2、插入视图的数据
INSERT INTO my_v4(last_name,department_id) VALUES('虚竹',90);

3、修改视图的数据
UPDATE my_v4 SET last_name ='梦姑' WHERE last_name='虚竹';

4、删除视图的数据
DELETE FROM my_v4;

# # 某些视图不能更新

包含以下关键字的sql语句:分组函数、distinct、group  by、having、union或者union all
常量视图
Select中包含子查询
join
from一个不能更新的视图
where子句的子查询引用了from子句中的表

# # 视图逻辑的更新

# 方式一:
CREATE OR REPLACE VIEW test_v7
AS
SELECT last_name FROM employees
WHERE employee_id>100;

# 方式二:
ALTER VIEW test_v7
AS
SELECT employee_id FROM employees;

SELECT * FROM test_v7;

# # 视图的删除

DROP VIEW test_v1,test_v2,test_v3;

# # 视图结构的查看

DESC test_v7;
SHOW CREATE VIEW test_v7;

delete和truncate在事物中的区别:

delete支持回滚,而truncate不支持回滚

# 存储过程

含义:一组经过预先编译的sql语句的集合
好处:

1、提高了sql语句的重用性,减少了开发程序员的压力
2、提高了效率
3、减少了传输次数

分类:

1、无返回无参
2、仅仅带in类型,无返回有参
3、仅仅带out类型,有返回无参
4、既带in又带out,有返回有参
5、带inout,有返回有参
注意:in、out、inout都可以在一个存储过程中带多个

# # 创建存储过程

语法:

create procedure 存储过程名(in|out|inout 参数名  参数类型,...)
begin
	存储过程体

end

类似于方法:

修饰符 返回类型 方法名(参数类型 参数名,...){

	方法体;
}

注意

1、需要设置新的结束标记
delimiter 新的结束标记
示例:
delimiter $

CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名  参数类型,...)
BEGIN
	sql语句1;
	sql语句2;

END $

2、存储过程体中可以有多条sql语句,如果仅仅一条sql语句,则可以省略begin end

3、参数前面的符号的意思
in:该参数只能作为输入 (该参数不能做返回值)
out:该参数只能作为输出(该参数只能做返回值)
inout:既能做输入又能做输出

调用存储过程

call 存储过程名(实参列表)

# 函数

# # 创建函数

学过的函数:LENGTH、SUBSTR、CONCAT等
语法:

CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型
BEGIN
	函数体
END
# 函数体必须要有return语句,没有则会报错
# 如果return语句没有在函数体的最后一句,也不会报错,但不推荐

# # 调用函数

SELECT 函数名(实参列表)

# # 函数和存储过程的区别

		关键字		调用语法	返回值			应用场景
函数		FUNCTION	SELECT 函数()	只能是一个		一般用于查询结果为一个值并返回时,当有返回值而且仅仅一个
存储过程	PROCEDURE	CALL 存储过程()	可以有0个或多个		一般用于更新

# 流程控制结构

# # 系统变量

一、全局变量

作用域:针对于所有会话(连接)有效,但不能跨重启

查看所有全局变量
SHOW GLOBAL VARIABLES;
查看满足条件的部分系统变量
SHOW GLOBAL VARIABLES LIKE '%char%';
查看指定的系统变量的值
SELECT @@global.autocommit;
为某个系统变量赋值
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;

二、会话变量

作用域:针对于当前会话(连接)有效

查看所有会话变量
SHOW SESSION VARIABLES;
查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%char%';
查看指定的会话变量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
为某个会话变量赋值
SET @@session.tx_isolation='read-uncommitted';
SET SESSION tx_isolation='read-committed';

# # 自定义变量

一、用户变量

声明并初始化:

SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;

赋值:

方式一:一般用于赋简单的值
SET 变量名=值;
SET 变量名:=值;
SELECT 变量名:=值;


方式二:一般用于赋表 中的字段值
SELECT 字段名或表达式 INTO 变量
FROM 表;

使用:

select @变量名;

二、局部变量

声明:

declare 变量名 类型 【default 值】;
只能用于begin end的第一句话s0

赋值:

方式一:一般用于赋简单的值
SET 变量名=值;
SET 变量名:=值;
SELECT 变量名:=值;


方式二:一般用于赋表 中的字段值
SELECT 字段名或表达式 INTO 变量
FROM 表;

使用:

select 变量名

二者的区别:

		作用域				定义位置				语法
用户变量	当前会话				会话的任何地方		加@符号,不用指定类型
局部变量	定义它的BEGIN END中 	BEGIN END的第一句话	一般不用加@,需要指定类型

# # 分支

一、if函数
语法:if(条件,值1,值2)
特点:可以用在任何位置

二、case语句

语法:

情况一:类似于switch
case 表达式
when 值1 then 结果1或语句1(如果是语句,需要加分号) 
when 值2 then 结果2或语句2(如果是语句,需要加分号)
...
else 结果n或语句n(如果是语句,需要加分号)
end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)

情况二:类似于多重if
case 
when 条件1 then 结果1或语句1(如果是语句,需要加分号) 
when 条件2 then 结果2或语句2(如果是语句,需要加分号)
...
else 结果n或语句n(如果是语句,需要加分号)
end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)

特点:
可以用在任何位置

三、if elseif语句

语法:

if 情况1 then 语句1;
elseif 情况2 then 语句2;
...
else 语句n;
end if;

特点:
只能用在begin end中!!!!!!!!!!!!!!!

三者比较:
应用场合
if函数 简单双分支
case结构 等值判断 的多分支
if结构 区间判断 的多分支

# # 循环

类型:

while、loop、repeat
# iterate 类似continue
# leave 类似break

语法:

while:

【标签:】WHILE 循环条件  DO
	循环体
END WHILE 【标签】;

loop:

【标签:】loop
	循环体
END loop 【标签】;

repeat:

【标签:】repeat
	循环体
until 循环结束条件
END repeat 【标签】;	

特点:

只能放在BEGIN END里面

如果要搭配leave跳转语句,需要使用标签,否则可以不用标签

leave类似于java中的break语句,跳出所在循环!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值