条件查询
- 很多时候,用户感兴趣的并不是逻辑表里的全部记录,而只是它们当中能够满足某一种或某几种条件的记录。这类条件要用WHERE子句来实现数据的筛选
SELECT ... FROM ... WHERE 条件 [AND | OR] 条件 ...;
SELECT empno , ename , sal
FROM t_emp
WHERE deptno=10 AND sal >= 2000;
SELECT empno , ename , sal
FROM t_emp
WHERE (deptno=10 OR deptno=20) AND sal >= 2000;
四类运算符
-
WHERE语句中的条件运算会用到以下四种运算符:
算数运算符
null
进行加减乘除后的值仍然是null
,如果此时要对null
进行运算可以使用IFNULL(null,0)
将其转为0。
SELECT 3+null;
-> null
SELECT 3+IFNULL(null,0);
-> 3
- 例子:求部门编号为10,年薪大等于15000且工作时间大等于20年的员工信息。
SELECT empno, ename, deptno, sal, hiredate
FROM t_emp
WHERE deptno=10 AND (sal+IFNULL(null,0))*12>=15000
AND DATEDIFF(NOW(),hiredate)/365>=20;
//DATEDIFF 用于计算前后的天数差
DATEDIFF(date1,date2)
用于计算前后的天数差
比较运算符
- 例子:查询部门编号在(10,20,30)中且职位不是“SALESMAN”且入职日期小于“1985-01-01”的员工信息
SELECT empno,ename,sal,deptno,hiredate
FROM t_emp
WHERE deptno IN(10,20,30) AND job!="SALESMAN"
AND hiredate<"1985-01-01";
- 例子:名字含有A
SELECT
ename,comm,sal,hiredate
FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "%A%";
- 例子:不知道名字的第一个字符,但是其他为
LAKE
,使用下划线_
匹配一个字符
//匹配一个字符用下划线_
SELECT
ename,comm,sal,hiredate
FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "_LAKE";
- 例子:使用正则表达式匹配2-4位中文字符
//正则表达式匹配中文字符且长度为2-4位
SELECT
ename,comm,sal,hiredate
FROM t_emp WHERE comm IS NOT NULL
AND sal BETWEEN 1000 AND 3000
AND ename REGEXP "^[\\u4e00-\\u9fa5]{2,4}$";
[\\u4e00-\\u9fa5]
代表中文字符的Unicode编码范围
逻辑运算符
- 异或关系:左右两端结果不一致才为真,比如
True XOR False=True
二进制按位运算
-
二进制位运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑运算。
按位运算符
WHERE子句的注意事项
- WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧
SELECT empno, ename FROM t_emp WHERE ename = "FORD" AND sal >=2000;
SELECT empno, ename FROM t_emp WHERE deptno = 10 AND sal >= 2000;
各种子句的执行顺序
- 条件查询中,WHERE子句应该是第几个执行?
FROM -> WHERE -> SELECT -> ORDER BY -> LIMIT
网友评论