📜  SQL 面试问题 | 2套

📅  最后修改于: 2021-09-09 11:49:21             🧑  作者: Mango

  1. 锁定、阻塞和死锁的区别
    • 锁定:当连接需要访问数据库中的一段数据时,就会发生锁定,并且它会锁定它以用于某些用途,以便其他事务无法访问它。
    • 阻塞:当一个事务试图在另一个事务已经锁定的资源上获取一个不兼容的锁时,就会发生阻塞。被阻塞的事务一直被阻塞,直到阻塞事务释放锁。
    • 死锁:当两个或多个事务锁定了一个资源,并且每个事务请求锁定另一个事务已经锁定的资源时,就会发生死锁。这里的两个事务都不能继续前进,因为每个事务都在等待另一个释放锁。
  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;
    

    输出:

  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 个月。

    输出:

  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 天。

    输出:

  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 年。

    输出:

  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 开头的员工列表。

相关文章 :

  1. SQL 面试问题 |设置 1
  2. DBMS 常见问题集 1
  3. DBMS 常见问题集 2