Mysql 基础 [4]之视图 变量 存储过程 函数以及流程控制结构

视图

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


视图

视图和表的区别:
使用方式 占用物理空间
视图 完全相同 不占用,仅仅保存的是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.修改视图的数据
方法1
UPDATE my_v4 SET last_name ='梦姑' WHERE last_name='虚竹';
方法2
CREATE OR REPLACE VIEW 视图名
AS
查询语句;
4.删除视图
语法:DROP view 视图1,视图2,视图3...
5.查看视图
DESC 视图名字

创建视图

CREATE VIEW v1
AS 
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON j.job_id = e.job_id

使用视图

SELECT * FROM v1 WHERE last_name LIKE '%a%';

视图的好处
1.重用sql语句
2.简化复杂的sql操作,不必知道它的内部细节
3.保护数据,提高安全性

视图的更新

#视图的更新
CREATE OR REPLACE VIEW myv1
AS 
SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "年薪"
FROM employees;

SELECT * FROM myv1;

#1.插入 会对原表更新
INSERT INTO myv1 VALUES('张飞','zq@154',10000);

#2.修改 会对源表更新
UPDATE myv1 SET last_name ='哈希' WHERE last_name='张飞'

#3.删除 会对源表删除
DELETE FROM myv1 WHERE last_name='哈希';

某些视图不能更新

1.包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
2.常量视图
3.Select中包含子查询
4.join 可以更新,但是不能插入
5.from一个不能更新的视图
6.where子句的子查询引用了from子句中的表

视图逻辑的更新
#方式一:
CREATE OR REPLACE VIEW test_v7
AS
SELECT last_name FROM employees
WHERE employee_id>100;
变量

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

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

系统变量
变量是由系统提提供的,不是用户定义,属于服务器层面
使用的语法:
查看所有的系统变量

SHOW GLOBAL VARIABLES; //全局
SHOW SESSION VARIABLES; //会话

查询满足条件的部分系统变量

SHOW SESSION VARIABLES LIKE '%char%';

查看指定的某个系统变量的值

SELECT @@character_set_connection;
SELECT @@global.character_set_connection;
SELECT @@session.character_set_connection;

为某个系统变量赋值

SET @@global.character_set_connection = 值;

如果是全局级别,需要加 global 如果是会话级别 则需要加 session 如果不写则默认是session
非0就是true
作用域:服务器每次启动都会为所有的全局变量赋值,针对所有会话和链接有效,但是不能跨服务器

session:所用域,当前链接,当前会话有效,
自定义变量
说明:是用户自定义的,不是系统的
使用步骤:
声明
赋值
使用(查看,比较,运算等)

用户变量 作用域:针对当前会话(链接)有效.同于会话变量的作用域
应用于任何地方
1.声明并且初始化

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

2.赋值

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

方式1 通过set或select 是一种弱类型
方式2 select 字段 into  变量名
from 某表

SELECT count(*) INTO @name
from employees

查看用户变量名
SELECT @name;

局部变量 作用域:仅仅在定义它的 begin end 中有效
应用在 begin end 中的第一句话

声明
DECLARE 变量名 类型 ;
DECLARE 变量名 类型 DEFAULT 值;

赋值
SET 用户变量名=值;
SET 用户变量名:=值;
SELECT @用户变量名:=值;
方式2 select 字段 into  变量名
from 某表

使用 
select 变量名; 
存储过程和函数

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

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

创建语法

CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
    存储过程体(一组合法的SQL语句)
END

注意:
参数列表包含三部分
参数模式 参数名 参数类型
举例
IN stuname VARCHAR(20)

参数模式
IN:此参数可以作为输入,该参数需要调用方传入值
OUT:此参数可以作为输出.可以作为返回值
INOUT:既可以作为输入,也可以作为输出,也就是该参数即需要传入值也可以返回值


如果存储过程体仅仅只有一句话 BEGIN END 可以省略
存储过程体的每条SQL语句的结尾要求必须加分号
存储过程的结尾可以使用 DELIMITER  重新设置
语法:DELIMITER 结束标记  DELIMITER $

调用语法

CALL 存储过程名(实参列表);

案例 空参

插入五条数据
use girls;
SELECT * FROM admin;

DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
    INSERT INTO admin(username,password) VALUES ('join1',45645);
    INSERT INTO admin(username,password) VALUES ('join2',45645);
    INSERT INTO admin(username,password) VALUES ('join3',45645);
    INSERT INTO admin(username,password) VALUES ('join4',45645);
    INSERT INTO admin(username,password) VALUES ('join5',45645);
END $


调用
use girls;
CALL myp1()

in

DELIMITER $
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 myp4('张飞','8888')
#案例1:根据输入的女神名,返回对应的男神名

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 

SET @bName
CALL myp6('小昭',@bName)
SELECT @bName
#案例2:根据输入的女神名,返回对应的男神名和魅力值

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
#4.创建带inout模式参数的存储过程
#案例1:传入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;//不支持
SHOW CREATE PROCEDURE myp2;

函数

函数的介绍
创建函数

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

CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型 
BEGIN
    函数体
END
注意
参数列表 包含两部分
参数名 参数可类型
函数体 肯定有return 语句,如果没有会报错

函数中如果只有一句话,则可以省略 begin end

调用语法
SELECT 函数名(参数列表)
CREATE FUNCTION myf1() RETURNS INT
BEGIN
    DECLARE c INT DEFAULT 0;#定义常量
    SELECT COUNT(*) INTO c # 赋值
    FROM boys;
    RETURN c;
END

SELECT myf1()

查看函数的过程

SHOW CREATE FUNCTION myf1

删除函数

DROP FUNCTION myf1
流程控制结构

分支
1、if函数
语法:if(条件,值1,值2)
特点:可以用在任何位置
2、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后面不需要)
特点:
可以用在任何位置
3、if elseif语句
语法:
if 情况1 then 语句1;
elseif 情况2 then 语句2;
...
else 语句n;
end if;
特点:
只能用在begin end中!!!!!!!!!!!!!!!
三者比较:
应用场合
if函数 简单双分支
case结构 等值判断 的多分支
if结构 区间判断 的多分支

循环
语法:
[标签:]WHILE 循环条件 DO
循环体
END WHILE [标签];
特点:
只能放在BEGIN END里面


循环条件
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容