【MySQL】第三章 运算符
一,算术运算符
算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加 (+)、减(-)、乘(*)、除(/)和取模(%)运算(1) "+" 加法逻辑运算符
对于加法逻辑运算符的示例代码:
SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 * 30, 100 + 35.5, 100 - 35.5 FROM DUAL;
示例代码运行结果
当对于逻辑运算符+进行运算的时候,如果两边为整形的时候,计算出来的为整形,当由一个为浮点型的时候,计算出来的必为浮点型,可以观察下面多加的100 + 100.0
对于加法的特殊案例
SELECT 1 + '1', 1 + 'a', 1 + NULL FROM DUAL;
当1 + '1'的时候,sql会将字符串1隐式转换为整形1参与逻辑运算符的计算
当1 + ‘a’的时候,sql会将字符串a隐式转换为整型0参与逻辑运算符的计算(写成任何的字符串都是如此)
当1 + NULL的时候,依据sql的的规范,计算出来的为NULL(2) "*"和"%"逻辑运算符
SELECT 100, 100 * 1, 100 * 1.0, 100 / 1.0, 100 / 2, 100 + 2 * 5 / 2,100 / 3, 100 DIV 0 # 分母如果为0,则结果为null FROM DUAL;
示例代码运行结果
当进行乘法的时候,只要在进行乘法计算的时候,出现了浮点型的话,那么结果必为浮点型,当进行取模运算的时候,只要前面的数字为负数的话,取模的数字才可以为负数
二,比较运算符
比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回NULL比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录比较运算符的种类
示例代码
SELECT 1 = 1, 1 = 2, 1 != 2, 1 = '1', 1 = 'a', 0 = 'a' FROM DUAL;
= 和 != 的使用都很简单,这里需要注意的是,上面说过,当进行算术运算的时候,sql会将字符串1隐式转换为整形1,至此在这里也是一样的,当利用1去判断字符串1是否相等的时候,sql也会将其隐式转换,可以看到这里显示的是1,但是当与'a'进行逻辑判断的时候,这里显示了0,但是后面与0进行判断的时候,显示的为1,那么可以看出就是sql将'a'隐式转换了0特殊情况
#两边都是字符串的话,则按照ANSI的比较规则进行比较 SELECT 'a' = 'a','ab' = 'ab','a' = 'b' FROM DUAL;SELECT 1 = NULL,NULL = NULL # 只要有null参与判断,结果就为null FROM DUAL;
这里需要注意的是,当两边都是字符串的时候,sql会将两边的字符串都转换为ASCII值进行比较,当两边都是NULL的时候,这里判断的结果还是NULL,不是1,所以=运算符号不可以用来判断NULL,至此引出了安全等于<=>逻辑运算符
所以安全运算符<=>跟=的区别就是,可以用来判断NULL值
不等于也是很简单使用,剩下的都很简单,直接使用就ok这里就跳过了
三,关键字比较运算符
关键字比较运算符的分类
(1)IS NOT NULL \ IS NULL\ ISNULL
IS NOT NULL
SELECT last_name,salary,commission_pct FROM employees WHERE commission_pct IS NULL;
当commission_pct 为NULL的时候,然后就可以利用前面所学的WHERE来进行过滤一下数据,IS NULL就是可以过滤出这commission_pct为NULL的数据SELECT last_name,salary,commission_pct FROM employees WHERE ISNULL(commission_pct);
这个ISNULL就是一个函数,利用函数的使用方法就可以使用这个方法了
(2) LEAST和GREATEST
示例代码
SELECT LEAST('a','b','c'), GREATEST('a','b','c') FROM DUAL
这个就是比较其中的每一个字母的ASCII码值SELECT LEAST(first_name,last_name),LEAST(LENGTH(first_name),LENGTH(last_name)) FROM employees;
代码结果
这个第一个的作用是逐个比较每一个字符串的字母判断ASCII值,第二个是比较字符串的长度(3) BETWEEN A AND B
示例代码
#③ BETWEEN 条件下界1 AND 条件上界2 (查询条件1和条件2范围内的数据,包含边界) #查询工资在6000 到 8000的员工信息 SELECT employee_id,last_name,salary FROM employees #where salary between 6000 and 8000; WHERE salary >= 6000 && salary <= 8000;#交换6000 和 8000之后,查询不到数据 SELECT employee_id,last_name,salary FROM employees WHERE salary BETWEEN 8000 AND 6000;#查询工资不在6000 到 8000的员工信息 SELECT employee_id,last_name,salary FROM employees WHERE salary NOT BETWEEN 6000 AND 8000; #where salary < 6000 or salary > 8000;
这里只需要注意一下这个NOT的使用就好了,这个NOT就是用到这个BETWEEN的前面的,然后用到这个表的后面
(4) IN(A)和NOT IN(A)
这两个适用于其离散化查找,上面的BETWEEN A AND B是用来查找一个范围,这里是查找这个就是比如只找15这个值的对应的数据的,而不是一个范围
#④ in (set)\ not in (set)#练习:查询部门为10,20,30部门的员工信息 SELECT last_name,salary,department_id FROM employees #where department_id = 10 or department_id = 20 or department_id = 30; WHERE department_id IN (10,20,30);
(5) LIKE
这个是用在模糊查找里面的,就比如我要找一个人,但是当时就记得姓杨,但是叫啥忘记了,这个时候就可以用LIKE进行找出所有性杨的数据
#⑤ LIKE :模糊查询 # % : 代表不确定个数的字符 (0个,1个,或多个)#练习:查询last_name中包含字符'a'的员工信息 SELECT last_name FROM employees WHERE last_name LIKE '%a%';#练习:查询last_name中以字符'a'开头的员工信息 SELECT last_name FROM employees WHERE last_name LIKE 'a%';#练习:查询last_name中包含字符'a'且包含字符'e'的员工信息 #写法1: SELECT last_name FROM employees WHERE last_name LIKE '%a%' AND last_name LIKE '%e%'; #写法2: SELECT last_name FROM employees WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%';# _ :代表一个不确定的字符#练习:查询第3个字符是'a'的员工信息 SELECT last_name FROM employees WHERE last_name LIKE '__a%';#练习:查询第2个字符是_且第3个字符是'a'的员工信息 #需要使用转义字符: \ SELECT last_name FROM employees WHERE last_name LIKE '_\_a%';#或者 (了解) SELECT last_name FROM employees WHERE last_name LIKE '_$_a%' ESCAPE '$';
这里使用%来识别是哪里未知,然后可以结合AND的关键字来判断共同出现的a和b字符的数据,然后可以用下划线"_"来准确定位这个字母在第几个,然后如果是字符就是_的话,那么就会结合转义字符一起使用了
(6) 正则表达式
由于这个知识覆盖太广,这里列出一些常用的,剩下的用法可以在开发中学习
#⑥ REGEXP \ RLIKE :正则表达式SELECT 'shkstart' REGEXP '^shk', 'shkstart' REGEXP 't$', 'shkstart' REGEXP 'hk' FROM DUAL;SELECT 'atguigu' REGEXP 'gu.gu','atguigu' REGEXP '[ab]' FROM DUAL;
第一个代码的意思
就是判断首字母是否为shk开头,如果是就是标记为1,^这个是用来表示开头用的,然后$就是表示是否以t进行结尾,然后如就是单纯的一个字符串,那就判断这个里面是否包含这个字符串
第二个代码的意思
就是判断这个字符串是否包含gu[X]gu,这个字符串,中间的X可以为任意值,这里就用.来进行表示,然后后面的[ab]就是判断这个字符串是否包含a或者b
四,逻辑运算符
#3. 逻辑运算符: OR || AND && NOT ! XOR# or and SELECT last_name,salary,department_id FROM employees #where department_id = 10 or department_id = 20; #where department_id = 10 and department_id = 20; WHERE department_id = 50 AND salary > 6000;# not SELECT last_name,salary,department_id FROM employees #where salary not between 6000 and 8000; #where commission_pct is not null; WHERE NOT commission_pct <=> NULL;# XOR :追求的"异" SELECT last_name,salary,department_id FROM employees WHERE department_id = 50 XOR salary > 6000;#注意:AND的优先级高于OR#4. 位运算符: & | ^ ~ >> <<SELECT 12 & 5, 12 | 5,12 ^ 5 FROM DUAL;SELECT 10 & ~1 FROM DUAL;#在一定范围内满足:每向左移动1位,相当于乘以2;每向右移动一位,相当于除以2。 SELECT 4 << 1 , 8 >> 1 FROM DUAL;
这里的逻辑运算符都很简单,由于博主前面学习过了计组和C这里就不在阐述
五,总结