在本文中,我想向您展示有关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 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的旅程。稍后再见!