查询每个部门中入职日期一致的员工信息

INSERT into worker values (10004,‘孙大圣2’,‘1986-02-12’,‘女’,‘2019-06-23’,‘销售部’)
INSERT into worker values (10005,‘孙大圣3’,‘1968-08-12’,‘男’,‘2017-06-23’,‘销售部’)
INSERT into worker values (10006,‘孙大圣4’,‘1988-06-12’,‘女’,‘2014-06-23’,‘销售部’)
INSERT into worker values (10007,‘孙大圣5’,‘1998-07-12’,‘女’,‘2018-06-23’,‘财务部’)
INSERT into worker values (10008,‘孙大圣6’,‘1999-10-12’,‘男’,‘2019-06-23’,‘财务部’)
INSERT into worker values (10009,‘孙大圣7’,‘1988-01-12’,‘女’,‘2014-06-23’,‘财务部’)
INSERT into worker values (100010,‘孙大圣8’,‘1975-08-12’,‘女’,‘2018-06-23’,‘财务部’)
INSERT into worker values (100011,‘孙大圣9’,‘1997-12-12’,‘男’,‘2017-06-23’,‘财务部’)
INSERT into worker values (100012,‘孙大圣10’,‘1997-04-12’,‘男’,‘2017-06-23’,‘行政部’)
INSERT into worker values (100013,‘孙大圣11’,‘1998-05-12’,‘女’,‘2016-06-23’,‘行政部’)
INSERT into worker values (100014,‘孙大圣12’,‘1996-08-12’,‘男’,‘2019-06-23’,‘行政部’)
INSERT into worker values (100015,‘孙大圣13’,‘1997-04-12’,‘女’,‘2018-06-23’,‘行政部’)
INSERT into worker values (100016,‘孙大圣14’,‘1988-08-12’,‘男’,‘2016-06-23’,‘行政部’)
INSERT into worker values (100017,‘孙大圣15’,‘1998-09-12’,‘女’,‘2019-06-23’,‘行政部’)

  1. 使用内连接,查询所有员工的信息
  2. 查询某一员工所在部门的主管信息
  3. 查询销售部大于30岁的员工信息
  4. 查询每个部门中年龄最小的员工
  5. 查询每个部门中入职日期一致的员工信息

1. 使用内连接,查询所有员工的信息

SELECT
	*
FROM
	department,
	worker
WHERE
	department.department = worker.worker_department

在这里插入图片描述

2. 查询某一员工所在部门的主管信息

SELECT
	worker.worker_name,
	department.mangager,
	worker.worker_department
FROM
	department,
	worker
WHERE
	department.department = worker.worker_department

在这里插入图片描述

3. 查询销售部大于30岁的员工信息

SELECT
	*
FROM
	worker w
WHERE
	w.worker_department = '销售部'
HAVING
	w.worker_date < '1992-4-1'

在这里插入图片描述

4. 查询每个部门中年龄最小的员工

方法一:

SELECT
	*
FROM
	worker w
WHERE
	NOT EXISTS (
		SELECT
			1
		FROM
			worker
		WHERE
			worker_department = w.worker_department
		AND worker_date > w.worker_date
	)

– 方法二:

SELECT
	*
FROM
	worker
WHERE
	worker_date IN (
		SELECT
			MAX(worker_date)
		FROM
			worker
		GROUP BY
			worker_department
	)

在这里插入图片描述

5. 查询每个部门中入职日期一致的员工信息

SELECT
	*
FROM
	worker
WHERE
	(
		worker_time,
		worker_department
	) IN (
		SELECT
			worker_time,
			worker_department
		FROM
			worker
		GROUP BY
			worker_department,
			worker_time
		HAVING
			COUNT(*) > 1
	)
ORDER BY
	worker_time

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是十种不同的方法。 方法一:使用子查询和聚合函数 ``` SELECT emp_id, emp_name, dept_id, join_date FROM employee WHERE (dept_id, join_date) IN ( SELECT dept_id, MIN(join_date) FROM employee GROUP BY dept_id ) ``` 该查询使用子查询和聚合函数来查找每个部门的最早入员工。内部子查询用于查找每个部门的最早入日期,然后外部查询使用该日期部门 ID 来获取对应的员工记录。 方法二:使用窗口函数 ``` SELECT emp_id, emp_name, dept_id, join_date FROM ( SELECT emp_id, emp_name, dept_id, join_date, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY join_date) AS rn FROM employee ) t WHERE t.rn = 1 ``` 该查询使用窗口函数 `ROW_NUMBER()` 来为每个部门员工记录分配一个行号,然后筛选每个部门的第一条记录(即最早入员工记录)。 方法三:使用连接查询 ``` SELECT e1.emp_id, e1.emp_name, e1.dept_id, e1.join_date FROM employee e1 LEFT JOIN employee e2 ON e1.dept_id = e2.dept_id AND e1.join_date > e2.join_date WHERE e2.emp_id IS NULL ``` 该查询使用自连接查询,将每个员工与他们所在部门的其他员工进行比较,筛选出每个部门最早入员工记录。具体地,左连接查询每个员工与他们所在部门的其他员工连接起来,然后使用 `WHERE` 子句排除那些存在比他们入更早的其他员工记录的员工记录。 方法四:使用子查询和 `GROUP BY` ``` SELECT emp_id, emp_name, dept_id, join_date FROM employee e1 WHERE join_date = ( SELECT MIN(join_date) FROM employee e2 WHERE e1.dept_id = e2.dept_id ) ``` 该查询使用子查询和 `GROUP BY` 子句来查找每个部门的最早入员工。具体地,内部子查询用于查找每个部门的最早入日期,然后外部查询使用该日期部门 ID 来获取对应的员工记录。 方法五:使用 `DISTINCT ON` ``` SELECT DISTINCT ON (dept_id) emp_id, emp_name, dept_id, join_date FROM employee ORDER BY dept_id, join_date ``` 该查询使用 `DISTINCT ON` 子句来筛选每个部门的最早入员工。具体地,使用 `ORDER BY` 子句将员工记录按照部门 ID 和入日期进行排序,然后使用 `DISTINCT ON` 子句选择每个部门的第一条记录。 方法六:使用 `JOIN` 和子查询 ``` SELECT emp_id, emp_name, dept_id, join_date FROM employee JOIN ( SELECT dept_id, MIN(join_date) AS min_join_date FROM employee GROUP BY dept_id ) t ON employee.dept_id = t.dept_id AND employee.join_date = t.min_join_date ``` 该查询使用 `JOIN` 和子查询来查找每个部门的最早入员工。具体地,内部子查询用于查找每个部门的最早入日期,然后外部查询员工记录与该日期部门 ID 相匹配。 方法七:使用 `MIN` 和 `GROUP BY` ``` SELECT MIN(emp_id) AS emp_id, MIN(emp_name) AS emp_name, dept_id, MIN(join_date) AS join_date FROM employee GROUP BY dept_id ``` 该查询使用 `MIN` 和 `GROUP BY` 子句来查找每个部门的最早入员工。具体地,使用 `MIN` 函数选择每个部门的最早入员工的各个字段,然后使用 `GROUP BY` 子句按照部门 ID 进行分组。 方法八:使用 `NOT EXISTS` ``` SELECT emp_id, emp_name, dept_id, join_date FROM employee e1 WHERE NOT EXISTS ( SELECT 1 FROM employee e2 WHERE e1.dept_id = e2.dept_id AND e2.join_date < e1.join_date ) ``` 该查询使用 `NOT EXISTS` 子查询来查找每个部门的最早入员工。具体地,内部子查询用于查找每个部门是否存在比当前员工更早的员工,如果不存在,则选择该员工记录。 方法九:使用 `ROW_NUMBER()` 和 `PARTITION BY` ``` SELECT emp_id, emp_name, dept_id, join_date FROM ( SELECT emp_id, emp_name, dept_id, join_date, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY join_date) AS rn FROM employee ) t WHERE t.rn = 1 ``` 该查询使用 `ROW_NUMBER()` 和 `PARTITION BY` 子句来为每个部门员工记录分配一个行号,然后筛选每个部门的第一条记录(即最早入员工记录)。 方法十:使用 `LEFT JOIN` 和 `IS NULL` ``` SELECT e1.emp_id, e1.emp_name, e1.dept_id, e1.join_date FROM employee e1 LEFT JOIN employee e2 ON e1.dept_id = e2.dept_id AND e1.join_date > e2.join_date WHERE e2.emp_id IS NULL ``` 该查询使用 `LEFT JOIN` 和 `IS NULL` 子句来查找每个部门的最早入员工。具体地,左连接查询每个员工与他们所在部门的其他员工连接起来,然后使用 `WHERE` 子句排除那些存在比他们入更早的其他员工记录的员工记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值