03. 运算符
一、算术运算符
??算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+)、减(-)、乘(*)、除(/)和取模(%)运算
运算符 | 名称 | 作用 |
---|---|---|
+ | 加法运算符 | 计算两个值或表达式的和 |
- | 减法运算符 | 计算两个值或表达式的差 |
* | 乘法运算符 | 计算两个值或表达式的乘积 |
/ 或 DIV | 除法运算符 | 计算两个值或表达式的商 |
% 或 MOD | 求模(求余)运算符 | 计算两个值或表达式的余数 |
- 在SQL中,+没有连接的作用,就表示加法运算。此时,会将字符串转化为数值(隐式转换)
- 如果转换成功,则继续做加法运算
- 如果转换失败,则将字符型数值转换为0
- 一个数除以整数后,不管结果是否能除尽,其结果都为一个浮点数
- 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留小数点后4位
- 在MySQL中,一个数除以0为NULL
- 取模运算结果的正负号与被模数的正负号一致
SELECT 100, 100+0, 100-0, 100+50, 100+50-30, 100+35.5, 100-35.5 FROM DUAL;
SELECT 100+'1' FROM DUAL;
SELECT 100+'a' FROM DUAL;
SELECT 100+NULL FROM DUAL;
SELECT 100, 100*1, 100*1.0, 100/1.0, 100/2, 100+2*5/2, 100/3, 100 DIV 0 FROM DUAL;
SELECT 12%3, 12%5, 12 MOD -5, -12%5, -12%-5 FROM DUAL;
二、比较运算符
??比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其它情况则返回NULL。
运算符 | 名称 | 作用 |
---|---|---|
= | 等于运算符 | 判断两个值、字符串或表达式是否相等 |
<=> | 安全等于运算符 | 安全的判断两个值、字符串或表达式是否相等 |
<> 或 != | 不等于运算符 | 判断两个值、字符串或表达式是否不相等 |
< | 小于运算符 | 判断前面的值、字符串或表达式是否小于后面的值、字符串或表达式 |
<= | 小于等于运算符 | 判断前面的值、字符串或表达式是否小于等于后面的值、字符串或表达式 |
> | 大于运算符 | 判断前面的值、字符串或表达式是否大于后面的值、字符串或表达式 |
>= | 大于等于运算符 | 判断前面的值、字符串或表达式是否大于等于后面的值、字符串或表达式 |
- 等于运算符(=)判断两个值、字符串或表达式是否相等,如果相等则返回1,不相等则返回0
- 在使用等号运算符时,遵循如下规则:
- 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中的ANSI编码是否相等
- 如果等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小
- 如果等号两边的值一个是整数、另一个是字符串,则MySQL会将字符串转换为数字进行比较
- 如果转换成功,则继续做比较
- 如果转换不成功,则将字符串看作0后,继续做比较
- 如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL
- 安全等于运算符(<=>)可以用来对NULL值进行判断
- 在两个操作数均为NULL时,其返回值为1
- 当一个操作数为NULL时,其返回值为0
-- <、<=、>、>=、=、<=>、!=、<>
SELECT 1=2, 1!=2, 1='1', 1='a', 0='a' FROM DUAL;
SELECT 'a'='a', 'ab'='ab', 'a'='b' FROM DUAL;
SELECT 1=NULL, NULL=NULL FROM DUAL;
SELECT 1<=>2, 1<=>'1', 1<=>'a', 0<=>'a' FROM DUAL;
SELECT 1<=>NULL, NULL<=>NULL FROM DUAL;
-- 查询employees表中commission_pct为null的数据有哪些
SELECT last_name,salary,commission_pct FROM employees WHERE commission_pct <=> NULL;
SELECT 3<>2, '4'<>NULL, ''!=NULL, NULL!=NULL FROM DUAL;
-- 查询employees表中commission_pct不为null的数据有哪些
SELECT last_name,salary,commission_pct FROM employees WHERE NOT commission_pct <=> NULL;
运算符 | 名称 | 作用 |
---|---|---|
IS NULL | 为空运算符 | 判断值、字符串或表达式是否为空 |
IS NOTNULL | 不为空运算符 | 判断值、字符串或表达式是否不为空 |
LEAST | 最小值运算符 | 在多个值中返回最小值 |
GREATEST | 最大值运算符 | 在多个值中返回最大值 |
BETWEEN AND | 两值之间的运算符 | 判断一个值是否在两个值之间 |
ISNULL | 为空运算符 | 判断一个值、字符串或表达式是否为空 |
IN | 属于运算符 | 判断一个值是否为列表中的任意一个值 |
NOT IN | 不属于运算符 | 判断一个值是否不是一个列表中的任意一个值 |
LIKE | 模糊匹配运算符 | 判断一个值是否符合模糊匹配规则 |
REGEXP | 正则表达式运算符 | 判断一个值是否符合正则表达式的规则 |
RLIKE | 正则表达式运算符 | 判断一个值是否符合正则表达式的规则 |
- 最小值运算符,当参数是整数或者浮点数时,LEAST将返回其中最小的值;当参数为字符串时,返回字母表中顺序最靠前的字符;当比较值列表中有NULL时,不能判断大小,返回值为NULL。
- 最大值运算符,当参数中是整数或者浮点数时,GREATEST将返回其中最大的值;当参数为字符串时,返回字母表中顺序最靠后的字符;当比较值列表中有NULL时,不能判断大小,返回值为NULL。
- BETWEEN 条件下界 AND 条件上界
- 查询条件下界和条件上界范围内的数据,包含边界
- like:模糊匹配,%代表不确定个数的字符,-代表一个字符
- REGEXP运算符用来匹配字符串,语法格式为: express REGEXP 匹配条件
- '^'匹配以该字符后面的字符开头的字符串
- '$'匹配以该字符前面的字符结尾的字符串
- '.'匹配任何一个单字节
- "[]"匹配方括号内的任何字符
- '*'匹配零个或多个在它前面的字符
-- IS NULL、ISNULL()、IS NOT NULL
-- 查询employees表中commission_pct为null的数据有哪些
SELECT last_name,salary,commission_pct FROM employees WHERE commission_pct IS NULL;
-- 查询employees表中commission_pct为null的数据有哪些
SELECT last_name,salary,commission_pct FROM employees WHERE ISNULL(commission_pct);
-- 查询employees表中commission_pct不为null的数据有哪些
SELECT last_name,salary,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
-- LEAST()、GREATEST()
SELECT LEAST('g','b','t','m'),GREATEST('g','b','t','m') FROM DUAL;
-- BETWEEN...AND
-- 查询工资在6000到8000的员工信息
SELECT employee_id,last_name,salary FROM employees WHERE salary BETWEEN 6000 AND 8000;
-- 交换6000和8000后查询不到数据
SELECT employee_id,last_name,salary FROM employees WHERE salary BETWEEN 8000 AND 6000;
-- IN、NOT IN
-- 查询部门为10、20、30部门的员工信息
SELECT last_name,salary,department_id FROM employees WHERE department_id IN (10,20,30);
-- 查询工资不是6000、7000、8000的员工信息
SELECT last_name,salary,department_id FROM employees WHERE salary NOT IN (6000,7000,8000);
-- LIKE:模糊查询
-- 查询last_name包含字符a的信息
-- %:代表不确定个数的字符(0个、1个、多个)
-- _:代表一个不确定的字符
SELECT last_name FROM employees WHERE last_name LIKE '%a%';
-- 查询last_name中以字符'a'开头的员工信息
SELECT last_name FROM employees WHERE last_name LIKE 'a%';
-- 查询第二个字符是'a'的员工信息
SELECT last_name FROM employees WHERE last_name LIKE '_a%';
-- 查询第二个字符是'_'且第三个字符是'a'的员工信息`employees`
SELECT last_name FROM employees WHERE last_name LIKE '_\_a%';
SELECT last_name FROM employees WHERE last_name LIKE '_$_a%' ESCAPE '$';
-- REGEXP、RLIKE:正则表达式
SELECT 'sakura' REGEXP '^s','sakura' RLIKE 'a$','sakura' RLIKE 'ak' FROM DUAL;
SELECT 'mikoto' REGEXP 'k.t','mikoto' RLIKE '[am]' FROM DUAL;
三、逻辑运算符
??逻辑运算符主要用来判断表达式的真假。
运算符 | 名称 | 作用 |
---|---|---|
NOT 或 ! | 逻辑非 | 当给定的值为0时返回1;当给定的值为非0值时返回0;当给定的值为NULL时,返回NULL。 |
AND 或 && | 逻辑与 | 当给定的所有值均为非0值,并且都不为NULL时,返回1;当给定的一个值或者多个值为0时则返回0;否则返回NULL。 |
OR 或 || | 逻辑或 | 当给定的值都不为NULL,并且任何一个值为非0值时,则返回1,否则返回0;当一个值为NULL,并且另一个值为非0值时,返回1,否则返回NULL;当两个值都为NULL时,返回NULL。 |
XOR | 逻辑异或 | 当给定的值中任意一个值为NULL时,则返回NULL;如果两个非NULL的值都是0或者都不等于0时,则返回0;如果一个值为0,另一个值不为0时,则返回1。 |
??OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OR中的操作数结合。
-- OR ||
SELECT last_name,salary,department_id
FROM employees
WHERE department_id = 10 OR department_id = 20;
-- AND &&
SELECT last_name,salary,department_id
FROM employees
WHERE department_id = 5 OR salary > 6000;
-- NOT ! XOR
SELECT last_name,salary,department_id
FROM employees
WHERE NOT salary BETWEEN 6000 AND 8000;
-- XOR
SELECT last_name,salary,department_id
FROM employees
WHERE department_id = 5 XOR salary > 6000;
四、位运算符
??位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。
运算符 | 名称 | 作用 |
---|---|---|
& | 按位与(位AND) | 将给定值对应的二进制数逐位进行逻辑与运算 |
| | 按位或(位OR) | 将给定的值对应的二进制数逐位进行逻辑或运算 |
^ | 按位异或(位XOR) | 将给定的值对应的二进制数逐位进行逻辑异或运算 |
~ | 按位取反 | 将给定的值的二进制数逐位进行取反操作 |
>> | 按位右移 | 将给定的值的二进制数的所有位右移指定的位数 |
<< | 按位左移 | 将给定的值的二进制数的所有位左移指定的位数 |
- >>,右移指定的位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐。
- <<,左移指定的位数后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐。
- 在一定范围内,每向左移动一位,相当于乘以2;每向右移动一位,相当于除以2;
-- & | ^ ~ << >>
SELECT 12&6, 12|5, 12^5 FROM DUAL;
SELECT 255&~10, 10<<1, 10>>1 FROM DUAL;
五、运算符的优先级
优先级 | 运算符 |
---|---|
1 | !=、=(赋值) |
2 | || 或 OR、XOR |
3 | && 或 AND |
4 | NOT |
5 | BETWEEN、CASE、WHEN、ELSE |
6 | =(比较运算符)、<=>、>=、>、<=、<、<> 或 !=、IS、LIKE、REGEXP、IN |
7 | | |
8 | & |
9 | <<、>> |
10 | +(加法)、- |
11 | *、/ 或 DIV 、% 或 MOD |
12 | ^ |
13 | -(负号)、~(按位取反) |
14 | ! |
15 | () |
??数字编号越大,优先级越高,优先级高的运算符先进行计算。
六、练习题
-- 1.选择工资不在5000到12000的员工的姓名和工资
SELECT last_name,salary FROM employees WHERE salary NOT BETWEEN 5000 AND 12000;
-- 2.选择在20或50号部门工作的员工姓名和部门号
SELECT last_name,department_id FROM employees WHERE department_id IN (20,50);
-- 3.选择公司中没有管理者的员工姓名及job_id
SELECT last_name,job_id FROM employees WHERE manager_id IS NULL;
-- 4.选择公司中有奖金的员工姓名,工资和奖金级别
SELECT last_name,salary,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
-- 5.选择员工姓名的第三个字母是a的员工姓名
SELECT last_name FROM employees WHERE last_name LIKE '__a%';
-- 6.选择姓名中有字母a和k的员工姓名
SELECT last_name FROM employees WHERE last_name LIKE '%a%' AND last_name LIKE '%k%';
-- 7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息
SELECT first_name FROM employees WHERE first_name LIKE '%e';
-- 8.显示出表 employees 部门编号在 80-100 之间的姓名、工种
SELECT last_name,job_id FROM employees WHERE department_id BETWEEN 80 AND 100;
-- 9.显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、管理者id
SELECT last_name,salary,manager_id FROM employees WHERE manager_id IN (100,101,110);