2021-07-13 SQL(牛客网)刷题 4/5/7题(没有找到第6题)

SQL4 查找所有已经分配部门的员工的last_name和first_name以及dept_no


SQL4 题目


SQL4 题目

解答:

方法1)外部表联结

左外部联结(LEFT JOIN)- 包含左边表的所有列

SELECT e.first_name,e.last_name,d.dept_no

FROM employees as e

LEFT JOIN dept_emp as d

on e.emp_no = d.emp_no

WHERE d.dept_no is not null


右外部联结(RIGHT JOIN)- 包含右边表的所有列

SELECT e.first_name,e.last_name,d.dept_no

FROM employees as e

RIGHT JOIN dept_emp as d

on e.emp_no = d.emp_no

方法2)内部联结

SELECT e.first_name, e.last_name, d.dept_no

FROM employees AS e

INNER JOIN dept_emp AS d

ON e.emp_no = d.emp_no

方法3)使用where子查询

通过WHERE子句筛选已经分配部门的员工

SELECT e.first_name,e.last_name,d.dept_no

FROM dept_emp as d,employees as e

WHERE d.emp_no = e.emp_no





SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no



SQL5 题目


SQL5 题目


SQL 题目

解答:

注意是大表(数据量多的)在前,使用外连接

select

last_name,first_name,dept_no

from employees a left join dept_emp b

on a.emp_no=b.emp_no




SQL7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t




SQL 7 题目


SQL 7 题目

解答:

拿到题目后,我们不要着急一次性写出代码,先将题目进行分解。

1、按照员工号进行分组,先算出表中的薪水记录条数,这里使用到

group by、count

两个复合函数。

具体的SQL语句:

select emp_no,count(emp_no) as countNo

from salaries

group by emp_no;

注意,这里一定进行分组,不然就是统计整张表的记录,这不是我们想要的。

2、查询到上述的记录后,我们就已经知道了每一个员工在表中的薪水记录条数,那么,接下来我们该如何去得

到我们想要的数据。我们再看回看一下题目:查找薪水记录超过15次的员工号emp_no,从上面的查询语

句中,我们已经获得了每一个员工的记录条数,按照我们往常的思路,查找XXX记录,条件是其XXX大于XX,

我们都会在SQL语句后面补上where XXX > XX。这道题我们能否也这样做呢?

答案是肯定的。

我们将上述查询到的结果看做是一张临时表,注意:这里的思路转换非常很重要。

select emp_no,count(emp_no) as t from salaries group by emp_no as s;

那么,原题目将被转换为:从临时表中,找到 countNo 大于 15 的员工号及记录条数,这个显然就是一条

很简单的查询语句。

select emp_no,t

from (select emp_no,count(emp_no) t from salaries group by emp_no) s

where s.t > 15;

我的写法(直接使用Having 在GROUP BY后面作为筛选条件)


我的写法

你可能感兴趣的:(2021-07-13 SQL(牛客网)刷题 4/5/7题(没有找到第6题))