您的位置:首页 > 数据库

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

2017-12-31 11:32 399 查看
题目地址

题目描述

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

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`));


解法

select e.last_name,e.first_name,d.dept_no
from employees as e
inner join dept_emp as d
on e.emp_no = d.emp_no


知识补充

上述的查询方式是
等值联结
查询。一般用于查询的列来自于不同的表,表与表之间用某个键值关联。

1.为什么这样设计关系表

如果把部门信息都存放在雇员表中

每个雇员属于一个部门,每个部门会有N多个部员,会造成大量的数据冗余

当部门信息发生改变的时候,需要修改表中所有与这个部门有关的记录

在雇员表中大量重复出现相同部门信息,很难保证每次输入信息的格式和内容相同,导致数据不一致性

设计成两张表

修改部门信息只需要修改部门表

只通过部门编号和雇员表关联减少数据冗余

查询信息的时候通过联结查询

这样设计提高了可升缩性

注意

上面的代码可以写成下面用where字句

select e.last_name,e.first_name,d.dept_no
from employees as e,dept_emp as d
where e.emp_no = d.emp_no


使用的时候要注明合适的where条件和on条件,不然返回的笛卡尔积会有许多不必要的数据降低性能。一遍等值联结的条件就是相等的键值(外键,主键)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  牛客数据库
相关文章推荐