你应该避免的 5 个最常见的 SQL 错误

了解如何加快 SQL 查询的执行速度——SQL 是用于查询关系大数据的最常用的编程语言之一。在 SQL 中,可能有多种创建数据表的方法,但重要的是要了解并遵循正确(最佳)的方法,这样您就不必等待数小时来执行……

你应该避免的 5 个最常见的 SQL 错误

了解如何加快 SQL 查询的执行速度

SQL 是用于查询关系大数据的最常用的编程语言之一。在 SQL 中,可能有多种创建数据表的方法,但重要的是要了解并遵循正确的(最佳)方法,这样您就不必等待数小时来执行代码。

在这篇博客中,我将带您了解为了优化 SQL 查询而应避免的 5 个最常见的 SQL 编程错误。

  1. 不要使用 Select *:Select * 输出一个数据表的所有列,这是一个昂贵的操作,增加了查询的执行时间。理想的方法是只选择子查询或输出表中的相关列。

例如,假设我们想从 Orders 表中获取订单 ID,那么我们应该只选择 OrderID 列,而不是使用 select * 选择所有列。

# Wrong way  
SELECT * FROM Orders

# Optimal way 
SELECT OrderID FROM Orders

2. 不要使用“have”而不是“where”:Having 子句用于对使用 group by 操作创建的聚合列(sum、min、max 等)应用过滤器。但有时,程序员也会使用“have”子句(而不是“where”子句)来过滤非聚合列。

例如,为了查找员工 id 为 3 的员工执行的总订单,使用“have”子句进行过滤会产生意想不到的结果。

# Wrong way - having should not be used to apply filter on non-aggregated column (EmployeeID in this example)
SELECT OrderDate, count(OrderID) FROM Orders
group by OrderDate
having EmployeeID = 3


# Right Way - Where should be used to apply filter on non-aggregated column. 
SELECT OrderDate, count(OrderID) FROM Orders
where EmployeeID = 3
group by OrderDate

3. 不要使用“where”进行连接:有些人使用“where”子句执行内连接,而不是使用“内连接”子句。虽然两种语法的性能相似(查询优化的结果),但由于以下原因,不建议使用“where”子句进行连接:

一世。对过滤和连接使用“where”子句会影响可读性和理解性。

ii.用于连接的“where”子句的使用非常有限,因为它不能执行除内部连接之外的任何其他连接。

# Wrong way - using where clause 
SELECT  Orders.OrderID, Orders.CustomerID, Customers.ContactName
FROM Orders, Customers
where Orders.CustomerID = Customers.CustomerID


# Right way - using inner join clause 
SELECT  Orders.OrderID, Orders.CustomerID, Customers.ContactName
FROM Orders
inner join 
Customers
on Orders.CustomerID = Customers.CustomerID

4. 不要使用 Distinct:Distinct 子句用于通过删除重复行来查找与所选列对应的不同行。 “Distinct”子句在 SQL 中是一项耗时的操作,替代方法是使用“group by”。例如,以下查询从订单详细信息表中查找订单数量:

# Expensive operation - count distinct order ids - using distinct 
SELECT count(distinct OrderID)
FROM OrderDetails

# Right way - count distinct order ids - using groupby  
select count(*) 
from
(SELECT OrderID
FROM OrderDetails
group by OrderID)

5. 在过滤中避免使用谓词:谓词是一个等于布尔值的表达式,即 True 或 False。使用谓词执行过滤操作会减慢执行时间,因为谓词不使用索引(SQL 索引是用于快速检索的查找表)。因此,应使用其他替代方法进行过滤。例如,如果我们要查找电话号码以 (171) 代码开头的供应商。

# expensive way 
SELECT SupplierID,SupplierName FROM Suppliers
where SUBSTR(Phone, 1, 5) = '(171)'

# right way 
SELECT SupplierID,SupplierName FROM Suppliers
where Phone like  '(171)%'

Thank You!

如果您发现我的博客有用,那么您可以关注我,以便在我发布故事时获得直接通知。[0]

如果您想亲自体验 Medium,请考虑通过注册会员来支持我和数以千计的其他作家。它每月只需 5 美元,它极大地支持了我们,作家,而且你也有机会通过写作赚钱。[0]

分享几个你可能感兴趣的故事:

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年5月11日
下一篇 2022年5月11日

相关推荐