#进阶二:条件查询
/*
语法:
select 查询列表
from 表名
where 筛选条件;
执行顺序:
1、from子句
2、where子句
3、select子句

特点:
1、按关系表达式筛选
关系运算符:> < >= <= = <>不等于 !=也支持但不建议
2、按逻辑表达式筛选
逻辑运算符:and or not 补充:也可以使用&& ||等但不建议
3、模糊查询
like
in
between and
is null
*/
# 一、按关系表达式筛选
#案例1:查询出部门编号不是100的员工信息
SELECT * FROM `employees` WHERE `department_id` <> 100;
#案例2:查询出工资小于15000的姓名和工资
SELECT `last_name`,`salary` FROM`employees` WHERE `salary`<15000;
#二、按逻辑表达式筛选
#案例1:查询部门编号不是50-100之间的员工姓名、部门编号、邮箱。
#方式1:
SELECT `last_name`,`department_id`,`email`
FROM `employees` 
WHERE `department_id`<50 OR `department_id`>100;
#方式2:
SELECT `last_name`,`department_id`,`email`
FROM `employees` 
WHERE NOT(`department_id`>=50 AND `department_id`<=100);
#案例2:查询奖金率>0.03或者员工编号在60-110之间的员工信息
SELECT *
FROM`employees`
WHERE `commission_pct`>0.03 OR (`employee_id`>=60 AND `employee_id`<=110);
#三、模糊查询
#1、like
/*
功能:一般和通配符搭配使用,对字符型数据进行匹配
常见的通配符:
_任意单个字符
%任意多个字符,支持0-多个
*/
#案例1:查询姓名中包含字符a的员工信息
SELECT *
FROM `employees`
WHERE `last_name` LIKE '%a%';
#案例2:查询姓名中最后一个字符为e的员工信息
SELECT *
FROM `employees`
WHERE `last_name` LIKE '%e';
#案例3:查询姓名中第一个字符为e的员工信息
SELECT *
FROM `employees`
WHERE `last_name` LIKE 'e%';
#案例4:查询姓名中包含第三个字符为x的员工信息
SELECT *
FROM `employees`
WHERE `last_name` LIKE '__x%';
#案例5:查询姓名中包含第二个字符为_的员工信息
SELECT *
FROM `employees`
WHERE `last_name` LIKE '_\_%';-- 可以用但不建议

SELECT *
FROM `employees`
WHERE `last_name` LIKE '_$_%' ESCAPE '$';-- ESCAPE '$'设置$符号为转义字符

#2、in
/*
功能:查询某字段的值是否属于制定的列表之内
a in(常量值1,常量值2,常量值3,....)
a not in(常量值1,常量值2,常量值3,....)
in/not in
*/
#案例1:查询部门编号是30/50/90的员工名、部门编号
#方式1:
SELECT `last_name`,`department_id`
FROM `employees`
WHERE `department_id` IN(30,50,90);
#方式2:
SELECT `last_name`,`department_id`
FROM `employees`
WHERE `department_id`=30
OR `department_id`=50
OR `department_id`=90;
#案例二:查询工种编号不是SH_CLERK或IT_PROG的员工信息
SELECT *
FROM `employees`
WHERE `job_id` NOT IN('SH_CLERK','IT_PROG');-- 非数值型的常量值都要用单引号引起来

#3、between and
/*
功能:判断某个字段的值是否介于xx之间(包含临界值)
between and/not between and
*/
#案例1:查询部门编号是30-90之间的部门编号、员工姓名
#方式1:
SELECT `department_id`,`last_name`
FROM `employees`
WHERE `department_id` BETWEEN 30 AND 90;
#方式2:
SELECT `department_id`,`last_name`
FROM `employees`
WHERE `department_id`>=30 AND `department_id`<=90;
-- 方式1和2完全等价,BETWEEN 30 AND 90等于>=30and<=90;
#案例2:查询年新不是100000-200000之间的员工姓名、工资、年新;
SELECT `last_name`,`salary`,`salary`*12*(1+IFNULL(`commission_pct`,0)) AS "年新"
FROM `employees`
WHERE `salary`*12*(1+IFNULL(`commission_pct`,0))NOT BETWEEN 100000 AND 200000;

#4、is null/is not null
#案例1:查询没有奖金的员工信息
SELECT *
FROM `employees`
WHERE `commission_pct` IS NULL;
#案例2:查询有奖金的员工信息
SELECT *
FROM `employees`
WHERE `commission_pct` IS NOT NULL;
-- =只能判断普通的内容
-- is只能判断Null值
-- <=> 安全等于,既能判断普通内容,又能判断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))
FROM `employees`
WHERE `employee_id` = 176;
#3、选择工资不在5000-12000的员工的姓名和工资
SELECT `last_name`,`salary`
FROM `employees`
WHERE `salary` NOT BETWEEN 5000 AND 12000;
#4、选择在20或50号部门工作的员工姓名和部门号
SELECT `last_name`,`department_id`
FROM `employees`
WHERE `department_id` IN(20,50);
#5、选择公司中没有管理者的员工姓名和`job_id`
SELECT `last_name`,`job_id`
FROM `employees`
WHERE `manager_id` IS NULL;
#6、选择公司中有奖金的员工姓名、工资、奖金级别
SELECT`last_name`,`salary`,`commission_pct`
FROM `employees`
WHERE `commission_pct` IS NOT NULL;
#7、选择员工姓名中第三个字母是a的员工姓名
SELECT `last_name`
FROM `employees`
WHERE `last_name` LIKE '__a%';
#8、选择姓名中有字母a和e的员工姓名
SELECT `last_name`
FROM `employees`
WHERE (`last_name` LIKE '%a%')AND(`last_name` LIKE '%e%');
#9、显示出表`employees`中`first_name`以'e'为结尾的员工信息
SELECT *
FROM `employees`
WHERE `first_name` LIKE '%e';
#10、显示出表`employees`部门编号在80-100之间的姓名、职位
SELECT `last_name`,`job_id`
FROM `employees`
WHERE `department_id` BETWEEN 80 AND 100;
#11、显示出表`employees`的`manager_id`是100、101、110的员工姓名、职位
SELECT `last_name`,`job_id`
FROM `employees`
WHERE `manager_id` IN(110,101,100);