条件查询


语法

SELECT 
  查询列表
FROM
  表名 
WHERE
  筛选条件 

如果要标明顺序的话,是先执行FROM 表名,确定表是否存在,然后执行WHERE 筛选条件,根据条件筛选,最后是SELECT 查询列表,进行查询显示。


分类

  1. 按条件表达式筛选
    条件运算符:><!=<>>=<=
  2. 按逻辑表达式筛选
    逻辑运算符:&&||!ANDORNOT,即与或非,建议使用后者
  3. 模糊查询
    LIKEBETWEEN ANDINIS (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. 模糊查询

LIKEBETWEEN ANDINIS (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列表中的一项。INOR更简洁。
要求IN列表的值类型一致或兼容。
IN列表不可以使用_%通配符。
案例:查询员工的工种编号是IT_PROGAD_VPAD_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的salarylast_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