单元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';

alt text
其中的反斜杠("\")表示输出一个反斜杠,单引号("'")表示输出一个单引号,双引号(""")表示输出一个双引号,换行符("\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。
alt text

2.系统变量

系统变量是MySql的一些特定设置。当MySq数据库服务器启动时,这些设置被读取出来决定下一步骤。例如,有些设置定义了数据如何被存储,有些设置则影响处理速度,还有些与日期相关,这些设置就是系统变量。和用户变量一样,系统变量也有一个值和一个数据类型,但不同的是,系统变量在MySql服务启动时就被引入并初始化为默认值

例 8.4

获取当前MySql版本号

SQL代码:

SELECT @@VERSION

在MySql中,系统变量VERSION的值设置为版本号。在变量名前必须加2个@符号才能正确返回该变量的值。
al text

8.1.3 运算符与表达式

1.算数运算符

算术运算符再两个表达式上执行数学运算,这两个表达式可以使任何数值数据类型,算数运算符有+、-、、/、% 5种运算。
+、-、
、/、% 5种运算的含义分别为:加、减、乘、除、求余。
+、-运算符还可用于对日期是时间值(如DATETIME)进行算数原酸,例如:

    SELECT '2019-01-01 12:34:56' + INTERVAL 1 DAY;

alt text

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);

alt text

4.运算符优先级

当一个复杂的表达式有多个运算符时,运算符优先级绝对执行运算的先后次序。执行的顺序会影响所得到的运算结果,运算符优先级的顺序如下:

运算符优先级运算符优先级
+(正)、-(负)1NOT5
*、/、%2AND6
+(加)、-(减)3OR7
=、>、<、>=、<=、<>、!=、!>、!<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()返回当前连接是否为空闲连接