学习内容:MySQL编程基础
1月30日
一、MySQL语言编程
MySQL编程语言按功能划分,可分为四类
1.数据定义语言(DDL)
最基础,用来执行数据库的任务,如创建、修改或删除数据库对象。这些数据库对象包括数据库、表、触发器、索引、视图、函数、类型以及用户等。
常见的数据定义语言有CREATE 语句、ALTER语句、DROP语句。
2.数据操作语言(DML)
用于操作数据库各种对象,检索和修改数据等。
常见的数据操作语言有SELECT语句、INSERT语句、UPDATE语句、DELETE语句。
3.数据控制语言(DCL)
用于安全管理,确定用户权限。默认情况下,只有sysadmin、dbcreator、db_owner等角色的用户成员才有权限执行数据控制语句。
常见的数据控制语言有:
- GRANT:授予权限,将语句权限或者对象权限授予其他用户或角色。
- REVOKE:删除权限。
- DENY:用于拒绝给当前数据库内的用户或角色授予权限,并防止用户或角色通过组或角色成员继承权限。
4.MySQL增加的语言元素
不是SQL标准所包含的内容,而是为了用户编程的方便增加的语言元素,如常量、变量、运算符等。
二、认识常量和变量
1.常量
-
字符串常量:
括在单引号内,包含字母和数字字符以及特殊字符,如!、@、#。
若单引号的字符串包含一个嵌入的引号,可以用两个单引号表示嵌入的单引号。 -
数值常量
包括整数和小数,不需要用单引号括上。 -
十六进制常量
默认类型为字符串。可以写成如 X’41’ 或 0x41。
若需将字符串作为数字处理,可以使用cast(ASUNSIGNED)函数来转换。若要将一个字符串或数字转换成十六进制格式的字符串,可以使用hex()函数来转换。 -
日期和时间常量
要用单引号括起来。在MySQL中,日期是按照年-月-日的顺序来表示的,中间的间隔符“-”也可以使用 “\” “@” “%”等特殊符号。 -
布尔值
TRUE,其数字值为1;FALSE,其数字值为0。 -
NULL值
常用来表示“没有值” “无数据”等意义,并且不同于数字类型的“0”或字符串类型的空字符串。
2.变量
分为用户变量和系统变量。
(1)用户变量
用户可自定义的变量,作用范围仅在程序内部。用DECLARE 关键字来定义变量。
语法格式:
DECLARE var_name[,···] type [DEFAULT value]
var_name:变量的名称,可同时定义多个变量。
type:指定变量类型。
DEFAULT value:为变量提供一个默认值,可以是常数或表达式。若未指定默认值,初始值为NULL。
变量赋值:SET语句 和 SELECT···INTO语句。
若要设置局部变量的值,可以用SET语句为变量赋值,语法格式:
SET var_name=expr [,varchar_name2=expr]···
SET:可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。@符号必须放在用户变量的前面,以便将它和列名区分开。
DECLARE v1,v2 int;
DECLARE v3 char(50);
Set @v1=66,@v2=88,@v3=’自定义变量’;
SELECT ···INTO语句:实现将SELECT选定的列值直接存储在对应位置的变量中。
SELECT clo_name[,···] INTO var_name[,···]
FROM table_name WHERE condition;
(2)系统变量
MySQL系统提供的内部使用的变量,无需用户定义,可直接使用,任何程序均可随时调用。引用时一般以标记符“@@”开头。
select @@version as 'MySQL版本';
--返回当前MySQL版本信息
三、常用运算符及优先级
1.算数运算符
+ ,-,*,/,%
2.比较运算符
= ,<=> 完全等于(可以比较NULL),
<> 不等于, <= , >= , < , >
IS NULL , IS NOT NULL
LEAST 在有两个或多个参数时,返回最小值
GREATEST 当有两个或多个参数时,返回最大值
BETWEEN AND 判断一个值是否落在两个值之间
IN 判断一个值是IN列表中的任意一值
NOT IN 判断一个值不是IN列表中的任意一值
LIKE 通配符匹配
REGEXP 正则表达式匹配
“=” 比较规则:
- 若一个或两个参数为NULL,则比较运算的结果为NULL。
- 若一个字符串和一个数字进行相等判断,则MySQL可以自动将字符串转换成数字。
“<=>"比较规则:
- 可以用来判断NULL值。若两个操作数均为NULL,则返回值为1;当其中一个操作数为NULL时,其返回值为0。
3.逻辑运算符
作用 | 运算符 |
---|---|
逻辑非 | NOT 或者 ! |
逻辑与 | AND 或者 && |
逻辑或 | OR 或者 || |
逻辑异或 | XOR |
(1)NOT 或者 !
操作数为0时,返回值为1;操作数为NULL时,返回值为NULL;否则返回值为0。
注意: “NOT 7+7” 与 “! 7+7” 结果不同,因为NOT与 “ !”的优先级不同。
“NOT 7+7” 先计算7+7,再进行逻辑非运算,最后返回值为0; “! 7+7” 先进行逻辑非运算“!7”结果为0,再加法运算,最后返回值为7。
(2)AND 或者 &&
当所有操作数均为非零值、并且不为NULL时,返回值为1;当一个或多个操作数为0时,返回值为0;其余返回值为NULL。
(3)OR 或者 ||
当两个操作数均为非NULL值,且其中一个操作数为非零值时,结果为1,否则结果为0;当有一个操作数为NULL,且另一个操作数为非零值时,则结果为1,否则结果为NULL;当两个操作数均为NULL,则所得结果为NULL。
(4)XOR
当任意一个操作数为NULL时,返回值为NULL;对于非NULL的操作数,如果两个都是非0或都为0,则返回值为0;如果一个为0,另一个为非0,返回值为1。
4.位运算符
运算符 | 作用 |
---|---|
| | 位或 |
& | 位与 |
^ | 位异或 |
<< | 位左移 |
>> | 位右移 |
~ | 位取反 |
四、流程控制语言
IF, CASE ,LOOP, LEAVE , ITERATE ,REPEAT ,WHILE 语句。
1.IF 语句
语法格式:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]···
[ELSE statement_list]
END IF
- search_condition:条件判断语句。
- statement_list:表示不同条件的执行语句,可以包含一条或多条语句。
2.CASE语句
语法格式:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]···
[ELSE statement_list]
END CASE
- case_value:表示条件判断的表达式
- when_value:表达式可能的取值。
另一种语法格式:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list]···
[ELSE statement_list]
END CASE
3.LOOP语句
LOOP语句本身并不进行条件判断,没有停止循环的语句,必须使用LEAVE语句才能跳出循环。
语法格式:
[begin_label:]LOOP
statement_list
END LOOP[end_label]
statement_list:表示需要循环执行的语句。
例如:
DECLARE aa int default 0;
add_sum:LOOP
SET aa=aa+1;
END LOOP add_sum;
--执行的是aa加1的操作,没有跳出循环语句,所以为死循环。
4.LEAVE语句
跳出任何被标注的流程控制语句。LEAVE label
DECLARE aa int default 0;
add_sum:LOOP
SET aa=aa+1;
IF aa>50 EHEN LEAVE add_sum;
END IF;
END LOOP add_sum;
5.ITERATE语句
ITERATE 语句也是用来跳出循环的语句。但ITERATE 只可以出现在LOOP、REPEAT 和WHILE 语句内。跳出本次循环,然后直接进入下一次循环。ITERATE label
CREATE PROCEDURE pp (a INT)
BEGIN
la:LOOP
SET a=a+1;
IF a<10 THEN ITERATE la;
END IF;
LEAVE la;
END LOOP la;
SET @x=a;
END
6.REPEAT 语句
带条件判断的循环过程。循环语句每次执行完都会对表达式进行判断,若表达式为真,则结束循环,否则再次重复执行循环中的语句。相当于do while
语法格式:
[begin_label:]REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
7.WHILE 语句
WHILE 在执行语句前,先对条件表达式进行判断,若为真,则执行循环内的语句。
语法格式:
[begin_label:]WHILE search_condition DO
statement_list
END WHILE [end_label]