目录
1. 算术运算符
1.加法与减法运算符
2.乘法与除法运算符
3.求模(求余)运算符
2. 比较运算符
1.等号运算符
2.安全等于运算符
3.不等于运算符
4. 空运算符
5. 非空运算符
6. 最小值运算符
7. 最大值运算符
8. BETWEEN AND运算符
9. IN运算符
11. LIKE运算符
ESCAPE
12. REGEXP运算符
3. 逻辑运算符
1.逻辑非运算符
2.逻辑与运算符
3.逻辑或运算符
4.逻辑异或运算符
4. 位运算符
1.按位与运算符
2. 按位或运算符
3. 按位异或运算符
编辑 4. 按位取反运算符
5. 按位右移运算符
6. 按位左移运算符
5. 运算符的优先级
编辑拓展:使用正则表达式查询
1. 查询以特定字符或字符串开头的记录
2. 查询以特定字符或字符串结尾的记录
3. 用符号"."来替代字符串中的任意一个字符
4. 使用"*"和"+"来匹配多个字符
5. 匹配指定字符串
6. 匹配指定字符中的任意一个
7. 匹配指定字符以外的字符
8. 使用{n,}或者{n,m}来指定字符串连续出现的次数
一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;在 Java 中, + 的左右两边如果有字符串,那么表示字符串的拼接。但是在 MySQL 中 + 只表示数值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按 0 计算。(补充: MySQL中字符串拼接要使用字符串函数 CONCAT() 实现)
# 计算出员工的年基本工资SELECT employee_id,salary,salary * 12 annual_salFROM employees;
一个数乘以整数 1 和除以整数 1 后仍得原数;一个数乘以浮点数 1 和除以浮点数 1 后变成浮点数,数值与原数相等;一个数除以整数后,不管是否能除尽,结果都为一个浮点数;一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后 4 位;乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。在数学运算中, 0 不能用作除数,在 MySQL 中,一个数除以 0 为 NULL 。
将t22表中的字段i对3和5进行求模(求余)运算。
# 筛选出 employee_id 是偶数的员工SELECT * FROM employeesWHERE employee_id MOD 2 = 0 ;
可以看到,12对3求模后的结果为0,对5求模后的结果为2
如果等号两边的值、字符串或表达式都为字符串,则 MySQL 会按照字符串进行比较,其比较的是每个字符串中字符的ANSI 编码是否相等。如果等号两边的值都是整数,则 MySQL 会按照整数来比较两个值的大小。如果等号两边的值一个是整数,另一个是字符串,则 MySQL 会将字符串转化为数字进行比较。如果等号两边的值、字符串或表达式中有一个为 NULL ,则比较结果为 NULL 。对比: SQL 中赋值符号使用 :=
1 row in set , 2 warnings ( 0.00 sec)# 查询 salary=10000 ,注意在 Java 中比较是 ==SELECT employee_id,salary FROM employees WHERE salary = 10000 ;
# 查询 commission_pct 等于 0.40SELECT employee_id,commission_pct FROM employees WHERE commission_pct = 0.40 ;SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> 0.40 ;# 如果把 0.40 改成 NULL 呢?
# 查询 commission_pct 等于 NULL 。比较如下的四种写法SELECT employee_id,commission_pct FROM employees WHERE commission_pct IS NULL ;SELECT employee_id,commission_pct FROM employees WHERE commission_pct <=> NULL ;SELECT employee_id,commission_pct FROM employees WHERE ISNULL(commission_pct);SELECT employee_id,commission_pct FROM employees WHERE commission_pct = NULL ;
SELECT last_name, manager_idFROM employeesWHERE manager_id IS NULL ;
# 查询 commission_pct 不等于 NULLSELECT employee_id,commission_pct FROM employees WHERE commission_pct IS NOT NULL ;SELECT employee_id,commission_pct FROM employees WHERE NOT commission_pct <=> NULL ;SELECT employee_id,commission_pct FROM employees WHERE NOT ISNULL(commission_pct);
SELECT last_name, salaryFROM employeesWHERE salary BETWEEN 2500 AND 3500 ;
SELECT employee_id, last_name, salary, manager_idFROM employeesWHERE manager_id IN ( 100 , 101 , 201 )
“%” :匹配 0 个或多个字符。“_” :只能匹配一个字符。
SQL语句示例如下
SELECT first_nameFROM employeesWHERE first_name LIKE 'S%' ;
SELECT last_nameFROM employeesWHERE last_name LIKE '_o%' ;
SELECT job_idFROM jobsWHERE job_id LIKE ‘IT\_%‘;
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
( 1 ) ‘^’ 匹配以该字符后面的字符开头的字符串。( 2 ) ‘$’ 匹配以该字符前面的字符结尾的字符串。( 3 ) ‘.’ 匹配任何一个单字符。( 4 ) “[...]” 匹配在方括号内的任何字符。例如, “[abc]” 匹配 “a” 或 “b” 或 “c” 。为了命名字符的范围,使用一个 ‘-’ 。 “[a-z]” 匹配任何字母,而 “[0-9]” 匹配任何数字。( 5 ) ‘*’ 匹配零个或多个在它前面的字符。例如, “x*” 匹配任何数量的 ‘x’ 字符, “[0-9]*” 匹配任何数量的数字,而 “*” 匹配任何数量的任何字符。
SQL语句示例如下:
SELECT last_name, job_idFROM employeesWHERE job_id NOT IN ( 'IT_PROG' , 'ST_CLERK' , 'SA_REP' );
SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >= 10000AND job_id LIKE '%MAN%' ;
# 查询基本薪资不在 9000-12000 之间的员工编号和基本薪资SELECT employee_id,salary FROM employeesWHERE NOT (salary >= 9000 AND salary <= 12000 );SELECT employee_id,salary FROM employeesWHERE salary < 9000 OR salary > 12000 ;SELECT employee_id,salary FROM employeesWHERE salary NOT BETWEEN 9000 AND 12000 ;
SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >= 10000OR job_id LIKE '%MAN%' ;
注意:OR 可以和 AND 一起使用,但是在使用时要注意两者的优先级,由于 AND 的优先级高于 OR ,因此先对AND 两边的操作数进行操作,再与 OR 中的操作数结合
select last_name,department_id,salaryfrom employeeswhere department_id in ( 10 , 20 ) XOR salary > 8000 ;
按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为0,将0变为1。
字符‘^’匹配以特定字符或者字符串开头的文本。
mysql> SELECT * FROM fruits WHERE f_name REGEXP '^b';
字符‘$’匹配以特定字符或者字符串结尾的文本。
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'y$' ;
字符‘.’匹配任意一个字符。 在fruits表中,查询f_name字段值
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'a.g';
星号‘*’匹配前面的字符任意多次,包括0次。加号‘+’匹配前面的字符至少一次。
mysql> SELECT * FROM fruits WHERE f_name REGEXP '^ba*' ;
mysql> SELECT * FROM fruits WHERE f_name REGEXP '^ba+' ;
正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符‘|’隔开。
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'on' ;
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'on|ap' ;
mysql> SELECT * FROM fruits WHERE f_name like 'on' ;Empty set ( 0.00 sec)
方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本。
mysql> SELECT * FROM fruits WHERE f_name REGEXP '[ot]' ;
mysql> SELECT * FROM fruits WHERE s_id REGEXP '[456]' ;
“[^字符集合]” 匹配不在指定集合中的任何字符。
mysql> SELECT * FROM fruits WHERE f_id REGEXP '[^a-e1-2]' ;
“字符串{n,}”表示至少匹配n次前面的字符;“字符串 {n,m}”表示匹配前面的字符串不少于n次,不多于m次。例如,a{2,}表示字母a连续出现至少2次,也可以大于2次;a{2,4}表示字母a连续出现最少2次,最多不能超过4次。
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'x{2,}' ;
mysql> SELECT * FROM fruits WHERE f_name REGEXP 'ba{1,3}' ;