运算符的优先级
- 运算的优先级决定了不同的运算符在表达式中计算的先后顺序。
- 级别高的运算符先进行计算,如果级别相同,MySQL按表达式的顺序从左到右依次计算。当然,在无法确定优先级的情况下,可以使用圆括号“()”来改变优先级。
MySQL支持大多数通用的、允许我们执行计算的的算数运算符。
“+(加法)、-(减法)、*(乘法)、/(除法,返回商)、%(除法,返回余数)”,如下例:
select 1+2;//加法运算,结果为3 select 2-1;//减法运算,结果为1 select 3*2;//乘法运算,结果为6 select 6/2;//除法运算,结果为3 select 25%7;//除法运算,结果为4 select 5/0;//除法运算,结果为null,MySQL除法的除数为0是不允许的
请注意,所有涉及整数的数学运算都是用64位的精度进行计算。
用字符串表示的数字在任何可能便于计算的地方都被自动的转换为字符串。
遵循两个转换原则:
1:如果第一位是数字的字符串被用于算数运算中,那么它被转换为这个数字的值
2:如果一个包含字符和数字混合的字符串不能被正确的转换为数字,将被转换成0
select '100'+'004';//结果为104 select '90AA'+'0';//结果为90 select '10x'*'qwe';//结果0
另外mysql 中没有乘法的函数,可以用以下方法实现
//利用log a+log b =log a*b来实现 select exp(sum(log(10)+log(10)))
比较运算符,允许我们对表达式的左边和右边进行比较,一个比较运算的结果总是1(真),0(假)或为null(不确定)。
select 6=6,3.4=4.5,'a'='b';//判断两边是否相等 select 7<>7,7<>8,'a'<>'b';//判断两边是否不相等 select 100>100,10<100;//判断左边是否大于右边,左边是否小于右边 select 10>=100,10<=1;//判断左边是否大于等于右边,左边是否小于等于右边 select 10 between 0 and 100;//检验一个值是否存在于一个指定的范围内 select 10 not between 11 and 100;//检验一个值是否不存在于一个指定的范围内 select 7 in (1,2,3,4,5,6,7,8,9);//检验一个值是否包含在一个指定的值集合中 select 7 not in (1,2,3,4,5,6,7,8,9);//检验一个值是否不包含在一个指定的值集合中
默认情况下,比较是不区分大小写的。我们可以用binary关键字来执行区分大小写的运算
select binary 'ross' in ('Chandler','Joey','Ross');
逻辑运算符可以测试1个或者多个表达式(或表达式集合)的逻辑有效性。含有这些运算符的运算结果总是1(真),0(假)或null(不能确定)
逻辑运算符中最简单的运算符是not运算符,它对跟在它后面的逻辑测试判断取反,把真变为假,把假变为真
select not 1,not 0,not (2=2),not (100>20);//结果为0,1,0,1
and 运算符可以测试两个或更多的值(或表达式求值)的有效性,如果它的所有成分为真并且不是null,它返回真值,否则返回假值
select (2=2) and (900<100),('a'='a') and ('c'<'d');//结果为0,1
or 运算符,如果包含的值或者表达式值为真并且不是null,它返回真值,否则返回假值。
select (2=2) or (900<100),('a'='a') or ('c'<'d');//结果为1,1
MySQL4.x和更高版本中还包括了一个附加的xor运算符,如果它的参数中的一个(不是两个)为真,它返回真值。
select (1=1) xor (2=4),(1<2) xor (9<10);//返回结果为1,0
MySQL包含了6个专门用于位操作的运算符
“|“运算符用于执行一个位or操作,而&用于执行一个位and操作。
select 16|32,9|4;//结果为48,13 select 30 & 10,8 & 16;//结果10,0
还可以分别使用<<和>>运算符向左和向右移动位。
select 1<<7,64>>1;//结果为128,32
^运算符执行位xor操作
select 1^0,0^1,17^9,143^66;//结果为1,1,24,205
~运算符执行位取反操作,并返回64位整型结果
select ~18446744073709551614,~1;//结果为1,18446744073709551614
运算符的优先级
由于MySQL包含了一系列的算术操作,所以关系型数据库管理系统支持很多数学函数
ABS(x);//返回x的绝对值 ACOS(x);//返回x(弧度)的反余弦值 ASIN(x);//返回x(弧度)的反正弦值 ATAN(x);//返回x(弧度)的反正切值 CEILING(x);//返回大于x的最小整数值 COS(x);//返回x(弧度)的余弦值 COT(x);//返回x(弧度)的余切 DEGREES(x);//返回弧度值x转化为角度的结果 EXP(x);//返回值e(自然对数的底)的x次方 FLOOR(x);//返回小于x的最大整数值 GREATEST(x1,x2,x3...);//返回集合中最大的值 LEAST(x1,x2,x3,,,);//返回集合中最小的值 LN(x);//返回x的自然对数 LOG(x,y);//返回x的以y为底的对数 MOD(x,y);//返回x/y的模(余数) PI();//返回pi的值(圆周率) POW(x,y)或者POWER(x,y);//返回x的y次幂 RAND();//返回0到1内的随机数 RADIANS(x);//返回角度x转化为弧度的结果 ROUND(x,y);//返回参数x的四舍五入的有y位小数的值 SIGN(x);//返回代表数字x的符号的值 SQRT(x);//返回x的开方 SIN(x);//返回x(弧度)的正弦值 TAN(x);返回x(弧度)的正切值 TRUNCATE(x,y);//返回数字x截短为y位小数的结果
看下面一些例子
select ABS(-123);//取绝对值,结果为123 select GREATEST(100,88,33,156);//获取一组数中最大值,结果为156
MySQL有一组函数是特意为求和或者对表中的数据进行集中概括而设计的,这些函数经常用在包含group by从句的select查询中,当然,它们也可以用于无group的查询
AVG(col);//返回指定列的平均值 COUNT(col);//返回指定列中非null值的个数 MIN(col);//返回指定列的最小值 MAX(col);//返回指定列的最大值 SUM(col);//返回指定列的所有值之和 STD(col)或STDDEV(col);//返回指定列的所有值的标准偏差 VARIANCE(col);//返回指定列的所有值的标准方差 GROUP_CONCAT(col);//返回由属于一组的列值连接组合而成的结果
这一组函数中,最常用到的是COUNT()函数,计算出结果集中至少包含一个非null的值的行数
select count(*) from members;
MIN()和MAX()函数返回数字集的最小或最大值
select min(quantity) from inventory;//返回最小值 select max(return) from investments;返回最大值
因为MySQL数据库不仅报含数字数据,还包含字符串,因此MySQL有一套为字符串操作而设计的函数。
通过length()函数可以获得一个字符串的长度
select length('aasdfgh');//结果为7
通过trim()函数可以让我们在剪切值时指定去除格式,还可以决定是从字符串的首部,尾部,两边剪切。
select trim(' red alter ');//去掉两边空格 select trim(leading '!' from '!!!error!!!');//去掉首部“!”符号
concat()函数将提供的参数连接成一个字符串
select concat('red','hot');//结果为redhot
这里只是简单列出几个常用的字符串函数,更多函数,请查询MySQL相关文档。
MySQL提供了很多处理日期时间的函数,这里我们只是选择一些常用的讲述。
使用now()函数获取当前的日期和时间,将以YYYY-MM-DD HH:MM:SS的格式返回当前的日期和时间
select now();//返回当前时间
单独获取日期和时间,可以使用curdate()和curtime()函数
select curtime();//当前时间,格式为 HH:MM:SS select curdate();//当前日期,格式为 YYYY-MM-DD
week()函数返回指定的日期是一年的第几个星期,而yearweek()函数返回指定的日期是哪一年的哪一个星期
select week('2004-03-01');//结果为9 select yearweek(20040301);//结果为200409
更多日期时间函数,请参考MySQL官方文档
MySQL特意设计了一些函数对数据进行加密。
AES_ENCRYPT(str,key);//返回使用密钥key对字符串str利用高级加密标准算法加密后的结果 AES_DECRYPT(str,key); //返回使用密钥key对字符串str利用高级加密标准算法解密后的结果 DECODE(str,key);//使用key作为密钥解密加密字符串str ENCRYPT(str,salt);//使用UNIX crypt()函数,用关键词salt加密字符串str ENCODE(str,key);//使用key作为密钥加密字符串str MD5();//计算字符串str的MD5校验和 PASSWORD(str);//返回字符串str的加密版本 SHA();//计算字符串str的安全散列算法(SHA)校验和
password()函数用来创建一个经过加密的密码字符串,它适合于插入到MySQL的安全系统。这个加密过程是不可以逆转的, 和UNIX密码加密使用不同的算法
如果愿意的话,可以通过ENCRYPT()函数使用UNIX crypt()系统加密字符串,ENCRYPT()函数接收要加密的字符串 和(可选的)用于加密过程的salt(一个可以唯一确定口令的字符串,就像钥匙一样)。
还可以使用ENCODE()函数和DECODE()函数来加密和解密字符串,ENCODE()有两个参数:被加密的字符串和作为加密基础的密钥:
insert into users values('','john',ENCODE('asdfasdf','secret_key')); select * from users; select id,uname,DECODE(upass,'secret_key') from users;
MySQL提供了4个函数是用来进行条件操作的。这些函数实现了sql的条件逻辑,允许开发者将一些应用程序业务逻辑转换到 数据库后台。
//如果testN为真,则返回resultN,否则返回default case where[test1] then[result1] ... else[defalut] end; //如果test和valN为真,则返回resultN,否则返回default case[test] where[val1] then[result1]...else[default] end; //如果test为真,返回t,否则返回f if(test,t,f); //如果arg1不是空,返回arg1,否则返回arg2 ifnull(arg1,arg2); //如果arg1=arg2返回null,否则返回arg1 nullif(arg1,arg2);
这些函数的第一个是ifnull()函数,它有两个参数,并且对第一个参数进行判断。如果第二个参数不是null, 函数就会向调用者返回第一个参数,如果是null,返回第二个参数。
select ifnull(1,2),ifnull(null,10),ifnull(4*null,'false');//结果为1,10,false
nullif()函数将会检验提供的两个参数是否相等,如果相等,则返回null,不相等,返回第一个参数。
if()函数有三个参数,第一个是要被判断的表达式,如果表达式为真,if()函数会返回第二个参数,为假,返回第三个参数。 if()函数在只有两种结果时才适合使用
MySQL还有一些函数是特意为格式化数据设计的
date_format(date,fmt);//依照字符串fmt格式化日期date的值 format(x,y);//把x格式化为以逗号隔开的数字序列,y是结果的小数位数 inet_aton(ip);//返回ip地址的数字表示 inet_ntoa(num);//返回数字所代表的ip地址 time_format(time,fmt);//依照字符串fmt格式化时间time值
其中最简单的是format()函数,它可以把大的数值格式化为以逗号间隔的易读的序列。format()的第一个参数是被 格式化的数据,第二个参数是结果的小数位数
select format(999999999868595049,2),format(-4512,6);//结果为999,999,999,82;-4.512.000000
更多用法,请查阅相关文档
为了进行数据类型转换,MySQL提供了cast()函数,它可以把一个值转化为指定的数据类型
通常情况下,当使用数值操作时,字符串会自动的转化为数字
select 1+'99';//结果为100 select 1+cast('99' as signed);//结果为100
我们可以强制许多日期和时间函数[包括now(),curtime()和curdate()函数],把它们返回的值作为一个数而不是字符串输出 ,只需要在数字的环境中使用这些函数或者把它们转化为数字
select cast(now() as signed integer),curdate()+0;
MySQL4.1支持以下几种类型:binary,char,date,time,datetime,signed,unsigned
MySQL还具有一些特殊的函数用来获得系统本身的信息
database();//返回当前数据库名称 benchmark(count,expr);//将表达式expr重复运行count次 connection_id();//返回当前客户的连接id found_rows();//将最后一个select查询(没有以limit进行限制结果)返回的记录行数返回 get_lock(str,dur);//获取一个由字符串str命名的并且有dur秒延时的锁定 is_free_lock(str);//检查以str命名的锁定是否释放 last_insert_id();//返回由该系统自动产生的最后一个auto increment id的值 master_pos_wait(log,pos,dur);//锁定主服务器dur秒直到从服务器与主服务器的日志log指定的位置pos同步 release_lock(str);//释放由字符串str命名的锁定 user()/system_user();//返回当前登录用户名 version();//返回MySQL服务器的版本
database(),user()和version()函数分别可以返回当前所选数据库,当前用户和MySQL版本的信息:
select database(),version(),user();
本文:Mysql:常见的运算符及使用, mysql运算符, mysql加法,mysql减法,mysql乘法,mysql除法, mysql数学函数