您当前的位置:网站首页>两个黄鹂鸣翠柳一行白鹭上青天,马住这7大SQL经典面试问题,春招躺赢!,送

两个黄鹂鸣翠柳一行白鹭上青天,马住这7大SQL经典面试问题,春招躺赢!,送

2019-04-08 23:02:34 投稿作者:admin 围观人数:217 评论人数:0次


马住这7大SQL经典面试问题,春招躺赢!


什么是SQL?


SQL是一种用于与数据库通讯的编程言语,是技术职业招聘中需求把握的最有用的技术之一。SQL是结构化查询言语的缩写,这个惊人的东西是剖析大型数据集的必备东西。当它应用于联络数据库(以某种办法彼此相关的仅有数据表)时,它的长处特别显着。

由于SQL在技术领域无处不在,许多公司在给出作业约请之前都会进行SQL面试。这有助于保证求职者(特别是从事项目办理、剖析、商业智能和软件工程相关作业的人员)能够轻松地在作业中运用SQL。

假如你行将进行SQL面谈,你或许想知道或许会遇到什么样的问题。招聘人员一般对细节闪烁其词,像这样一窍不通地开端一场说话会让人手足无措。

因而,咱们列出了7个最常见的SQL面试问题,以便你在面试前进行一些操练。经过一些预先预备,你会在面试日感觉到胸中有数、自傲满满。


1、什么是联络数据库,什么是SQL?举例说明


尽管你或许知道联络数据库是什么以及SQL是什么,但很难在面试现场给出衔接、简练的解说。为此,请保证你已提前预备好答复这个简略的问题。以下是一些答题小技巧:

联络数据库是一组数据表,以某种办法彼此链接或相关。它用于存储不同类型的信息,这些信息能够聚集起来答复特定的剖析问题。这是在不丢掉任何要害信息的状况下,最大极限地削减存储在服务器上的数据量一种有用办法。

这是一个含糊的界说,所以让咱们看看实践中的联络数据库。在线零售商的联络数据库的简略版别或许包括两个独自的数据表:

  • 顾客。客户信息列表,包括客户名字、联络信息和发货首选项。此数据库中的每个记载都包括一个仅有的customer_id字段,经过该字段能够辨认客户。
  • 订单。在零售商网站上购买的订单列表。每个订单列表还包括一个customer_id字段,用于将该订单的详细信息与下订单的特定客户相相关。

当然,假如咱们只在Orders 表中包括客户信息,就不需求多表数据库。但这并不是特别有用:假如一个客户下了多个订单,他或她的名字、联络信息和发货偏好将列在Orders 表的多行上,然后导致不必要的重复和无法办理的大型数据库。相反,咱们创立了一个联络数据库来节约空吉他教育间,并展现了不同数据块是怎么链接在一起的。

那么,SQL仅仅用于与这个联络数据库通讯的言语。数据库还不能了解像英语这样的人类言语——英语在语法上太杂乱了——所以咱们运用一种它们能够了解的规范化的言语来与它们沟通。


2、SQL JOIN子句有哪些不同类型,它们是怎么被运用的?

在SQL中,JOIN子句用于回来将两个或多个其他表的内容兼并在一起的表。 例如,假如咱们有两个表——一个包括Customers信息,另一个包括各个客户订货的Orders 信息——咱们能够运用JOIN子句将它们组合在一起并创立一个新表:客户的完好订单列表,供给予一切必要的信息以便发货。

有多种类型的JOIN子句,它们的功用略微有所不同:

  • INNER JOIN回来在指定的两个表中都匹配的行列表。它是默许的衔接类型,因而假如只输入JOIN而不指定任何其他条件,则将主动运用INNER JOIN。
  • LEFT JOIN将回来句子中左表的一切成果,并在或许的状况下与右表中的行匹配。假如左表中的一行在右表中不包括相应的匹配项,仍将列出该行——右表中的列为空值。
  • RIGHT JOIN 将回来句子中右表的一切成果,并尽或许与左表中的行匹配。假如右表中的行在左表中不包括相应的匹配项,仍将该行列出——左表的列为空值。
  • FULL JOIN将回来句子中左表和右表的一切成果。假如存在左表中的行与右表不匹配或右表中的行与左表不匹配的状况,一切数据仍将被回来——但SQL将在一切未匹配的列中输出空值。
  • CROSS JOIN回来两个表的笛卡尔积——换句话说,左表的每个独自行与右表的每个独自hat行匹配。


3、为什么此查火柴人大乱斗询未回来预期成果?


orders表中总共有1000行:

SELECT * F两个黄鹂鸣翠柳一行白鹭上彼苍,马住这7大SQL经典面试问题,春招躺赢!,送ROM orders;
-- 1就要鲁000 rows in set (0.05 sec)


其间23个订单来自customer_id = 45的用户:

SELECT * FROM orders WHERE customer_id = 45;
-- 23 rows in set (0.10 sec)


可是,当咱们挑选不是来自customer_id = 45的订单数量时,咱们只得到973个成果:

SELECT * FROM orders WHERE customer_id <> 45;
-- 973 rows in set (0.11 sec)


973 + 23 = 996。可是,customer_id =45加上customer_id不等于45的订单数量不应该等于1000吗?为什么此查询未回来预期成果?

答案是:此数据集很或许包括具有 customer_id为空的order值。在条件中运用SELECT子句时,具有空值的行与=或<>运算符不匹配。

上面咱们所指的第二个查询能够修正如下,以发生预期的成果:

SELECT * FROM orders WHERE (customer_id <> 45 OR customer_id IS NULL);
-- 977 rows in 安徽移动set (0.11 sec)


4、为什么其间一个查询有用而另一个查询无效


请看以下查询,该查询回来预期成果:

SELECT CASE WHEN (3 IN (1, 2, 3, NULL)) THEN 'Three is here!' ELSE "Three isn't here!" END AS result;
/*
+----------------+
| result 两个黄鹂鸣翠柳一行白鹭上彼苍,马住这7大SQL经典面试问题,春招躺赢!,送|
+----------------+
| Three is here! |
+----------------+
1 row in set (0.00 sec)
*/
输出中显现"Three is here!",由于值3包括在IN子句中。可是以下查询呢?
SELECT CASE WHEN (3 NOT IN (1, 2, NULL)) THEN "Three isn't here!" ELSE 'Three is here!' END AS result;
/*
+----------------+
| result |
+----------------两个黄鹂鸣翠柳一行白鹭上彼苍,马住这7大SQL经典面试问题,春招躺赢!,送+
| Three is here! |
+----------------+
1 row in set (0.00 sec)
*/


第二个数据会集不包括3,所以为什么咱们的查询过错地输出了"Three is here!"?

答案再一次与MYSQL处理NULL值的办法有关。让咱们细心看看。在咱们的第一个查询中,咱们问询值3是否包括在调集中(1, 2, 3ph, NULL)。咱们的句子在功用上等同于以下内容:

SELECT CASE WHEN ((3 = 1) OR (3 = 2) OR (3 = 3) OR (3 = NULL)) THEN 'Three is here!' ELSE "Three isn't here!" END AS resul天天评书网t;
/*
+----------------+
| result |
+----------------+
| Three两个黄鹂鸣翠柳一行白鹭上彼苍,马住这7大SQL经典面试问题,春招躺赢!,送 is here! |
+----------------+
1 row in set (0.00 sec)
*/


由于3肯定等于3,所以满意了咱们的OR条件之一,句子输出"Three is here!"。另一方面,咱们的第二个句子问询值3是否未包括在调集中(1, 2, NULL)。此句子在功用上等同于以下内容:

SELECT CASE WHEN ((3 <> 1) AND (3 <> 2) AND (3 <> NULL)) THEN "Three isn't here!" ELSE "Three is here!" END AS result;
/*
+----------------+
| result |
+----------------+
| Three is here! |
+----------------+
1 row in set (0.00 sec)
*/


在这种状况下,条件查看3 <> NULL失利,由于在ANSI规范SQL中,咱们需求运用IS NULL句子而不是<>运算符。


5、你能构建一个根本的INNER JOIN吗


customers和 orders表具有以下相应的结构:

CREATE TABLE `customers` (
`customer_id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) NOT NULL,
`last_name` varchar(255) NOT NULL,
`e诘mail` varchar(女儿奴255) NOT NULL,
`address` var洪巨仁char(255) DEFAULT NULL,
`city` varchar(255) DEFAULT NULL,
`state` varchar(2) DEFAULT NULL,
`zip_code` varchar(5) DEFAULT NULL,
PRIMARY KEY (`customer_id`)
);
CREATE TABLE `orders` (
`order_id` int(11) NOT NULL AUTO_INCREMENT,
`customer_id` int(11) NOT NULL,
`order_placed_date` date NOT NULL两个黄鹂鸣翠柳一行白鹭上彼苍,马住这7大SQL经典面试问题,春招躺赢!,送,
PRIMARY KEY (`order_id`),
KEY `customer_id` (`customer_id`),
FOREIGN KEY寻艺 (`customer_id`) REFERENCES `customers` (`customer_i软装规划公司d`)
);


你是否能够结构一个简略的SELECT 句子,该句子运用INNER JOI家宴N来组合来自customers和orders表的一切信息?

这儿的答案十分简略。咱们是这样做到的:

SELECT * FROM orders INNER JOIN customers on orders.customer_id = customers.customer_id;


6、运用 AS 句子

咱们依据上面的orders表编写了一个查询,以挑选2016年的一切订单。可是咱们的查询有错。你能找出问题出在哪儿吗?

SELECT order_id, customer_id, YEAR(order_plac两个黄鹂鸣翠柳一行白鹭上彼苍,马住这7大SQL经典面试问题,春招躺赢!,送ed_date) AS order_year FROM orders WHERE order_year = 2016;


答案是:order_year是一个别号,意味着它被用作更杂乱引证的另一个称号:YEAR(order_placed_date)。 事实证明,在SQL中,别号只能在 GROUP BY、 ORDER BY 和 HAVING子句中引证 - 它们不能在WHERE子句中运用。 运转上面的代码将发生以下成果:

--ERROR 1054 (42S22): Unknown col艳修umn 'order_year' in 'where clause'


要处理这个问题,咱们需求重申WHERE子句中order_year别号的界说,如下所示:

SELEC刘之冰前妻冯丽萍T order_id, customer_id, YEAR(order_placed_dat脱氧核糖是什么e) AS order_year FROM orders WHERE YEAR(order_placed_date) = 2016;
--498 rows in set (0.00 sec)


7、运用SUM 函数

请看以下数据库结构:

CREATE 旱魃TABLE `products` (
`product两个黄鹂鸣翠柳一行白鹭上彼苍,马住这7大SQL经典面试问题,春招躺赢!,送_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`price` decimal(19,4) NOT NULL,
PRIMARY KEY (`product_id`)
);
CREATE TABLE `order_products` (
`order_product_id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
PRIMARY KEY (`order_product_id`),
KEY `order_id` (`order_id`),
KEY `product_id` (`product_id`),
FOREIGN KEY (`order_id`) REFERENCES `orders` (`order_id`),
FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`)
)


你是否少年包彼苍1能够编写一个能够查找一切order_ids 的 product.price 的查询?(例如,每个订单的product.price的总和)

这个问题有点扎手,由于咱们有必要一起运用SUM函数和 GROUP BY子句并经过order_id聚合订单。咱们是这样做的:

SELECT order_id, SUM(price) AS total_order_price FROM order_products INNER JOIN products ON order_products.product_id = products.product_id GROUP BY order_id;
--1000 rows in set (0.01 sec)


the end
旧微商已被淘汰,新微商正在崛起,微商故事