📜  SQL 面试问题 |设置 1

📅  最后修改于: 2021-09-09 11:50:35             🧑  作者: Mango

Que-1:阻塞和死锁的区别。

  • 阻塞:
    阻塞发生是一个事务试图在另一个事务已经锁定的资源上获取不兼容的锁。被阻塞的事务一直被阻塞,直到阻塞事务释放锁。
  • 死锁:
    当两个或多个事务锁定了一个资源,并且每个事务请求锁定另一个事务已经锁定的资源时,就会发生死锁。这里的任何一个事务都不能向前推进,因为每个事务都在等待另一个释放锁。

Que-2:从表中删除重复数据,只有第一个数据保持不变。

经理 –

Id Name Salary
1 Harpreet 20000
2 Ravi 30000
3 Vinay 10000
4 Ravi 30000
5 Harpreet 20000
6 Vinay 10000
7 Rajeev 40000
8 Vinay 10000
9 Ravi 30000
10 Sanjay 50000

询问 –

DELETE M1 
From managers M1, managers M2 
Where M2.Name = M1.Name AND M1.Id>M2.Id; 

输出 –

Id Name Salary
1 Harpreet 20000
2 Ravi 30000
3 Vinay 10000
7 Rajeev 40000 10 Sanjay 50000

问题 3:查找员工姓名。

查找员工的姓名,其中表中给出了名字、名字和姓氏。缺少某些姓名,例如名字、第二名,并且可能是姓氏。这里我们将使用 COALESCE()函数,它将返回第一个非空值。

雇员 –

ID FName SName LName Salary
1 Har preet Singh 30000
2 Ashu NULL Rana 50000
3 NULL Vinay Thakur 40000
4 NULL Vinay NULL 10000
5 NULL NULL Rajveer 60000
6 Manjeet Singh NULL 60000

询问 –

SELECT ID, COALESCE(FName, SName, LName) as Name 
FROM employees; 

输出 –

Que-4:找出最近 n 个月内雇佣的员工。

查找在过去 n 个月内被雇用的员工。在这里,我们通过使用 TIMESTAMPDIFF() mysql函数来获得期望的输出。

雇员 –

ID FName LName Gender Salary Hiredate
1 Rajveer Singh Male 30000 2017/11/05
2 Manveer Singh Male 50000 2017/11/05
3 Ashutosh Kumar Male 40000 2017/12/12
4 Ankita Sharma Female 45000 2017/12/15
5 Vijay Kumar Male 50000 2018/01/12
6 Dilip Yadav Male 25000 2018/02/26
7 Jayvijay Singh Male 30000 2018/02/18
8 Reenu Kumari Female 40000 2017/09/19
9 Ankit Verma Male 25000 2018/04/04
10 Harpreet Singh Male 50000 2017/10/10

询问 –

Select *, TIMESTAMPDIFF (month, Hiredate, current_date()) as DiffMonth 
From employees
Where TIMESTAMPDIFF (month, Hiredate, current_date()) 
Between 1 and 5 Order by Hiredate desc; 

注意 –在查询 1 和 5 中,这里表示 1 到 n 个月,显示最近 1 到 5 个月雇用的员工。在这个查询中,DiffMonth 是我们理解的额外列,它显示了第 N 个月。

输出 –

Que-5:找出最近 n 天内雇佣的员工。

查找在过去 n 天内被雇用的员工。在这里,我们通过使用 DATEDIFF() mysql函数获得期望输出。


雇员 –

ID FName LName Gender Salary Hiredate
1 Rajveer Singh Male 30000 2017/11/05
2 Manveer Singh Male 50000 2017/11/05
3 Ashutosh Kumar Male 40000 2017/12/12
4 Ankita Sharma Female 45000 2017/12/15
5 Vijay Kumar Male 50000 2018/01/12
6 Dilip Yadav Male 25000 2018/02/26
7 Jayvijay Singh Male 30000 2018/02/18
8 Reenu Kumari Female 40000 2017/09/19
9 Ankit Verma Male 25000 2018/04/04
10 Harpreet Singh Male 50000 2017/10/10

询问 –

Select *, DATEDIFF (current_date(), Hiredate) as DiffDay 
From employees
Where DATEDIFF (current_date(), Hiredate) between 1 and 100 order by Hiredate desc; 

注意 –在查询 1 和 100 中,这里表示 1 到 n 天。显示最近 1 到 100 天雇用的员工。在这个查询中,DiffDay 是我们理解的额外列,它显示了第 N 天。

输出 –

Que-6:找出最近 n 年雇佣的员工。

查找在过去 n 年中被雇用的员工。在这里,我们通过使用 TIMESTAMPDIFF() mysql函数来获得期望的输出。

雇员 –

ID FName LName Gender Salary Hiredate
1 Rajveer Singh Male 30000 2010/11/05
2 Manveer Singh Male 50000 2017/11/05
3 Ashutosh Kumar Male 40000 2015/12/12
4 Ankita Sharma Female 45000 2016/12/15
5 Vijay Kumar Male 50000 2017/01/12
6 Dilip Yadav Male 25000 2011/02/26
7 Jayvijay Singh Male 30000 2012/02/18
8 Reenu Kumari Female 40000 2013/09/19
9 Ankit Verma Male 25000 2017/04/04
10 Harpreet Singh Male 50000 2017/10/10

询问 –

Select *, TIMESTAMPDIFF (year, Hiredate, current_date()) as DiffYear 
From employees
Where TIMESTAMPDIFF (year, Hiredate, current_date()) between 1 and 4 order by Hiredate desc; 

注意 –在查询 1 和 4 中,这里表示 1 到 n 年。它显示了过去 1 到 4 年雇用的员工。在这个查询中 DiffYear 是我们理解的额外列,它显示了第 N 年。

输出 –

Que-7:选择所有以给定字母开头的名字。

在这里,我们通过使用三个不同的查询来获得欲望输出。

雇员 –

ID FName LName Gender Salary Hiredate
1 Rajveer Singh Male 30000 2010/11/05
2 Manveer Singh Male 50000 2017/11/05
3 Ashutosh Kumar Male 40000 2015/12/12
4 Ankita Sharma Female 45000 2016/12/15
5 Vijay Kumar Male 50000 2017/01/12
6 Dilip Yadav Male 25000 2011/02/26
7 Jayvijay Singh Male 30000 2012/02/18
8 Reenu Kumari Female 40000 2013/09/19
9 Ankit Verma Male 25000 2017/04/04
10 Harpreet Singh Male 50000 2017/10/10

询问 –

Select *
From employees 
Where Fname like 'A%';

Select *
From employees 
Where left(FName, 1)='A';

Select *
From employees 
Where substring(FName, 1, 1)='A'; 

注意 –这里每个查询都会给出相同的输出,并且 FName 以字母 A 开头的员工列表。

参考 – SQL 面试问题 | 2套