MySQL数据库DML——条件查询
条件查询
很多时候,用户感兴趣的并不是逻辑表里的全部记录,而知识它们当中能够满足某一种或集中条件的记录。这类条件要用WHERE子句来实现数据的筛选。
SELECT ...... FROM ...... WHERE 条件 [AND|OR] 条件 ......;
案例:
SELECT empno,ename FROM t_emp WHERE deptno=10 AND sal>=2000;
SELECT empno,ename FROM t_emp WHERE (deptno=10 OR deptno=20) AND sal>=2000;
算数运算符
WHERE语句中的条件运算会用到以下四种运算符:
序号|运算符
1|数学运算符
2|比较运算符
3|逻辑运算符
4|按位运算符
数学运算符
序号 | 表达式 | 意义 | 例子 |
---|---|---|---|
1 | + | 加法 | 1 + 2 + 3 |
2 | - | 减法 | 1 - 2 - 3 |
3 | * | 乘法 | 5 * 35 |
4 | / | 除法 | 231 / 15 |
5 | % | 求模 | 10 % 3 |
案例:查询年收入大于等于15000并且工龄大于20年的员工信息
SELECT empno,ename,sal,hiredate FROM t_emp
WHERE deptno=10 AND (sal+IFNULL(comm,0))*12>=15000
AND DATEDIFF(NOW(),hiredate)/365>=20;
关于IFNULL()函数:
(1) 任何数字与NULL做数学运算的结果都为NULL。
(2) 如果想让NULL参与数学运算,那么需要添加MySQL自带的函数IFNULL()。
案例:
SELECT 10+IFNULL(null,0);
注:IFNULL(null,0)的第一个参数可以为任何一个字段或者为null,如果第一个参数为null,那么IFNULL返回的结果就为第二个参数。
关于DATEDIFF ()函数:
DATEDIFF (NOW(),hiredate)函数会返回第一个时间参数减去第二个时间参数的值。
NOW()函数
NOW()函数会返回当前时间。
比较运算符
序号 | 表达式 | 意义 | 例子 |
---|---|---|---|
1 | > | 大于 | age > 18 |
2 | >= | 大于等于 | age >= 18 |
3 | < | 小于 | sal < 3000 |
4 | <= | 小于等于 | sal <= 3000 |
5 | = | 等于 | deptno = 10 |
6 | != | 不等于 | deptno != 30 |
7 | IN | 包含 | deptno IN(10,30,40) |
8 | IS NULL | 为空 | comm IS NULL |
9 | IS NOT NULL | 不为空 | comm IS NOT NULL |
10 | BETWEEN AND | 范围 | sal BETWEEN 2000 AND 3000 |
11 | LIKE | 模糊查询 | ename LIKE “A%” |
12 | REGEXP | 正则表达式 | ename REGEXP “[a-zA-Z]{4}” |
注:中文正则表达式为[4E00-9FA5],后边的{4}表示一共有多少个字符。
案例1:查询1986-01-01年前入职并且部门编号为10、20和30并且职位不是SALESMAN的员工
SELECT empno,ename,sal,hiredate FROM t_emp
WHERE deptno IN (10,20,30)
AND job != "SALESMAN"
AND hiredate < "1985-01-01";
案例2: 使用正则表达式查找
SELECT ename,comm FROM t_emp WHERE comm IS NOT NULL;
SELECT ename,comm FROM t_emp WHERE comm IS NULL;
SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000;
SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "%A%";
SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "_LAKE";
SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 1000 AND 3000
AND ename REGEXP "^[\\u4e00-\\u9fa5]{2,4}$";
注:
SELECT ename,comm,sal FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 1000 AND 3000
AND ename REGEXP "^[\\u4e00-\\u9fa5]{2,4}$";
^[\\u4e00-\\u9fa5]{2,4}$
中的^
表示开头,$
表示结尾,[\\u4e00-\\u9fa5]
表示代表中文的正则表达式,{2,4}表示2个字符到4个字符之间。
逻辑运算符
序号 | 表达式 | 意义 | 例子 |
---|---|---|---|
1 | AND | 与关系 | age > 18 AND sex = “男” |
2 | OR | 或关系 | empno = 8000 OR deptno = 20 |
3 | NOT | 非关系 | NOT deptno = 20 |
4 | XOR | 异或关系 | age > 18 XOR sex = “男” |
注:a XOR b
表示如果条件a和条件b同时被满足或者同时不满足,则返回结果为false;如果满足a不满足b或者不满足a但满足b,则返回结果为true。
案例:
SELECT ename,deptno FROM t_emp WHERE NOT deptno IN(10,20);
SELECT ename,deptno FROM t_emp WHERE deptno NOT IN(10,20);
SELECT ename,deptno FROM t_emp WHERE NOT deptno IN(10,20)
XOR sal>=2000;
注:这里可以发现 NOT deptno IN(10,20);
与 deptno NOT IN(10,20);
运行结果一致。
按位运算符
二进制位运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑运算。
序号 | 表达式 | 意义 | 例子 |
---|---|---|---|
1 | & | 位与关系 | 3 & 7 |
2 | ∣ \vert ∣ | 位或关系 | 3$\vert$7 |
3 | ~ | 位取反 | ~ 10 |
4 | ^ | 位异或 | 3 ^ 7 |
5 | << | 左移 | 10 << 1 |
6 | >> | 右移 | 10 >> 1 |
注:
(1) 10 << 1
表示将10转换为二进制,在右侧补一位二进制0;
(2) 10 >> 1
表示将10转换为二进制,将右侧一位数抹掉,并在左侧补一位二进制0。
WHERE子句的注意事项
(1) WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧。
(2) 各种子句的执行顺序
条件查询中,各种子句的执行顺序如下:
FROM
→
\to
→WHERE
→
\to
→SELECT
→
\to
→ORDER BY
→
\to
→LIMIT
注:这里是WHERE在SELECT之前执行,这是因为必须先要筛选出符合条件的记录,才能从中挑选出结果集中显示的字段。