MySQL最全笔记

MySQL

一、为什么要学习数据库
二、数据库的相关概念
  DBMS、DB、SQL
三、数据库存储数据的特点
四、初始MySQL MySQL产品的介绍

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

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

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

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

MySQL服务的登录和退出
  方式一:通过mysql自带的客户端 只限于root用户
  方式二:通过windows自带的客户端
  登录:mysql 【-h主机名 -P端口号 】-u用户名 -p密码
  退出:exit或ctrl+C

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

MySQL的语法规范

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

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

SQL的常见命令
/* 查看所有的数据库 */
show databases; 
/* 打开指定的库 */
use 库名; 
/* 显示库中的所有表 */
show tables; 
/* 显示指定库中的所有表 */
show tables from 库名; 
/* 创建表 */
create table 表名( 	
	字段名 字段类型,	 	
	字段名 字段类型 
);
/* 查看指定表的结构 */
desc 表名; 
/* 显示表中的所有数据 */
select * from 表名;
DQL语言的学习
进阶1:基础查询

语法:

select 要查询的字段|表达式|常量值|函数 		
from 表名

特点:
  ①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
  ② 要查询的东西可以是常量值、可以是表达式、可以是字段、可以是函数

进阶2:条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据

语法:

select 要查询的字段|表达式|常量值|函数 		
from 表名
where 条件

分类:
  一、条件表达式
    示例:salary > 10000
    条件运算符:<  >=  <=  =  !=  <>
  二、逻辑表达式
    示例:salary > 10000 && salary < 20000
    逻辑运算符:
      and(&&):两个条件如果同时成立,结果为true,否则为false
      or(||):两个条件只要有一个成立,结果为true,否则为false
      not(!):如果条件成立,则not后为false,否则为true
  三、模糊查询
    示例:last_name like ‘a%’

进阶3:排序查询

语法:

select 	要查询的东西 
from 	表 
where  	条件
order by 排序的字段|表达式|函数|别名 [asc|desc]
进阶4:常见函数

一、单行函数
  1、字符函数
     concat 拼接
     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 将字符转换成日期
     date_format 将日期转换成字符
  4、流程控制函数
     if 处理双分支
     case语句 处理多分支
     情况1:处理等值判断
     情况2:处理条件判断
  5、其他函数
     version 版本
     database 当前库
    user 当前连接用户
二、分组函数
  sum 求和  
  max 最大值
  min 最小值
  avg 平均值
  count 计数

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

进阶5:分组查询

分组查询
  语法:

select 
查询的字段,
分组函数
from 
表名
group by 分组的字段

特点:
    1、可以按单个字段分组
    2、和分组函数一同查询的字段最好是分组后的字段
    3、分组筛选

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

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

进阶6:多表连接查询

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

一、传统模式下的连接 :等值连接——非等值连接
  1.等值连接的结果 = 多个表的交集
  2.n表连接,至少需要n-1个连接条件
  3.多个表不分主次,没有顺序要求
  4.一般为表起别名,提高阅读性和性能
二、sql99语法:通过join关键字实现连接
  含义:1999年推出的sql语法
  支持:等值连接、非等值连接 (内连接)交叉连接 
  语法:

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 排序的字段或表达式]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`;
进阶7:子查询

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

特点:
  1、子查询都放在小括号内
  2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
  3、子查询优先于主查询执行,主查询使用了子查询的执行结果
  4、子查询根据查询结果的行数不同分为以下两类:
    ① 单行子查询
      结果集只有一行
        一般搭配单行操作符使用:> < = <> >= <=
     
    非法使用子查询的情况:
      a、子查询的结果为一组值
      b、子查询的结果为空
      
    ② 多行子查询
      结果集有多行
        一般搭配多行操作符使用:any、all、in、not in
        in: 属于子查询结果中的任意一个就行
        any和all往往可以用其他查询代替

进阶8:分页查询

应用场景:
  实际的web项目中需要根据用户的需求提交对应的分页查询的sql语句
  语法:

select 字段|表达式,...
from 表
[where 条件]
[group by 分组字段]
[having 条件]
[order by 排序的字段]
limit [起始的条目索引, 条目数];

特点:
    1.起始条目索引从0开始
    2.limit子句放在查询语句的最后
    3.公式:

select *
from  表 
limit (page-1)* sizePerPage, sizePerPage

假如:
    每页显示条目数sizePerPage
    要显示的页数 page

进阶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语言

插入

​ 语法1:(支持一次插入多行,支持子查询)

insert into 表名 (字段名1,...) 
values (值1,...);

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

​ 语法2:

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

修改

​ 修改单表语法:

update 表名 
set 字段=新值,字段=新值
where 筛选条件;

​ 修改多表语法:

sql92语法:

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

sql99语法:

update 表1 别名1
INNER|LEFT|RIGHT 表2 别名2
on 连接条件
set 字段=新值,字段=新值, ...
where 筛选条件;

删除

​ 方式1:delete语句

单表的删除: ★

delete from 表名 
where 筛选条件

多表的删除:
     sql92

DELETE 表1的别名,表2的别名
FROM  表1 别名,表2 别名
WHERE 连接条件
AND 筛选条件

sql99

DELETE 表1的别名,表2的别名
FROM  表1 别名
INNER|LEFT|RIGHT JOIN 表2 别名 on 连接条件
WHERE 筛选条件

​ 方式2:truncate语句

truncate table 表名

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

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

DDL语句

库和表的管理

库的管理

  #一、创建库
   	CREATE DATABASE 库名
   	#容错机制:
   		CREATE DATABASE IF NOT EXISTS 库名
  #二、更改库的字符集
   	ALTER DATABASE books CHARACTER SET gbk;
  #三、删除库
   	DROP DATABASE 库名
   	DROP DATABASE IF EXISTS 库名;

表的管理:
      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) ;
  #删除字段
   ALTER TABLE studentinfo DROP COLUMN email;

3.删除表
  
  ```mysql
  DROP TABLE [IF EXISTS] studentinfo;


        查看当前库的所有表

```mysql
  SHOW TABLES;

通用的写法

  DROP DATABASE IF EXISTS 旧库名;
  CREATE DATABASE 新库名;
  DROP TABLE IF EXISTS 旧表名;
  CREATE TABLE 新表名;

4.复制表

  #4.1 仅仅复制表的结构:
  	CREATE TABLE copy_author LIKE author;
  #4.2 复制表的结构 + 数据
  	CREATE TABLE copy1_author 
  	SELECT *
  	from author
  	WHERE nation = '中国';
  #4.3 仅仅复制某些字段
  	CREATE TABLE copy3_author 
  	SELECT id, au_name 
  	FROM author 
  	WHERE 0;
字段类型

常见类型
整型:
Tinying(1), Smallint(2), Mediumint(3), Int | integer(4), Bigint(8)

​ 1.如果不设置有无符号,默认的是有符号,如果想设置无符号,需要设置UNSIGNED关键字
​ 2.如果插入的数值超出了整型的范围,会报错误信息’out of range’,并且插入临界值
​ 3.如果不设置长度,会设置成默认的长度
​ 4.长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用
      
小数:
​ 浮点型:FLOAT(M,D),DOUBLE(M,D)
​ 定点型:DEC(M,D),DECIMAL(M,D)

​ ①M 整数部位 + 小数部位
​ ①D 小数部位
​ ①如果超出范围,则插入临界值
​ ①M 和 D 都可以省略。
​ 在DECIMAL中M默认为10,D默认为0;
     在FLOAT和DOUBLE中,则会根据插入的数值的精度来决定精度
​ ①定点型的精确度较高,如果要求插入的数值的精度较高如货币运算等则考虑使用

字符型:
​ 较短的文本:char、varchar
​ 较长的文本:text、blob(较长的二进制数据)
​ 其他:
​ binary和varbinary用于保存较短的二进制
​ enum用于保存枚举
​ set用于保存集合
​ 特点:

写法M的意思特点空间的耗费效率
charchar(M)最大的字符数,可以省略,默认为1固定长度的字符比较耗费
varcharvarchar(M)最大的字符数,不可以省略可变长度的字符比较节省

日期型:
​ date 只保存日期
​ time 只保存时间
​ year 只保存年
  
​ datetime 保存日期 + 时间
​ timestamp 保存日期 + 时间
    
​ 特点:

字节范围时区等的影响
datetime81000-9999不受
timestamp41970-2038

Blob类型:

约束

常见约束

NOT NULL #非空,用于保证该字段的值不能为空
DEFAULT #默认,用于保证该字段有默认值
UNIQUE #唯一,用于保证该字段的值具有唯一性,可以为空
CHECK #检查约束【MySQL中不支持】
PRIMARY KEY #主键,用于保证该字段的值具有唯一性,并且不可以为空
FOREIGN KEY #外键约束,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值;在从表中添加外键约束,用于引用主表中某列的值

约束的添加分类
  1.列级约束
    1.1 六大约束语法上都支持,但外键约束没有效果
    1.2 创建表时添加约束:
      直接在字段名和类型后面追加 约束类型 即可
    1.3 修改表时添加约束:

ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 约束类型;  

2.表级约束
    2.1 除了非空、默认,其他的的支持
    2.2 创建表时添加约束:
     语法:在各个字段的最下面

[CONSTRAINT 约束名] 约束类型 (字段名) [外键的引用]

2.3 修改表时添加约束:

ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型 (字段名) [外键的引用] 

修改表时删除约束

#1.删除非空约束
   ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR ( 20 ) NULL;
#2.删除默认约束
   ALTER TABLE stuinfo MODIFY COLUMN age int;
#3.删除主键约束
   ALTER TABLE stuinfo DROP PRIMARY KEY;
#4.删除主键约束
   ALTER TABLE stuinfo DROP INDEX seat;
#5.删除外键约束
   ALTER TABLE stuinfo DROP FOREIGN KEY majorid;

主键和唯一键的对比

保证唯一性是否允许为空一个表中可以有多少个是否允许组合
主键×至多有一个
唯一键可以有多个

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

事务的介绍 TCL语言

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

特点 (ACID)
  原子性:事物是一个不可再分割的工作单位,事物中的操作要么都执行,要么都不执行
  一致性:事物必须使数据库从一个一致性状态变换到另一个一致性状态
  隔离性:一个事务的执行不能被另外一个事务干扰,即并发执行的各个事物之间不能互相干扰
  持久性:一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
 
相关步骤:
  1、开启事务
  2、编写事务的一组逻辑操作单元(多条sql语句)
  3、提交事务或回滚事务

事务的分类与创建:

隐式事务:没有明显的开启和结束事务的标志
   比如
     insert、update、delete语句本身就是一个事务
 显式事务:具有明显的开启和结束事务的标志
   前提:必须先设置自动提交功能为禁用(SET autocommit=0;)
     步骤1:开启事务,取消自动提交事务的功能
       SET autocommit=0;
     步骤2:编写事务中的sql语句(select、insert、update、delete)
       语句一;
       语句二;
       …
     步骤3:结束事物
       COMMIT;提交事务
       ROLLBACK;回滚事务

使用到的关键字
  set autocommit=0;
  start transaction;
  commit;
  rollback;
 
  savepoint 设置保存点
  commit to 断点
  rollback to 断点

设置事务的隔离级别:

事务并发问题如何发生?
当多个事务同时操作同一个数据库的相同数据时事务的并发问题有哪些?

脏读:一个事务读取到了另外一个事务更新但是未提交的数据
不可重复读:同一个事务中,多次读取到的数据不一致
幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据,如果第一个事物再次读取同一个数据时,就会多出被第二个事物更新的数据
 
如何避免事务的并发问题?
通过设置事务的隔离级别

隔离级别(由低到高)
READ UNCOMMITTED读未提交数据不可避免
READ COMMITTED读已提交数据可以避免脏读
REPEATABLE READ可重复读可以避免脏读、不可重复读
SERIALIZABLE串行化可以避免脏读、不可重复读和幻读

设置隔离级别:
  set session|global transaction isolation level 隔离级别名;
  MySQL中默认REPEATABLE READ级别
  Oracle中默认READ COMMITTED级别
查看隔离级别:
  select @@tx_isolation;

视图

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

视图和表的区别

创建语法的关键字使用是否实际占用物理空间
视图CREATE VIEW增删改查不占用,仅仅保存的是sql逻辑
CREATE TABLE增删改查占用,保存了数据

视图的好处:
  1、sql语句提高重用性,效率高
  2、和表实现了分离,提高了安全性
视图的创建
  语法:

CREATE VIEW 视图名 
AS 查询语句; 

视图的修改
  方式一:

CREATE OR REPLACE VIEW test_v3
AS 
SELECT last_name 
FROM employees 
WHERE employee_id>10;

方式二:

ALTER VIEW test_v3
AS
SELECT *
FROM employees; 
SELECT * FROM test_v3;

视图的删除

DROP VIEW 视图名1, 视图名2, ... ;

视图的查看

DESC 视图名; 
SHOW CREATE VIEW 视图名; 

视图的更新

#1、查看视图的数据 ★
SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';
#2、插入视图的数据
INSERT INTO v1 VALUES('张飞',90);
#3、修改视图的数据
UPDATE v1 SET last_name ='张无忌' WHERE last_name='张飞';
#4、删除视图的数据
DELETE FROM myv1 WHERE last_name='张无忌';

以下视图不允许更新

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

系统变量

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

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

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

#查看所有会话变量
   SHOW SESSION VARIABLES;
#查看满足条件的部分会话变量
   SHOW SESSION VARIABLES LIKE '%char%';
#查看指定的会话变量的值
   SELECT @@会话变量;
   SELECT @@session.会话变量名;
#为某个会话变量赋值
   SET @@session.会话变量名=值;
   SET SESSION 会话变量名=值;
自定义变量

一、用户变量
   作用域:仅仅针对于当前会话(连接)有效
   应用会话的任何地方!

声明并初始化:
    SET @变量名=值;
    SET @变量名:=值; 
    SELECT @变量名:=值;
  
  赋值:
    方式一:一般用于赋简单的值
      SET 变量名=值;
      SET 变量名:=值;
      SELECT 变量名:=值;
 
    方式二:一般用于赋表中的字段值
      SELECT 字段名或表达式 INTO 变量名 FROM 表;
select count(*) INTO @name from employees;
  使用(查看用户变量的值):
    SELECT @变量名;
    
二、局部变量
  作用域:仅仅在定义它的begin end中有效
  应用在 begin end 中的的一句话!
  
  声明:
    declare 局部变量名 类型 【default 值】;
    declare 局部变量名 类型 ;
  
  赋值:
    方式一:一般用于赋简单的值
      SET 局部变量名=值;
      SET 局部变量名:=值;
      SELECT @局部变量名:=值;
 
    方式二:一般用于赋表 中的字段值
      SELECT 字段名或表达式 INTO 局部变量名 FROM 表;
  使用:
    select 变量名;
   
二者的区别:

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

含义:一组预先编译好的sql语句,理解成批量处理语句

​ 好处:
  1、提高了代码的重用性
  2、简化操作
  3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

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

创建存储过程

语法:

create procedure 存储过程名(参数模式 参数名  参数类型,...)
begin
存储过程体
end

参数模式:
  IN: 该参数可以作为输入,也就是该参数需要调用方传入值
  OUT: 该参数可以作为输出,也就是该参数可以作为返回值
  INOUT: 该参数既可以作为输入,又可以作为输出,也就是该参数既需要调用方传入值,又可以作为返回值
  
类似于方法:
  修饰符 返回类型 方法名(参数类型 参数名,…){
   方法体;
  }
 
注意:
  1、存储过程体中的每条SQL语句的结尾要求必须加分号。存储过程的结尾可以使用delimiter重写设置新的结束标记
    语法:
      delimiter 新的结束标记
    案例:

delimiter $
CREATE PROCEDURE 存储过程名(参数模式 参数名  参数类型, ...)
BEGIN
sql语句1;
sql语句2;
END $

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

调用存储过程

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

案例1:

delimiter $
CREATE PROCEDURE myp1 ( ) 
BEGIN
	INSERT INTO admin ( username, PASSWORD )
	VALUES( 'join1', '00000' );
END $
  
CALL myp1 ( )

案例2:

delimiter $
CREATE PROCEDURE myp2 ( IN beautyName VARCHAR ( 20 ), OUT boyName VARCHAR ( 20 ) ) 
BEGIN
   SELECT
       bo.boyName INTO boyName 
   FROM
       boys bo
   INNER JOIN beauty b ON bo.id = b.boyfriend_id 
   WHERE
       b.NAME = beautyName;
END$
 
CALL myp2('王语嫣',@bName1)
  
SELECT @bName1 ;

案例3:

delimiter $
CREATE PROCEDURE myp3 ( INOUT a INT, INOUT b INT )
BEGIN
	SET a = a * 2;
	SET b = b * 2;
END $ 
   
set @m = 10;
set @n = 30;
CALL myp3(@m,@n)
SELECT @m,@n; 
删除/查看存储过程

删除语法
DROP PROCEDURE 存储过程名;

查看语法
SHOW CREATE PROCEDURE 存储过程名;

函数的介绍

含义:一组预先编译好的sql语句,理解成批量处理语句

好处:
  1、提高了代码的重用性
  2、简化操作
  3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
  
函数和存储过程的区别:
  存储过程可以有0个返回,也可以有多个返回。适合做批量插入、批量更新
  函数:有且仅有1个返回。适合做处理数据后返回一个结果

函数的使用

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

语法:

CREATE FUNCTION 函数名(参数名 参数类型, ...) RETURNS 返回类型
BEGIN
	函数体
END

注意:
  1.函数体一定会有RETURN语句,如果没有会报错( RETURN 值; )
  2.如果RETURN语句没有放在函数体的最后也不会报错,但不建议
  3.函数体中可以有多条sql语句,如果仅仅只有一条sql语句,则可以省略begin end
  4.使用 delimiter 语句设置结束标记
  
调用函数
  SELECT 函数名(实参列表)
  
查看函数
  SHOW CREATE FUNCTION 函数名;
  
删除函数
  DROP FUNCTION 函数名;

流程控制结构

顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码

分支结构

一、if 函数
功能:实现简单的双分支
语法:
if(表达式1,表达式2,表达式3)
执行顺序:
如果表达式1成立,则 if 函数返回表达式2的值,否则返回表达式3的值
应用:任何位置

二、case结构
  语法:
    情况一:类似于 Java 中的 switch 语句

case 表达式|变量|字段
	when 要判断的值1 then 返回的值1或语句1(如果是语句,需要加分号) 
	when 要判断的值2 then 返回的值2或语句2(如果是语句,需要加分号)
	...
	else 返回的值n
	end [case] #如果是放在begin end中需要加上case,如果放在select后面不需要

情况二:类似于 Java 中的多重 if 语句

case 
	when 要判断的条件1 then 返回的值1或语句1(如果是语句,需要加分号) 
	when 要判断的条件2 then 返回的值2或语句2(如果是语句,需要加分号)
	...
	else 返回的值n或语句n(如果是语句,需要加分号)
	end [case] #如果是放在begin end中需要加上case,如果放在select后面不需要

特点:
    1、可以作为表达式,嵌套在其他语句中使用,可以用在任何位置,BEGIN END中或BEGIN END外
    2、可以作为独立的语句去使用,只能放在BEGIN END中
    3、如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE;如果都不满足,则执行ELSE中的语句或返回的值
    4、ELSE可以省略,如果ELSE省略了,并且所有WHEN条件都不满足,则返回NULL
 
三、if 结构
  功能:实现多重分支
  
  语法:

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 WHILE 【标签】; 
  
特点:
  仅仅能放在BEGIN END里面
  如果要搭配leave跳转语句,需要使用标签,否则可以不用标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值