MySQL学习笔记:条件查询、排序查询练习

# 条件查询
/*
select 查询列表 from 表名 where 筛选条件;
分类:
1、按照条件筛选:<,>,=,<>,<=,...
2、按照逻辑表达式筛选:&&,||,!  and or not
3、模糊查询:;like,between and, in is null

*/
# 查询薪资>12000的员工信息
use myemployees;
-- select * from employees;
-- select first_name, last_name from employees where salary>12000;
-- select * from employees where salary>12000;
-- 
-- # 查询部门编号不等于90号的员工名和部门编号
-- select concat(first_name,',',last_name) as employee_name,department_id from employees where department_id<>90;
# 逻辑判断符运用
-- select first_name,last_name,salary,commission_pct from employees where salary<=20000 and salary>=10000;
# 查询部门编号不是在90和110之间,或者工资高于15000的员工信息
select * from employees where not(department_id>=90 and department_id <=110) or salary>=15000;
# 模糊查询
-- like:一般和通配符搭配使用: %(任意多个字符,包含0个字符); _(任意单个字符)
-- between and:特点:简洁,包含临界值, >= a <=, 不能颠倒顺序,值是同类型(或者类型兼容)
-- in:判断某字段的值是否属于in列表中的某一项,特点:简单,值是同类型(或者类型兼容,‘123’=>123),不支持通配符
-- is null 
-- is not null

# like 
select * from employees where department_id not between 90 and 110 or salary>=15000;
# 查询员工名中包含字符a的员工信息 
# like:应用于不精确匹配=模糊匹配查询时候,注意字符型查询的需要加''% 代表任一个字符, 默认不区分字母大小写
select * from employees where first_name like '%a%' or last_name like '%a%';
# 查询员工名中第三个字符号为e,第五个字符为a的员工名和工资:
select last_name,salary from employees where last_name like 'a_e%';
# 查询员工名中第二个字符为_的员工名,用对——进行转义
select last_name from employees where last_name like '_\_%'; 
# 加一个$+escape表示该符号为转义字符
select last_name from employees where last_name like '_$_%' escape '$'; 

# between and 
# 查询员工编号在100到120之间的员工信息
select * from  employees where employee_id between 100 and 120;

# in 
# 查询员工工种编号job_id是 IT_PROG,AD_VP,AD_PRES中的一个员工名和工种编号
select last_name,job_id from employees where job_id in  ('IT_PROG','AD_PRES','AD_PRES');
-- select last_name,job_id from employees where job_id in  ('IT_PROG','AD_%');   错误
# 相当于
# select last_name,job_id from employees where job_id ='IT_PROG' or job_id = 'AD_VP' or job_id = 'AD_PRES';

# is null
# 查询没有奖金的员工名和奖金率
select last_name, commission_pct from employees where commission_pct is null;
-- select last_name, commission_pct from employees where commission_pct = null; 错误,=不可判断null值

# 查询有奖金的员工名和奖金率
select last_name, commission_pct from employees where commission_pct is not null;

# 安全等于 <=> : 可判断null值和普通数值, 可读性较差
select last_name, commission_pct from employees where commission_pct <=> null;
select last_name, commission_pct,salary from employees where salary <=> 12000;

# 条件查询案例讲解:
# 查询员工号为176的员工的姓名、部门编号和年薪
select last_name,department_id,salary*12*(1+ifnull(commission_pct,0)) as annual_salary 
from employees where employee_id = 176;
# 选择工资不在5000到12000的员工的姓名和工资
select last_name,salary from employees where salary not between 5000 and 12000;
# 选择在20号或50号部门工作的员工姓名和部门号;
select last_name, department_id from employees where department_id = 20 or department_id = 50 ;
select last_name, department_id from employees where department_id in (20,50) ;
# 选择公司中没有管理者的员工姓名及job_id;
select last_name,job_id from employees where manager_id is null;
select last_name,job_id from employees where manager_id <=> null;

# 选择公司中有奖金的员工姓名、工资和奖金级别,????
select * from job_grades;
select * from employees;
select last_name,salary*(ifnull(commission_pct,0)) as reward from employees where commission_pct is not null;
# 选择员工信工的第三个字母是a的员工姓名
select last_name from employees where last_name like '__a%';
# 查询没有奖金,且工资小于18000的salary,last_name
select salary,last_name from employees where commission_pct is null and salary<18000;
# 查询job_id不为‘’IT 或者工资为12000的员工信息;
select * from employees where job_id <> 'IT' or salary = 12000;
# 查看部门department表的结构, 可知表中有哪些参数
desc departments;
# 查询部门departments表中哪些位置编号, distinct 关键字
select distinct location_id from departments;

# 区别select * from employees 和 select * from emplyees where commission_pct like '%%' and last_name like '%%' 是否一样?为什么?
# 并不一样,如果判断的字段有null值就不一样,因为commission_pct中有null值

# 区别select * from employees 和 select * from emplyees where commission_pct like '%%' or last_name like '%%' 是否一样?为什么?
# 一样,如果判断的字段有null值就不一样,因为last_name中无null值
# 进阶3:排序查询: 按照某种参数的某种特定顺序进行排序
/*
排序查询语法:
select 查询列表 from 表名 【where ...】 order by 排序列表 【asc/ desc】 ; asc 表示升序, desc表示降序
特点:
如果不写 asc, desc 默认asc
可按照多个字段排序
order by 放在查询语句的最后面,limit除外
*/

use myemployees;
select last_name,salary from employees order by salary asc;
desc employees;
select last_name,salary from employees order by salary desc;
# 条件+排序
# 查询部门编号>=90 , 并按照入职时间升序排列的员工信息
desc employees; 
select * from employees where department_id >= 90 order by hiredate asc;

# 表达式排序,表达式过长起别名
# 按年薪高低显示员工信息
select * from employees order by salary*12*(1+ifnull(commission_pct,0)) asc;
select *,salary*12*(1+ifnull(commission_pct,0)) as annual_salary from employees order by annual_salary asc;

# 函数排序,根据last_name字节长度进行升序排序,length()
select last_name,salary from employees order by length(last_name) asc;

# 按照多个字段排序:查询员工信息,先按工资排序,再按员工编号排序
select last_name,salary,employee_id from employees order by salary asc, employee_id desc;

# 测试题
# 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序
select last_name, department_id, salary*12*(1+ifnull(commission_pct,0)) as annual_salary from employees 
order by annual_salary desc, last_name asc;

# 选择工资不在8000到17000的员工的姓名和工资,按工资降序
select last_name,salary from employees where salary not between 8000 and 17000 order by salary desc;

# 查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按照部门号升序
desc employees;
select last_name,email,department_id from employees where email like '%e%' order by length(email) desc, department_id asc;

参考资料:https://www.bilibili.com/video/BV12b411K7Zu?p=40&spm_id_from=pageDriver

原文地址:https://www.cnblogs.com/feynmania/p/14781310.html