mysql学习笔记_隋小bai

此为学习笔记,若有侵权请联系我,谢谢!!!

基础操作

启动服务: net start 服务名  
关闭服务: net stop 服务名
登录: mysql -h主机名 -p端口号 -u用户名 -p密码  退出exit
退出:exit或ctrl+C

DQL

基础查询

特点:
查询结果是一个虚拟的表

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

语法:select 字段 fromselect 查询列表   后面可以加

1 单个字段

2 多个字段

3 *表中所有的字段

4 查询常量值  SELECT 100  SELECT '字符串'  字符型和日期型必须用''引起来 数值型不需要

5 查询表达式	SELECT 100%98

6 查询函数	SELECT 函数名(实参列表)

7 起别名 SELECT 100%98 as 别名   
		SELECT 100%98 别名 

		便于理解  区分重复名称的字段
		别名如果有关键字要加单引号或者双引号

8 去重  DISTINCT 
	    DISTINCT 字段名称
9 +号作用 只能当做运算符

	两个操作数值均为数值型,则做加法运算

	其中一个为字符型 尝试做加法运算
		'10'+90   --> 100				转换成功 做加法运算
		'aa'+90   --> 0+90 90		转换失败 字符型转为0
		其中一个为null  结果都为null

10 如果想拼接两字字段  可以使用 CONCAT(字段名称1,字段名称2) 可以拼接多个

11 IFNULL(字段名,默认值)
	判断某个值是否为null,如果为null返回默认值,如果不为null返回原本的值
12 isnull函数
	判断某个字段或表达式是否为null,如果是返回1如果不是返回0

条件查询

#语法:
	select 查询列表
	from 表名
	where 筛选条件

执行顺序  先from后  然后在where 后  最后select后

分类

1按照条件表达式查询  
	条件运算符 > < =   >=  <=   != --> <>	<=>

2按逻辑表达式查询  
	逻辑运算符
	&& AND(两个条件为true都为true)  

	|| OR(有一个为true结果为true,反之为false)  

	! NOT(本身为true 变为false)

3模糊查询 	

	1 LIKE 一般和通配符搭配使用 
		%任意多的字符,包括0个字符  _任意单个字符		
		
	特殊情况(案例)查询第二个为_的名称 
	
	SELECT 字段 FROMWHERE `name` like '_\_%'  \为转义字符
	SELECT 字段 FROMWHERE `name` like '_a_%'  ESCAPE 'a'
	a可以用任意字符表示  ESCAPE 后加转义字符

2 BETWEEN AND	

	BETWEEN -->  >=    AND -->  <=

	使用between and 可以提高简洁度 包含临界值  两个临界值的顺序不能替换

3 IN    

	使用in 可以提高简洁度  IN列表的值的类型必须一致或者兼容 (eg:'1' 1) 不支持通配符

4 IS NULL    IS NOT NULL

	=<> --> !=  不能判断null值

补充		安全等于<=>  可以判断null  也可以判断普通值

			  普通类型的数值	  null值   可读性
		is null		×	 	   	√		√
		 <=>		√		   	√		×

排序查询

	select 查询列表
	fromwhere 筛选条件
	order by 排序列表 【asc}descASC升序 DESC 降序  不写默认升序 ASC	

	ORDER BY子句中可以支持单个字段,多个字段,表达式,函数,别名

常见函数

概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1、隐藏了实现细节  2、提高代码的重用性

调用: select 函数名(实参列表) from 表

函数可以嵌套使用

分类:

​		1:单行函数

​		如	concat length ifnull

​		单行函数: 字符函数 数学函数 日期函数 其他函数 流程控制函数

​		

​		2:分组函数  

​		功能:做统计使用  有称为统计函数,聚合函数,组函数



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

		substring_index(字段, 符号, i) 截取第几个符号的前几位
	
		CAST (expression AS data_type) 用于将某种数据类型的表达式显式转换为另一种数据类型
		
     	数学函数:
		
​		1.round 四舍五入  round(数字)round(数字,保留几位(数字))2.ceil 向上取取整 返回>=该参数的最小整数 ceil(数字)3.floor 向下取整<=该参数的最大整数 返回floot(数字)4.truncate 截断   truncate(小数,保留的位数)5.mod 取余  mod(数字 被除数)6. rand 获取随机数	

​		

 		日期函数

​		1.now  返回当前的系统日期+时间  now()2.curdate  返回当前系统日期,不包含时间 curdate();3.curtime  返回当前时间,不包含日期 curtime();4.获取指定的部分 年 月 日 时 分 秒 

​			year() 年

​			month() 月

​			monthname() 以英文形式返回月

​			day() 天

​			hour() 小时

​			minute() 分钟

​			second() 秒

​			year(now)   年

​			year('1998-03-14') 年

​			year(字段)| 序号 | 格式符 | 功能              |
| ---- | ------ | ----------------- |
| 1    | %Y     | 四位的年份        |
| 2    | %y     | 两位的年份        |
| 3    | %m     | 月份(01,02,11,12) |
| 4    | %c     | 月份(1,2,11,12)   |
| 5    | %d     |(01,02)         |
| 6    | %H     | 小时(24小时制)    |
| 7    | %h     | 小时(12小时制)    |
| 8    | %i     | 分钟(00,01,..,59) |
| 9    | %s     |(00,01,...,59)  |

​			str_to_date: 将日期格式的字符转换成指定格式的日期

​			SELECT STR_TO_DATE('3-14 1970','%c-%d %Y')  1970-03-14

​			date_format: 将日期转为字符串

​			date_format('2018/6/6','%y_%m _% d')  2018_06 _06

​			datadiff('日期一','日期二')  两个日期的差数

  其他函数	

​	version() 版本

​	database() 当前数据库

​	user() 当前用户

​	password('字符串') 返回当前字符的密码形式 加密

​	md5('字符串') md5的加密形式

 流程控制函数

​		1.if函数:if else的效果
				if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2if(10>5,'大','小 ')if(字段名 is null,'true','false')2.case函数 switch case的效果

​				case 要判断的字段或表达式

​				when 常量1 then 要显示的值1或语句1when 常量2 then 要显示的值2或语句2.......else 要显示的值n或者语句n

​				end

​				

​				case函数 多重if效果

​				casewhen 条件1 then 要显示的值1或语句1when 条件2 then 要显示的值2或语句2....else 要显示的值n或语句n

​				end

​	

分组函数

​	功能 :用作统计使用,又称为聚合函数或统计函数或组函数

分类:

	sum 求和 avg 平均值 max最大值 min最小值 count 计算个数
		sum(参数)avg(参数)max(参数)min(参数)count(参数)

​	特点 :
	1.支持的类型
     sum avg 一般用于处理数值型
​	 max min count 可以处理任何类型

​    2.sum avg max min count 忽略null值

​    3.可以和distinct搭配实现去重的运算

​	4.count 函数

​		1.count(字段) 统计该字段非空值的个数

​		2.count(*) 统计行数

​		3.count(1)  统计行数

​		4.效率 MYISAM存储引擎下 count(*)的效率高

​		  INNODB存储引擎下 count(*)count(1)的效率差不多 比count(字段)要高 

​		5.和分组函数一同查询的字段要求是group by字段

分组查询

group by(参数)

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

​	特点:

​		 分组查询中的筛选条件分为两类		

​					        数据源			         位置    7		关键字

​		分组前的筛选			 原始表				  group by子句前		where

​		分组后的筛选	 		 分组后的结果集		  group by子句前		having

​	分组函数做条件肯定放在having的子句中

​	能用分组前筛选,优先考虑分组前筛选  

​	group by 支持单个字段分组,多个字段分组(没有顺序要求 逗号隔开 ),可用表达式或函数

​    可以添加排序(放在分组查询的最后)


连接查询(多表查询)

​		当查询中涉及到了多个表的字段,需要使用多表连接
select 字段1,字段2
from1,表2,...;
		 笛卡尔乘积现象 表1m行 表2n行 总共m*n行

​		 添加连接条件可以避免

​		 连接方式 按年代分  按功能分

​				年代分

​					sql92标准 仅仅支持内连接(mysql中)

​					sql99标准(推荐) 支持内连接,外连接(左外和右外),交叉连接(mysql中)

​				 功能分

​						内连接: 等值连接 ,非等值连接 ,自连接

​						外连接: 左外连接 ,右外连接 ,全外连接

​						交叉连接		

​				

​			sql92标准

​				等值连接
​						 语法 
							select 查询列表
							from1 别名,2 别名
							where1.key=2.keyand 筛选条件】
							【group by 分组字段】
							【having 分组后的筛选】
							【order by 排序字段】
					特点:		
​						 为表起别名 提高简洁度 区分多个重名的字段   如果起了别名 则查询的字段就不能用原来的表明去限定
​						 多个表之间的顺序可以调换
​						 可以加筛选条件  可以加分组条件 可以加排序条件
						 多表等值连接的结果为多表的交集部分
​					   	 n表连接 至少需要n-1个连接条件


​					非等值连接

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

​									eg  select a字段,b字段 from a表 as a ,b表 as b where a.字段 between b.字段1 and b.字段2 



​					自连接 一张表当成两张表或多张表用

​							语法 
								select 查询列表
								from 表 别名1,表 别名2
								where 等值的连接条件
								【and 筛选条件】
								【group by 分组字段】
								【having 分组后的筛选】
								【order by 排序字段】
								
								eg  select a.字段 , b.字段 from a表 as a ,a表 as b where a.Xid = b.XXid

​				 

​				sql99标准

​					语法
						select 查询列表
						from1 别名
						【连接类型】 join2 别名 on 连接条件
						where 筛选条件
						group by 分组列表
						having 分组后的筛选
						order by 排序列表
						limit
​					分类

​						内连接 inner  -->连接类型

​						外连接  左外连接 left [outer]  -->连接类型

​							   右外连接 right [outer]  -->连接类型

​							   全外连接 full [outer]	-->连接类型

​						交叉连接 cross	-->连接类型

​					内连接

​						语法 
							select 查询列表
							from1 别名
							【innerjoin2 别名 on 连接条件
							where 筛选条件
							group by 分组列表
							having 分组后的筛选
							order by 排序列表
							limit 	

​						特点  	  
								表的顺序可以调换

​								内连接的结果 = 多表的交集

​								n表连接至少需要n-1个连接条件

​					    分类 等值连接  非等值连接  自连接



​					 	等值连接

​						 特点 添加排序 分组 筛选

​								 inner 可以省略

​								 筛选条件放在where后面 连接条件放在on后面 ,提高分离性 便于阅读

​								 inner join连接和sql92语法中的等值连接效果一样都是查询交集

​					     非等值连接

​							更改on 后面的条件 (between and  in   not in)

​					

​					    自连接

​							 一个表当两个表使用

​					外连接 			

​						场景  用于查询一个表有 另一个表没有的记录  可以用 null来填充

​						特点 外连接查询的结果为主表中的所有记录 如果有显示  没有为null	 

​							 左外  left join 左边是主表

​							 右外  right join  右边是主表

​							 全外  full outer join    内连接的结果+1中有但表2没有的+2中有但表1没有的  也就是全部的值
							一般用于查询除了交集部分的剩余的不匹配的行
								
						语法:
						select 查询列表
						from1 别名
						left|right|fullouterjoin2 别名 on 连接条件
						where 筛选条件
						group by 分组列表
						having 分组后的筛选
						order by 排序列表
						limit 	

​					 交叉连接  cross	
						语法:
​							select 查询列表
							from1 别名
							cross join2 别名;

​						 	用来找笛卡尔积

子查询

						出现在其他语句中的select语句 称为子查询或者内查询

​								外面语句可以是 insert update delete select(常用)

​								外部的查询语句 是主查询语句或者外查询语句

​							分类

​								按子查询出现的位置

​										select 后面  仅仅支持标量子查询 (一行一列的结果)from后面  支持表子查询 

​												将子查询结果充当一张表,要求必须起别名

​										wherehaving 后面    标量子查询  列子查询(多行子查询) 行子查询				

​										exists后面 标量子查询 列子查询 行子查询 表子查询



​											特点 子查询放在小括号内

​													 子查询一般放在条件的右侧

​													 标量子查询(一行一列)一般搭配着当行操作符使用< > >= <= = <>

​													 列子查询 (多行子查询 一列多行)一般搭配着对行操作符使用 in not in (等于列表中的任意一个) any/some(和子查询返回的某一个值比较)  all(和子查询返回的所有值比较 ) 

​													行子查询(结果集一行多列或多行多列)

​													表子查询 结果集为多行多列

​													 子查询的执行优先于主查询的执行,主查询的条件用到了子查询的结果						 

​										exists后面(相关子查询)	表子查询  先执行外查询 根据exists内的查询语句来过滤   能用exists 基本都可以用in   结果 1 (true)0(false )

​							   按结构集的行列数不同

​										 标量子查询(结果集只有一行一列)

​										 列子查询(结构集只有一列多行)

​										 行子查询(结果集有一行多列)

​										 表子查询(结果集一般为多行多列) 

分页查询

应用场景	当要显示的数据 一页显示不全,则需要进行分页查询

​		语法

​			select 查询列表

​			from 表

​				[join type] join2on 连接条件

​				where 筛选条件

​				group by分组字段

​				having 分组后的筛选

​				order by 排序的字段]limit 起始索引,每页条数  ( 如果为第一页 起始索引为0 起始索引可以省略)

​			特点:

​					1 limit 放在查询语句的最后  语法在最后  查询顺序也是最后

​					2  公式 要显示的起始索引 page  (默认为0)每页条数 size

​						select 查询列表

​						from 表

​						limit (page-1)*size,size

查询顺序

| (语法顺序)                                               | (执行顺序) |
| -------------------------------------------------------- | ---------- |
| select 查询列表                                          | 7          |
| from| 1          |
| 连接类型 join2                                        | 2          |
| on 连接条件                                              | 3          |
| where 筛选条件                                           | 4          |
| group by 分组列表                                        | 5          |
| having 分组后的筛选条件                                   | 6          |
| order by 排序列表                                        | 8          |
| limit (page-1)*size,size  (起始索引 page  每页条数 size)  | 9          |


联合查询

		union :联合 合并:将多条查询语句的结果合并成一个结果  

​		语法:

​			查询语句1union

​			查询语句2union

​			查询语句3.........

​		应用场景

​				要查询的结果来自多个表,且多个表没有直接连接的关系 但查询信息一致
				将一条比较复杂的查询语句拆分成多条语句



​				特点

​				1 要求多条查询语句的查询列数是一致的

​				2 要求多条查询语句的查询各列的类型和顺序最好一致

​				3 union 默认去重   使用union all 不会去重(包含重复项)

行列转换

方式一:使用if
select 查询列表 ,
sum(if(字段名称1='a',字段名称2,0))as a,
sum(if(字段名称1='b',字段名称2,0))as b, 
sum(if(字段名称1='c',字段名称2,0))as c,
from 表

方式二:使用case
select  查询列表,
sum(case when 字段名称1 = 'a' then 字段名称2 end) as a,
sum(case when 字段名称1 = 'b' then 字段名称2 end) as b,
sum(case when 字段名称1 = 'c' then 字段名称2 end) as c,
from 表

方法三: with rollup
with rollup:在group分组字段的基础上再进行统计数据
select 
ifnull(字段名称1,'zdmc') name,
sum(if(字段名称2='a',字段名称3,0))as a,
sum(if(字段名称2='b',字段名称3,0))as b,
sum(if(字段名称3='c',字段名称3,0))as c,
sum(Fraction) 总分
fromgroup by 字段名称1 with rollup

DML语言

数据操作语言

插入 insert

修改 update

删除 delete

插入语句

方式一  支持一次插入多行  支持子查询

​		语法 insert   into 表明(字段名,....) values(,.....)

​        多行插入		insert   into 表名 【(字段名,..)values(1,.....),(1,....)

​		插入的值的类型要与列的类型一致或者兼容

​		不可以为null的列必须插入值

​		可以为null的列如何插入值

​			方式1 写列写null

​			方式2 不写列 不写null

​		列的顺序可以颠倒

​		列数和值的个数必须一致,且一一对应

​		可以省略列明, 默认所有列  而且列的顺序和表中列的顺序一致

​					

​		方式二  不支持多行插入  不支持子查询

​		语法 inset into 表名 set 列名=,列名 =,....


修改语句

​		语法 修单标的记录  update 表名 set 字段=新值,字段=新值  [where 筛选条件]

​				 修改多表的记录	
				update1 别名 ,2 别名 set=,,,,
				where  连接条件 
				and 筛选条件


				update1 别名 
				left|right|inner join2 别名 
				on 连接条件  
				set 字段=,字段=值 
				【where 筛选条件】;

删除语句

方式一 delete 

​			语法delete from 表名 where 筛选条件 limit条目数

​			多表删除[级联删除]

​				sql92语法

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

​				sql99语法

​				delete1 别名 inner|left|right join2 别名 on 连接条件 where 筛选条件

方式二 truncate

​			语法 truncate table 表名



​			区别  delete可以加where 条件 truncate 不能加

​						truncate删除效率高一些

​						如果使用delete删除后 再插入数据  自增长的值从断电开始,truncate删除后再插入数据,自增长列的值从1开始 

​						truncate删除没有返回值 delete删除有返回值

​						truncate删除不能回滚事务 delete 删除可以回滚事务

DDL语言

数据库定义语言

​ 库的管理

​ 创建 修改 删除

库的管理

1.库的创建

​		语法: creat database [if not exists(容错性的处理)] 库名[character set 字符集名]2.库的修改

​		语法:

​			rename database 库名 to 新库名(已经被废弃)

​			 更改库的字符集

​			alter databasecharacter set 字符集名

​		 3.库的删除

​			drop database [if exists] 库名

​	

表的管理

desc 表名 查看表的结构

​	 	创建 修改 删除

​			创建creat

​			create table if not exists 表名(

​					字段名 字段类型 [长度 约束],

​				    字段名 字段类型 [长度 约束],.....

​					字段名 字段类型 [长度 约束])



​			修改 alteralter table 表名 add|drop|modify|change column 列名[列类型 约束]

​				 修改表名

​					alter table 旧表名 rename to 新表名

​		 		修改列名

​				    alter table 表明 change column 旧列名 新列名 类型

​		 		修改列的类型或约束

​				    alter table 表名 modify column 列名 类型 [新约束]

​				 添加新列

​					 alter table 表名 add column 列名 类型

​					 alter table 表名 add column 列名 类型[first|after 字段名] first 第一行 after 字段名 某个字段后 

​				 删除列

​					alter table 表名 drop column 列名



​				删除表 dropdrop table if exists 表名


表的复制

​				仅仅只能复制表的结构

​				create table 表名 like 被复制的表名

​				复制表的结构+数据

​				create table 表名 select * from  被复制的表名	

​				 只复制部分数据

​				create table 表名 select * from  被复制的表名	where 筛选条件

​				 仅仅复制某些字段

​				create table 表名 select 字段1 ,字段2  from 被复制的表 where 1=2(永远不成立的条件  也可以写成where 0 (0false 1true))


常见的数据类型
数值型
整数

​				

​						 

特点:
		  如果不设置无符号 默认有符号 

​		  如果设置无符号 需要添加unsigned关键字 

​		  如果插入的值超过了整型的范围,会报out of range 异常 并且插入的是临界值		  如果不设置长度会有默认的长度	

​		  如果代表了显示的最大宽度,如果不够会用0在左边填充(zerofill 0填充 默认无符号整形  往前补0)

在这里插入图片描述
小数

​ 

​		定点数 dec(M,D) decimal(M,D)

​		浮点数float(M,D) double(M,D)

​		特点

​		1. M(整数和小数一共的位数)和D(小数点后的位数,不足位数在后补0)如果超如范围会报out or range异常,并插入临界值   

​		2. M和D都可以省略(floatdouble 跟插入的值来决定精度, decimal默认为decimal(10,0)M默认为10,D默认为0 )3. 定点型的精确度较高,如果要求插入数值的精确度较高如货币运算符等则考虑使用

​		原则 选择的类型越简单越好,能保存的数值越小越好
			如果精度要求较高,则优先考虑使用定点数


在这里插入图片描述
字符型
在这里插入图片描述

​						 	较短的文本 



​						          		写法					M的意思										          	特点					   		空间的耗费                       效率	

​		char	    		 char(M)                M最大的字符数(可以省略默认为1)  		固定长度的字符				比较耗费						 高

​		varchar	  		 	 varchar(M)     	    M最大的字符数(不可以省略)           		 可变长度的字符		  	 比较节省                          低

​							 binaryvarbinary类型

​								说明:类似于charvarchar 不同的是他们包含二进制字符串而不包含非二进制字符串

​							  Enum类型   用于保存枚举   性别男和女常用

​								要求插入的值必须属于列表中指定的值之一

​									如果列表成员为1~255,则需要1个字节存储

​									如果列表成员为255~65535,则需要两个字节存储

​									最多需要65535个成员  

​						创建表

​							create table test_enum(

​									c ENUM('a','b','c'))

​						在表中插入的值只能是 a,b,c  大写自动变为小写 其他值显示空

​								

​						set类型   用于保存集合

​								和enum类型类似,里面可以保持0~64个成员,Enum类型最大的区别是:set类型可以一次选取多个成员,Enum只能选一个根据成员个数不同,存储所在的字节也不同

​						成员数               字节数

​						1~8						19~16					217~24  				    325~32					433~64					8

​							

​								创建表

​							create table test_set(

​									c SET('a','b','c'))

​							可以插入多个  eg  a   a,b   a,b,c



​							较长文本 text blob(较长的二进制数据)

日期型
在这里插入图片描述

data 只保存日期

​					time 只保存时间

​					year 只保存年

​					datetime 保存日期+时间       

​					timestamp 保存日期+时间    

​		特点			

​											字节					范围				时区等的影响

datatime									8					1000-9999				不受

timestamp						 			4      			   1970-2038(更能反映当前真实时间)

常见约束

​		含义  一种限制,用于限制表中的数据,为了保证表中数据的可靠性

​		分类 :六大约束

​				  not null  非空约束  用于保证该字段的值不能为空

​				  default   默认约束  用于保证该字段的值有默认值		

​				  primary key 主键约束  用于保证该字段的值具有唯一性 并且非空	unique+not nullunique 唯一约束   用于保证该字段的值具有唯一性  可以为空

​				  check  检查约束 [ mysql中不支持,无效果但不报错 ]

​				  foreing key 外键约束 用于限制两个表的关旭 用于保证该字段的值必须来自于主表1的关联的值   在从表添加外键约束,用于引用主表的某列的值

​			 	

​				添加约束的时机: 

​										创建表时  

​										修改表时



​				添加约束的分类:

​										 列级约束  六大约束语法上都支持 但外键约束没有效果  

​															列的下面      不可以起约束名

​										 表级约束  除了非空 默认 其他的都支持

​															所有列的下面      可以起约束名(主键无效果)create table 表名(

​							 字段名  字段类型 列级约束,

​							  字段名  字段类型,

​							   表级约束						

​				)

​				

​			创建表时添加约束

​			1 添加列级约束

​					语法 直接在字段名和类型后面追加约束类型可以是多个

​					只支持 默认 非空 主键 唯一



​					查看表中的索引: show index from 表

​					查看表的结构:  desc 表

​					eg


CREATE TABLE stuinfo(
	字段名 字段类型 PRIMARY KEY,#主键
	字段名 字段类型 NOT NULL,#非空
	字段名 字段类型 CHECK(gender='男' OR gender ='女'),#检查
	字段名 字段类型 UNIQUE,#唯一
	字段名 字段类型 DEFAULT[],#默认约束
	constraint 约束名 foreign key(字段名) references 主表(被引用列)#外键
);
CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARCHAR(20)
);

​												支持类型					可以起约束名

​	列级约束							除了外键						不可以

​	标级约束							除了非空和默认			可以但是对主键无效

​	列级约束可以在一个字段是追加多个,中间用空格隔开,没有顺序要求



​	2.添加表级约束

​			语法 在各个字段的最下面

​				[constraint 约束名 不起名默认为字段名]约束类型(字段名)  					


​	
​	CREATE TABLE stuinfo(
​		id INT,
​		stuname VARCHAR(20),
​		gender CHAR(1),
​		seat INT,
​		age INT,
​		majorid INT,CONSTRAINT pk PRIMARY KEY(id),#主键CONSTRAINT uq UNIQUE(seat),#唯一键CONSTRAINT ck CHECK(gender ='男' OR gender  = '女'),#检查CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键);



通用写法 
CREATE TABLE IF NOT EXISTS stuinfo(
	id INT PRIMARY KEY,
	stuname VARCHAR(20),
	sex CHAR(1),
	age INT DEFAULT 18,
	seat INT UNIQUE,
	majorid INT,
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)

);
主键和唯一的对比:
保证唯一性  是否允许为空    一个表中可以有多少个   是否允许组合
主键	√		×			至多有1个           √,但不推荐
唯一	√		√			可以有多个          √,但不推荐

外键:
	1、用于限制两个表的关系,从表字段值引用了主表的某字段值,要求在从表设置外键关系
	2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,意义一样,名称无要求
	3、主表的关联列必须是一个key(一般是主键或唯一)
	4、插入数据时,先插入主表,再插入从表
	删除数据时,先删除从表,再删除主表

可以通过以下两种方式删除主表的记录

添加外键时后面加on delete cascade  可以级联删除 主表从表都删

ALTER TABLE 从表 ADD CONSTRAINT 外键名称 FOREIGN KEY(从表外键字段) REFERENCES 主表(主表字段) on delete cascade; 

添加外键时后面加on delete set null   级联置空	主表删除,从表对应记录置空

ALTER TABLE 从表 ADD CONSTRAINT 外键名称 FOREIGN KEY(从表外键字段) REFERENCES 主表(主表字段) on delete cascade; 

修改表的时候添加约束 

1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;

2、添加表级约束
alter table 表名 addconstraint 约束名】 约束类型(字段名) 【外键的引用】;



#1.添加非空约束
alter table 表名 modify column 字段名 字段类型 not null;
#2.添加默认约束
alter table 表名 modify column 字段名 字段类型 default;
#3.添加主键
#①列级约束
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 PRIMARY KEY;
#②表级约束
alter table 表名 addconstraint 约束名】 primary key(字段名);

#4.添加唯一

#①列级约束
ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 UNIQUE;
#②表级约束
alter table 表名 addconstraint 约束名】 unique(字段名);


#5.添加外键
alter table 表名 addconstraint 约束名】 foreign key(字段名) references 主表(被引用列); 


修改表时删除约束
#1.删除非空约束
alter table 表名 modify column 字段名 字段类型 ;

#2.删除默认约束
alter table 表名 modify column 字段名 字段类型 ;

#3.删除主键
alter table 表名 drop primary key;

#4.删除唯一
alter table 表名 drop index 索引名;

#5.删除外键
alter table 表名 drop foreign key 约束名;

标识列 自增长列

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



特点:
1、标识列必须不一定只能和主键搭配,但要求是一个key
2、一个表可以有一个标识列!
3、标识列的类型只能是数值型
4、标识列可以通过 SET auto_increment_increment=3;设置步长(影响当前连接下的)
不用手动插入值,可以自动提供序列值,默认从1开始,步长为1,可以通过 手动插入值,设置起始值
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量

SHOW VARIABLES LIKE '%auto_increment%';可以查看启示值(auto_increment_offset)和步长(auto_increment_increment)



一、创建表时设置标识列
create table(
	字段名 字段类型 约束 auto_increment
)

二 修改表时设置标识列

alter tablemodify column 字段名 字段类型 约束 auto_increment



三 修改表时删除标识列

alter tablemodify column 字段名 字段类型 约束 

TCl(事务控制语言 Transaction Control Language)

事务

一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

事务由单独单元的一个或多个sql语句组成,在这个单元整,每个sql语句是相互依赖的,整个单元作为一个不可分割的整体如果单元中某条sql语句一旦执行失败或产生错误,整个单元将会回滚

mysql中 innodb支持事务 



事务的acid属性

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

一致性(Consistency)事务必须使数据库从一个一致性状态切换到另一个一致性状态

隔离性(Isolation)事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰

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



事务的创建
隐式事务:事务没有明显的开启和结束的标记,本身就是一条事务可以自动提交
比如insertupdatedelete语句



显式事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用

set autocommit=0; 只对当前的对话有用



步骤1:开启事务
set autocommit=0;
start transaction;可选的
步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
...

步骤3:savepoint 节点名;设置保存点(回滚点) 只搭配rollback使用
步骤4:结束事务
commit;提交事务
rollback;回滚事务
----------------------------------------------------------
#开启事务
SET autocommit=0;
START TRANSACTION;
#编写一组事务的语句
UPDATE account SET balance = 1000 WHERE username='张无忌';
UPDATE account SET balance = 1000 WHERE username='赵敏';

#结束事务
ROLLBACK;
#commit;
----------------------------------------------------------

----------------------------------------------------------
#演示savepoint 的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滚到保存点


SELECT * FROM account; 删除2528号未删除
----------------------------------------------------------

deletetruncate在事务使用时的区别

SET autocommit=0;
START TRANSACTION;  不可回滚

DELETE FROM account;  可以回滚
ROLLBACK;


并发事务
多个事务 同时 操作 同一个数据库的相同数据时
解决并发问题  通过设置隔离级别来解决
SQL标准定义了4类隔离级别(由低到高):
1.Read Uncommitted(读取未提交内容)
脏读:对于两个事务T1,T2 , T1读取了已经被T2更新但还没有被提交的字段,之后,若T2回滚,T1读取的内容就是临时无效的    (更新)

2.Read Committed(读取提交内容,解决了出现脏读的问题)
不可重复读:对于两个事务T1,T2 T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取了同一个字段,值就不同了

3.Repeatable Read (可重读,解决虚读问题)
幻读:对于两个事务T1,T2 T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后,如果T1再次读取了同一个表,就会多出几行   (插入 删除)

4.Serializable (可串行化,解决幻读问题)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题,但性能十分低

Oracle支持两种隔离级别 度已提交和串行化 默认为读已提交

mysql支持四种隔离级别 默认是可重复读



事务的隔离级别:
|                    | 脏读 | 不可重复读 | 幻读 |
| ------------------ | ---- | ---------- | ---- |
| read uncommitted||||
| read committed| ×    |||
| repeatable read| ×    | ×          ||
| serializable       | ×    | ×          | ×    |


 查看当前会话的隔离级别

5.0语句  select @@tx_isolation;

8.0语句  select @@transaction_isolation;

查看当前系统当前隔离级别

5.0语句  select @@global.tx_isolation;

8.0语句  select @@global.transaction_isolation;



设置当前mysql连接的隔离级别

set session transaction isolatin level repeatable read;

设置数据库系统的全局隔离级别

 set global transaction isolation level repeatable read;

视图

含义:虚拟表,和普通表一样使用 行和列的数据来自定义视图的查询中使用的表,并且是使用视图时动态生成的只保存sql逻辑,不报错查询结果

特点: 数据来自于表,通过执行时 动态生成 临时性

优点:

​		提高了sql语句的重用性

​		简化复杂的sql操作,不必知道它的查询细节

​		保护数据,提高安全性

使用场景

多个地方用到了同样的查询结果

该查询结果使用的sql语句比较复杂

mysql5.1版本出现的新特性,是通过表动态生成的数据

比如:舞蹈班和普通班级的对比



​	创建语法的关键字	是否实际占用物理空间	使用

视图		  view		     只是保存了sql逻辑	增删改查,只是一般不能增删改

表		  table	    	 保存了数据				增删改查

----------------------------------------------------------
#示例:查询姓张的学生名和专业名
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`
WHERE s.`stuname` LIKE '张%';
创建视图
CREATE VIEW v1
AS
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`;
使用视图 
SELECT * FROM v1 WHERE stuname LIKE '张%';
----------------------------------------------------------
创建视图

语法 :

​	create view 视图名 
​	as
​	查询语句;



视图的修改

方式一:

create or replace view  视图名  (如果视 图存在就修改如果不存在就创建)
as
查询语句;



方式二

语法:
alter view 视图名
as 
查询语句;



视图的删除

语法:drop view 视图名,视图名,...;



查看视图

DESC 视图;

SHOW CREATE VIEW 视图;



视图使用

插入 insert 修改 update 删除 delete 查看 select



视图更新

视图是可以增删改的

增加INSERT INTO 视图 VALUES()

修改UPDATE 视图 SET 字段 = 新值 WHERE  字段=旧值;

删除DELETE FROM 视图 WHERE 筛选条件;

视图不安全  一般会添加权限 只能读不能写



具备以下特点的视图不允许更新


①包含以下关键字的sql语句:分组函数、distinctgroup  byhavingunion或者union all
②常量视图 
③Select中包含子查询
④join 连接    可以更新  不能删除或者新增
⑤from一个不能更新的视图
⑥where子句的子查询引用了from子句中的表

②常量视图 
----------------------------------------------------------
常量视图
CREATE OR REPLACE VIEW myv2
AS

SELECT 'john' NAME;
----------------------------------------------------------Select中包含子查询
----------------------------------------------------------
CREATE OR REPLACE VIEW myv3
AS

SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
----------------------------------------------------------join 连接    可以更新  不能删除或者新增
----------------------------------------------------------
CREATE OR REPLACE VIEW myv4
AS

SELECT last_name,department_name
FROM employees e
JOIN departments d
ON e.department_id  = d.department_id;
----------------------------------------------------------from一个不能更新的视图
----------------------------------------------------------
CREATE OR REPLACE VIEW myv5
AS

SELECT * FROM myv3;   myv3也是个视图
----------------------------------------------------------where子句的子查询引用了from子句中的表
----------------------------------------------------------
CREATE OR REPLACE VIEW myv6
AS

SELECT last_name,email,salary
FROM employees
WHERE employee_id IN(
	SELECT  manager_id
	FROM employees
	WHERE manager_id IS NOT NULL
);
----------------------------------------------------------

变量

系统变量:
	全局变量
	会话变量

自定义变量:
	用户变量
	局部变量

系统变量

说明:变量由系统定义,不是用户定义,属于服务器层面
注意:全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别
使用步骤:
1、查看所有系统变量global全局 session会话,如果没有显式声明global还是session,则默认是session
show global|session】variables;

2、查看满足条件的部分系统变量,如果没有显式声明global还是session,则默认是session
show global|session】 variables like '%char%';
3、查看指定的系统变量的值,如果没有显式声明global还是session,则默认是session
select @@global|session】系统变量名;
4、为某个系统 变量赋值  如果没有显式声明global还是session,则默认是session
方式一:
set global|session】系统变量名=;
方式二:
set @@global|session】系统变量名=;	(全局变量)

set	@@变量名=;	(局部变量)

全局变量

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

必须拥有super权限才能为系统变量赋值

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

会话变量

服务器为每一个连接的客户端都提供了系统变量

必须拥有super权限才能为系统变量赋值

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

#①查看所有会话变量
SHOW VARIABLES;

SHOW SESSION VARIABLES;
#②查看满足条件的部分会话变量

SHOW VARIABLES LIKE '%char%';

SHOW SESSION VARIABLES LIKE '%char%';
#③查看指定的会话变量的值
SELECT @@autocommit;

SELECT @@tx_isolation;

SELECT @@session.tx_isolation;

#④为某个会话变量赋值

方式一

SET @@session.tx_isolation='read-uncommitted';

方式二

SET SESSION tx_isolation='read-committed';

### 自定义变量

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

#### 用户变量

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

位置:可以写在任何地方 也就是begin end 里面 或者放在begin end外面

#赋值操作符:=或:=
#①声明并初始化
SET @变量名=;
SET @变量名:=;
SELECT @变量名:=;

#②赋值(更新变量的值)
#方式一:
	SET @变量名=;
	SET @变量名:=;
	SELECT @变量名:=;
#方式二:
	SELECT 字段 INTO @变量名
	FROM;
#③使用(查看变量的值)
SELECT @变量名;

#### 局部变量

作用域:仅仅在定义它的begin end块中有效
位置:只能放在begin end中,而且只能放在第一句

#①声明
DECLARE 变量名 类型;(mysql常见的数据类型)
DECLARE 变量名 类型 【DEFAULT 值】;


#②赋值(更新变量的值)

#方式一:
	SET 局部变量名=;
	SET 局部变量名:=;
	SELECT @局部变量名:=;
#方式二:
	SELECT 字段 INTO 局部变量名
	FROM;
#③使用(查看变量的值)
SELECT 局部变量名;



用户变量和局部变量的对比

​			   作用域								定义位置							  	语法

用户变量	      当前会话							会话的任何地方					 加@符号,不用指定类型
局部变量	      BEGIN ENDBEGIN END的第一句话		        一般不用加@,需要指定类型			

存储过程和函数

存储过程适合增删改

函数适合查询

## 存储过程

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

#一、创建语法

CREATE PROCEDURE 存储过程名(参数列表)
BEGIN

存储过程体(一组合法的SQL语句)

END

#注意:
/*
1、参数列表包含三部分
参数模式  参数名  参数类型

eg:in stuname varchar(20)

参数模式:
in:该参数可以作为输入,也就是该参数需要调用方传入值
out:该参数可以作为输出,也就是该参数可以作为返回值
inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值

2、如果存储过程体仅仅只有一句话,begin end可以省略
存储过程体中的每条sql语句的结尾要求必须加分号。
存储过程的结尾可以使用 delimiter 重新设置
语法:
delimiter 结束标记
eg:
delimiter $

调用语法

----------------------------------------------------------
CALL 存储过程名(实参列表);
调用in模式的参数:call sp1(‘值’);
调用out模式的参数:set @name; call sp1(@name);select @name;
调用inout模式的参数:set @name=; call sp1(@name); select @name;

----------------------------------------------------------
先设置结束标记

在写存储过程语句

eg 黑窗口执行	
----------------------------------------------------------
空参列表
插入到admin表中五条记录

SELECT * FROM admin;

DELIMITER $   设置结束标记
CREATE PROCEDURE myp1()
BEGIN
	INSERT INTO admin(username,`password`) 
	VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
END $


#调用
CALL myp1()$
----------------------------------------------------------
创建带in模式参数的存储过程
----------------------------------------------------------
创建存储过程实现 根据女神名,查询对应的男神信息

CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
BEGIN
	SELECT bo.*
	FROM boys bo
	RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
	WHERE b.name=beautyName;
	

END $

#调用
CALL myp2('柳岩')$


创建存储过程实现,用户是否登录成功

CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
	DECLARE result INT DEFAULT 0;#声明并初始化
	
	SELECT COUNT(*) INTO result#赋值
	FROM admin
	WHERE admin.username = username
	AND admin.password = PASSWORD;
	
	SELECT IF(result>0,'成功','失败');#使用
END $

#调用
CALL myp3('张飞','8888')$
----------------------------------------------------------
创建out 模式参数的存储过程
----------------------------------------------------------
根据输入的女神名,返回对应的男神名

CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
	SELECT bo.boyname INTO boyname
	FROM boys bo
	RIGHT JOIN
	beauty b ON b.boyfriend_id = bo.id
	WHERE b.name=beautyName ;
	
END $

#调用
CALL myp6('小昭',@bname)$
SELECT @bname


根据输入的女神名,返回对应的男神名和魅力值
CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT) 
BEGIN
	SELECT boys.boyname ,boys.usercp INTO boyname,usercp
	FROM boys 
	RIGHT JOIN
	beauty b ON b.boyfriend_id = boys.id
	WHERE b.name=beautyName ;
	
END $


#调用
CALL myp7('小昭',@name,@cp)$
SELECT @name,@cp$
----------------------------------------------------------
创建带inout模式参数的存储过程
----------------------------------------------------------
传入a和b两个值,最终a和b都翻倍并返回

CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT)
BEGIN
	SET a=a*2;
	SET b=b*2;
END $

#调用
SET @m=10$
SET @n=20$
CALL myp8(@m,@n)$
SELECT @m,@n$
----------------------------------------------------------
#三、删除存储过程
#语法:drop procedure 存储过程名
DROP PROCEDURE p1;
DROP PROCEDURE p2,p3;#× 不支持多次删除

#四、查看存储过程的信息
DESC myp2;×  不支持desc
SHOW CREATE PROCEDURE  存储名;

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

区别:

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



一、创建语法
CREATE FUNCTION 函数名(参数名,参数类型) RETURNS 返回类型
BEGIN
	函数体 
END

注意:
1.参数列表 包含两部分:
参数名 参数类型

2.函数体:肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不报错,但不建议

return;
3.函数体中仅有一句话,则可以省略begin end
4.使用 delimiter语句设置结束标记



二、调用语法
SELECT 函数名(参数列表)



无参有返回

delimiter $;  语句结束标记

----------------------------------------------------------
CREATE FUNCTION myf1() RETURNS INT
BEGIN

	DECLARE c INT DEFAULT 0;#定义局部变量
	SELECT COUNT(*) INTO c#赋值
	FROM employees;
	RETURN c;
	
END $

SELECT myf1()$
----------------------------------------------------------
有参有返回
----------------------------------------------------------
根据员工名,返回它的工资

CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
	SET @sal=0;#定义用户变量 
	SELECT salary INTO @sal   #赋值
	FROM employees
	WHERE last_name = empName;
	
	RETURN @sal;
END $

SELECT myf2('k_ing') $




根据部门名,返回该部门的平均工资

CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
BEGIN
	DECLARE sal DOUBLE ;
	SELECT AVG(salary) INTO sal
	FROM employees e
	JOIN departments d ON e.department_id = d.department_id
	WHERE d.department_name=deptName;
	RETURN sal;
END $

SELECT myf3('IT')$
----------------------------------------------------------
创建函数,实现传入两个float,返回二者之和
----------------------------------------------------------
CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
	DECLARE SUM FLOAT DEFAULT 0;
	SET SUM=num1+num2;
	RETURN SUM;
END $

SELECT test_fun1(1,2)$
----------------------------------------------------------
三、查看函数

SHOW CREATE FUNCTION 函数名;

四、删除函数
DROP FUNCTION 函数名;

流程控制结构

顺序:程序从上往下依次执行

分支:程序从两条或多条路径中选择一条去执行

循环:程序在满足一定条件的基础上,重复执行一段代码



## 分支结构

1.if函数

语法:if(条件,1,值2)
功能:实现简单的双分支

执行顺序

如果表达式1成立 则if函数返回表达式2的值否则返回表达式3的值

应用:在任何地方,begin end中或外面

如果放在begin end 外面,作为表达式结合着其他语句使用

如果放在begin end 里面,一般作为独立的语句使用

2.case结构

情况1 类似于java中的switch语句 一般用于实现等值判断

case 变量|表达式|字段
when 要判断的值 then 返回的值1;
when 要判断的值 then 返回的值2;
...
else 返回的值n;
end 



case 变量|表达式|字段
when 要判断的值 then 返回的语句1;
when 要判断的值 then 返回的语句2;
...
else 返回的语句n;
end case



情况2 类似于java中的多重if语句,一般用于实现区间判断

case 
when 要判断的条件 then 返回的值1;
when 要判断的条件 then 返回的值2;
...
else 返回的值n;
end 



case 
when 要判断的条件 then 返回的语句1;
when 要判断的条件 then 返回的语句2;
...
else 返回的语句n;
end case



特点

1.可以作为表达式,嵌套在其他语句中使用,可以放在任何地方BEGIN END 中或 BEGIN END的外面

可以作为独立的语句去使用,只能放在BEGIN END2.如果WHEN中的值满足或者条件成立,则执行对应的THEN后面的语句,并且结束CASE 如果都不满足,则执行ELSE中的语句或值

3.ELSE可以省略,如果ELSE省略了,并且所有WHEN的条件都不满足,则返回null

			语法						位置
情况一		case 表达式				begin endwhen1 then1			begin endwhen2 then2
			...
			else 值n
			end
			
情况二		case 表达式				begin endwhen条件1 then1		begin endwhen条件2 then2
			...
			else 值n
			end
			
情况三		case 表达式				begin endwhen1 then 语句1			
			when2 then 语句2
			...
			else 值n
			end case;

情况四		case 表达式				begin endwhen条件1 then 语句1		
			when条件2 then 语句2
			...
			else 语句n
			end case

案例1:创建存储过程,实现传入成绩,如果成绩>90,显示A,如果成绩>80,显示B,如果成绩>60,显示C,否则显示D
----------------------------------------------------------
CREATE PROCEDURE test_case(IN score INT)
BEGIN 
	CASE 
	WHEN score>=90 AND score<=100 THEN SELECT 'A';
	WHEN score>=80 THEN SELECT 'B';
	WHEN score>=60 THEN SELECT 'C';
	ELSE SELECT 'D';
	END CASE;
END $

SELECT test_case(56)$
----------------------------------------------------------
3.if结构

位置:只能放在begin end 中

语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
....
else 语句n;
end if;
功能:类似于多重if实现多重分支

应用:只能应用在begin end 中

案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
----------------------------------------------------------
CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
	IF score>90 AND score<=100 THEN RETURN'A';
	ELSEIF score>80 THEN RETURN'B';
	ELSEIF score>60 THEN RETURN'C';
	ELSE RETURN'D';
	END IF;
	
END $

SELECT test_if(87)$
----------------------------------------------------------
## 循环结构

位置:begin end 中

分类

whilelooprepeat

循环控制(跳转语句)

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



写上标签可以搭配循环控制取用

1.while    先判断后执行

语法:

【标签:】while 循环条件 do
	循环体;
end while【 标签】;

2.loop   没有条件的死循环

语法:
【标签:】loop
	循环体;
end loop 【标签】;

可以用来模拟简单的死循环

跳出循环搭配leave 语句

3.repeat   先执行后判断

语法:
【标签:】repeat
	循环体; 
until 结束循环的条件
end repeat 【标签】;





对比:

①这三种循环都可以省略名称,但如果循环中添加了循环控制语句(leaveiterate)则必须添加名称
②
loop 一般用于实现简单的死循环
while 先判断后执行
repeat 先执行后判断,无条件至少执行一次





eg

没有添加循环控制语句

批量插入,根据次数插入到admin表中多条记录
----------------------------------------------------------
DROP PROCEDURE pro_while1$
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
		SET i=i+1;
	END WHILE;
	
END $

CALL pro_while1(100)$
----------------------------------------------------------
添加leave语句

批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
----------------------------------------------------------
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	a:WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
		IF i>=20 THEN LEAVE a;
		END IF;
		SET i=i+1;
	END WHILE a;
END $


CALL test_while1(100)$
----------------------------------------------------------
添加iterate语句

批量插入,根据次数插入到admin表中多条记录,只插入偶数次
----------------------------------------------------------
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 0;
	a:WHILE i<=insertCount DO
		SET i=i+1;
		IF MOD(i,2)!=0 THEN ITERATE a;
		END IF;
		
		INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
		
	END WHILE a;
END $


CALL test_while1(100)$
----------------------------------------------------------
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值