有一个员工表,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 Christian Koblick M 1986-12-01 有一个部门表,dept_emp简况如下: emp_no dept_no from_date to_date 10001 d001 1986-06-26 9999-01-01 10002 d002 1989-08-03 9999-01-01 请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工,以上例子如下: last_name first_name dept_no Facello Georgi d001 Simmel Bezalel d002 Bamford Parto NULL Koblick Chirstian NULL
时间: 2023-06-12 13:05:44 浏览: 175
可以使用左连接(LEFT JOIN)来查找所有已经分配部门的员工的last_name和first_name以及dept_no,以及暂时没有分配具体部门的员工的last_name和first_name和NULL值的dept_no。具体SQL语句如下:
SELECT employees.last_name, employees.first_name, dept_emp.dept_no
FROM employees
LEFT JOIN dept_emp ON employees.emp_no = dept_emp.emp_no;
其中,LEFT JOIN表示左连接,即以employees表为主表,将dept_emp表按照emp_no字段与之关联起来;employees.last_name和employees.first_name表示要查询的员工的姓和名;dept_emp.dept_no表示要查询的部门编号,可能为NULL值。
相关问题
有一个员工表employees简况如下: emp_no birth_date first_name last_name gender hire_date 10001 1953-09-02 Georgi Facello M 2001-06-22 10002 1964-06-02 Bezalel Simmel F 1999-08-03 有一个薪水表salaries简况如下: emp_no salary from_date to_date 10001 85097 2001-06-22 2002-06-22 10001 88958 2002-06-22 9999-01-01 10002 72527 1999-08-03 2000-08-02 10002 72527 2000-08-02 2001-08-02 请你查找在职员工自入职以来的薪水涨幅情况,给出在职员工编号emp_no以及其对应的薪水涨幅growth
可以通过联结两个表,计算每名员工的薪水涨幅情况。
SQL查询语句如下:
```
SELECT e.emp_no, (s.salary - s_prev.salary) AS growth
FROM employees e
JOIN salaries s ON e.emp_no = s.emp_no
JOIN salaries s_prev ON s.emp_no = s_prev.emp_no
AND s.from_date > s_prev.to_date
AND s_prev.to_date = (
SELECT MAX(to_date)
FROM salaries
WHERE emp_no = s.emp_no
AND to_date < s.from_date
)
WHERE s.to_date = '9999-01-01'
```
解释:
首先,我们联结了两个薪水表,使用了自连接,并且使用了子查询来获取员工上一次薪水记录的to_date,这是为了计算薪水涨幅。
然后,我们筛选出在职员工,即薪水表中to_date为9999-01-01的员工。
最后,我们计算每个员工的薪水涨幅,并且返回员工编号和涨幅。
有一个员工表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 有一个部门领导表dept_manager简况如下: dept_no emp_no from_date to_date d001 10002 1996-08-03 9999-01-01 d002 10003 1990-08-05 9999-01-01 请你找出所有非部门领导的员工emp_no,以上例子输出: emp_no 10001
可以使用左连接(LEFT JOIN)和空值判断来找出非部门领导的员工emp_no。具体SQL语句如下:
```sql
SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager dm
ON e.emp_no = dm.emp_no
WHERE dm.emp_no IS NULL
```
解释一下:LEFT JOIN会保留左表(即employees表)中所有记录,如果右表(即dept_manager表)中没有匹配的记录,则右表中的列会被填充空值。我们利用WHERE子句过滤掉右表中有记录的员工,只保留没有记录的员工,即非部门领导的员工。
阅读全文