[mysql]mysql的运算符
运算符
我们一般都会用到where,因为你们想,我们一个表里有几万条,上万条数据,如果你不加where,那么我们要呈现给用户那是非常恐怖的事情,我们一般都会加一点过滤条件,我们已经用上了大于,小于等于,这些运算符.除了这些运算符还有哪些更丰富的运算符呢,接下来我的文章就说一下算数运算符.
我们python,java和c语言大家如果有接触的话,就会知道里面有一个东西叫变量,接触了变量之后我们就会接触运算符,变量和变量之间的运算,算术运算符,加减乘除这种,比较运算符,大于小于等于,逻辑运算符设计或与非,位运算符左移右移与运算或运算,像python还有赋值运算符,三元运算符.有些语言在这些通用的情况下还有一些其他的场景.
如果大家学过其他编程语言,那应该入手就很快.
1算术运算符+ - */div%mod
其实这个难度不大,我们就直接说了
SELECT 100,100+0,100-0,100+50,100+50-30,100+35.5,100-35.5 FROM DUAL;
记得我们之前说过 DUAL代表的就是伪表
算数运算符主要是针对数值类型的计算,这里面的100和35.5的类型是不一样的是整型和浮点型,和我们小学学的整数和小数的意思是一样的.比较好理解,我们执行之后结果是先进行乘除和
我们大家可能会疑惑那我们如果用字符型的数字能不能计算呢.我们看看
在java的语言是变成11,在字符里其他语言是代表连接的含义,在sql中的+号是没有连接作用的,大家要记住这个点,他会把字符串装换为数值.存在一个隐式转换,如果计算的是非数值的字符串是不会考虑的.因为不是数值嘛,那么如果是null,我们之前说过,null加入运算的时候,结果为null
如果我们想要拼接的话,就得用函数concat(),我们之后再提,
我们如果浮点型加入计算,结果也是浮点型,如果是除法结果全部都是小数,如果是java语言那么结果就是整数,会把小数去掉,mysql就会默认除不尽的情况,div代表的就是除法,这个结果不会报错,如果分母为0结果就是NULL,这个大家要记一下.
运算符也是可以在SELECT语句中对字段进行使用
mod和%也就是取余的运用:
选择执行之后,我们会发现,结果的符号和我们的被模数的一致的,和模的数无关.
联系一下,我们查询员工id为偶数的员工信息.那么我们就让员工id对2取余,这时在条件筛选出结果为0的值就可以了.
SELECT employee_id,last_name,salaty FROM employees WHERE employee_id%2=0
我们就可以把偶数的id取出来..
2比较运算符
比较运算符,代表的就是左边的操作数和右边的操作数进行比较,比较的结果会返回3个,一定要记得,如果结果为家返回0如果结果为真返回1,如果其他情况就返回null.
=等于,<=>安全等于,<>不等于,!=不等于,<,>,<=,>=
我们来使用一下
前两个很明显,是真的就是1,不是真的就是0,加入字符串的运算我们要记得,字符串存在隐式转换如果是数字那就回变成数值型的对应数字,如果是其他,那么结果就是0
那我们就疑惑了,是不是所有情况都会进行隐式装换呢,我们来看看下面的案例,我们发现如果是纯粹的字符串比较,那么就不会进行比较,会直接对比ANSI的编码是否相同,就是比较规则.
还有就是null的情况,那么只要null参与判断,结果就为null.
SELECT last_name,salary
FROM employees
WHERE commission_pct =NULL
这样会出现我们commission里面null的记录吗,我们运行一下
结果一个都没有,为什么呢,因为我们WHERE指针有循环,会一个一个查找情况,如果结果是1的话就显示,其他两种0和null的情况都不要,那么我们就会发现NULL加入的运算就会导致我们的每次运算的空的导致最后的结果一条都没有,
大家理解一下这个带你,执行之后是不会有任何的结果
那么这种情况我们就出现了一个特殊的比较运算符
<=>安全等于:这个比较运算符和=的唯一区别就是,它会识别null:
我们可以发现,正常情况都是一样的,下面这个情况,我们如果用的是=那么结果就应该全是null,现在的结果就是0和1了,说明NULL也加入了运算.
安全等于的记忆技巧:为NULL而生.
如果我们把刚才的代码使用安全等于运行一下,是不是就可以了,因为这个时候,如果null安全等于null那么结果就是1.
大家可能会疑惑其他的符号null参与是不是真的结果是null,大家可以自己去试一试.
其他我们就不细说了.大体是比较简单的
还有一些在具体场景出现的时候我们为了便利而使用的比较运算符
我们继续进行比较运算符的第二波
IS NULL\IS NOT NULL\ISNULL
IS NULL这个其实我们我们刚才使用安全等于NULL的情况
IS NOT NULL
我们发现是不是结果代表的情况就出来了.
还一个这样写的ISNULL,这个其实是一个函数,它的使用方法是这样的
其实开发中会写一种就行,不用炫耀技巧.
对了大家可能会疑惑那普通=可以加!变成不等于,安全等于可以加!变成不安全等于吗,口误安全不等于.
直接加!是不行的,在前面直接加NOT也是不行的,要在WHERE的后面加NOT才可以
在这边呢我是建议大家,如果想查询字段是不是空,那就用is null,是不是不为空就用 is not null;如果涉及到具体的数值,那就使用<=>
第二波:LEAST()\GREATEST()
我们来说一下涉及最小和最大的事情
SELECT LEAST('a','b','e','z'),GREATEST('a','b','e','z')
FROM DUAL
我们来看看字符的比较规则,这里面a就是最小的,z就是最大的.
我们来一下业务的情况,我们希望知道姓和名那个的首字母是最小的和最大的.
SELECT LEAST(first_name,last_name),GREATEST(first_name,last_name)
FROM employees
注意这里比较的是他们两个字段哪一个字段的首字符在ANSI里的大小,而不是长度,如果我们想要对比长度,就需要使用单行函数LENGTH
SELECT LEAST(first_name,last_name),GREATEST(first_name,last_name),GREATEST(LENGTH(first_name),LENGTH(last_name))
FROM employees
大家可能就纳闷了,这不是长度吗,没有名字,那我们就得到流程控制的时候在说了,在谁比谁小,谁比谁大的时候再用.
第三波BETWEEN..AND
我们要查询工资在6000到8000的区间的时候,我们就要使用这个了
SELECT employee_id,salary
FROM employees
WHERE salary BETWEEN 6000 AND 8000;
那么这里有一个问题,6000和8000包括吗,我们从结果去找,6000有8000也有,所以BETWEEN 条件1 and 条件2 .条件1和条件2是包括的.
如果我们用的是普通的比较运算符,那么应该怎么写呢,我们就要用到逻辑运算符,和AND,是&&
SELECT employee_id,salary
FROM employees
WHERE salary >= 6000 AND salary <= 8000;和上面的betwenn是等价的.
可以看到结果都是一样的,那么我们会好奇,条件1和条件2可以互换吗
SELECT employee_id,salary
FROM employees
WHERE salary BETWEEN 8000 AND 6000;
显然不行,所以前面的条件是下界限,后面是条件是上限.这个要注意,
那么我们想要不在6000到8000范围内的函数怎么办呢.我们就可以用逻辑运算符好理解,这个时候是不是就要用或了,or
SELECT employee_id,salary
FROM employees
WHERE salary < 6000 OR salary > 8000;
SELECT employee_id,salary
FROM employees
WHERE NOT salary BETWEEN 6000 AND 8000;
那么我们就把逻辑运算符也顺便说了or是不是就是或,and(&&)就是与,not就是非
然后就是IN和NOT IN:
刚才是在一个范围查找,而in是在一个离散值里面查找,我们想查找10,20,30的员工信息
那么我们可以用or来吗,不够是或还是且,前后的条件都必须是完整的
SELECT employee_id,last_name,department_id
FROM employees
WHERE department_id=10 OR department_id=20 OR department_id =30;
我们再来
SELECT employee_id,last_name,department_id
FROM employees
WHERE department_id IN (10,20,30);
那么我们的效果是一样的,但是IN和NOT In的效率比较高
那么这里就过了
LIKE
是我们的模糊查询,比如我们想查询字符串里面包含a的员工信息,模糊查询,就是只要有小a就行.,我们如果直接用='a'那就变成精确查询了,这样就不行.我们要直接用like可以吗 like 'a'这样是不行的,和=一样的效果,我们要使用%,也就是使用like '%a%',这里百分号代表的含义就是任何长度的字符42.13,
%代表的是不确定个数的字符(0个1个或者多个)
SELECT last_name FROM employees WHERE last_name LIKE '%a%'
这个查询代表的含义就是名字里带有a的,那我们再思考
SELECT last_name FROM employees WHERE last_name LIKE 'a%';如果把前面的百分号去掉呢
那么它的结果就是首字母为a的值.
如果把百分号都去了,那就是查询last_name中为a的字符
那我们现在想查询last_name中包含字符a也包含字符e的员工信息.
那么就要用到逻辑关系词且了
写法1:
SELECT last_name FROM employees WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';
那么既然有写法1,就有写法2,写法2的思考方法不同,我们能不能直接在%a%e%,这里是不是不行,因为只包含a在前面的情况,然后我们要用or加上e在前面的情况
_,代表一个不确定的字符
我们现在有新的要求,第二个字符是a的情况.那么我们现在的情况就不够我们用了,我们得引入一个新的字符_,那这个要求我们就可以解决了
SELECT last_name FROM employees WHERE last_name LIKE '_a%';这就代表了第2个的字符是a.记住千万不要在_和%这种字符之间加空格那就是画蛇添足,会导致代表的含义变化
比如SELECT last_name FROM employees WHERE last_name LIKE '_ _a%'这个代表的含义就是第4个字符是a第二个字符是空格的情况了
那么我们现在有一个新的要求:我要名字里面有下划线的情况怎么办,我现在要查询名字里第2个字符是下划线,第三个字符是a的情况.
我们运行一下看看
比如SELECT last_name FROM employees WHERE last_name LIKE '__a%'.如果我们学过其他语言,那么我们就要使用转义符,使用的是\,
比如SELECT last_name FROM employees WHERE last_name LIKE '_\_a%'.
这里扩展一下,如果我们希望其他字符能代替转义符的作用怎么办呢,那么我们就要用ESCAPE函数
SELECT last_name FROM employees WHERE last_name LIKE '_&_a%' ESCAPE '&'那么这里的&也代表转义符,我们一般使用\就可以了,其他编程语言使用的也是这个符号.
第四波:正则表达REGEX\RLIKE
我们前面只是第几个字符包含啥,如果我们需要很具体的查询要求,正则的细节我们就不说清楚,这里只做一个介绍.
^代表的就是以该字符开头,$代表的是以该字符结尾,这里有一个技巧,小荷才露尖尖角,然后仍一个美元硬币是一定会沉底.头和尾就有了.头是^尾是$'.'点代表的就是任意一个单字符[abc]方框代表的就是匹配里面的任意字母,[0-9]代表任意数字[a-z]代表任意字母.,,*是匹配0个或者多个在它前面的字符.比如a*代表的就是匹配多个或一个a字符.
里面还有很丰富的规则,这里就不过多赘述,大家可以在使用时候在回来看.
我们举个例子
要从shkstart里找到以t结尾s开头包含hk的
SELECT 'shkstart' REGEXP '^s','shkstart' REGEXP 't$','shkstart' REGEXP 'hk';
是不是都能匹配上
SELECT 'shkstart' REGEXP 'sh.st';
这里的.代表的就是任意字符
这里[ab]代表的就是是否包含a,b,如果我们工作的时候需要再进行网络查询.这里就不再展开了.