2.case CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。
查询员工的工资,要求
部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,显示的工资为原工资
SELECT salary 原始工资,department_id, CASE department_id WHEN 30 THEN salary*1.1 WHEN 40 THEN salary*1.2 WHEN 50 THEN salary*1.3 ELSE salary END AS 新工资 FROM employees;五.分组函数
1.sum(expression) 求和
SELECT SUM(salary) FROM employees;
2.avg(expression) 平均值
SELECT AVG(salary) FROM employees;
3.max(expression) 最大值
SELECT MAX(salary) FROM employees;
4.min(expression) 最小值
SELECT MIN(salary) FROM employees;
5.count(expression) 计算个数
SELECT COUNT(salary) FROM employees;
分组函数支持哪些类型:
字符:先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
日期:SELECT SUM(hiredate) ,AVG(hiredate) FROM employees;
特点:
sum、avg一般用于处理数值型
max、min、count可以处理任何类型
以上分组函数都忽略null值
可以和distinct搭配实现去重的运算
一般使用count(*)用作统计行数
和分组函数一同查询的字段要求是group by后的字段
六.分组查询
语法:select 分组函数,分组后的字段 from 表 【where 筛选条件】 group by 分组的字段 【having 分组后的筛选】 【order by 排序列表】
特点:
和分组函数一同查询的字段必须是group by后出现的字段
筛选分为两类:分组前筛选和分组后筛选
1.简单的分组
SELECT AVG(salary),job_id FROM employees GROUP BY job_id;
2.分组前筛选
例1:查询邮箱中包含a字符的 每个部门的最高工资
SELECT MAX(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id;
3.分组后筛选
例1:查询哪个部门的员工个数>5
SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*)>5;
4.添加排序
例1:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
SELECT job_id 工种编号, MAX( salary ) 最高工资 FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX( salary )> 6000 ORDER BY MAX( salary );
5.按多个字段分组
例1:查询每个工种每个部门的最低工资,并按最低工资降序
SELECT MIN( salary ) 最低工资, department_id 部门, job_id 工种 FROM employees GROUP BY department_id, job_id ORDER BY MIN( salary ) DESC;
七.连接查询
select 字段1,字段2 from 表1,表2,...;
1.笛卡尔积现象
当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
表1 有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件 如何避免:添加有效的连接条件
2.分类
按功能分类: 内连接: 等值连接 非等值连接 自连接 外连接: 左外连接 右外连接 全外连接(mysql不支持) 交叉连接
3.等值连接
多表等值连接的结果为多表的交集部分
n表连接,至少需要n-1个连接条件
表的顺序没有要求
一般需要为表起别名
可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
例1:查询女神名和对应的男神名
SELECT NAME,boyName FROM boys, beauty WHERE beauty.boyfriend_id = boys.id;
4.为表起别名
SELECT e.last_name, e.job_id, j.job_title FROM employees e, jobs j WHERE e.`job_id` = j.`job_id`;
5.加筛选条件
SELECT last_name, department_name, commission_pct FROM employees e, departments d WHERE e.`department_id` = d.`department_id` AND e.`commission_pct` IS NOT NULL;
6.加分组
例1:查询每个城市的部门个数
SELECT COUNT(*) 个数, city FROM departments d, locations l WHERE d.`location_id` = l.`location_id` GROUP BY city;
7.非等值连接