SQL篇(一)

以下源于编程实战:SQL数据库实战题_面试必刷+解析_牛客题霸_牛客网

描述:有一个员工employees表简况如下。

        有一个各个部门的领导表dept_manager简况如下:

        有一个全部员工的薪水表salaries简况如下: 

        有一个员工职称表titles简况如下:

        有一个部门表departments表简况如下:

SQL1:查找最晚入职员工的所有信息

SELECT *
FROM employees 
WHERE hire_date = 
(SELECT max(hire_date) FROM employees )


##考虑到如果只有一条记录在这一天入职,也可以这么解
select * from employees order by hire_date desc limit 1

SQL2:查找倒数第三晚入职员工的所有信息

窗口函数参考链接:

mysql实现开窗函数、Mysql实现分析函数 - 郭大侠1 - 博客园

MySQL操作实战(二):窗口函数_陆-CSDN博客_mysql窗口函数

# 从0开始计数,第三行的下标即为2
# 1为步长
# 2,1即取第三行
# 存在bug:如果第三名有多个则无法满足
select *
from employees
ORDER BY hire_date DESC
limit 2,1


# distinct解法
SELECT * 
FROM employees
WHERE hire_date = (SELECT DISTINCT hire_date 
                   FROM employees 
                   ORDER BY hire_date
                   DESC LIMIT 2,1)


# 窗口函数解法
SELECT emp_no,birth_date,first_name,last_name,gender,hire_date 
FROM (
    SELECT *, DENSE_RANK() OVER (ORDER BY hire_date DESC) as row_num
    FROM employees
) tmp
WHERE row_num = 3

SQL3:查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序

SELECT s.*, d.dept_no
FROM salaries s JOIN dept_manager d ON s.emp_no = d.emp_no
ORDER BY s.emp_no

SQL4:找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示

select last_name, first_name, dept_no
from employees e join dept_emp d ON e.emp_no = d.emp_no

SQL5:查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工

SELECT last_name, first_name, dept_no
FROM employees e LEFT JOIN dept_emp d ON e.emp_no = d.emp_no 

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

SELECT emp_no, COUNT(1) t
FROM salaries
GROUP BY emp_no
HAVING t > 15

SQL8:找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示

SELECT DISTINCT salary
FROM salaries
ORDER BY salary DESC

SQL10:找出所有非部门领导的员工emp_no

SELECT emp_no
FROM employees
WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager)

SQL11:获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示

SE
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值