分组查询 连接查询

分组查询

语法:

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 查询列表
FROM1 【连接类型】
JOIN2
ON 连接条件
【WHERE 筛选条件】
【GROUP BY 分组】
【HAVING 筛选条件】
【ORDER BY 排序顺序】

1、内连接:inner
语句:

SELECT 查询列表
FROM1
INNER JOIN2
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章