放在前面的话
- 这次SQL4和SQL5很简单,用内连接和左连接就好,没有新的知识点
- 于是刷了SQL7(SQL6没有),遇到新知识点,分组之后的数据筛选,不能用where,而要用having
目录
SQL4 查找所有已经分配部门的员工的last_name和first_name以及dept_no(8.4)
SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no(8.4)
SQL7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t(8.4)
SQL4 查找所有已经分配部门的员工的last_name和first_name以及dept_no(8.4)
一、题目描述
有一个员工表,employees简况如下:
有一个部门表,dept_emp简况如下:
请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示,以上例子如下:
二、思路1:内连接
-
无非就是两张表,一张员工表,一张部门表,通过内连接把它们连接起来,再取数据
-
注意:能用内连接,不用
where
直接连接,where会形成笛卡尔积,产生临时表,效率低
SELECT last_name,first_name,B.dept_no
FROM
employees A
INNER JOIN
dept_emp B
ON
A.emp_no=B.emp_no
SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no(8.4)
一、题目描述
有一个员工表,employees简况如下:
有一个部门表,dept_emp简况如下:
请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工,以上例子如下:
二、思路1:左连接
-
由于要取到所有员工的信息,且空值也要取进去,所以采用左连接
SELECT last_name,first_name,B.dept_no
FROM
employees A
LEFT JOIN
dept_emp B
ON
A.emp_no=B.emp_no
SQL7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t(8.4)
-
没有SQL6!!!
一、题目描述
有一个薪水表,salaries简况如下:
请你查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t,以上例子输出如下:
二、思路:分组+having
-
首先根据id进行分组,其次统计每组的数量,筛选>15的组
-
注意
-
分组之后,不能用COUNT,而要用HAVING!!!
-
记得,要加改名后的新列名——t
-
SELECT emp_no, COUNT(salary) t
FROM
salaries
GROUP BY
emp_no
HAVING
t>15
知识点——having
-
where用于分组之前的筛选
-
一旦分组之后,不能再用where count()>15
-
-
having用于分组之后的筛选
-
例如,求每组数量大于15的组,要用group_by之后用having筛选
-