导图社区 SQL学习
SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极大的便利,数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。SQL语言不仅能独立应用于终端,还可以作为子语言为其他程序设计提供有效助力,该程序应用中,SQL可与其他程序语言一起优化程序功能,进而为用户提供更多更全面的信息。
编辑于2022-05-20 08:50:43SQL
概念
数据库的好处
1.持久化数据到本地
2.可以实现结构化查询,方便管理
数据库相关概念
1、DB:数据库,保存一组有组织的数据的容器
2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
3、SQL:结构化查询语言,用于和DBMS通信的语言
数据库存储数据的特点
1、将数据放到表中,表再放到库中
2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。
4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
5、表中的数据是按行存储的,每一行类似于java中的“对象”。
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
MySQL的语法规范
1.不区分大小写,但建议关键字大写,表名、列名小写
2.每条命令最好用分号结尾
3.每条命令根据需要,可以进行缩进 或换行
4.注释
单行注释:#注释文字
单行注释:--空格注释文字
多行注释:/* 注释文字 */
基础知识
MySQL服务的启动和停止
计算机——右击管理——服务
通过管理员身份运行cmd
net start musql80(服务名,启动服务)
net stop 服务名(停止服务)
MySQL服务的登录和退出
登录
通过mysql自带的客户端
只限于root用户
通过windows自带的客户端
mysql -u root -p
989426
退出
exit
ctrl+C
常见命令
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
8.显示表中的所有数据
select * from 表名;
9.去重
在字段名前加DISTINCT
10.拼接
将几个字符串结合用concat
select concat('a','b','c') 结果就是abc
11.条件判断 ifnull
如果字段值是null,显示为0
ifnull (字段,0)
12.起别名
select 字段 AS 别名
select last_name AS 姓 from 查询表
select 字段 空格 别名
select last_name 姓 from 查询表
可以为表起别名
如果别名里面有特殊符号,建议给别名加双引号
13.加号+
两个操作数都为数值型,则作加法运算
select 120+90 结果为210
其中一方为数值型,试图将字符型数值转换成数值型
转化成功:加法运算
select '120'+90 结果为210
转换失败:将字符型转化为0
select 'jion'+90 结果为90
若有一方为null,则结果为null
select null+90 结果为null
14.通配符
%:任意多个字符,包含0个字符
不管所查的字符在第几位,只要包含即可
_:任意单个字符
例如:查询manner(第2个字符是a,第5个字符是e),则表达为:‘_a__e%'
注意:查询第2个字符是_时,用转义,即'_\_%'
15.转义符
\:查询第2个字符是_时,用转义,即'_\_%'
ESCAPE:指定转义符,如:'_\_%' 等同于 '_w_%' ESCAPE 'w';
16.isnull
判断是否为null,是为1,否为0
17.字符长度计算
length
DQL语言的学习
1.基础查询
注意
1.use 库名
每次都要写,打开库名后才可以保证每次使用的表格在这个库里
2.为了区分字段和关键字,用着重号`标记字段
语法
SELECT 查询列表 FROM 表名;
类似于Java中 :System.out.println(要打印的东西);
特点
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 查询列表可以是:常量值、可以是表达式、可以是字段、可以是函数
查询字段
查询表中的单个字段
select 字段 from 表名
查询表中的多个字段
select 字段1,字段2,字段3 from 表名
查询表中的所有字段
select * from 表名
查询表达式
select 100+100
加减乘除都可以正常用
2.条件查询
语法
select 要查询的字段|表达式|常量值|函数 from 表 where 条件 ;
分类
条件表达式
条件运算符
> < >= <= =
不等于
!=
<>
逻辑表达式
逻辑运算符
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
案例
查询工资>12000的员工信息
SELECT * FROM employees WHERE salary>12000;
查询部门编号不等于90号的员工名和部门编号
SELECT last_name,department_id FROM employees WHERE department_id<>90;
查询工资在10000到20000之间的员工名、工资以及奖金
SELECT last_name,salary,commission_pct FROM employees WHERE salary<=20000 and salary>=10000 ;
查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT * FROM employees WHERE department_id >110 or department_id <90 or salary>15000;
SELECT * FROM employees WHERE NOT (department_id <=110 AND department_id >=90) or salary>15000;
模糊查询
运算符
like
查询员工名中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';
between and
查询员工编号在100到120之间的员工信息
SELECT * FROM employees WHERE employee_id >=100 and employee_id <=120 ;
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120 ;
特点
①可以提高语句简洁度
②包含临界值
③不可以颠倒临界值顺序
in
查询员工编号是IT_PROG、AD_Vp、AD_PRES中的一个员工名和工种编号
SELECT last_name,job_id FROM employees WHERE job_id='IT_PROT' OR job_id='AD_Vp' ORjob_id='AD_PRES'
SELECT last_name,job_id FROM employees WHERE job_id in ('IT_PROT' ,'AD_Vp','AD_PRES')
特点
①可以提高语句简洁度
②in里面的值必须一致或者兼容
③不支持通配符
in null
查询没有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct is null ;
查询有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct is not null ;
注意
=或者<>不能判断null
is null 或者 is not null 仅用于判断null值
安全等于<=>
查询没有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct <=>null ;
判断是否等于,如果等于返回,可读性较低,不建议使用
3.排序查询
语法
从低到高:order by 排序的字段|表达式|函数|别名 asc
从高到低:order by 排序的字段|表达式|函数|别名 desc
案例
查询员工信息,要求工资从高到底
select * from employees order by salary desc ;
查询员工信息,要求工资从低到高
【按字段排序】select * from employees order by salary asc ;
查询部门编号>=90的员工信息,并按照入职日期先后的顺序进行排序
【根据条件筛选排序】select * from employees where department_id >=90 order by hiredate asc ;
按照年薪的高低显示员工的信息和年薪
【按表达式排序】select *,salary*12*(1+ifnull(commission_pct,0)) as 年薪 from employees order by salary*12*(1+ifnull(commission_pct,0)) desc ;
【按别名排序】select *,salary*12*(1+ifnull(commission_pct,0)) as 年薪 from employees order by 年薪 desc ;
按姓名的长度显示员工的姓名和工资
【按函数排序】select last_name,salary from employees order by length(last_name) ;
查询员工信息,先按照工资排序,再按照员工编号排序
【按多个字段排序】select * from employees order by salary asc,employee_id desc;
特点
1.asc代表升序,desc代表降序,不写默认降序
2.order by子句 一般放在最后,limit字句除外
4.常见函数
单行函数
1.字符函数
length 获取字节个数
concat拼接
upper转换成大写
lower转换成小写
substr截取子串
substr(字符,数字)代表截取第几位之后的字符
substr(字符,数字,数字)代表截取第几位之后的几个字符
instr返回子串第一次出现的索引
instr(字符,子字符)代表子字符从第几位开始,如果找不到返回0
去空格
trim去前后指定的空格和字符
trim(字符)代表去掉字符前后的空格
trim(1字符from字符)代表去掉字符前后的1字符
ltrim去左边空格
rtrim去右边空格
填充
lpad左填充
用指定的字符在左边填充想实现的长度
rpad右填充
replace替换
2.数学函数
round 四舍五入
ceil向上取整,返回>=该参数的最小整数
floor向下取整,返回<=该参数的最大整数
mod取余
truncate截断
rand 随机数
3.日期函数
curdate当前系统日期
curtime当前系统时间
now当前系统日期+时间
year、month、day年月日
str_to_date 将字符转换成日期
date_format将日期转换成字符
4.流程控制函数
if 处理双分支
case语句 处理多分支
情况1:处理等值判断
情况2:处理条件判断
5.其他函数
version版本
database当前库
user当前连接用户
6.流程控制函数
if函数,实现if else的效果
case函数
类似java中的switch case效果
case 要判断的字段或者表达式 when 常量1 then 要显示的值1或者语句1 when 常量2 then 要显示的值2或者语句2 else 要显示的值n或者语句n end
类似java中的多重if
case when 条件1 then 要显示的值1或者语句1 when 条件2 then 要显示的值2或者语句2 else要显示的值n或者语句n end
分组函数
sum 求和
max 最大值
min 最小值
avg 平均值
count 计数
count(*)表示所有行数
count(1)表示统计1个的个数
特点
1、以上五个分组函数都忽略null值,除了count(*)
建议使用 count(*)
2、sum和avg一般用于处理数值型 max、min、count可以处理任何数据类型
3、都可以搭配distinct使用,用于统计去重后的结果
4、count的参数可以支持:字段、*、常量值,一般放1
分组查询
语法
select 查询的字段,分组函数 from 表 group by 分组的字段
案例
查询每个工种的最高工资
select max(salary),job_id from employees group by job_id;
查询邮箱中含有字符a的每个部门的平均工资
select avg(salary),department_id from employees where email like%a% group by job_id;
特点
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、分组筛选
针对的表 位置 关键字 分组前筛选: 原始表 group by的前面 where 分组后筛选: 分组后的结果集 group by的后面 having
4、可以按多个字段分组,字段之间用逗号隔开
5、可以支持排序
6、having后可以支持别名
多表连接查询
69-86章节未学习
笛卡尔乘积:如果连接条件省略或无效则会出现
解决办法:添加上连接条件
语法:select 字段1,字段2,from表1,表2,where 表1 .判定字段1=表2.判定字段2
.做定义,用于表明所使用字段是属于哪个表的
传统模式下的连接:等值连接——非等值连接
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 排序的字段或表达式】
好处:语句上,连接条件和筛选条件实现了分离,简洁明了!
自连接
案例:查询员工名和直接上级的名称
sql92
SELECT e.last_name,m.last_name FROM employees e,employees m WHERE e.`manager_id`=m.`employee_id`;
sql99
SELECT e.last_name,m.last_name FROM employees e JOIN employees m ON e.`manager_id`=m.`employee_id`;
子查询
含义:
一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询,在外面的查询语句,称为主查询或外查询
分类
根据查询结果的行数不同分类
① 单行子查询
结果集只有一行,一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空
② 多行子查询
结果集有多行,一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替
根据结果集的行数不同分类
标量子查询:结果集只有一行一列
列子查询:结果集只有一列多行
行子查询:结果集有一行多列
表子查询:结果集一般为多行多列
特点:
1、子查询都放在小括号内
2、子查询可以放在
select后面
仅支持标量子查询
案例:查询每个部门的员工个数
select D.*,(select count (*) from employees as E where E.department_id =D.`department_id`) as 个数 from department_id ;
案例:查询员工号为102的部门名
select (select department_name from department as D inner join employees as E on D.department_id=E.department_id where E.employee_id =102)AS部门名 ;
from后面
支持表子查询
案例:查询每个部门的平均工资的等级
①查询每个部门的平均工资
slelect avg(salary),department_id from employees group by department_id ;
②链接①的结果值和job_grades表,筛选条件平均工资between lowest_sal and highest_sal
select from ( slelect avg(salary),department_id from employees group by department_id ) as 平均工资表 inner join job_grades as 等级表 on 平均工资表.ag between lowest_sal and highest_sal ;
③链接
select 平均工资表.*,等级表.`grade_level` from ( slelect avg(salary),department_id from employees group by department_id ) as 平均工资表 inner join job_grades as 等级表 on 平均工资表.ag between lowest_sal and highest_sal ;
注意:将子查询结果充当一张表,必须起别名
where后面或having后面
标量子查询
一般搭配着单行操作符使用> < >= <= = <>
案例:谁的工资比Abel高?
①查询Abel的工资
select salary from employees where last_name =`Abel`
②查询员工的信息,满足salary>①的结果
select * from employees where salary >(select salary from employees where last_name =`Abel`)
列子查询
一般搭配着多行操作符使用 in any some all
案例:返回location_id是1400或1700的部门中所有员工姓名
①查询location_id是1400或1700的部门编号
select department_id from departments where location_id in(1400,1700)
②查询员工姓名,要求部门号是①列表中的某一个
select last_name from employees where department_id in (select department_id from departments where location_id in(1400,1700))
案例:返回其他部门中比job_id为`IT_PROG`部门任意工资低的员工的员工号、姓名、job_id以及salary
①查询job_id为为`IT_PROG`部门任意工资
select distinct salary from employees where job_id=`IT_PROG`
②查询员工号、姓名、job_id以及salary<①的任意一个
select last_name,employees_id,job_id,salary from employees where salary <any(select distinct salary from employees where job_id=`IT_PROG`) and job_id<>`IT_PROG` ;
行子查询
案例:查询员工编号最小并且工资最高的员工信息
传统方法
①查询最小的员工编号
select min(employe_id) from employees
②查询最高工资
select max(salary) from employees
③查询员工信息
select * from employees where employee_id=(select min(employe_id) from employees) and salary =(select max(salary) from employees) ;
行子查询
select * from employees where (employee_id,salary)=(select min(employe_id),max(salary) from employees) ;
exists后面(相关子查询)
先外查询,后子查询
表子查询
语法:exists (完整的查询语句),结果是1或者0
案例:查询有员工的部门名
select department_name from departments D where exists(select * from employees E where D.`department_id`=E.`department_id`) ;
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
分页查询
应用场景:
实际的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
union联合查询
引入:
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语言的学习
插入语句
语法:
insert into 表名(字段名,...) values(值1,...);
特点:
1、字段类型和值类型一致或兼容,而且一一对应
2、可以为空的字段,可以不用插入值,或用null填充
3、不可以为空的字段,必须插入值
4、字段个数和值的个数必须一致
5、字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致
修改语句
修改单表语法:
update 表名 set 字段=新值,字段=新值 【where 条件】
修改多表语法:
update 表1 别名1,表2 别名2 set 字段=新值,字段=新值 where 连接条件 and 筛选条件
删除语句
delete语句
单表的删除
delete from 表名 【where 筛选条件】
多表的删除:
delete 别名1,别名2 from 表1 别名1,表2 别名2 where 连接条件 and 筛选条件;
truncate语句
truncate table 表名
两种方式的区别
1.truncate不能加where条件,而delete可以加where条件
2.truncate的效率高一丢丢
3.truncate 删除带自增长的列的表后,如果再插入数据,数据从1开始 delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始
4.truncate删除不能回滚,delete删除可以回滚
DDL语言的学习
库和表的管理
库的管理
创建库
create database 库名
删除库
drop database 库名
表的管理
创建表
CREATE TABLE IF NOT EXISTS stuinfo( stuId INT, stuName VARCHAR(20), gender CHAR, bornDate DATETIME ); DESC studentinfo;
修改表 alter
语法
LTER 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;
删除表
ROP TABLE [IF EXISTS] studentinfo;
常见数据类型介绍
整型:
小数:
浮点型
定点型
字符型:
日期型:
Blob类型:
常见约束
NOT NULL
DEFAULT
UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY
TCL语言的学习
事务和事务处理
含义
通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态
特点
原子性:要么都执行,要么都回滚
一致性:保证数据的状态操作前和操作后保持一致
隔离性:多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
持久性:一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改
相关步骤:
1、开启事务
2、编写事务的一组逻辑操作单元(多条sql语句)
3、提交事务或回滚事务
事务的分类
隐式事务,没有明显的开启和结束事务的标志
比如
insert、update、delete语句本身就是一个事务
显式事务,具有明显的开启和结束事务的标志
1、开启事务
取消自动提交事务的功能
2、编写事务的一组逻辑操作单元(多条sql语句)
insert
update
delete
3、提交事务或回滚事务
使用到的关键字
set autocommit=0;
start transaction;
commit;
rollback;
savepoint 断点
commit to 断点
rollback to 断点
事务的隔离级别
事务并发问题如何发生?
当多个事务同时操作同一个数据库的相同数据时
事务的并发问题有哪些?
脏读:一个事务读取到了另外一个事务未提交的数据
不可重复读:同一个事务中,多次读取到的数据不一致
幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据
如何避免事务的并发问题?
通过设置事务的隔离级别
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免脏读
3、REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读
4、SERIALIZABLE可以避免脏读、不可重复读和幻读
设置隔离级别
set session|global transaction isolation level 隔离级别名;
查看隔离级别
select @@tx_isolation;
视图的讲解
含义:理解成一张虚拟的表
视图和表的区别:
使用方式 占用物理空间 视图 完全相同 不占用,仅仅保存的是sql逻辑 表 完全相同 占用
视图的好处:
1、sql语句提高重用性,效率高
2、和表实现了分离,提高了安全性
视图的创建
语法:
CREATE VIEW 视图名 AS 查询语句;
视图的增删改查
查看视图的数据
SELECT * FROM my_v4; SELECT * FROM my_v1 WHERE last_name='Partners';
插入视图的数据
INSERT INTO my_v4(last_name,department_id) VALUES('虚竹',90);
修改视图的数据
UPDATE my_v4 SET last_name ='梦姑' WHERE last_name='虚竹';
删除视图的数据
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;
变量
存储过程和函数
含义:一组经过预先编译的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 存储过程名(实参列表)
函数
创建函数
CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型 BEGIN 函数体 END
调用函数
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 值】;
赋值
一般用于赋简单的值
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中
循环
语法:
【标签:】WHILE 循环条件 DO 循环体 END WHILE 【标签】;
特点:
只能放在BEGIN END里面
如果要搭配leave跳转语句,需要使用标签,否则可以不用标签
leave类似于java中的break语句,跳出所在循环!!!