条件查询
语法
SELECT
查询列表
FROM
表名
WHERE
筛选条件
如果要标明顺序的话,是先执行FROM 表名,确定表是否存在,然后执行WHERE 筛选条件,根据条件筛选,最后是SELECT 查询列表,进行查询显示。
分类
- 按条件表达式筛选
条件运算符:>、<、!=、<>、>=、<= - 按逻辑表达式筛选
逻辑运算符:&&、||、!或AND、OR、NOT,即与或非,建议使用后者 - 模糊查询
LIKE、BETWEEN AND、IN、IS (NOT) NULL
使用
1. 按条件表达式筛选
案例1:查询工资>12000的员工信息
SELECT
*
FROM
employees
WHERE salary > 12000 ;

案例2:查询部门编号不等于90的员工名和部门编号
SELECT
last_name,
department_id
FROM
employees
WHERE department_id != 90 ;
2. 按逻辑表达式筛选
逻辑运算符:用于连接条件表达式。
案例1:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE salary >= 10000
AND salary <= 20000 ;

案例2:查询部门编号不是在90到110之间的,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE department_id < 90
OR department_id > 110
OR salary > 15000 ;
相当于:
WHERE NOT (
department_id >= 90
AND department_id <= 110
)
OR salary > 15000 ;
3. 模糊查询
LIKE、BETWEEN AND、IN、IS (NOT) NULL
1) LIKE
特点:一般和通配符%(0个或多个字符)、_(一个字符)搭配使用。
案例1:查询员工名中包含字符a的员工信息
SELECT
*
FROM
employees
WHERE last_name LIKE '%a%' ;
%表示字符通配符,用于替代0个或多个字符。
可以看出并不区分大小写。
案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
SELECT
last_name, salary
FROM
employees
WHERE last_name LIKE '__n_l%' ;
案例3:查询员工名中第二个字符为_的员工名
用转义字符\
SELECT
last_name
FROM
employees
WHERE last_name LIKE '_\_%' ;
或者用ESCAPE关键字人为规定转义字符
WHERE last_name LIKE '_$_%' ESCAPE '$';
2) BETWEEN AND
使用BETWEEN AND包含边界值,也就是相当于>=、<=。
案例1:查询员工编号在100到120之间的员工信息
可以使用<=、>=
SELECT
*
FROM
employees
WHERE employee_id >= 100
AND employee_id <= 120 ;
但是这里不能简写为employee_id >= 100 AND <= 120 ;
可以写为employee_id BETWEEN 100 AND 120 ;
注意不可以写为BETWEEN 120 AND 100。
3) IN
判断某字段的值是否属于in列表中的一项。IN比OR更简洁。
要求IN列表的值类型一致或兼容。IN列表不可以使用_、%通配符。
案例:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES的员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE job_id IN ('IT_PROG', 'AD_VP', 'AD_PRES') ;
相当于
where job_id = 'IT_PROG'
or job_id = 'AD_VP'
or job_id = 'AD_PRES' ;
4) IS (NOT) NUL
案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE commission_pct IS NULL ;

不可以写为WHERE commission_pct = NULL,=、<>不能用于判断NULL,是无效的,查询结果将是0条。另外IS也不能用于判断数值,如WHERE salary = 12000;也是不正确的。
总而言之,IS只能和NULL一起用。
有奖金的就是WHERE commission_pct IS NOT NULL。
4. 安全等于<=>
可以用来判断NULL,如
WHERE commission_pct <=> NULL ;
也可以判断数值,如
WHERE salary <=> 12000 ;
但是安全等于用得较少,因为视觉上很容易和不等于<>混淆。
习题
1. 查询工号为176的员工的姓名、部门号和年薪
SELECT
last_name,
department_id,
salary * 12 * (1+ IFNULL(commission_pct, 0)) AS 年薪
FROM
employees
WHERE employee_id = 176 ;
2. 查询没有奖金,且工资小于18000的salary、last_name
SELECT
salary,
last_name
FROM
employees
WHERE commission_pct IS NULL
AND salary < 18000 ;
3. 查询employees表中,job_id不为IT或者工资为120000的员工信息
SELECT
*
FROM
employees
WHERE job_id <> 'IT'
OR salary = 12000 ;
4. 查询部门departments表中涉及到了哪些位置编号
SELECT DISTINCT
location_id
FROM
departments ;
5. 经典面试题
试问
SELECT
*
FROM
employees ;
和
SELECT
*
FROM
employees
WHERE commission_pct LIKE '%%'
AND last_name LIKE '%%' ;
结果是否一样?说明原因。
答:不一样。
前者显示的结果中,commission_pct字段有NULL值,而后者没有,相当于筛掉了NULL。
如果改成
SELECT
*
FROM
employees
WHERE commission_pct LIKE '%%'
OR last_name LIKE '%%' ;
OR employee_id LIKE '%%';
OR ... (所有字段都加上)
就和SELECT * FROM employees一样了,因为总归有一个字段不存在NULL值。(主键就不可以为NULL)