视图
含义
一种虚拟表
语法
CREATE VIEW 视图名
AS
查询语句
将select结果封装到view里面
#查询姓名中包含a字符的员工名、部门名和工种信息
#创建虚拟表
create view myvl
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 myvl where last_name like '%a%'
目的
简化sql操作,保护数据
修改
方式一
CREATE OR REPLACE VIEW 视图名
AS
查询语句
方式二
ALTER VIEW 视图名
AS
查询语句
删除
drop view 视图名,视图名,...
查看
show create view 视图名
更新
#插入
INSERT INTO 视图名 VALUES(修改内容)#其实只要标记想要修改的部分即可
#修改
UPDATE 视图名 SET 赋值语句
#删除
DELETE FROM 视图名 WHERE 筛选条件
有些类型不可更新
- 包含以下关键字:分组函数、distinct、group by、having、union
- 常量查询
- 包含子查询
- 联合查询
- 来自(from)一个无法更新的视图
- where子查询引用了from子句的表
变量
系统变量:
系统提供的变量
-
全局变量
show global variables show global variables like '%char%'#特定变量 select @@global.autocommit #查看autocommit的值 set @@global.autocommit=0 #设置指定值
全局变量设置后在各个连接中均有效,重启后失效
-
会话变量
针对于当前的会话show session variables #session可省略 show session variables like '%char%'#特定变量 select @@session.tx_isolation #查看tx_isolation的值 set @@session.tx_isolation=0 #设置指定值
只对当前会话有效
自定义变量:
用户自用,三部分组成:声明、赋值、使用
- 用户变量
声明、初始化set @用户变量名=值 set @用户变量名:=值 select @用户变量名:=值
赋值
#1 同样set、select #2 select 字段 into @变量 from 表 #字段处为函数
使用
select @用户变量名 #查看
- 局部变量
只在定义其的begin end中有效,可以不用加@
声明declare 变量名 类型 default 值 #此处值的类型与定义类型一致
赋值
set 变量名:= 值 select @变量名 := 值 #多变量同时赋值可以逗号隔开 select 字段1,字段2 into 变量1,变量2 from 表
使用(同用户变量)
储存过程
一组预先编译好的sql语句(~批处理),包含创建与调用
创建
delimiter #告诉解释器什么时候结束(看到时候结束)
create procedure 过程名(参数列表) #多个以逗号隔开
begin
存储体(即一组合法的sql语句)
end $
参数列表:包含参数模式、参数名、参数类型,空格隔开,模式有in、out、inout。in表示该参数可以作为输入(普通参数值),out表示输出(返回值)
储存体的语句结尾必须加;
调用
call 储存过程名(实参列表) $
举例
#根据女生姓名查询对应的男生信息
DELIMITER CREATE PROCEDURE myp(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 myp('柳岩') $
#简单的登录识别
delimiter $
create procedure login(in usname varchar(20),in passw varchar(20))
begin
declare result int default 0;#用以辅助的局部变量
select count(*) into result
from admin
where admin.username
=usname
and admin.password
=passw;
select if(result>0,'登录成功','登陆失败') 结果;
end call login('张三','12341234')
输出模式中可在存储过程外用额外定义的用户变量放入call
中“装载”结果,此处略去实例
#输入值翻倍
CREATE PROCEDURE doubl3(INOUT a INT,INOUT b INT)
BEGIN
SET a=a*2
SET b=b*2
END $
删除
drop procedure 过程名#只能一个一个删除
存储过程也可以用来转换,例如转换日期
存储过程一般可以用于做批量插入、批量更新
函数
有且仅有一个返回结果的一组sql语句
如何创建?
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
- 参数列表:参数名 参数类型
- 函数体:包含return语句(
return 值
)
调用
select 函数名(参数列表)
流程控制结构
分支结构
程序从两条或者多条路径中选择一条执行
if函数:
select if()
case结构:
case 变量 表达式 字段
when 判断1 then 返回1
when 判断2 then 返回2
when 判断3 then 返回3
...
else 返回值
end case
若是返回语句,注意加分号
select u.id,u.name,u.sex,
(case u.sex
when 1 then '男'
when 2 then '女'
else '空的'
end) 性别 #只返回值,end case中case可省略
from users u;
if结构
应用在beginend中
if 条件1 then 语句1;
elseif 条件2 then 语句2
...
else 语句
end if
#分数判断
create function test_if(score int) returns char
begin
if score>=90 and score<=100 then return 'A';#注意分号
elseif score>=80 AND score<=90 THEN RETURN 'B';
elseif score>=70 AND score<=80 THEN RETURN 'C';
else return 'F';
end if
end
循环结构
while\loop\repeat
while
先判断再执行
标签:while 循环条件 do
循环体;
end while
loop
死循环
标签:loop
循环体;
end loop
repeat
先执行后判断
标签:repeat
循环体;
until 结束循环的条件
end repeat
#根据次数插入多条记录到admin表中
create procedure pro_while(IN insertCount INT)
begin
declare i int default 1;
while i<=insertCount do
insert into admin(username,password)
values('hhh'+i,'578')
set i=i+1 #赋值
end while;
end
call pro_while