5.2 条件查询

#进阶2:条件查询
/* 
语法:
	select 
		查询列表
	from
		表名
	where
		筛选条件
分类:
	一、按条件表达式筛选
	
	条件运算符:> < = != <> >= <=
	
	二、按逻辑表达式筛选
	
	逻辑运算符:
		&& || !
		and or not
	三、模糊查询
		like
		between and
		in
		is null|is not null

*/
#一、按条件表达式筛选
#案例1:查询工资>12000的员工信息
SELECT
	*
FROM
	employees
WHERE
	salary>12000;

#案列2:查询部门编号不等于90号的员工名和部门编号
SELECT
	last_name,
	department_id,
FROM
	employees
WHERE
	department_id<>90;

#二、按逻辑表达式筛选
#案例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
	NOT(department_id<90 AND department_id>110) OR salary>15000;

#三、模糊查询
/* 
like
between and
in
is null|is not null

*/
#1.like
/*
特点:
①一般和通配符搭配使用
	通配符:
	% 任意多个字符,包含0个字符
	_ 任意单个字符
*/
#案例1:查询员工中包含字符a的员工信息
SELECT
	*
FROM
	employees
WHERE
	last_name LIKE '%a%';  #abc
#案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
SELECT
	last_name,salary
FROM
	employees
WHERE
	last_name LIKE '__n_l%';
#案例3:查询姓名中包含第二个字符为_的员工信息
SELECT 
	*
FROM 
	employees
WHERE 
	last_name LIKE '_\_%'; #转义\
#--------------------------------------------
SELECT 
	*
FROM 
	employees
WHERE 
	last_name LIKE '_$_%' ESCAPE '$'; #自定义转义escape

#2.between and/not between and
/*
①使用between and 可以提高语句的
②包含临界值,不要调换顺序
*/
#案例:查询员工编号在100到120之间的员工信息
SELECT 
	*
FROM
	employees
WHERE 
	employees_id BETWEEN 100 AND 120;

#3.in
/*
功能:查询某字段的值是否属于指定的列表之内
特点:
	①使用in提高语句简洁度
	②in列表的值类型必须统一

*/

#案例1:查询部门编号是30/50/90的员工名、部门编号

SELECT 
	last_name,department_id
FROM 
	employees
WHERE 
	department_id IN(30,50,90);
#-----------------------------------
SELECT 
	last_name,department_id
FROM 
	employees
WHERE 
	department_id=30 OR department_id=50 OR department_id=90;
	
#案例2:查询工种编号不是SH_CLERK或IT_PROG的员工信息
SELECT 
	*
FROM 
	employees
WHERE 
	job_id NOT IN('SH_CLERK','IT_PROG');
#--------------------------------------
SELECT 
	*
FROM 
	employees
WHERE 
	NOT(job_id ='SH_CLERK' OR job_id = 'IT_PROG');


#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<=>             安全等于,既能判断普通内容,又能判断NULL

5. 3 排序查询

#进阶3:排序查询
/*
语法:
	select 查询列表
	from 表名
	【where 筛选条件】
	order by 排序列表【asc|desc】

执行顺序:
	①from 子句
	②where 子句
	③select 子句
	④order by 子句

特点:
1、asc代表的升序,desc代表的是降序,如果不写默认升序
2、order by子句中可以支持单个字段、多个字段、表达式、函数、别名
3、order by子句一般是放在查询语句的最后面,limit子句除外
*/
#案例1:查询员工信息,要求工资冲高到底排序
SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM employees ORDER BY salary;

#案例2:查询部门编号>=90的员工信息,按入职时间的先后进行排序【添加筛选条件】
SELECT * 
FROM employees 
WHERE department_id>=90
ORDER BY hiredate ASC;

#案例3:按年薪的高低显示员工的信息和年薪【按表达式排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

#案例4:按年薪的高低显示员工的信息和年薪【按别名排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC;

#案例5:按姓名的长度显示员工的姓名和工资【按函数】
SELECT LENGTH(last_name) 字节长度,last_name,salary
FROM employees
ORDER BY LENGTH(last_name) DESC;

#案例6:查询员工信息,要求先按工资升序,再按员工编号降序【按多个字段排序】
SELECT * FROM employees ORDER BY salary ASC,employees_id DESC;