我是一名学生,正在学习SQL和DB课程。我的问题是:如何才能擅长手写查询?我们的期末考试将由许多这样的问题组成,我想做好。我们也不允许任何形式的参考表,只是供参考。
我想我要问的是:你将如何处理这个问题?
发布于 2019-11-13 01:56:13
简而言之,您需要练习使用sql。
发布于 2019-11-13 02:15:10
你可能会从别人那里得到很多关于这方面的意见。除了练习和阅读之外,试着确保你理解查询的绝对基础和顺序。
始终使用table.column或alias.column来帮助防止对来自何处的任何模棱两可。
了解编写查询的总体基本部分,例如
select
[all your alias.columns comma separated]
from
[your primary and/or JOIN/LEFT JOIN/etc tables]
where
[what is the criteria you are looking for]
AND [use proper parenthesis to prevent ambiguity if so needed]
group by
[any columns if doing aggregates such as count, min, max, avg, etc]
[you need to list all NON-AGGREGATE alias.columns]
having
[if any, such as count(*) > someValue]
order by
[any specific columns and ascending or descending order]
[such as orderDate DESC to put most recent order at top]在我看来,获取FROM子句是最重要的之一,我总是尝试在第一个表/别名=第二个表/别名上列出我的表连接子句。缩进在这里很有帮助,这样您就可以看到如何从一个表转到下一个表。在这一点上,不要考虑您的过滤(还没有),只考虑表是如何相关的。然后,您可以为您从该来源特别查找的内容添加"AND“标准。
订单的一个示例。寻找在过去30天内订购的客户。从源代码开始,将其作为第一个FROM table,其他所有内容都在此基础上。所以我从订单开始,因为我关心的是什么时候订购。然后我可以加入到客户那里去获取他们的名字。
select
c.LastName,
c.FirstName,
o.OrderDate
from
Orders o
JOIN Customers c
on o.CustomerID = c.CustomerID
where
o.OrderDate > [sql-specific current date - 30 days]
order by
c.LastName,
c.FirstName在过去30天内订购特定项目的订单的另一个示例。在这种情况下,我可以颠倒细节的顺序,因为被排序的特定事物可能是更小的粒度而不是所有的东西。因此,修改上面的内容,比如
select
c.LastName,
c.FirstName,
o.OrderDate
from
Items i
JOIN OrderDetails od
on i.ItemID = od.ItemID
JOIN Orders o
on od.OrderID = o.OrderID
AND o.OrderDate > [sql-specific current date - 30 days]
JOIN Customers c
on o.CustomerID = c.CustomerID
where
i.ItemDescription = 'SomeThing'
order by
c.LastName,
c.FirstName注意我的缩进嵌套。个人风格偏好,但至少你可以看到如何别名i到od,od到o,o到c。在我的偏好中,更容易看到表的轨迹以及每个表是如何直接相关的。我还添加了"AND“子句,以便直接在连接到orders表中筛选出过去30天内的订单。
左连接,我做同样的事情,并将条件直接保持在连接级别。如果您将左连接的条件放入WHERE子句中(没有显式处理NULL或条件,它会将左连接转换为内连接。
希望这篇基本指南能帮助您更好地编写自己的查询和课程/考试准备。
https://stackoverflow.com/questions/58824054
复制相似问题