高级SQL查询的基本:调整
#community #sql #database #性能

在本文中,我想向您展示有关SQL的内容,我相信您会在您的查询中有所作为。

首先,SQL如何工作?对于某些人来说,这一点可能很明显,但是我认为这可以在这里提及。请记住,查询sql可以按顺序起作用:从哪里,选择。

看表 老师

id_teacher id_school 情况
1 1 1
2 1 1
3 2 1
4 1 0

例如,在查询中:

SELECT teachers.* 
FROM teachers 
WHERE teachers.id_school = 1

数据库将搜索所有老师,然后搜索哪个具有列 id_school 等于 1 ,所以在此之后,从您的选择中放入列,在这种情况下,表 教师的所有列

输出:

id_teacher id_school 情况
1 1 1
2 1 1
4 1 0

好吧,这很简单,你知道吗?让我们变得更有趣 - 考虑一下,您的雇主告诉您进行查询,以返回所有在某些学校积极工作的老师。

让我们考虑上面的 教师 的表格,以及下表的 School

id_school 情况
1 1
2 1
3 0

想到的第一件事就是这样:

SELECT teachers.* 
FROM teachers 
JOIN school ON (school.id_school = teachers.id_school) 
WHERE teachers.situation = 1

输出:

id_teacher id_school 情况
1 1 1
2 1 1
3 2 1

好吧,这有效,但是我该如何使它变得更好?我们知道SQL查询从首先开始在子句上起作用,此后,它将加入子句。考虑到这一点,对于数据库而言,更容易搜索所有老师,然后看看谁链接了学校或搜索所有学校,然后看看谁是老师?

逻辑告诉我们,表格学校 教师,因此我们可以得出结论,数据库更容易寻找学校表。这样:

 SELECT teachers.* 
 FROM school 
 JOIN teachers ON (teachers.id_school = school.id_school)
 WHERE teachers.situation = 1

输出:

id_teacher id_school 情况
1 1 1
2 1 1
3 2 1

相同的结果,但性能更好。这是我了解SQL的最重要的教训之一。

好吧,我们深入调整SQL查询,来了,继续谈论。我想谈论的第二点是子征服。在大多数情况下,您不需要这个!

子查询是SQL查询的吸血鬼,当您希望每行中的其他表格中放置值时,它们是常见的,例如当您想排队与您一起从订单中列出项目的总和 select select

考虑 顺序 order_itens 的下表

顺序:

id costumer
1 1
2 1

订购itens:

id id_order value
1 1 93.3
2 1 12.99
3 2 10.19
4 2 12.5
5 2 79.99
6 3 99.13

例如:

SELECT order.*, 
      (SELECT SUM(order_itens.vl_item) 
       FROM order_itens 
       WHERE order_itens.id_order = order.id) AS vl_total_order 
FROM order

输出:

id costumer vl_total_order
1 1 106.29
2 1 102.68

此查询返回我们想要的东西,所有订单中所有项目的价值。好的,但是我该如何使它变得更好?

我建议您做的第一件事是,如果可能的话,请分离此查询,这是我认为的更好的选择。但是,如果不是,在SQL中,您还有其他选择可以执行此类景象,我们可以使用函数的进行查询。

从现在开始,我不会更多地谈论此功能,但是也许我可以创建另一个文档来谈论这个功能。实际上,如果您不知道如何正确地做一个,它们可能比帮助更大,因此请小心。

好的,但是有时我们可以逃离子征服,例如,您必须检查一行结果是否存在在另一个表上。类似:

SELECT order_itens.* 
FROM order_itens 
WHERE order_itens.id_order IN (SELECT order.id 
                               FROM order)

输出:

id id_order value
1 1 93.3
2 1 12.99
3 2 10.19
4 2 12.5
5 2 79.99

当然,我们可以做到的更好的方法就是加入。但是,如果您的表格没有pk和序列,则在定义明确或其他方面,也许会得到更多的性能:

SELECT order_itens.* 
FROM order_itens 
WHERE EXISTS (SELECT 1 
              FROM order 
              WHERE order.id = order_itens.id)

考虑到这一点,在此示例中,我们只需要知道另一个表中是否存在线路,因此请拿第一个您找到并完成!这似乎是一件小事,但是当我们谈论调整时,我们有很多很小的事物可以一起改变。


就是这样!感谢您的阅读,我希望这项技巧能帮助您作为开发人员SQL的旅程。稍后再见!