(LIKE):一般和通配符% _搭配使用。 例:查询员工名中包含字符a的员工信息。 SELECT * FROM employees WHERE last_name like '%a%'; 查询员工名中第三个字符为e,第五个字符为a的员工名和工资 SELECT last_name,salary FROM employees WHERE last_name LIKE '__e_a%';(%:任意多个字符,包含0个字符。_:任意单个字符)
1 2 3 4 5 6 7 8 9
(BETWEEN AND):包含两个临界值;两个临界值不能调换顺序。 例:查询员工编号在100~200之间的员工信息 SELECT * FROM employees WHERE employees_id >= 100 AND employees_id <=200; ----------------------------------------------------- SELECT * FROM employees WHERE employees_id BETWEEN 100 AND 200;
1 2 3 4 5 6 7 8 9 10 11 12 13
(IN):用来判断某字段的值是否属于IN列表中的某一项;IN列表的值类型必须一致或兼容;IN列表中不支持通配符。 例:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号 SELECT last_name,job_id FROM emplyoees WHERE job_id = 'IT_PROG' OR jod_id = 'AD_VP' OR job_id = 'AD_PRES'; ------------------------------------------------------------------------ SELECT last_name, job_id FROM employees WHERE job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');
(IS NULL):=或!=和<>不能用来判断NULL值,IS NULL或IS NOT NULL可以判断NULL值。 例:查询没有奖金的员工名和奖金率 SELECT last_name, commission_pct FROM employees WHERE commission_pct IS NULL; 例:查询有奖金的员工和奖金率 SELECT last_name, commission_pct FROM employees WHERE commission_pct IS NOT NULL; ---------------------------------- SELECT last_name, commission_pct FROM employees WHERE salary IS 12000;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
安全等于<=> 例:查询没有奖金的员工和奖金率 SELECT last_name, commission_pct FROM employees WHERE commission_pct <=>NULL; 例:查询工资为12000的员工信息 SELECT last_name, salary FROM employees WHERE salary <=> 12000;
IS NULL:仅仅可以判断NULL值,可读性较高(建议使用)。
<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低。
排序查询:
1 2 3 4 5
select 要查询的内容 from 表
where 条件
order by 排序的字段|表达式|函数|别名 asc(默认升序)或desc(降序)
分组查询:
1 2 3 4 5 6
语法: select 分组函数,列(要求出现在GROUP BY 后面) form 表 【where 筛选条件】 group by 分组的列表 【order by 子句】
注意:查询列表必须特殊,要求是分组函数和group by 后出现的字段。
特点:
1:和分组函数一同查询的字段必须是group by后出现的字段。
2:筛选分为两类:分组前筛选和分组后筛选
分组前筛选:原始表
分组后筛选:group by后的结果集
group by 前用关键字where,group by后用关键字 having
分组筛选不能放在where后面。
3:分组函数做条件肯定是放在having子句中。
能用分组前筛选的,优先考虑使用分组前筛选
4:group by 子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(较少使用)。
例: select 要查询的字段,分组函数 from 表 where 筛选条件 group by 分组的字段 order by 排序的字段
查询每个部门的员工个数: SELECT COUNT(*) FROM employees WHERE department_id = 90; 简单的分组: 1:查询每个工种的员工的平均工资 SELECT AVG(salary),job_id FROM emplyoees GROUP BY job_id;
2:查询每个位置的部门个数 SELECT COUNT(*),location_id FROM department GROUP BY location_id;
3:实现分组前的筛选 查询邮箱中包含a字符的每个部门的最高工资 SELECT MAX(salary),manager_id FROM emplyoees WHERE commission_pct IS NOT NULL GROUP BY manager_id;
分组后筛选 ①:查询每个部门的员工个数 SELECT COUNT(*),department_id FROM emplyoees GROUP BY departments_id;
②:筛选①的结果,查询哪个部门的员工个数>5 SELECT COUNT(*),department_id FROM emplyoees GROUP BY department_id HAVING COUNT(*)>5;
4:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资 SELECT job_id,MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000;
5:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资 manager_id>102 SELECT manager_id,MIN(salary) FROM employees GROUP BY manager_id HAVING MIN(salary)>5000;
6.添加排序 例:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序 SELECT job_id,MAX(salary) m FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING m>6000 ORDER BY m ;
7.按多个字段分组 例:查询每个工种每个部门的最低工资,并按最低工资降序 SELECT MIN(salary),job_id,department_id FROM employees GROUP BY department_id,job_id ORDER BY MIN(salary) DESC;