#进阶2:条件查询
/*
语法:
SELECT
查询列表
FROM
表名
WHERE
筛选条件;
分类:
1、按条件表达式筛选
条件运算符:> < = !=【<>】 >= <=
2、按逻辑表达式筛选
逻辑运算符:&& || !
and or not
3、模糊查询:
like
between and
in
is null
*/
#1、按条件表达式筛选
#案例1:查询工资>12000的员工信息
SELECT*FROM
employees
WHERE
salary >12000;
#案例2:查询部门编号不等于90的员工名和部门编号
#2、按逻辑表达式筛选
#案例1:查询工资在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
salary >=10000AND
salary <=20000;
#案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
SELECT*FROM
employees
WHERE
department_id >=90AND
department_id <=110OR
salary >15000;
#模糊查询
/*
like
特点:
a、一般和通配符搭配使用
通配符:
%任意多个字符,包含0个
_任意单个字符
between and
注意事项:
a、可以提高语句简洁度 相当于>= && <=
b、包含临界值
c、两个临界值不能颠倒
in
判断某字段的值是否属于in列表中的某一项
特点:
a、使用in提高语句简洁度
b、in列表的值类型必须一致或兼容(可隐式转换)
c、不支持通配符
is null | is not null
注意事项:
=或<>不能用于判断null值
*/
#like
#案例1:查询员工名中包含字符a的员工信息
SELECT*FROM
employees
WHERE
last_name LIKE'%a%';
#案例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转义
last_name LIKE'_$_%'ESCAPE'$';
#between and
#案例1:查询员工编号在100到120之间的所有员工信息
SELECT*FROM
employees
WHERE
employee_id BETWEEN100AND120;
#in
#案例1:查询员工的工种编号是IT_PROG、AD_PRES、AD_VP中的一个员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN('IT_PROG','AD_PRES','AD_VP');
#is null
#案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct ISNULL;
#案例2:查询有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct ISNOTNULL;
#安全等于<=>
#案例1:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=>NULL;
#案例2:查询工资为12000的员工信息
SELECT*FROM
employees
WHERE
salary <=>12000;/*
IS NULL 与 <=>
IS NULL:仅仅可以判断NULL值,可读性高,建议使用
<=> :既可以判断NULL值,又可以判断普通数值,可读性低
*/
#练习1:查询员工号为176的员工的姓名和部门号和年薪
SELECT
last_name,
department_id,
salary *12*(1+IFNULL(commission_pct,0))AS 年薪
FROM
employees
WHERE
employee_id =176;
条件查询练习
#1、查询没有奖金,且工资小于18000的salary, last_name
SELECT
salary,
last_name
FROM
employees
WHERE
commission_pct ISNULLAND salary <18000;
#2、查询employees表中,job_id不为‘IT’或者工资为12000的员工信息
SELECT*FROM
employees
WHERE
job_id <>'IT'OR salary =12000;
#3、查看部门departments表的结构
DESC departments;
#4、查询部门departments表中涉及到了那些位置编号
SELECT
location_id
FROM
departments;
#5、经典面试题:
#试问:select *from employees ;
#和select *from employees where commission_pct like '%%' and last_name like '%%';
#结果是否一样?说明原因
#如果判断的字段有NULL值就不一样,没有就一样
查询练习
#1. 查询工资大于 12000 的员工姓名和工资
SELECT
last_name,
salary
FROM
employees
WHERE
salary >12000;
#2. 查询员工号为 176 的员工的姓名和部门号和年薪
SELECT
last_name,
department_id,
salary *12*(1+IFNULL(commission_pct,0))AS 年薪
FROM
employees
WHERE
employee_id =176;
#3. 选择工资不在 5000 到 12000 的员工的姓名和工资
SELECT
last_name,
salary
FROM
employees
WHERE
salary <5000OR salary >12000;
#4. 选择在 20 或 50 号部门工作的员工姓名和部门号
SELECT
last_name,
department_id
FROM
employees
WHERE
department_id =20OR department_id =50;
#5. 选择公司中没有管理者的员工姓名及 job_id
SELECT
last_name,
job_id
FROM
employees
WHERE
manager_id ISNULL;
#6. 选择公司中有奖金的员工姓名,工资和奖金级别
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
commission_pct ISNOTNULL;
#7. 选择员工姓名的第三个字母是 a 的员工姓名
SELECTCONCAT(last_name, first_name)AS 姓名
FROM
employees
WHERECONCAT(last_name, first_name)LIKE'__a%';
#8. 选择姓名中有字母 a 和 e 的员工姓名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE'%a%'OR last_name LIKE'%e%';
#9. 显示出表 employees 表中 first_name 以 'e'结尾的员工信息
SELECT*FROM
employees
WHERE
first_name LIKE'%e';
#10. 显示出表 employees 部门编号在 80-100 之间 的姓名、职位
SELECTCONCAT(last_name, first_name)AS 姓名,
job_id AS 职位
FROM
employees
WHERE
department_id BETWEEN80AND100;
#11. 显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、职位
SELECT
last_name,
job_id AS 职位
FROM
employees
WHERE
manager_id =100OR manager_id =101OR manager_id =110;