8.1 了解MySQL的语言结构
单元8 数据库编程
8.1 了解MYSQL的语言结构
MYSQL数据库在数据的存储、查询及更新是所使用的语言是遵循SQL标准的。但为了与其他数据库的语言进行区分,MYSQL的语言中使用了一些特殊的关键字。这些元素不是SQL标准所包含的内容,包含常量、变量、运算符、函数、和流程控制语句等。
8.1.1 常量
1.字符串常量
字符串常量是指使用单引号或双引号括起来的字符序列。如'hello'、'123'、'abc'等。每个汉字字符用2个字节存储,而每个ASCII字符用1个字节存储。
在字符串中不仅可以使用普通的字符,也可以使用特殊字符如换行符、单引号等。如果需要使用特殊字符,需要使用转义符。格式为每个特殊字符以一个反斜杠("")开始,指出后面的字符使用转义字符来解释,而不是普通的字符。
例 8.1
输出反斜杠("")、单引号("'"),双引号(""")、换行符("\n")和制表符("\t")。
SQL代码:SELECT '\\','\'','\"\"','\n','\t';
其中的反斜杠("\")表示输出一个反斜杠,单引号("'")表示输出一个单引号,双引号(""")表示输出一个双引号,换行符("\n")表示换行,制表符("\t")表示输出一个制表符。
2.数值常量
数值常量同城可以分为整数常量和浮点数常量。
整数常量是指没有小数部分的数字。如123、-456等。
浮点数常量是指有小数部分的数字。如123.45、-67.89等。
3.日期时间常量
日期时间常量有单引号江表示日期时间的字符串括起来构成。
日期型常量包含年、月、日、时、分、秒等,数据类型为data,表示为1999-12-31这样的值。
时间型常量包含时、分、秒等,数据类型为time,表示为12:34:33这样的值。
日期时间常量是指使用日期时间函数获取的日期时间值。数据类型为datatime和timestamp。
datatime和timestamp的区别在于:
datatime的年份在1000~9999之间,timestamp的年份在1970~2038之间。
timestamp的精度为秒,datatime的精度为微秒。
timestamp支持是去,即在不同时区转换为相应时间
需要注意MYSQL是按年-月-日-时-分-秒的顺序来存储日期时间的。中间的符号可以是"@"、"%"、""等特殊符号。
4.布尔常量
布尔常量是指TRUE和FALSE。TRUE的数字值为1,FALSE的数字值为0。
8.1.2 变量
变量是指在程序运行过程中其值可以改变的量。MYSQL中变量分为用户变量和系统变量。
用户变量是指在程序运行过程中其值可以改变的量。用户变量的作用范围是当前连接。
系统变量是指在程序运行过程中其值可以改变的量。系统变量的作用范围是服务器。
1.用户变量
用户可以再表达式中使用定义的变量,这样的变量就叫做用户变量。用户可以再用户变量中保存值,然后在以后引用他,这样就可以将值从一个语句传递到另一个语句。在使用时,用户变量必须定义和初始化。如果使用没有初始化的变量,其值为NULL。
用户变量与链接有关。一个客户端链接定义的变量,不能被其他客户端看到或使用。
当客户端退出时,客户端所创建的所有变量将会自动释放。
语法格式
SET @变量名=值,....;
例 8.2
设置用户变量name并赋值为枫月。
SQL代码:SET @name='枫月';name的数据是根据气候的赋值表达式自动分配的也就是说name的数据类型跟“枫月”的数据类型是一样的,字符集和校对规则也是一样的。如果说给name变量重新赋不同的值,则name的数据类型也会发生变化。
对于SET语句,可以使用“=”或“:=”作为分配福。分配给每个变得值可以为整数、浮点数、字符串、日期时间或布尔值。也可以用其他SQL语句代替SET语句来为用户变量分配一个值。在这种情况下,分配符必须为“:=”,而不能用“=”,应为在非SET语句中“=”被视为比较操作符。
例 8.3
分配符应用举例
SQL代码:SELECT @t2:=(@t2:=2)+5 as t2;(@t2:=2)先分配给变量t2初值2,然后+5,结果为7,最后赋值给变量t2。
2.系统变量
系统变量是MySql的一些特定设置。当MySq数据库服务器启动时,这些设置被读取出来决定下一步骤。例如,有些设置定义了数据如何被存储,有些设置则影响处理速度,还有些与日期相关,这些设置就是系统变量。和用户变量一样,系统变量也有一个值和一个数据类型,但不同的是,系统变量在MySql服务启动时就被引入并初始化为默认值
例 8.4
获取当前MySql版本号
SQL代码:SELECT @@VERSION在MySql中,系统变量VERSION的值设置为版本号。在变量名前必须加2个@符号才能正确返回该变量的值。
8.1.3 运算符与表达式
1.算数运算符
算术运算符再两个表达式上执行数学运算,这两个表达式可以使任何数值数据类型,算数运算符有+、-、、/、% 5种运算。
+、-、、/、% 5种运算的含义分别为:加、减、乘、除、求余。
+、-运算符还可用于对日期是时间值(如DATETIME)进行算数原酸,例如:
SELECT '2019-01-01 12:34:56' + INTERVAL 1 DAY;

INTERVAL关键字后面跟一个时间间隔,时间间隔可以是年、月、日、时、分、秒等。1 DAY表示在当前的日期基础上加上1天,当前日期为2019-01-01,加上1天后为2019-01-02。
2.比较运算符
比较运算符(关系运算符)用于比较两个表达式的大小,比较运算符有=、<>、!=、>、<、>=、<= 7种运算。
| 运算符 | 含义 | 运算符 | 含义 |
|---|---|---|---|
| = | 等于 | <>、!= | 不等于 |
| > | 大于 | >= | 大于等于 |
| < | 小于 | <= | 小于等于 |
| <=> | 相等或都等于空 |
3.逻辑运算符
逻辑运算符用于对某个条件进行测试,运算结果为TRUE,FALSE。
| 运算符 | 运算规则 | 运算符 | 运算规则 |
|---|---|---|---|
| NOT 或! | 逻辑非 | OR或! | 逻辑或 |
| AND或&& | 逻辑与 | XOR | 逻辑异或 |
XOR运算的规则是:
如果包含的值或表达式一个为真而另一个为假并且不是NULL,那么结果为真值,否则为假值。
例如:
SELECT (1=1) XOR (1=2),(1<2) XOR (9<10);

4.运算符优先级
当一个复杂的表达式有多个运算符时,运算符优先级绝对执行运算的先后次序。执行的顺序会影响所得到的运算结果,运算符优先级的顺序如下:
| 运算符 | 优先级 | 运算符 | 优先级 |
|---|---|---|---|
| +(正)、-(负) | 1 | NOT | 5 |
| *、/、% | 2 | AND | 6 |
| +(加)、-(减) | 3 | OR | 7 |
| =、>、<、>=、<=、<>、!=、!>、!< | 4 | =(赋值) | 8 |
5.表达式
表达式是由运算符和操作数组成的式子。操作数可以是常量、变量、函数、表达式等。
例如1+2+3,a=b+1。
表达式一般用在SELECT及SELECT语句的WHERE子句中。
8.1.4 系统内置函数
1.数学函数
数学函数是对数值数据进行处理的函数。
| 函数 | 含义 | 函数 | 含义 |
|---|---|---|---|
| GREATEST() | 返回一组数中的最大值 | LEAST() | 返回一组数中的最小值 |
| FLOOR() | 获得小于一个数的最大整数值 | CEILING() | 获得大于一个数的最小整数值 |
| ABS() | 返回一个数的绝对值 | SIGN() | 返回一个数的符号 |
| ROUND() | 返回四舍五入的整数值 | TRUNCATE() | 把一个数字截取为一个指定小数个数的数字,逗号后面的数字表示制定小数的位数 |
2.字符串函数
字符串函数是对字符串数据进行处理的函数。
| 函数 | 含义 | 函数 | 含义 |
|---|---|---|---|
| CONCAT() | 连接字符串 | UPPER() | 将字符串转换为大写 |
| LOWER() | 将字符串转换为小写 | LEFT() | 返回字符串左边的字符 |
| RIGHT() | 返回字符串右边的字符 | LENGTH() | 返回字符串的长度 |
| SUBSTRING() | 返回字符串的子串 | REPLACE() | 替换字符串 |
3.日期时间函数
日期时间函数是对日期时间数据进行处理的函数。
| 函数 | 含义 | 函数 | 含义 |
|---|---|---|---|
| CURDATE() | 返回当前日期 | CURTIME() | 返回当前时间 |
| NOW() | 返回当前日期和时间 | YEAR() | 返回日期的年份 |
| MONTH() | 返回日期的月份 | DAY() | 返回日期的天数 |
| HOUR() | 返回时间的小时 | MINUTE() | 返回时间的分钟 |
| SECOND() | 返回时间的秒 | DATE_FORMAT() | 格式化日期 |
4.加密函数
加密函数是对数据进行加密的函数。
| 函数 | 含义 | 函数 | 含义 |
|---|---|---|---|
| MD5() | 返回字符串的MD5值 | SHA1() | 返回字符串的SHA1值 |
| AES_ENCRYPT() | 使用AES算法加密字符串 | AES_DECRYPT() | 使用AES算法解密字符串 |
| ENCODE() | 使用Base64编码字符串 | DECODE() | 使用Base64解码字符串 |
| PASSWORD() | 返回字符串的加密值 | UNIX_TIMESTAMP() | 返回日期的UNIX时间戳 |
5.控制流函数
控制流函数是对程序流程进行控制的函数。
| 函数 | 含义 | 函数 | 含义 |
|---|---|---|---|
| IF() | 如果条件为真返回一个值,否则返回另一个值 | IFNULL() | 如果表达式为NULL返回一个值,否则返回表达式 |
| CASE WHEN THEN ELSE END | 根据条件返回一个值 | NULLIF() | 如果两个表达式相等返回NULL,否则返回第一个表达式 |
6.类型转换函数
类型转换函数是对数据类型进行转换的函数。
| 函数 | 含义 | 函数 | 含义 |
|---|---|---|---|
| CAST() | 将一个值转换为指定的数据类型 | CONVERT() | 将一个值转换为指定的数据类型 |
| BINARY() | 将一个字符串转换为二进制字符串 | HEX() | 将一个字符串转换为十六进制字符串 |
7.系统信息函数
系统信息函数是获取系统信息的函数。
| 函数 | 含义 | 函数 | 含义 |
|---|---|---|---|
| VERSION() | 返回当前MySQL服务器的版本号 | DATABASE() | 返回当前数据库的名称 |
| USER() | 返回当前用户的名称 | SYSTEM_USER() | 返回当前系统用户的名称 |
| SCHEMA() | 返回当前数据库的名称 | CHARSET() | 返回当前数据库的字符集 |
| GET_FORMAT() | 返回当前数据库的日期格式 | COLLATION() | 返回当前数据库的排序规则 |
| FOUND_ROWS() | 返回上一条SELECT语句影响的行数 | ROW_COUNT() | 返回上一条SELECT语句影响的行数 |
| MASTER_HOST() | 返回主服务器的主机名 | MASTER_PORT() | 返回主服务器的端口号 |
| IS_FREE_CONNECT() | 返回当前连接是否为空闲连接 | IS_FREE_CONNECT() | 返回当前连接是否为空闲连接 |


