条件查询
语法
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
)