分组查询
语法:
select 查询列表
from 表
【where 筛选条件】
group by 分组的字段
【order by 排序的字段】
查询每个工种的员工平均工资
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id
连接查询
-
按照年代分类:
- sql92标准:仅仅支持内连接
- sql99标准:支持内连接+外连接(左外和右外)+交叉连接
-
按照功能分类:
- 内连接:
- 等值连接
- 非等值连接
- 子连接
- 外连接:
- 左外连接
- 右外连接
- 全外连接
- 交叉连接:
一、sql92标准
1、等值连接:
查询女生名对应的男生名 - 内连接:
SELECT girlName, boyName
FROM boys, girls
WHERE girls.boyfriend_id = boys.id;
可以加筛选
查询有奖金的员工名、部门名
SELECT last_name, department_name, commission_pct
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND commission_pct IS NOT NULL;
可以加分组
查询每个城市的部门个数
SELECT COUNT(*),city
FROM departments d, locations l
WHERE d.location_id = l.location_id
GROUP BY city;
可以加排序
查询每个工种的工种名和员工个数,并且按员工个数降序
SELECT job_title, COUNT(*)
FROM employees e, jobs j
WHERE e.job_id = j.job_id
GROUP BY job_title
ORDER BY COUNT(*) DESC;
2、非等值连接
查询员工的工资和工资等级
SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
AND g.`grade_level`='A';
3、子连接
查询员工名和上级名称
SELECT e.employee_id, e.last_name, m.emplyee_id, m.last_name
FROM emplyees e, emplyees m
WHERE e.'manager_id' = m.'employee_id';
二、sql99标准
语法:
SELECT 查询列表
FROM 表1 【连接类型】
JOIN 表2
ON 连接条件
【WHERE 筛选条件】
【GROUP BY 分组】
【HAVING 筛选条件】
【ORDER BY 排序顺序】
1、内连接:inner
语句:
SELECT 查询列表
FROM 表1
INNER JOIN 表2
ON 连接条件
【WHERE 筛选条件】
【GROUP BY 分组】
【HAVING 筛选条件】
【ORDER BY 排序顺序】
分类:
等值、非等值、自连接
特点:
- 添加排序、分组、筛选。
- inner可以省略。
- 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读。
- inner join连接和sql92语法中的等值连接效果相同,都是查询多表的交集。
1)、等值连接
查询员工名和部门名
SELECT last_name, department_name
FROM departments d
INNER JOIN employees e
ON d.`department_id` = e.`department_id`;
查询名字中包含e的员工名和工种名(添加筛选)
SELECT last_name, job_title
FROM employees e
INNER JOIN jobs j
ON e.`job_id` = j.`job_id`
WHERE last_name LIKE '%e%';
查询部门个数>3的城市名和部门个数(添加分组+筛选)
SELECT city,COUNT(*) 个数
FROM departments d
INNER JOIN locations l
ON l.`location_id` = d.`location_id`
GROUP BY l.city
HAVING COUNT(*) > 3;
2)、非等值连接
查询员工工资级别
SELECT grade_level, salary
FROM job_grades j
JOIN employees e
ON e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal`;
3)、自连接
查询员工的名字和上级的名字
SELECT e.last_name, m.last_name
FROM employees e
JOIN employees m
ON e.`manager_id`= m.`employee_id`;
2、外连接
应用场景:用于查询一个表中有,另一个表没有的记录
特点:
- 外连接的查询结果为主表中所有记录
- 如果从表中有和它匹配的,则显示匹配的值
- 如果从表中没有和它匹配的,则显示null
- 外连接查询结果=内连接结果+主表中有而从表中没有的记录
- 左外连接,left join左边的是主表
右外连接,right join右边是主表 - 左外和右外交换两个表的顺序,可以实现同样的效果
- 全外连接=内连接的结果+表1中有但表2没有+表2中有但表1没有的
1)、左外连接:left【outer】
查询没有男朋友的女生名
SELECT b.name
FROM beauty b
LEFT JOIN boys bo
ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id` IS NULL;
2)、右外连接:right 【outer】
查询没有男朋友的女生名
SELECT b.name
FROM boys bo
RIGHT JOIN beauty b
ON bo.`id` = b.`boyfriend_id`
WHERE bo.`id` IS NULL
3)、全外连接:full【outer】
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.id;
3、交叉连接:cross
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;