3.4 逻辑异或运算符
逻辑异或(XOR)运算符是当给定的值中任意一个值为NULL时,则返回NULL;如果两个非NULL的值都是0或者都不等于0时,则返回0;如果一个值为0,另一个值不为0时,则返回1。
XOR :追求的"异"
SELECT 1 XOR -1, 1 XOR 0, 0 XOR 0, 1 XOR NULL, # 1 XOR 1 为 0 # 0 XOR 1 为 1 1 XOR 1 XOR 1, # 0 XOR 0 为 0 # 0 XOR 0 为 0 0 XOR 0 XOR 0;
4 位运算符
位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。
MySQL支持的位运算符如下:
运算符 | 作用 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 |
>> | 按位右移 |
<< | 按位左移 |
4.1 按位与运算符
按位与(&)运算符将给定值对应的二进制数逐位进行逻辑与运算。当给定值对应的二进制位的数值都为1时,则该位返回1,否则返回0。
4.2 按位或运算符
按位或(|)运算符将给定的值对应的二进制数逐位进行逻辑或运算。当给定值对应的二进制位的数值有一个或两个为1时,则该位返回1,否则返回0。
4.3 按位异或运算符
按位异或(^)运算符将给定的值对应的二进制数逐位进行逻辑异或运算。当给定值对应的二进制位的数值不同时,则该位返回1,否则返回0。
4.4. 按位取反运算符
按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为0,将0变 为1。
4.5. 按位右移运算符
按位右移(>>)运算符将给定的值的二进制数的所有位右移指定的位数。右移指定的位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐。
4.6. 按位左移运算符
按位左移(<<)运算符将给定的值的二进制数的所有位左移指定的位数。左移指定的位数后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐。
在一定范围内满足:每向左移动1位,相当于乘以2;每向右移动一位,相当于除以2。
SELECT 12&5, 12|5, 12^5, ~(-2), 4<<1, 4>>1 FROM dual;
5 运算符的优先级
数字编号越大,优先级越高,优先级高的运算符先进行计算。可以看到,赋值运算符的优先级最低,使用“( )”括起来的表达式的优先级最高。
6 运算符练习
【题目】
# 1.选择工资不在5000到12000的员工的姓名和工资 # 2.选择在20或50号部门工作的员工姓名和部门号 # 3.选择公司中没有管理者的员工姓名及job_id # 4.选择公司中有奖金的员工姓名,工资和奖金级别 # 5.选择员工姓名的第三个字母是a的员工姓名 # 6.选择姓名中有字母a和k的员工姓名 # 7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息 # 8.显示出表 employees 部门编号在 80-100 之间的姓名、工种 # 9.显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、管理者id
【解答】
# 1.选择工资不在5000到12000的员工的姓名和工资 SELECT last_name, salary FROM employees WHERE salary NOT BETWEEN 5000 AND 12000; # 或者 SELECT last_name, salary FROM employees WHERE salary<5000 OR salary>12000;
# 2.选择在20或50号部门工作的员工姓名和部门号 SELECT last_name, department_id FROM employees WHERE department_id=20 OR department_id=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; # 或者 SELECT last_name, job_id FROM employees WHERE manager_id <=> 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%'; # 或者 SELECT last_name FROM employees WHERE last_name LIKE '%a%k%' OR last_name LIKE '%k%a%';
# 7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息 SELECT employee_id, first_name, last_name FROM employees WHERE first_name LIKE '%e'; # 或者 SELECT employee_id, first_name, last_name FROM employees WHERE first_name REGEXP '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);