Bootstrap

Mysql —— 1、运算符

目录

1、算数运算符

1.1、加法与减法运算符 

1.3、取模

2、比较运算符

2.1、等号运算符

2.2、安全等于 

2.3、不等于运算符

2.3.1、REGEXP运算符

 3、逻辑运算符

4、位运算符

4.1、按位与运算符 

4.2、按位或运算符

4.3、按位异或运算符

 4.4、按位取反运算符

4.5、按位右移运算符

4.6、按位左移运算符

5、运算符优先级


1、算数运算符

算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加 (+)、减(-)、乘(*)、除(/)和取模(% )运算。

 

1.1、加法与减法运算符 

SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5 FROM DUAL;

SELECT 100 + '1' FROM DUAL; #结果是101
SELECT 100 + 'a' FROM DUAL; #结果是100
SELECT 100 + NULL; #结果是NULL
结论:
- 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;
- 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;
- 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;
- 在 Java 中, + 的左右两边如果有字符串,那么表示字符串的拼接。但是在 MySQL +只表示数 值相加。如果遇到非数值类型,先尝试转成数    值,如果转失败,就按0计算。(补充: MySQL 中字符串拼接要使用字符串函数CONCAT() 实现)

1.2、乘法与除法运算符

SELECT 100, 100 * 1, 100 * 1.0, 100 / 1.0, 100 / 2,100 + 2 * 5 / 2,100 /3, 100 DIV 0 FROM dual;

#计算出员工的年基本工资 
SELECT employee_id,salary,salary * 12 annual_sal FROM employees;

结论:

- 一个数乘以整数 1 和除以整数 1 后仍得原数;
- 一个数乘以浮点数 1 和除以浮点数 1 后变成浮点数,数值与原数相等;
- 一个数除以整数后,不管是否能除尽,结果都为一个浮点数;
- 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后 4 位;
- 乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。
- 在数学运算中, 0 不能用作除数,在 MySQL 中,一个数除以 0 NULL

1.3、取模

SELECT 12 % 3, 12 MOD 5, -12 % 3, -12 MOD 5 FROM DUAL;

#筛选出employee_id是偶数的员工 
SELECT * FROM employees WHERE employee_id MOD 2 = 0;

2、比较运算符

- 比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回 1 ,比较的结果,为假则返回0 ,其他情况则返回 NULL
- 比较运算符经常被用来作为 SELECT 查询语句的条件来使用,返回符合条件的结果记录。

2.1、等号运算符

- 等号运算符(=)判断等号两边的值、字符串或表达式是否相等,如果相等则返回 1 ,不相等则返回 0。
- 在使用等号运算符时,遵循如下规则:
        如果等号两边的值、字符串或表达式都为字符串,则MySQL 会按照字符串进行比较,其比较的 是每个字符串中字符的ANSI 编码是否相等。
        如果等号两边的值都是整数,则MySQL 会按照整数来比较两个值的大小。
        如果等号两边的值一个是整数,另一个是字符串,则MySQL 会将字符串转化为数字进行比较。
        如果等号两边的值、字符串或表达式中有一个为NULL ,则比较结果为 NULL
- 对比: SQL 中赋值符号使用 :=
# 1.等号运算符
# 字符串存在隐式转换。如果转换数值不成功,则看作0
# 两边都是字符串的话按照ansi的比较规则比较
# 只要有null参与,结果都为null
SELECT 1 = 1, 1 = '1', 1 = 0, 0 = 'a', 'a' = 'a', (5 + 3) = (2 + 6), '' = NULL , NULL = NULL;
SELECT 1 = 2, 0 = 'abc', 1 = 'abc' FROM DUAL;

2.2、安全等于 

- 安全等于运算符(<=>)与等于运算符(=)的作用是相似的, 唯一的区别 ‘<=>’ 可 以用来对NULL 进行判断。在两个操作数均为 NULL 时,其返回值为 1 ,而不为 NULL ;当一个操作数为 NULL 时,其返回值为0 ,而不为 NULL
SELECT 1 <=> 2, NULL <=> NULL, 2 <=> NULL;

2.3、不等于运算符

不等于运算符(<>和 != )用于判断两边的数字、字符串或者表达式的值是否不相等, 如果不相等则返回1 ,相等则返回 0 。不等于运算符不能判断 NULL 值。如果两边的值有任意一个为 NULL , 或两边都为NULL ,则结果为 NULL
此外,还有非符号类型的运算符:

注意:

        BETWEEN ... AND ... 包含边界

        转义字符:/

# 3.不等于
# IS NULL / IS NOT NULL / ISNULL
SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NULL;
SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NOT NULL;
SELECT last_name, salary, commission_pct FROM employees WHERE ISNULL(commission_pct);

# LEAST() / GREATEST()
SELECT LEAST('c', 't', 'p', 'r'), GREATEST('c', 't', 'p', 'r');

# BETWEEN 条件1 AND 条件2 (包含边界)
# 查询工资在6000到8000的员工信息
SELECT * FROM employees WHERE salary BETWEEN 6000 AND 8000;

# 条件1 > 条件2 时没有结果
SELECT * FROM employees WHERE salary BETWEEN 8000 AND 6000;

# 查询工资不在6000到8000的员工信息
SELECT * FROM employees WHERE salary NOT BETWEEN 6000 AND 8000;

# IN(SET) / NOT IN(SET)
# 查询部门为10,20,30部门的员工信息
SELECT * FROM employees WHERE department_id IN(10, 20, 30);

# 查询工资不是6000,7000,8000的员工信息
SELECT * FROM employees WHERE salary NOT IN(6000,7000,8000);

# LIKE:模糊查询
# %代表任意个字符,包括0个
# _代表一个任意字符
# 查询last_name中包含字符'a'的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';

# 查询last_name中包含字符'a'和'e'的员工信息
SELECT * FROM employees 
#WHERE last_name LIKE '%a%e%' or last_name like '%e%a%';
WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';

# 查询last_name第二个字符是'a'的员工
SELECT * FROM employees WHERE last_name LIKE '_a%';

# 查询last_name第二个字符是_且第三个字符是a的员工
# 需要使用转义字符/
SELECT * FROM employees 
#where last_name like '_/_a%';
WHERE last_name LIKE '_^_a%' ESCAPE '^'; #ESCAPE中的字符任意

2.3.1、REGEXP运算符

- REGEXP 运算符用来匹配字符串,语法格式为: expr REGEXP 匹配条件 。如果 expr 满足匹配条件,返回 1;如果不满足,则返回 0 。若 expr 或匹配条件任意一个为 NULL ,则结果为 NULL

 REGEXP运算符在进行匹配时,常用的有下面几种通配符:

(1‘^’匹配以该字符后面的字符开头的字符串。

(2‘$’匹配以该字符前面的字符结尾的字符串。

(3‘.’匹配任何一个单字符。

(4“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”“b”“c”。为了命名字符的范围,使用一 个‘-’“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。

(5 ‘*’ 匹配零个或多个在它前面的字符。例如, “x*” 匹配任何数量的 ‘x’ 字符, “[0-9]*” 匹配任何数量的数字, 而“*” 匹配任何数量的任何字符。

# REGEXP / RLIKE
SELECT 'sfhef' REGEXP '^s', 'fesiofi' REGEXP 'i$', 'fakef' REGEXP 'ak';
SELECT 'faufake' REGEXP 'fa.fa';
SELECT 'bbbaaa' REGEXP 'b{2}', 'bbbbaa' RLIKE 'b{2,5}';

 3、逻辑运算符

逻辑运算符主要用来判断表达式的真假,在 MySQL 中,逻辑运算符的返回结果为 1 0 或者 NULL。

MySQL中支持4种逻辑运算符如下:

注意:

1. OR 可以和 AND 一起使用,但是在使用时要注意两者的优先级,由于 AND 的优先级高于 OR ,因此先对AND 两边的操作数进行操作,再与 OR 中的操作数结合。
2. XOR一真一假为真

4、位运算符

位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。

4.1、按位与运算符 

按位与(&)运算符将给定值对应的二进制数逐位进行逻辑与运算。当给定值对应的二进制位的数值都为1时,则该位返回1,否则返回0。

4.2、按位或运算符

按位或( | )运算符将给定的值对应的二进制数逐位进行逻辑或运算。当给定值对应的二进制位的数值有一个或两个为1时,则该位返回1,否则返回0。

4.3、按位异或运算符

按位异或(^)运算符将给定的值对应的二进制数逐位进行逻辑异或运算。当给定值对应的二进制位的数值不同时,则该位返回1,否则返回0。

SELECT 12 & 5, 12 | 5,12 ^ 5

 4.4、按位取反运算符

按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为o,将0变为1。

SELECT 10 & ~1; # 结果为10

由于按位取反(~)运算符的优先级高于按位与(&)运算符的优先级,所以10&~1,首先,对数字1进行按位取反操作,结果除了最低位为o,其他位都为1,然后与10进行按位与操作,结果为10。

4.5、按位右移运算符

按位右移(>>)运算符将给定的值的二进制数的所有位右移指定的位数。右移指定的 位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0 补齐。

4.6、按位左移运算符

按位左移(<<)运算符将给定的值的二进制数的所有位左移指定的位数。左移指定的 位数后,左边高位的数值被移出并丢弃,右边低位空出的位置用0 补齐。

5、运算符优先级

数字编号越大,优先级越高,优先级高的运算符先进行计算。可以看到,赋值运算符的优先级最低,使 用“()” 括起来的表达式的优先级最高。

;