首页 > 试题广场 >

查找所有员工的last_name和first_name以及对

[编程题]查找所有员工的last_name和first_name以及对
  • 热度指数:353137 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个员工表employees简况如下:
emp_no
birth_date
first_name
last_name
gender hire_date
10001
1953-09-02
Georgi
Facello
M 1986-06-26
10002
1964-06-02
Bezalel
Simmel
F 1985-11-21
10003
1959-12-03
Parto
Bamford
M 1986-08-28
10004
1954-05-01
Chirstian
Koblick
M 1986-12-01


有一个部门表departments表简况如下:
dept_no dept_name
d001 Marketing
d002
Finance
d003
Human Resources


有一个,部门员工关系表dept_emp简况如下:
emp_no
dept_no
from_date
to_date
10001 d001
1986-06-26 9999-01-01
10002 d001
1996-08-03 9999-01-01
10003 d002
1990-08-05 9999-01-01


请你查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工,以上例子输出如下:
last_name first_name dept_name
Facello Georgi Marketing
Simmel Bezalel Marketing
Bamford Parto Finance
Koblick Chirstian NULL
示例1

输入

drop table if exists  `departments` ; 
drop table if exists  `dept_emp` ; 
drop table if exists  `employees` ; 
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
INSERT INTO departments VALUES('d001','Marketing');
INSERT INTO departments VALUES('d002','Finance');
INSERT INTO departments VALUES('d003','Human Resources');
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d002','1990-08-05','9999-01-01');
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
INSERT INTO employees VALUES(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01');

输出

Facello|Georgi|Marketing
Simmel|Bezalel|Marketing
Bamford|Parto|Finance
Koblick|Chirstian|None
select last_name,first_name,dept_name  
from employees as e left join  dept_emp as de  on e.emp_no=de.emp_no 
left join departments as d on de.dept_no = d.dept_no
不知道为啥第一个left我刚开始写反了,用右连接报错,我把两个表换了一下改成left join就过了,这里由于要将dept_no为null的条件给忽略掉.所以应该该用左连接

发表于 2018-03-11 21:07:05 回复(2)
select e.last_name, e.first_name, d.dept_name
from 
employees as e
left JOIN
(
    SELECT d_emp.emp_no,dept.dept_no,dept.dept_name
    from 
    dept_emp as d_emp
    left JOIN
    departments as dept
    on d_emp.dept_no = dept.dept_no
)
 as d
on e.emp_no = d.emp_no;

发表于 2021-09-11 19:31:18 回复(0)
select e.last_name
,e.first_name
,d.dept_name
from employees e
left join dept_emp de
on de.emp_no = e.emp_no
left join departments d
on de.dept_no = d.dept_no;


发表于 2021-09-02 21:05:57 回复(0)
select e.last_name,e.first_name,d.dept_name from employees e left join dept_emp de on de.emp_no=e.emp_no
                                                left join departments d on d.dept_no=de.dept_no
发表于 2017-10-23 17:09:44 回复(0)
本题思路为运用两次LEFT JOIN连接嵌套
1、第一次LEFT JOIN连接employees表与dept_emp表,得到所有员工的last_name和first_name以及对应的dept_no,也包括暂时没有分配部门的员工
2、第二次LEFT JOIN连接上表与departments表,即连接dept_no与dept_name,得到所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
SELECT em.last_name, em.first_name, dp.dept_name
FROM (employees AS em LEFT JOIN dept_emp AS de ON em.emp_no = de.emp_no)
LEFT JOIN departments AS dp ON de.dept_no = dp.dept_no

编辑于 2017-07-13 12:42:09 回复(54)
SELECT
    e.last_name,
    e.first_name,
    T .dept_name
FROM
    employees e
LEFT JOIN dept_emp d ON d.emp_no = e.emp_no
LEFT JOIN departments T ON d.dept_no = T .dept_no
本题有三张表,设计到三表的连接:
   1.首先是员工表employees和部门临时表dept_emp进行连接,获取员工所在的部门编号
           employees e LEFT JOIN dept_emp d ON d.emp_no = e.emp_no
   2.然后在和部门表departments进行连接,获取部门的真实名称dept_name
           LEFT JOIN departments T ON d.dept_no = T .dept_no
发表于 2019-10-28 09:13:32 回复(0)
select e.last_name,e.first_name,d.dept_name from employees as e left join dept_emp as de on e.emp_no=de.emp_no
left join departments as d on d.dept_no=de.dept_no
发表于 2018-03-25 16:32:30 回复(0)
select e.last_name,e.first_name,d.dept_name
from 
employees as e 
left join dept_emp as de on e.emp_no=de.emp_no 
left join departments as d on de.dept_no=d.dept_no;
发表于 2017-07-12 10:57:08 回复(7)
select e.last_name, e.first_name, d.dept_name
from employees e 
left join dept_emp de on e.emp_no = de.emp_no
left join departments d on de.dept_no = d.dept_no;

第一步,将员工表employees与员工-部门关系表dept_emp进行外连接left join,连接条件是员工编号对应,这样得到的连表包含所有的员工信息+对应的部门编号信息(如果员工未分配部门,则按照外连接规则,默认填写null);
第二步,将第一步中得到的连表,与部门信息表departments进行外连接,连接条件是部门编号对应,这样得到的新的连表即包含题目要求的所有记录。
发表于 2019-06-29 17:38:21 回复(5)
solution1:
SELECT em.last_name, em.first_name, 
(SELECT dp.dept_name FROM departments dp INNER JOIN dept_emp d ON dp.dept_no = de.dept_no)
FROM  employees em LEFT OUTER JOIN dept_emp de ON em.emp_no = de.emp_no

solution2.1:
SELECT em.last_name, em.first_name, dp.dept_name
FROM  employees em LEFT OUTER JOIN dept_emp de ON em.emp_no = de.emp_no
LEFT OUTER JOIN departments dp ON dp.dept_no = de.dept_no

solution2.2:
SELECT em.last_name, em.first_name, dp.dept_name
FROM  (employees em LEFT JOIN dept_emp de ON em.emp_no = de.emp_no) AS t
LEFT JOIN departments dp ON dp.dept_no = t.dept_no
通过2.2可以更好地理解2.1:第一条联结语句的结果,继续与 departments 进行联结


发表于 2017-07-15 16:55:49 回复(6)
#注意这里要用两次left join
#第一次是dept_emp和departments,dept_emp为员工部门对应,由于不一定分配了部门,所以应该用left join
#第二次是employees和第一步生成的子表的左连
select last_name,first_name,dept_name
from employees e
left join 
(select dept_name,emp_no from dept_emp de
left join departments d on de.dept_no=d.dept_no) sub_tab
on e.emp_no=sub_tab.emp_no;

发表于 2020-06-06 15:52:40 回复(0)
select e.last_name, e.first_name, dpp.dept_name from employees e left join (select * from dept_emp de left join departments dp on de.dept_no == dp.dept_no) as dpp on e.emp_no == dpp.emp_no;


发表于 2018-07-20 18:36:01 回复(1)
SELECT
    employees.last_name,
    employees.first_name,
    d.dept_name
FROM
    employees
LEFT JOIN (
    SELECT
        departments.dept_name,
        dept_emp.emp_no
    FROM
        departments,
        dept_emp
    WHERE
        departments.dept_no = dept_emp.dept_no
) d ON employees.emp_no = d.emp_no;

发表于 2018-03-09 21:03:12 回复(0)
SELECT
    employees.last_name,
    employees.first_name,
    dept_name
FROM
    employees
LEFT JOIN (
    SELECT
        emp_no,
        dept_name
    FROM
        departments,
        dept_emp
    WHERE
        departments.dept_no = dept_emp.dept_no
) AS temp ON employees.emp_no = temp.emp_no;
发表于 2018-07-08 11:11:11 回复(0)
 select employees.last_name , employees.first_name , temp.dept_name from 
employees
left join
(select departments.dept_name,dept_emp.emp_no from dept_emp inner join departments on departments.dept_no = dept_emp.dept_no) as temp
on employees.emp_no = temp.emp_no
发表于 2017-08-06 08:55:04 回复(0)
三行代码
select last_name, first_name, dept_name 
from employees as e left join dept_emp as d on e.emp_no = d.emp_no
left join departments as de on de.dept_no = d.dept_no

发表于 2021-10-11 15:07:32 回复(0)
select 
    e.last_name,e.first_name,d.dept_name
from 
    employees e
left join 
    dept_emp de 
on 
    e.emp_no = de.emp_no
left join 
    departments d 
on 
    de.dept_no = d.dept_no
这就是三个表:员工表、中间表、部门表
通过员工表关联查询中间表、再通过中间表关联查询部门表即可
发表于 2021-09-27 20:30:21 回复(0)
select last_name,first_name,dept_name
from (
SELECT employees.emp_no,last_name,first_name,dept_emp.dept_no from employees
left join dept_emp
on employees.emp_no=dept_emp.emp_no
) new
left join departments
on departments.dept_no = new.dept_no;
发表于 2021-07-14 11:47:32 回复(0)
再贴一种解法,有需要的童鞋自取

select e.last_name,e.first_name,dp.dept_name
from (departments as dp inner join dept_emp as de on dp.dept_no = de.dept_no)
right join employees as e on e.emp_no = de.emp_no;

发表于 2021-04-02 21:36:53 回复(0)
SELECT e.last_name,e.first_name,dn.dept_name  # 按顺序输出显示列
FROM employees e  # 来自表employees
LEFT JOIN dept_emp d ON e.emp_no = d.emp_no  #  将dept_emp表左连接于employees表
LEFT JOIN departments dn ON d.dept_no = dn.dept_no #departments表左连接于前两张表
发表于 2021-03-10 19:17:43 回复(0)