MySQL语言包括四部分:
数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)(详见第三章)
以及MySQL增加的语言元素:
- 不是SQL标准所包含的内容,是为了用户编程的方便增加的语言元素。
- 各个DBMS都会对SQL标准进行扩充,使SQL语言功能更强大。
- MySQL中增加的语言元素有常量、变量、运算符、函数、流程控制语句和注释等。
常量和变量
常量
常量是指在程序运行过程中值保持不变的量。在MySQL中,常量的类型由它表示的值的数据类型决定。
常量类型 | 示例 |
---|---|
字符串常量 | 'hello' 、'abc#%' 、"5hello! " |
实数常量 | 3.14 、-3.14 、15.3E5 、0.3E-5 |
整数常量 | 100 、-100 、0x1D (十六进制表示) |
日期时间常量 | '2021-08-2 14:28:24:00' 、'2021-08-2' 、'14:28:24:00' |
布尔值常量 | TRUE (数字值为“1”)、FALSE (数字值为“0”) |
NULL值 | 用来表示“无数据”,不同于空字符串和数字0 |
select
语句可以用来呈现变量和常量:
SELECT 'hello',"hello",500,true,'2023-5-4 10:18:40',null,'',0;
变量
变量是指在程序运行中值可以变的量,它是表达式中最基本的元素,可用于存储临时数据。
自定义变量的三个要素:变量名称、数据类型、取值
包括以下三类:
用户变量
- 用户变量:带有前缀@,只能被定义它的用户使用,作用于当前整个连接
- 当前连接断开后,所定义的用户变量会被全部释放。用户变量不用提前定义就可以直接使用。
- 在使用前必须定义和初始化。如果变量没有初始化,变量的值为NULL。
set @user_variable1=expression1 [,@user_variable2= expression2 , ...];
例:
set @number=(select sno from s where sname='朱安琪');
select @number;
select * from sc where sno=@number;
局部变量
- 局部变量:没有前缀,一般用于SQL语句块中,比如存储过程的BEGIN…END中。
- 局部变量使用前需要先通过DECLARE声明。如没有声明,则初始值为NULL。
declare var_name [, var_name] ... type [default value];
系统变量
- MySQL系统内部定义的变量,用于控制数据库的一些行为和方式的参数。
- 系统变量以@@开头。
- 系统变量包含全局变量和会话变量。
-
- 全局变量由系统定义,会影响整个服务器,当MySQL服务器启动时,全局变量初始化为默认值,并且应用于每一个启动的会话。
-
- 会话变量只影响个人客户端连接,在每一次建立一个新连接时,由MySQL服务器将当前所有全局变量复制一份给会话变量完成初始值。
查看全局变量的基本语法格式:
show global variables [like 'pattern'];
或
select @@global.system_variable;
例如:
--查询包含version字样的全局变量的值。
show global variables like '%version%';
--查询指定全局变量的值。
select @@global.sort_buffer_size;
查看会话变量的基本语法格式:
show session|local variables [like 'pattern'];
或
select @@session|local.system_variable;
例如:
--查看会话变量sql_warnings,将其值修改为相反的值后,再次查看该会话变量。
show session variables like 'sql_warnings';
set @@session.sql_warnings =1;
-- 等价于
set session sql_warnings =1;
select @@session.sql_warnings;
运算符与表达式
- 运算符是用来连接表达式中各个操作数据的符号,用来指明对操作数据所进行的运算。
- 运用运算符可以更加灵活地对表中的数据进行计算和查询。
运算符
算术运算符
运算符 | 说明 | 举例 | 结果 |
---|---|---|---|
+ | 加法,返回相加后的值 | 7 + 5 | 12 |
- | 减法,返回相减后的值 | 7 - 5 | 2 |
* | 乘法,返回相乘后的值 | 7 * 5 | 35 |
/ | 除法,返回相除后的值 | 7 / 5 | 1.4 |
div | 取整,返回相除后的商的整数部分 | 7 div 5 | 1 |
%, mod | 求余,返回相除后的余数 | 7 % 5 或 7 mod 5 | 2 |
比较运算符
- 关系运算符,比较结果为真,则返回1,为假则返回0,结果不确定则返回NULL。
运算符 | 说明 | 举例 | 结果 |
---|---|---|---|
= | 等于 | 7 = 5 | 0 |
<=> | 完全等于(相等或都等于空) | null <=> null | 1 |
<> 或 != | 不等于 | 7 != 5 | 1 |
> | 大于 | 7 > 5 | 1 |
>= | 大于或等于 | 7 >= 5 | 1 |
< | 小于 | 7 < 5 | 0 |
<= | 小于或等于 | 7 <= 5 | 0 |
in | 在集合中 | 5 in (5, 7) | 1 |
not in | 不在集合中 | 5 not in (5, 7) | 0 |
is null | 为空 | 5 is null | 0 |
is not null | 不为空 | 5 is not null | 1 |
between | 在两者之间 | 5 between 5 and 7 | 1 |
not between | 不在两者之间 | 5 not between 5 and 7 | 0 |
like | 字符串匹配,包含通配符“%” 和“_” | ‘hello’ like ‘%e%’ | 1 |
regexp 或 rlike | 正则表达式匹配 | ‘a00’ regexp ‘.00’ | 1 |
least | 返回最小值 | Least(5, 6, 7) | 5 |
greatest | 返回最大值 | Greatest(5, 6, 7) | 7 |
逻辑运算符
- 逻辑运算也称为布尔运算,在MySQL中,所有逻辑表达式的结果均为true、false或null,分别显示为1、0、null。
运算符 | 说明 | 举例 | 结果 |
---|---|---|---|
not 或 ! | 逻辑非(假变真,真变假) | Not(7 = 5) | 1 |
and 或 && | 逻辑与(所有为真则为真) | (7 < 5) and (5 < 7) | 0 |
or 或 || | 逻辑或(一真则为真) | (7 < 5) or (5 < 7) | 1 |
xor | 逻辑异或(一真一假则为真) | (7 < 5) xor (5 < 7) | 1 |
位运算符
- 位运算在两个表达式之间执行二进制位操作,这两个表达式的类型可为整型或与整型兼容的数据类型。
运算符 | 说明 | 举例 | 结果 |
---|---|---|---|
& | 位and | 5 & 7 | 5 |
| | 位or | 5 | 7 | 7 |
^ | 位xor | 5 ^ 7 | 2 |
~ | 位取反 | ~5 | 18446744073709551610 |
>> | 位右移 | 64 >> 1 | 32 |
<< | 位左移 | 64 << 1 | 128 |
运算符的优先级
运算符 | 优先级 | 运算符 | 优先级 |
---|---|---|---|
! | 1 | |(位或) | 8 |
-(负)、~(位取反) | 2 | =、<=>、>=、>、<=、<、<>、!=、is、like、regexp、in | 9 |
^(位异或) | 3 | between | 10 |
*(乘)、/(除)、%(模) | 4 | not | 11 |
+(加)、-(减) | 5 | and | 12 |
<<、>> | 6 | or、xor、any、some | 13 |
&(位与) | 7 | =(赋值运算符)、:= | 14 |
表达式
- 表达式就是常量、变量、列名、复杂计算、运算符和函数的组合。
- 一个表达式通常可以得到一个值。与常量和变量一样,表达式的值具有某种数据类型,可能的数据类型有字符型、数值型、日期时间型。
- 表达式一般用在select语句及select语句的where子句中。
--字符型表达式,例如:
concat( 'hello','', 'tsguas')
--数值型表达式,例如:
2+3
2*3
--日期型表达式,例如:
'2021-01-01'+ interval 5 month
函数(暂略)
程序流程控制
- 流程控制语句是指可以控制程序运行顺序的指令,程序运行顺序主要包括顺序执行、条件执行和循环执行。
- MySQL支持的流程控制语句包括if语句、case语句、loop语句、leave语句(跳出整个循环)、iterate语句(跳出本次循环)、repeat语句和while语句等。
- 流程控制语句主要用在存储过程体中。
IF语句:
IF实现条件判断,语句中可以包含多个判断条件,系统会根据条件的结果是否为TRUE执行相应的操作。
if 判断条件 then 执行语句
[elseif 判断条件 then 执行语句]
...
[else 执行语句]
end if;
case语句:
--格式1
case 变量
when 值1 then result1
when 值2 then result2
...
when 值n then resultn
else result
end;
--格式2
CASE
WHEN 条件1 THEN result1
WHEN 条件2 THEN result2
...
ELSE default_result
END
repeat语句:
repeat语句可以实现有条件控制的循环语句
repeat
执行语句
until 停止条件
end repeat;
while语句:
while语句同样可以实现一个带条件判断的循环结构
while 循环条件(满足则循环) do
执行语句组
end while;
Begin…end语句:
begin…end语句的用途是将多条mysql语句包含起来,形成语句集合,常用于存储过程中。
begin
执行语句组
end;
Declare语句:
Declare语句用来声明存储过程中临时定义的局部变量、游标等。
Declare语句只能出现在begin…end语句的开头位置,且必须先于任何其它语句。
begin
declare var_name[,var_name] … type[ default value]
statement list
end;
Select…into语句:
Select…into语句是select语句的扩展,功能为将查询得到的结果保存在变量中。仅适用于查询结果为一行元组,查询结果为多行元组或0行元组都会出错。
select 列名1, 列名2, ...
into var_list
from 表名|视图名
where 条件表达式 ;