41 Essential SQL 面试问题 *

最好的SQL开发人员和工程师可以回答的全面来源的基本问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.

Hire a Top SQL Developer Now
Toptal标志是顶级自由软件开发人员的专属网络吗, designers, 金融专家, 产品经理, and project managers in the world. 顶级公司雇佣Toptal自由职业者来完成他们最重要的项目.

面试问题

1.

What does UNION do? 是什么? difference between UNION and UNION ALL?

查看答案

UNION 将两个结构兼容的表的内容合并为一个合并表. 两者的区别 UNION and UNION ALL is that UNION will omit duplicate records whereas UNION ALL will include duplicate records.

值得注意的是,的性能 UNION ALL will typically be better than UNION, since UNION 要求服务器执行删除任何重复项的额外工作. So, 在确定不会有任何重复的情况下, 或者有副本不是问题的地方, use of UNION ALL 会因为性能原因而被推荐吗.

2.

列出并解释不同类型的 JOIN clauses supported in ANSI-standard SQL.

查看答案

ansi标准SQL指定了五种类型 JOIN 条款如下:

  • 内连接 (a.k.a. " simple join "):返回两个表中至少有一个匹配的所有行. 如果没有指定,这是默认的连接类型 JOIN 指定类型.

  • LEFT JOIN (or 左外连接): Returns all rows from the left table, and the matched rows from the right table; i.e.,结果将包含 all 从左表中删除记录,即使 JOIN 条件在正确的表中找不到任何匹配的记录. 这意味着如果 ON 子句与正确表中的任何记录都不匹配 JOIN 仍然会返回一行的结果为记录在左表, 但是右表的每一列都为NULL.

  • RIGHT JOIN (or 右外连接):返回右表中的所有行,以及左表中匹配的行. This is the exact opposite of a LEFT JOIN; i.e.,结果将包含 all 从右表中获取记录,即使 JOIN 条件在左表中找不到任何匹配的记录. 这意味着如果 ON 子句与左表中的任何记录都不匹配 JOIN 仍然会返回一行的结果为记录在正确的表, 但是左表中的每一列都为NULL.

  • FULL JOIN (or 全外连接):返回在任意一个表中有匹配的所有行. 从概念上讲,一个 FULL JOIN 结合了两者的作用 LEFT JOIN and a RIGHT JOIN; i.e.,其结果集等价于执行a UNION 左外部查询和右外部查询结果的.

  • CROSS JOIN:返回第一个表中的每一行与第二个表中的每一行组合在一起的所有记录(i.e.,返回连接表中行集的笛卡尔积). 请注意 CROSS JOIN can either be specified using the CROSS JOIN 语法(“显式连接表示法”)或(b)列出 FROM 用逗号分隔的子句,不使用 WHERE 子句提供连接标准(“隐式连接符号”).

3.

Given the following tables:

sql> SELECT * FROM runners;
+----+--------------+
| id | name |
+----+--------------+
[1]约翰·多伊
[2]简·多伊
爱丽丝·琼斯
鲍比·路易斯
莉萨·罗梅罗
+----+--------------+

sql> SELECT * FROM races;
+----+----------------+-----------+
| id | event          | winner_id |
+----+----------------+-----------+
|  1 | 100 meter dash |  2        |
|  2 | 500 meter dash |  3        |
|  3 | cross-country  |  2        |
|  4 | triathalon     |  NULL     |
+----+----------------+-----------+

下面的查询结果是什么?

SELECT winner_id FROM races

解释您的答案,并提供该查询的替代版本,以避免它暴露的问题.

查看答案

令人惊讶的是,给定所提供的样例数据,该查询的结果将是一个空集. 这样做的原因如下:如果集合由 SQL NOT IN 条件包含 any 为空的值, 那么这里的外部查询将返回一个空集合, 即使有许多跑步者id与winner_id匹配 races table.

知道了这一点,可以避免这个问题的查询如下:

从winner_id不为空的比赛中查询winner_id。

注意,这是假设您在不修改默认值的情况下获得标准SQL行为 ANSI_NULLS setting.

申请加入Toptal的发展网络

and enjoy reliable, steady, remote 自由SQL开发人员 Jobs

申请成为自由职业者
4.

给定两个表创建和填充如下:

创建表dbo.envelope(id int, user_id int);
创建表dbo.文档(idnum int, pageseq int, doctext varchar(100));

插入dbo.信封的价值观
  (1,1),
  (2,2),
  (3,3);

插入dbo.文档(idnum pageseq)值
  (1,5),
  (2,6),
  (null,0);

下面的查询结果是什么?

更新文档设置doctext=pageseq从文档内部连接信封上的信封.id=docs.idnum
哪里存在(
  SELECT 1 FROM dbo.docs
  在id =信封.id
);

解释你的答案.

查看答案

查询的结果如下:

Idnum pageseq doctext
1      5        5
2      6        6
0 0 0

The EXISTS 子句中的上述查询是转移注意力. It will always 是真的 ID is not 的成员 dbo.docs. As such, it will refer to the envelope table comparing itself to itself!

The idnum value of NULL will not be set since the join of NULL 当尝试匹配任何值时,将不返回结果 envelope.

5.

假设模式为 Emp (Id, Name, DeptId), Dept (Id, Name).

If there are 10 records in the Emp 表和5条记录中的 Dept 下面的SQL查询的结果将显示多少行:

选择*从Emp,部门

解释你的答案.

查看答案

该查询将以“笛卡尔积”或“交叉连接”的形式生成50行。, 当省略' where '子句时,哪个是默认值.

6.

Given two tables created as follows

create table test_a(id numeric);

create table test_b(id numeric);

insert into test_a(id) values
  (10),
  (20),
  (30),
  (40),
  (50);

insert into test_b(id) values
  (10),
  (30),
  (50);

编写一个查询来获取表中的值 test_a 那是和不在 test_b without 使用NOT关键字.

注意,Oracle不支持上述操作 INSERT 语法,所以你需要这样做:

insert into test_a(id) values (10);
insert into test_a(id) values (20);
insert into test_a(id) values (30);
insert into test_a(id) values (40);
insert into test_a(id) values (50);
insert into test_b(id) values (10);
insert into test_b(id) values (30);
insert into test_b(id) values (50);
查看答案

在SQL Server, PostgreSQL和SQLite中,可以使用 except 关键词如下:

从test_a中选择*
except
Select * from test_b;

在Oracle中, minus 用关键字代替. 注意,如果有多个列, 说ID和Name, 该列应该在Oracle查询中明确声明: Select ID from test_a - Select ID from test_b

MySQL不支持 except function. 然而,有一个标准的SQL解决方案适用于所有上述引擎,包括MySQL:

select a.id
从test_a a
左连接test_b b在a上.id = b.id
where b.Id为空;
7.

编写一个SQL查询,从一个列表中查找工资排名第十的员工 Employee table. 解释你的答案.

(注意:您可以假设在列表中至少有10条记录 Employee table.)

查看答案

This can be done as follows:

SELECT TOP (1) Salary FROM
(
    从员工薪水排序中选择不同的最高(10)薪水
)按薪水排序

其工作原理如下:

首先, 从员工薪水排序中选择不同的最高(10)薪水 查询将选择表中排名前10位的受薪员工. 不过,这些薪水会列在 descending order. 这是第一个查询工作所必需的, 但是现在从列表中选择最上面的1会给你 highest 薪水不是 10日最高 salary.

因此,第二个查询将对中的10条记录重新排序 ascending 顺序(默认排序顺序)和 then 选择最高的记录(现在将是这10个工资中最低的).

Not all databases support the TOP keyword. 例如,MySQL和PostreSQL使用 LIMIT 关键字如下:

选择薪金
(
    根据薪资DESC上限10从员工订单中选择不同的薪资
)按薪水排序 LIMIT 1;

或者更简洁地说,在MySQL中可以是:

从员工订单中查询不同的薪水

And in PostgreSQL this can be:

从员工订单中选择不同的工资,按工资DESC限制1 OFFSET 9;
8.

编写一个SQL查询 UNION ALL (not UNION),使用 WHERE clause to eliminate duplicates. Why might you want to do this?

查看答案

You can avoid duplicates using UNION ALL and still run much faster than 结合不同的 (这实际上与UNION相同)通过运行这样的查询:

SELECT * FROM mytable WHERE b=Y AND a!=X

关键是 AND a!=X part. This gives you the benefits of the UNION (a.k.a., 结合不同的)命令,同时避免了大部分性能损失.

9.

Given the following tables:

SELECT * FROM users;

user_id用户名
1约翰·多伊                                                                                            
2简·唐                                                                                            
3爱丽丝·琼斯                                                                                         
4丽莎·罗梅罗

SELECT * FROM training_details;

User_training_id user_id training_id training_date
1                 1        1            "2015-08-02"
2                 2        1            "2015-08-03"
3                 3        2            "2015-08-02"
4                 4        2            "2015-08-04"
5                 2        2            "2015-08-03"
6                 1        1            "2015-08-02"
7                 3        2            "2015-08-04"
8                 4        3            "2015-08-03"
9                 1        4            "2015-08-03"
10                3        1            "2015-08-02"
11                4        2            "2015-08-04"
12                3        2            "2015-08-02"
13                1        1            "2015-08-02"
14                4        3            "2015-08-03"

编写一个查询来获取在同一天内多次参加培训课程的用户列表, grouped by user and training lesson, 从最近的课程日期到最老的日期.

查看答案
SELECT
      u.user_id,
      username,
      training_id,
      training_date,
      count( user_training_id ) AS count
  FROM users u JOIN training_details t ON t.User_id = u.user_id
  分组.user_id,
           username,
           training_id,
           training_date
  HAVING count( user_training_id ) > 1
  ORDER BY training_date DESC;
User_id username training_id training_date计数
4莉萨·罗梅罗2015年8月2日00:00:00
4莉萨·罗梅罗2015年8月3日00:00:00
1无名氏2015年8月1日00:00:00
3爱丽丝·琼斯2015年8月2日00:00:00
10.

什么是执行计划? 你什么时候用它? How would you view the execution plan?

查看答案

执行计划基本上是一个路线图,它以图形或文本方式显示SQL服务器的查询优化器为存储过程或临时查询选择的数据检索方法. 执行计划对于帮助开发人员理解和分析查询或存储过程的性能特征非常有用, 因为计划用于执行查询或存储过程.

在许多SQL系统中,文本执行计划可以使用关键字获得,例如 EXPLAIN,并且通常也可以获得视觉表示. 在Microsoft SQL Server中, 查询分析器有一个名为“显示执行计划”的选项(位于查询下拉菜单上). If this option is turned on, 当查询运行时,它将在一个单独的窗口中显示查询执行计划.

11.

列出并解释共同保证数据库事务可靠处理的每个ACID属性.

查看答案

ACID(原子性、一致性、隔离性、持久性) 一组保证数据库事务得到可靠处理的属性. They are defined as follows:

  • Atomicity. 原子性要求每个事务是“全或无”:如果事务的一部分失败, the entire transaction fails, 数据库状态保持不变. 原子系统必须保证在每种情况下都具有原子性, 包括电力故障, errors, 和崩溃.
  • 一致性. 一致性属性确保任何事务都将数据库从一种有效状态带到另一种有效状态. 根据所有定义的规则,写入数据库的任何数据都必须是有效的, 包括约束, cascades, triggers, and any combination thereof.
  • Isolation. 隔离属性确保事务的并发执行将导致如果事务串行执行将获得的系统状态, i.e.,一个接一个. 提供隔离是并发控制的主要目标. 根据并发控制方法(i.e. 如果它使用严格的(而不是宽松的)序列化性), 不完整事务的影响甚至可能对另一个事务不可见.
  • Durability. 持久性意味着一旦事务被提交, 它将一直如此, even in the event of power loss, crashes, or errors. 在关系数据库中, 例如, 一旦一组SQL语句执行, 结果需要永久存储(即使数据库随后立即崩溃)。. To defend against power loss, 事务(或其影响)必须记录在非易失性存储器中.
12.

给定一张桌子 dbo.users 这里是列 user_id 是唯一的数字标识符,如何高效地选择前100个奇数 user_id 表中的值?

(假设该表包含超过100条带有奇数的记录 user_id values.)

查看答案

SELECT TOP 100 user_id FROM dbo.WHERE user_id % 2 = 1

13.

是什么? NVL and the NVL2 SQL中的函数? 它们有什么不同??

查看答案

Both the NVL (exp1 exp2) and NVL2(exp1, exp2, exp3) 函数检查值 exp1 看看它是否为空.

With the NVL (exp1 exp2) 功能,如果 exp1 is not 的值为空 exp1 返回; otherwise, the value of exp2 返回,但大小写与的数据类型相同 exp1.

With the NVL2(exp1, exp2, exp3) 功能,如果 exp1 is not null, then exp2 返回; otherwise, the value of exp3 返回.

14.

如何从表中选择所有偶数记录? 所有的奇数记录?

查看答案

选择所有 even number records from a table:

Select * from table where id % 2 = 0 

选择所有 odd number records from a table:

Select * from table where id % 2 != 0
15.

是什么? 两者的区别 RANK() and DENSE_RANK () functions? 提供一个示例.

查看答案

The only 两者的区别 RANK() and DENSE_RANK () functions is in cases where there is a “tie”; i.e.,在一个集合中的多个值具有相同排名的情况下. 在这种情况下, RANK() 将为集合中的值分配非连续的“排名”(当存在平局时,将导致整数排名值之间的差距), whereas DENSE_RANK () 将为集合中的值分配连续的排名(因此在平局的情况下,整数排名值之间不会有差距).

For example, consider the set {25, 25, 50, 75, 75, 100}. 对于这样一个集合, RANK() 将返回 {1, 1, 3, 4, 4, 6} (注意,跳过了值2和5),而 DENSE_RANK () 将返回 {1,1,2,3,3,4}.

16.

是什么? 两者的区别 WHERE and HAVING clauses?

查看答案

When GROUP BY 是不使用的, WHERE and HAVING clauses are essentially equivalent.

然而,当 GROUP BY is used:

  • The WHERE 子句用于从结果中筛选记录. 筛选在进行任何分组之前进行.
  • The HAVING 子句用于从组(例如.e.,以检查聚合到组后的条件)。.
17.

给定一张桌子 Employee 在列 empName and empId,下面的SQL查询的结果是什么?

从员工订单中查询员工姓名
查看答案

“Order by 2”只有在select语句中至少有两列被使用时才有效. 然而,在这个查询中,即使 Employee 表有2列, 查询只选择了1个列名, 因此,“Order by 2”将导致语句在执行上述sql查询时抛出错误.

18.

假设Employee表有10条记录,下面查询的输出将是什么?

开始TRAN
截断表雇员
ROLLBACK
SELECT * 从员工s
查看答案

This query 将返回 10 records as TRUNCATE was executed in the transaction. TRUNCATE does not itself keep a log but 开始事务 跟踪 TRUNCATE command.

19.
  1. 单行函数和多行函数有什么区别?
  2. 是什么? group by 用于…的从句?
查看答案
  1. 单行函数一次只处理一行. 多行函数一次处理多行数据.
  2. The group by 子句组合在特定字段或任何字段组中具有相同值的所有记录.
20.

假设表中有一个列,填充的是一个数字(0-9)或一个字符(a-z), A-Z). 编写一个SQL查询,为该列中的所有值打印数字值' Fizz '或字母值' Buzz '.

Example:

['d', 'x', 'T', 8, 'a', 9, 6, 2, 'V']

…应该输出:

[“嗡嗡声”,“嗡嗡声”,“嗡嗡声”,“饮料”,“嗡嗡声”,“饮料”,“饮料”,“饮料”,“嗡嗡”)

查看答案
SELECT col, case when upper(col) = lower(col) then 'Fizz' else 'Buzz' end as FizzBuzz from table;
21.

是什么? difference between char and varchar2?

查看答案

当存储在数据库中时, varchar2 uses only the allocated space. E.g. 如果你有 varchar2 (1999) 在表中放入50个字节,它将使用52个字节.

But when stored in a database, char 总是使用最大长度并填充空白. E.g. 如果你有 char(1999) 在表中放入50个字节,它将消耗2000个字节.

22.

编写一个SQL查询来显示文本 CAPONE as:

C
A
P
O
N
E 

或者换句话说,是一个转换文本的SQL查询.

查看答案
Declare @a nvarchar(100)='capone';
声明@length INT;
声明@i INT=1;
设置@lenght = LEN (@a)
while @i<=@length
BEGIN
print (substring (@a @i 1));
设置@i = @i + 1;
END

在Oracle SQL中,可以这样做:

SELECT SUBSTR('CAPONE', LEVEL, 1)
FROM DUAL CONNECT BY LEVEL <= LENGTH('CAPONE');
23.

我们可以隐式地为标识列插入一行吗?

查看答案

是的,像这样:

SET IDENTITY_INSERT TABLE1 ON

INSERT INTO TABLE1 (ID,NAME)
SELECT ID,NAME FROM TEMPTB1

将identity_insert设置为关闭
24.

给出这个表格:

Testdb=# Select * FROM "Test"."EMP";

 ID
----
  1
  2
  3
  4
  5
(5 rows)

下面代码片段的输出是什么?

从“Test”中选择SUM(1)."EMP";
从“Test”中选择SUM(2)."EMP";
从“Test”中选择SUM(3)."EMP";
查看答案
5
10
15
25.

表格如下:

IDC1C2C3
1RedYellowBlue
2NULLRedGreen
3YellowNULLViolet

打印列C1、C2或C3中具有“黄色”的行,但不使用 OR.

查看答案
SELECT * FROM表
WHERE 'Yellow' IN (C1, C2, C3)
26.

Write a query to insert/update Col2’s values to look exactly opposite to Col1’s values.

Col1Col2
10
01
01
01
10
01
10
10
查看答案
更新表设置col2 = case,当col1 = 1,则0,否则1结束

或者如果类型是数字:

update table set col2 = 1 - col1
27.

你怎么得到最后一个 id 没有 max function?

查看答案

In MySQL:

从表中按id desc limit 1顺序选择id

在SQL Server:

按id desc顺序从表中选择top 1 id
28.

是什么? difference between IN and EXISTS?

查看答案

IN:

  • 在列表结果集上工作
  • 不适用于产生多列虚拟表的子查询
  • 比较结果列表中的每个值
  • 对于较大的子查询结果集,性能相对较慢

EXISTS:

  • 在虚拟表上工作
  • Is used with co-related queries
  • Exits comparison when match is found
  • 对于较大的子查询结果集,性能相对较快
29.

假设在一个表中有7条记录.

The column is an identity column.

现在客户端想要在标识值之后插入一条记录 7 with its identity value starting from 10.

有可能吗?? If so, how? 如果没有,为什么没有呢?

查看答案

是的,这是可能的,使用DBCC命令:

创建表
(id int identity;
 名字nvarchar (50)
)
insert into tableA values ('ram')
insert into tableA values ('rahim')
insert into tableA values ('roja')
insert into tableA values ('rahman')
insert into tableA values ('rani')
insert into tableA values ('raja')
insert into tableA values ('raga')
select * From tableA
DBCC CHECKIDENT(tableA,RESEED,9)
insert into tableA values ('roli')
insert into tableA values ('rosy')
insert into tableA values ('raka')
insert into tableA values ('rahul')
insert into tableA values ('rihan')
insert into tableA values ('bala')
insert into tableA values ('gala')
30.

如何使用CTE返回第五高(或? Nth highest) salary from a table?

查看答案
声明@N int
set @N = 5;
以cte为例
(
    查询姓名,薪水,工作编号, RN = ROW_NUMBER() 
	OVER (ORDER BY Salary DESC)
    从员工
)
查询姓名,薪水,工作编号
FROM CTE
其中rn = @n
31.

Given the following table named A:

  x
------
  2
 -2
  4
 -4
 -3    
  0
  2

编写一个查询来计算所有正数的和 x and he sum of all negative values of x.

查看答案
select sum(case when x>0 then x else 0 end)sum_pos,sum(case when x<0 then x else 0 end)sum_neg from a;
32.

给定表格 mass_table:

weight
5.67
34.567
365.253
34

编写一个查询,产生如下输出:

weightkggms
5.67567
34.56734567
365.253365253
34340
查看答案
选择weight, trunc(weight)为kg, nvl(substr(weight - trunc(weight), 2), 0)为GMS
从mass_table;
33.

考虑到 Employee 下表.

Emp_IdEmp_nameSalaryManager_Id
10Anil5000018
11Vikas7500016
12Nisha4000018
13Nidhi6000017
14Priya8000018
15Mohit4500018
16Rajesh90000
17Raman5500016
18Santosh6500017

编写一个查询生成如下输出:

Manager_IdManagerAverage_Salary_Under_Manager
16Rajesh65000
17Raman62500
18Santosh53750
查看答案
select b.emp_id为“Manager_Id”,
          b.emp_name为“Manager”, 
          avg(a.作为“Average_Salary_Under_Manager”
从雇员a, 
     Employee b
where a.Manager_id = b.emp_id
group by b.emp_id, b.emp_name
order by b.emp_id;
34.

如何将数据从一个表复制到另一个表 ?

查看答案
INSERT INTO table2 (column1, column2, column3) ...)
SELECT column1, column2, column3, ...
从表1
条件;
35.

找出下面等于以下内容的SQL语句: SELECT name FROM customer WHERE state = 'VA';

  1. SELECT name IN customer WHERE state IN ('VA');
  2. SELECT name IN customer WHERE state = 'VA';
  3. SELECT name IN customer WHERE state = 'V';
  4. SELECT name FROM customer WHERE state IN ('VA');
查看答案
  1. SELECT name FROM customer WHERE state IN ('VA');
36.

给定Customers表的这些内容:

Id	Name			ReferredBy
1	John Doe		NULL
2	Jane Smith		NULL
3	安妮·詹金斯		2
4	埃里克·布兰福德		NULL
5	帕特理查兹		1
6	爱丽丝巴恩斯		2

下面是一个用来返回Jane Smith未提及的客户列表的查询:

SELECT Name 从客户s WHERE ReferredBy <> 2;

What will be the result of the query? Why? 什么是更好的写法呢?

查看答案

虽然有4个客户不是Jane Smith推荐的(包括Jane Smith自己), 查询将只返回一个:帕特理查兹. 没有人引用的所有客户(因此在ReferredBy列中为NULL)都不会出现. 但这些顾客肯定不是简·史密斯介绍的, and certainly NULL is not equal to 2, 那为什么他们没有出现呢?

SQL Server uses three-valued logic, 对于习惯于大多数编程语言使用的更令人满意的两值逻辑(TRUE或FALSE)的程序员来说,这可能会很麻烦. 在大多数语言中, if you were presented with two predicates: ReferredBy = 2 and ReferredBy <> 2, 你会期望其中一个为真,另一个为假, given the same value of ReferredBy. 在SQL Server中, however, 如果ReferredBy为NULL, 它们都不是真的,也都不是假的. 任何与NULL比较的值都是三值逻辑中的第三个值:UNKNOWN.

该查询应该以以下两种方式之一编写:

SELECT Name 从客户s WHERE ReferredBy IS NULL OR ReferredBy <> 2

…or:

SELECT Name 从客户s WHERE ISNULL(ReferredBy, 0) <> 2; -- (Or COALESCE() )

Watch out for the following, though!

SELECT Name 从客户s WHERE ReferredBy = NULL OR ReferredBy <> 2

这将返回与原来相同的故障集. Why? 我们已经介绍了这一点:任何与NULL比较的结果都是三值逻辑中的第三个值:UNKNOWN. That “anything” includes NULL itself! 这就是为什么SQL Server提供IS NULL和IS NOT NULL操作符来专门检查NULL的原因. 那些特定的运算符总是求值为真或假.

即使应聘者没有大量的SQL Server经验, 一般来说,深入研究复杂的三值逻辑可以很好地表明他们是否有能力快速学习它,或者他们是否会为此而挣扎.

37.

给定一张桌子 TBL 有一个场 Nmbr 它具有以下值的行:

1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1

Write a query to add 2 where Nmbr 0加3在哪里 Nmbr is 1.

查看答案

This can be done as follows:

更新TBL设置Nmbr = case,当Nmbr = 0时,则Nmbr+2,否则Nmbr+3结束;
38.

假设我们有 Customer table containing the following data:

CustomerID CustomerName
1           Prashant Kaurav
2 Ashish Jha
安吉特·瓦尔马
4维尼特·库马尔
拉胡尔·库马尔

编写一条SQL语句,将所有客户名称连接到以下单个以分号分隔的字符串中:

Prashant Kaurav; Ashish Jha; Ankit Varma; Vineet Kumar; Rahul Kumar
查看答案
SELECT CustomerName+ '; ' 
从客户
对于XML PATH(")

这是接近的,但会有一个不希望的落后 ;. One way of fixing that could be:

SELECT top 1
LTRIM(((选择的东西 &#39;; &#39; + c1.从客户c1获取客户名&#39;&#39;)), 1, 1,&#39;&#39;))作为SSV
从客户c2;

在PostgreSQL中也可以使用这种语法来获得完全正确的结果:

SELECT array_to_string(array_agg(CustomerName), '; '::text) 
从客户
39.

如何在没有子查询或CTE的情况下从Employee表中获得第n高的工资?

查看答案
SELECT Employee order by salary (

这将给出Employee表中第三高的工资. 据此,我们可以用 限制(n - 1), 1.

但是MS SQL Server不支持这种语法,所以在这种情况下:

根据工资DESC从员工订单中选择工资
偏移2行
只获取下一行

OFFSET’s parameter corresponds to the (N-1) above.

40.

How to find a duplicate record?

  1. duplicate records with one field

  2. 具有多个字段的重复记录

查看答案
  1. duplicate records with one field

     SELECT name, COUNT(电子邮件) 
     FROM users
     通过电子邮件分组
     HAVING COUNT(email) > 1 
    
  2. 具有多个字段的重复记录

     SELECT name, email, COUNT(*)
     FROM users
     组的名字,电子邮件
     HAVING COUNT(*) > 1
    
41.

考虑下面sqlserver样式图中显示的数据库模式, 编写一个SQL查询来返回所有发票的列表. 每张发票, 显示发票编号, 开票日期, 客户姓名, 以及推荐该客户的客户名称(如果有的话). 清单应按开票日期排序.

查看答案
SELECT i.Id, i.BillingDate c.Name, r.名称为ReferredByName
发票i
 加入客户c ON i.CustomerId = c.Id
 LEFT JOIN Customers r ON c.ReferredBy = r.Id
按i排序.BillingDate;

这个问题只是测试应试者接受简单英语要求并编写相应SQL查询的能力. 这篇文章没有什么棘手的,它只涵盖了基本的内容:

  • 当为引用的客户名连接客户表时,候选对象是否记得使用LEFT JOIN而不是inner JOIN? 如果没有,任何客户的发票都将被完全遗漏.

  • 候选表在JOIN中别名了吗? 大多数有经验的T-SQL程序员都会这样做, 因为每次需要引用时重复完整的表名很快就会变得乏味. 在这种情况下, 如果至少Customer表没有别名,查询实际上就会中断, 因为它在不同的上下文中被引用了两次(一次作为包含已开具发票的客户姓名的表), 一次作为表,其中包含引用客户的名称).

  • 候选人是否在SELECT中消除了Id和Name列的歧义? Again, 这是大多数有经验的程序员会自动做的事情, 是否会有冲突. And again, 在这种情况下,就会有冲突, 因此,如果候选人忽略这样做,查询将中断.

注意,此查询不会返回没有关联Customer的发票. 在大多数情况下,这可能是正确的行为.g., 保证每个发票都与一个客户相关联, 或不匹配的发票不感兴趣). However, 以保证所有发票无论如何都能被退回, 发票表应该使用LEFT JOIN与客户连接:

SELECT i.Id, i.BillingDate c.Name, r.名称为ReferredByName
发票i
 LEFT 加入客户c ON i.CustomerId = c.Id
 LEFT JOIN Customers r ON c.ReferredBy = r.Id
按i排序.BillingDate;

面试不仅仅是棘手的技术问题, 所以这些只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能回答所有的问题, 回答所有问题也不能保证成为A级考生. 一天结束的时候, 招聘仍然是一门艺术,一门科学,需要大量的工作.

Why Toptal

Tired of interviewing candidates? 不知道该问什么才能让你得到一份好工作?

让Toptal为你找到最合适的人.

Hire a Top SQL Developer Now

我们的SQL开发人员专属网络

希望找到一份SQL开发人员的工作?

Let Toptal find the right job for you.

申请成为SQL开发人员

Job Opportunities From Our Network

Submit an interview question

提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, at the sole discretion of Toptal, LLC.

*所有字段均为必填项

寻找SQL开发人员?

寻找 SQL开发人员? Check out Toptal’s SQL developers.

马修•纽曼

自由SQL开发人员

美国自由SQL开发人员 at Toptal Since 2019年11月8日

Matthew在数据库管理和软件开发方面拥有超过15年的经验, 专注于全栈web应用程序. He specializes in Django and Vue.拥有在AWS上部署服务器和无服务器环境的专业知识. 他还处理关系数据库和大型数据集.

Show More

Duy Pham

自由SQL开发人员

Vietnam自由SQL开发人员 at Toptal Since 2019年10月29日

Duy拥有20多年使用微软技术栈的软件开发经验, 主要是用 .NET. 他构建高质量和高性能的后端系统,并使用Angular或React等现代框架创建具有良好UX的web应用程序. Duy积极主动,以结果为导向,不仅喜欢编写代码,还喜欢删除代码以确保效率, stable, 灵活的软件在预计的范围和预算内交付.

Show More

Juan Manuel Ortiz de Zarate

自由SQL开发人员

Argentina自由SQL开发人员 at Toptal Since 2019年11月6日

Currently, 胡安是布宜诺斯艾利斯大学的博士候选人, researching the subjects of AI, NLP, 以及社交网络. 他拥有超过十年的专业开发经验. 过去的几年里, 他一直沉浸在各种类型的数据科学项目中,热爱其中的每一分钟. Juan relishes taking on data problems, 建立预测模型, 学习最先进的技术.

Show More

Toptal连接 Top 3% of Freelance Talent All Over The World.

加入Toptal社区.

Learn more