目录
4.2.4、TRIM()、LTRIM()和RTRIM()函数
4.4.1、AES_ENCRYPT()和AES_DECRYPT()函数
1、常量
1.1、字符串常量
字符串是指用单引号或双引号括起来的字符序列。如'你好',每个汉字字符用2个字节存储,而每个ASCII字符用1个字节存储。
在字符串中不仅可以使用普通的字符,也可以使用特殊字符如换行符、单引号(“ ' ”)、反斜线(“ \ ”)等,但如果要使用特殊字符,需要使用转义符。每个特殊字符以一个反斜杠开始,指出后面的字符使用转义字符来解释,而不是普通字符。
1.2、数值常量
数值常量可以分为整数常量和浮点数常量。
整数常量即不带小数点的十进制数。
浮点数常量是使用小数点的数值常量。
1.3、日期时间常量
日期时间常量是由单引号将表示日期时间的字符串括起来构成。日期型常量包括年、月、日,数据类型为date,表示为1970-01-01这样的值。时间型常量包括小时数、分钟数、秒数及微秒数,数据类型为time,表示为12:30:52.01这样的值。MySQL还支持日期/时间的组合,数据类型为datetime或timestamp,如“1970-01-01 12:30”。datetime和timestamp的区别:datetime的年份在1000-9999之间,而timestamp的年份在1970-2037之间,还有就是timestamp在插入带微秒的日期时间时将忽略微秒。timestamp还支持时区,即在不同时区转换为相应时间。
1.4、布尔值
布尔值只包含两个可能的值:true和false。false的数字值是0,true的数字值是1。
2、变量
2.1、用户变量
用户可以在表达式中使用自己定义的变量,这样的变量叫做用户变量。用户可以先在用户变量中保存值,然后在以后引用它,这样可以将值从一个语句传递到另一个语句。在使用用户变量前必须定义和初始化。如果使用没有初始化的变量,其值为NULL。
用户变量与连接有关。也就是说,一个客户端定义的变量不能被其他客户端看到或使用。当客户端退出时,该客户端连接的所有变量将自动释放。
定义和初始化一个变量可以使用set语句。
语法格式:SET @用户变量=表达式
例:创建用户变量name并赋值为“张华”
SET @name='张华';
可以同时定义多个变量,中间用逗号隔开。
例:创建用户变量u1并赋值为1,u2赋值为2
SET @u1=1,@u2=2;
定义用户变量是变量值可以是一个表达式
例:创建用户变量u1,其值为u2的值加1
SET @u1=@u2+1;
在SELECT语句中,表达式发送到客户端后才进行计算。因此在HAVING、GROUP BY或ORDER BY子句中,不能使用包含SELECT列表中所设变量的表达式。
对于SET语句,可以使用“=”或“:=”作为分配符。分配给每个变量的值可以为整数、实数、字符串或NULL值,也可以用其他SQL语句代替SET语句来为用户变量分配一个值。在这种情况下,分配符必须为“:=”,而不能用“=”,因为在非SET语句中“=”被视为比较操作符。
2.2、系统变量
系统变量是MySQL的一些特定设置。当MySQL数据库服务器启动时,这些设置被读取出来决定下一步骤。例如,有些设置定义了数据如何被存储,有些设置则影响处理速度,还有些与日期有关,这些设置就是系统变量。和用户变量一样,系统变量也有一个值和一个数据类型,但不同的是,系统变量在MySQL服务器启动时就被引入并初始化为默认值。
例:获得现在使用的MySQL版本号
SELECT @@VERSION;
在MySQL中,系统变量VERSION的值设置为版本号。在变量名前必须加两个@符号才能正确返回该变量的值。
大多数的系统变量应用于其他SQL语句中时,必须在名称前加两个@符号,而为了与其他SQL产品保持一致,某些特定的系统变量是要省略这两个@符号的,如CURRENT_DATE(系统日期)、CURRENT_TIME(系统时间)、CURRENT_TIMESTAMP(系统日期和时间)和CURRENT_USER(SQL用户的名字)。
例:获取系统当前时间
SELECT CURRENT_TIME;
MySQL对于大多数系统变量都有默认值。当数据库服务器启动时,就使用这些值。也可以在C盘MYSQL文件夹下的my.ini选项文件中修改这些值。但数据库服务器启动时,该文件被自动读取。
使用SHOW VARIABLES语句可以得到系统变量清单。
例:显示系统变量清单
SHOW VARIABLES;
3、运算符与表达式
3.1、算术运算符
算术运算符在两个表达式上执行数学运算,这两个表达式可以是任何数值数据类型。算术运算符有+(加)、-(减)、*(乘)、/(除)和%(求模/取余)5种运算。
3.2、比较运算符
比较运算符(又叫关系运算符),用于比较两个表达式的值,其运算结果为逻辑值,可以为1(真)、0(假)和NULL(不能确定)中的一种。
比较运算符可以用于比较数字和字符串。数字作为浮点值比较,而字符串以不区分大小写的方式进行比较(除非用特殊的BINARY关键字)
注意:MySQL在运算过程中能够自动地把数字转换为字符串,而在比较运算过程中,MySQL能够自动地把字符串转换为数字。
3.3、逻辑运算符
逻辑运算符用于对某个条件进行测试,运算结果为true(1)或false(0)。
这些具体的运算符在博主以前发布的《MySQL之数据查询(WHERE)》一文中有写到,所以这里便不具体写出了。
3.4、运算符优先级
当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。执行的顺序会影响所得到的运算结果。在一个表达式中按先高(优先级数字小)后低(优先级数字大)的顺序进行运算。
优先级从小到大:
+(正)、-(负)1级
*(乘)、/(除)、%(模)2级
+(加)、-(减)3级
=,>,<,>=,<=,<>,!=,!>,!< 4级
NOT 5级
AND 6级
OR 7级
=(赋值) 8级
3.5、表达式
表达式就是常量、变量、列名、运算符和函数的组合。一个表达式通常可以得到一个值。与常量和变量一样,表达式的值也具有某种数据类型,可能的数据类型有字符类型、数值类型、日期时间类型,这样,根据表达式值的类型,表达式可分为字符型表达式、数值型表达式和日期表达式。
表达式按照形式还可分为单一表达式和复合表达式。单一表达式就是一个单一的值,如一个常量或列名。复合表达式是由运算符将多个单一表达式连接而成的表达式。
4、系统内置函数
4.1、数学函数
数学函数用于执行一些比较复杂的算术操作。MySQL支持很多数学函数。若发生错误,所有的数学函数都会返回NULL。
4.1.1、GREATEST()和LEAST()函数
功能为获得一组数中的最大值和最小值。
- # 例
- SELECT GREATEST(10,9,20,5),LEAST(1,2,3);
4.1.2、FLOOR()和CEILING()函数
FLOOR()用于获得小于一个数的最大整数值,CEILING()函数用于获得大于一个数的最小整数值。
4.1.3、ROUND()和TRUNCATE()函数
ROUND()函数用于获得一个数的四舍五入的整数值。
TRUNCATE()函数用于把一个数字截取为一个指定小数个数的数字,逗号后面的数字表示指定小数的位数。例:SELECT TRUNCATE(3.1415,2)
4.1.4、ABS()函数
ABS()用于获得一个数的绝对值
4.1.5、SIGN()函数
SIGN()函数返回数值的符号,返回的结果是正数(1)、负数(-1)或者零(0)
4.1.6、SQRT()函数
用于返回一个数的平方根
4.2、字符串函数
在字符串函数中,包含的字符串必须用单引号括起。MySQL提供了很多字符串函数。
4.2.1、ASCII()函数
ASCII(char)
返回的字符表达式最左端字符的ASCII值。参数char的类型为字符型的表达式,返回值为整型。例:SELECT ASCII('A'); 返回的便是字母A的ASCII码值
4.2.2、CHAR()函数
CHAR(X1,X2,X3)
将X1,X2,X3的ASCII码转换为字符并将结果组合成一个字符串。参数X1,X2,X3为介于0-255之间的整数,返回值为字符型。例:SELECT CHAR(65,66,67); 返回ASCII码值为65、66、67的字符,组成一个字符串。
4.2.3、LEFT()和RIGHT()函数
LEFT | RIGHT(str,x)
分别返回从字符串str左边和右边开始指定x个字符
例:返回Book表中书名最左边的3个字符
SELECT LEFT(书名,3) FROM Book;
4.2.4、TRIM()、LTRIM()和RTRIM()函数
TRIM | LTRIM | RTRIM(str)
使用LTRIM()和RTRIM()分别删除字符串中前面的空格和尾部的空格,返回值为字符串。参数str为字符型表达式,返回值类型为varchar。
TRIM()删除字符串首部和尾部的所有空格。
- # 例
- SELECT TRIM(' MySQL ');
-
- # 结果:返回MySQL5个字符
4.2.5、REPLACE()函数
REPLACE(str1,str2,str3)
REPLACE()函数的作用是用字符串str3替换str1中所有出现的字符串str2,返回替换后的字符串。
4.2.6、SUBSTRING()函数
SUBSTRING(expression,Start,Length)
返回expression中指定的部分数据。参数expression可为字符串、二进制串、text、image字段或表达式。Start、Length均为整型,前者指定子串的开始位置,后者指定子串的长度(需要返回的字节数)。如果expression是字段类型和二进制类型,则返回值类型与expression的类型相同。如果为text类型,返回的是varchar类型。
例:显示Members表中会员姓名,要求在一列中显示姓,在另一列中显示名。
- SELECT SUBSTRING(会员姓名,1,1)AS 姓,
- SUBSTRING(会员姓名,2,LENGTH(会员姓名)-1)AS 名
- FROM Members
- ORDER BY 会员姓名;
LENGTH函数的作用是返回一个字符串的长度。
4.3、日期和时间函数
4.3.1、NOW()函数
使用NOW()函数可以获得当前的日期和时间,它以YYYY-MM-DD HH:MM:SS的格式返回当前的日期和时间。例:SELECT NOW();
4.3.2、CURTIME()和CURDATE()函数
CURTIME()和CURDATE()函数比NOW()函数更为具体化,他们分别返回的是当前的时间和日期,没有参数。
4.3.3、YEAR(dstr)函数
YEAR(dstr)函数分析日期值dstr并返回其中关于年的部分。
例:SELECT YEAR(202208142132);
4.3.4、MOTNTH()和MONTHNAME()函数
MOTNTH()和MONTHNAME()函数分别以数值和字符串的格式返回参数中月的部分。
4.3.5、DAYNAME()函数
和MONTHNAME()相似,DAYNAME()以字符串形式返回星期名。
4.4、加密函数
4.4.1、AES_ENCRYPT()和AES_DECRYPT()函数
AES_ENCRYPT | AES_DECRYPT(str,key);
AES_ENCRYPT()函数返回的是密钥key对字符串str利用高级加密标准(AES)算法加密后的结果,结果是一个二进制的字符串,以BLOB类型存储。而AES_DECRYPT()函数用于对用高级加密方法加密的数据进行解密。若检测到无效数据或不正确的填充,函数会返回NULL。
4.4.2、ENCODE()和DECODE()函数
ENCODE | DECODE(str,key);
ENCODE()函数用来对字符串str进行加密,返回的结果是一个二进制字符串,以BLOB类型存储。DECODE()函数使用正确的密钥对加密后的结果进行解密。与AES_ENCRYPT()和AES_DECRYPT()函数相比,这两个函数加密程度相对较弱。
4.4.3、PASSWORD()函数
PASSWORD(str);
返回的字符串str加密后的密码字符串,适合于插入到MySQL的安全系统。该加密过程不可逆,和UNIX密码加密过程使用不同的算法,主要用于MySQL的认证系统。
例:SELECT PASSWORD('MySQL'); 返回MySQL的加密版本。
4.5、控制流函数
MySQL有部分函数是用来进行条件操作的。这些函数可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台。
和许多脚本语言提供的IF()函数一样,MySQL的IF()函数也可以建立一个简单的条件测试:IF(ex1,ex2,ex3)
该函数有3个参数,第1个是要被判断的表达式,如果表达式为真,IF()将会返回第2个参数。如果为假,IF()将会返回第3个参数。
例:SELECT IF(2*4>9-5,'是','否'); 先判断2*4是否大于9-5,是则返回'是',否则返回'否'。
4.6、类型转换函数
MySQL提供CAST()函数进行数据类型转换,它可以把一个值转换为指定的数据类型。
CAST(expr,AS type)
expr是CAST()函数要转换的值,type是转换后的数据类型。
在CAST()函数中MySQL支持以下数据类型:BINARY、CHAR、DATE、TIME、DATETIME、SIGNED和UNSIGNED类型。
通常情况下,当使用数值操作时,字符串会自动地转换为数字,因此下面例子中两种操作会得到相同的结果:SELECT 1+'99',1+CAST('99' AS SIGNED);
字符串可以指定为BINARY类型,这样他们的比较操作就对大小写敏感。使用CAST()函数指定一个字符串为BINARY何字符串前面使用BINARY关键词具有相同的作用。
例:SELECT 'a'=BINARY'A','a'=CAST('A'AS BINARY);
两个表达式的结果都为零表示两个表达式都为假,从此例可以看出字符串指定为BINARY类型后,对大小写是敏感的。