41 Essential SQL 面试问题 *
最好的SQL开发人员和工程师可以回答的全面来源的基本问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.
Hire a Top SQL Developer Now面试问题
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
会因为性能原因而被推荐吗.
ansi标准SQL指定了五种类型 JOIN
条款如下:
-
INNER 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 aLEFT JOIN
; i.e.,结果将包含 all 从右表中获取记录,即使JOIN
条件在左表中找不到任何匹配的记录. 这意味着如果ON
子句与左表中的任何记录都不匹配JOIN
仍然会返回一行的结果为记录在正确的表, 但是左表中的每一列都为NULL. -
FULL JOIN
(or全外连接
):返回在任意一个表中有匹配的所有行. 从概念上讲,一个FULL JOIN
结合了两者的作用LEFT JOIN
and aRIGHT JOIN
; i.e.,其结果集等价于执行aUNION
左外部查询和右外部查询结果的. -
CROSS JOIN
:返回第一个表中的每一行与第二个表中的每一行组合在一起的所有记录(i.e.,返回连接表中行集的笛卡尔积). 请注意CROSS JOIN
can either be specified using theCROSS JOIN
语法(“显式连接表示法”)或(b)列出FROM
用逗号分隔的子句,不使用WHERE
子句提供连接标准(“隐式连接符号”).
Given the following tables:
sql> SELECT * FROM runners;
+----+--------------+
| id | name |
+----+--------------+
| 1 |约翰·多伊|
|0 |简·多伊|
| 3 |爱丽丝·琼斯|
| 4 |鲍比·路易斯|
bbb50 |丽莎·罗梅罗|
+----+--------------+
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
给定两个表创建和填充如下:
创建表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
.
假设模式为 Emp (Id, Name, DeptId), Dept (Id, Name)
.
If there are 10 records in the Emp
表和5条记录中的 Dept
下面的SQL查询的结果将显示多少行:
选择*从Emp,部门
解释你的答案.
该查询将以“笛卡尔积”或“交叉连接”的形式生成50行。, 当省略' where '子句时,哪个是默认值.
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为空;
This can be done as follows:
SELECT TOP (1) Salary FROM
(
从员工薪水排序中选择不同的最高(10)薪水
)按薪水排序
其工作原理如下:
First, the 从员工薪水排序中选择不同的最高(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;
编写一个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., 结合不同的
)命令,同时避免了大部分性能损失.
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
GROUP BY u.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
执行计划基本上是一个路线图,它以图形或文本方式显示SQL服务器的查询优化器为存储过程或临时查询选择的数据检索方法. 执行计划对于帮助开发人员理解和分析查询或存储过程的性能特征非常有用, 因为计划用于执行查询或存储过程.
在许多SQL系统中,文本执行计划可以使用关键字获得,例如 EXPLAIN
,并且通常也可以获得视觉表示. 在Microsoft SQL Server中, 查询分析器有一个名为“显示执行计划”的选项(位于查询下拉菜单上). If this option is turned on, 当查询运行时,它将在一个单独的窗口中显示查询执行计划.
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, 事务(或其影响)必须记录在非易失性存储器中.
给定一张桌子 dbo.users
这里是列 user_id
是唯一的数字标识符,如何高效地选择前100个奇数 user_id
表中的值?
(假设该表包含超过100条带有奇数的记录 user_id
values.)
SELECT TOP 100 user_id FROM dbo.WHERE user_id % 2 = 1
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
返回.
选择所有 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
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}
.
When GROUP BY
是不使用的, WHERE
and HAVING
clauses are essentially equivalent.
然而,当 GROUP BY
is used:
- The
WHERE
子句用于从结果中筛选记录. 筛选在进行任何分组之前进行. - The
HAVING
子句用于从组(例如.e.,以检查聚合到组后的条件)。.
“Order by 2”只有在select语句中至少有两列被使用时才有效. 然而,在这个查询中,即使 Employee
表有2列, 查询只选择了1个列名, 因此,“Order by 2”将导致语句在执行上述sql查询时抛出错误.
This query 将返回 10 records as TRUNCATE
was executed in the transaction.
TRUNCATE
does not itself keep a log but 开始事务
跟踪 TRUNCATE
command.
- 单行函数一次只处理一行. 多行函数一次处理多行数据.
- The
group by
子句组合在特定字段或任何字段组中具有相同值的所有记录.
假设表中有一个列,填充的是一个数字(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;
当存储在数据库中时, 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个字节.
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');
是的,像这样:
SET IDENTITY_INSERT TABLE1 ON
INSERT INTO TABLE1 (ID,NAME)
SELECT ID,NAME FROM TEMPTB1
将identity_insert设置为关闭
给出这个表格:
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
SELECT * FROM表
WHERE 'Yellow' IN (C1, C2, C3)
Write a query to insert/update Col2
’s values to look exactly opposite to Col1
’s values.
Col1 | Col2 |
---|---|
1 | 0 |
0 | 1 |
0 | 1 |
0 | 1 |
1 | 0 |
0 | 1 |
1 | 0 |
1 | 0 |
更新表设置col2 = case,当col1 = 1,则0,否则1结束
或者如果类型是数字:
update table set col2 = 1 - col1
In MySQL:
从表中按id desc limit 1顺序选择id
在SQL Server:
按id desc顺序从表中选择top 1 id
IN
:
- 在列表结果集上工作
- 不适用于产生多列虚拟表的子查询
- 比较结果列表中的每个值
- 对于较大的子查询结果集,性能相对较慢
EXISTS
:
- 在虚拟表上工作
- Is used with co-related queries
- Exits comparison when match is found
- 对于较大的子查询结果集,性能相对较快
假设在一个表中有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')
声明@N int
set @N = 5;
以cte为例
(
查询姓名,薪水,工作编号, RN = ROW_NUMBER()
OVER (ORDER BY Salary DESC)
从员工
)
查询姓名,薪水,工作编号
FROM CTE
其中rn = @n
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;
给定表格 mass_table
:
weight |
---|
5.67 |
34.567 |
365.253 |
34 |
编写一个查询,产生如下输出:
weight | kg | gms |
---|---|---|
5.67 | 5 | 67 |
34.567 | 34 | 567 |
365.253 | 365 | 253 |
34 | 34 | 0 |
选择weight, trunc(weight)为kg, nvl(substr(weight - trunc(weight), 2), 0)为GMS
从mass_table;
考虑到 Employee
下表.
Emp_Id | Emp_name | Salary | Manager_Id |
---|---|---|---|
10 | Anil | 50000 | 18 |
11 | Vikas | 75000 | 16 |
12 | Nisha | 40000 | 18 |
13 | Nidhi | 60000 | 17 |
14 | Priya | 80000 | 18 |
15 | Mohit | 45000 | 18 |
16 | Rajesh | 90000 | – |
17 | Raman | 55000 | 16 |
18 | Santosh | 65000 | 17 |
编写一个查询生成如下输出:
Manager_Id | Manager | Average_Salary_Under_Manager |
---|---|---|
16 | Rajesh | 65000 |
17 | Raman | 62500 |
18 | Santosh | 53750 |
select b.emp_id为“Manager_Id”,
b.emp_name为“Manager”,
avg(a.作为“Average_Salary_Under_Manager”
从雇员a,
员工乙
where a.Manager_id = b.emp_id
b组.emp_id, b.emp_name
对b排序.emp_id;
INSERT INTO table2 (column1, column2, column3) ...)
SELECT column1, column2, column3, ...
从表1
条件;
找出下面等于以下内容的SQL语句: SELECT name FROM customer WHERE state = 'VA';
SELECT name IN customer WHERE state IN ('VA');
SELECT name IN customer WHERE state = 'VA';
SELECT name IN customer WHERE state = 'V';
SELECT name FROM customer WHERE state IN ('VA');
SELECT name FROM customer WHERE state IN ('VA');
给定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经验, 一般来说,深入研究复杂的三值逻辑可以很好地表明他们是否有能力快速学习它,或者他们是否会为此而挣扎.
给定一张桌子 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结束;
假设我们有 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(((选择的东西 '; ' + c1.从客户c1获取客户名'')), 1, 1,''))作为SSV
从客户c2;
在PostgreSQL中也可以使用这种语法来获得完全正确的结果:
SELECT array_to_string(array_agg(CustomerName), '; '::text)
从客户
SELECT Employee order by salary (
这将给出Employee表中第三高的工资. 据此,我们可以用 限制(n - 1), 1
.
但是MS SQL Server不支持这种语法,所以在这种情况下:
根据工资DESC从员工订单中选择工资
偏移2行
只获取下一行
OFFSET
’s parameter corresponds to the (N-1)
above.
-
duplicate records with one field
SELECT name, COUNT(电子邮件) FROM users 通过电子邮件分组 HAVING COUNT(email) > 1
-
具有多个字段的重复记录
SELECT name, email, COUNT(*) FROM users 组的名字,电子邮件 HAVING COUNT(*) > 1
考虑下面sqlserver样式图中显示的数据库模式, 编写一个SQL查询来返回所有发票的列表. 每张发票, 显示发票编号, 开票日期, 客户姓名, 以及推荐该客户的客户名称(如果有的话). 清单应按开票日期排序.
SELECT i.Id, i.BillingDate c.Name, r.名称为ReferredByName
发票i
加入客户c ON i.CustomerId = c.Id
左加入客户r上c.ReferredBy = r.Id
ORDER BY i.BillingDate;
这个问题只是测试应试者接受简单英语要求并编写相应SQL查询的能力. 这篇文章没有什么棘手的,它只涵盖了基本的内容:
-
当为引用的客户名连接客户表时,候选对象是否记得使用LEFT JOIN而不是inner JOIN? 如果没有,任何客户的发票都将被完全遗漏.
-
候选表在JOIN中别名了吗? 大多数有经验的T-SQL程序员都会这样做, 因为每次需要引用时重复完整的表名很快就会变得乏味. 在这种情况下, 如果至少Customer表没有别名,查询实际上就会中断, 因为它在不同的上下文中被引用了两次(一次作为包含已开具发票的客户姓名的表), 一次作为表,其中包含引用客户的名称).
-
候选人是否在SELECT中消除了Id和Name列的歧义? Again, 这是大多数有经验的程序员会自动做的事情, 是否会有冲突. And again, in this case there would be a conflict, 因此,如果候选人忽略这样做,查询将中断.
注意,此查询不会返回没有关联Customer的发票. 在大多数情况下,这可能是正确的行为.g., 保证每个发票都与一个客户相关联, 或不匹配的发票不感兴趣). However, 以保证所有发票无论如何都能被退回, 发票表应该使用LEFT JOIN与客户连接:
SELECT i.Id, i.BillingDate c.Name, r.名称为ReferredByName
发票i
左加入客户c ON i.CustomerId = c.Id
左加入客户r上c.ReferredBy = r.Id
ORDER BY 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.
Juan Manuel Ortiz de Zarate
自由SQL开发人员
Currently, 胡安是布宜诺斯艾利斯大学的博士候选人, researching the subjects of AI, NLP, 以及社交网络. 他拥有超过十年的专业开发经验. 过去的几年里, 他一直沉浸在各种类型的数据科学项目中,热爱其中的每一分钟. Juan relishes taking on data problems, 建立预测模型, 学习最先进的技术.
Show MoreToptal连接 Top 3% 世界各地的自由职业人才.
加入Toptal社区.