SQL查询速度很快。 第一部分

引言


由于SQL语言的简单性,便利性和普遍性,它非常紧密地集成到业务分析人员的生活和对候选人的要求中。 根据我自己的经验,我可以说,SQL通常用于形成上载,店面(以及基于这些店面的报表的后续构建)和数据库管理。 而且由于分析师的日常工作不可避免地与数据上载和店面相关联,因此编写SQL查询的能力可能成为一个因素,因此候选人将获得优势或被淘汰。 令人遗憾的消息是,并不是每个人都能期望将其放在学生席上。 好消息是,学习SQL并不复杂,它很快,并且查询语法简单明了。 对于已经遇到过更复杂语言的人来说尤其如此。

我将SQL培训分为三个部分。 这部分致力于基本语法,在80-90%的情况下使用该语法。 接下来的两部分将专门介绍子查询,Join'am和特殊运算符。 指南的目的是快速而实际地练习SQL语法,以将其添加到技能库中。

练习


将使用专门为SQL实践设计的开放数据库来检查语法的简介。 为了使您的培训尽可能有效,请在新选项卡中打开下面的链接,然后立即运行上述示例,这将使您可以更好地整合材料并亲自使用语法。

点击这里

单击链接后,您可以在屏幕的中央部分看到查询编辑器本身和数据输出,数据库表的列表在右侧。

SQL查询结构


请求的一般结构如下:

SELECT ('  *    ; ') FROM ('; ') WHERE ('/, , city = 'Moscow'; ') GROUP BY (',     ; ') HAVING ('/    ; ') ORDER BY (',     ; ') 

让我们分析一下结构。 为方便起见,CAPS突出显示了请求中的当前学习项目。

选择,从


SELECT,FROM-查询的必需元素,用于定义所选列,它们的顺序和数据源。

从客户表中选择所有(表示为*):

 SELECT * FROM Customers 

从客户表中选择客户ID,客户名称列:

 SELECT CustomerID, CustomerName FROM Customers 


在哪里


WHERE是可选查询元素,当您需要按所需条件过滤数据时使用。 通常,在where元素内部,IN / NOT IN用于按几个值过滤一列,AND / OR用于按几列过滤表。

按一个条件和一个值过滤:

 select * from Customers WHERE City = 'London' 

使用IN(包含)或NOT IN(异常)按一个条件和多个值进行过滤:

 select * from Customers where City IN ('London', 'Berlin') 

 select * from Customers where City NOT IN ('Madrid', 'Berlin','Bern') 

使用AND(满足所有条件)或OR(满足至少一个条件)和几个值按几个条件进行过滤:

 select * from Customers where Country = 'Germany' AND City not in ('Berlin', 'Aachen') AND CustomerID > 15 

 select * from Customers where City in ('London', 'Berlin') OR CustomerID > 4 

分组依据


GROUP BY-一个可选的查询元素,您可以使用它按所需的列指定汇总(例如,如果您需要找出每个城市中有多少客户)。

使用GROUP BY时必须:

  1. 在SELECT和GROUP BY中,用于剪切的列列表相同,
  2. 聚合函数(SUM,AVG,COUNT,MAX,MIN)也必须在SELECT中使用要应用此函数的列指定。

按城市分组客户数量:

 select City, count(CustomerID) from Customers GROUP BY City 

按国家和城市对客户数量进行分组:

 select Country, City, count(CustomerID) from Customers GROUP BY Country, City 

通过具有不同汇总功能的产品ID对销售进行分组:该产品的订单数量和已售件数:

 select ProductID, COUNT(OrderID), SUM(Quantity) from OrderDetails GROUP BY ProductID 

销售分组以及对源表的过滤。 在这种情况下,输出将是一个包含德国城市客户数量的表:

 select City, count(CustomerID) from Customers WHERE Country = 'Germany' GROUP BY City 

使用AS运算符重命名聚合列。 默认情况下,聚合列的名称等于所应用的聚合函数,这对于感知而言可能还不太方便。

 select City, count(CustomerID) AS Number_of_clients from Customers group by City 

拥有


HAVING是可选查询元素,负责在分组数据级别(实际上是WHERE,但仅高一层)进行过滤。

根据城市过滤客户数量的汇总表,在这种情况下,我们仅保留那些卸载了至少5个客户的城市:

 select City, count(CustomerID) from Customers group by City HAVING count(CustomerID) >= 5 


对于HAVING中的重命名列,可以同时指定聚合构造计数(CustomerID)和新列名称number_of_clients:

 select City, count(CustomerID) as number_of_clients from Customers group by City HAVING number_of_clients >= 5 

包含WHERE和HAVING的示例查询。 在此查询中,首先过滤用户的初始表,计算出按城市划分的客户数量,仅保留那些客户数量至少为5的城市:

 select City, count(CustomerID) as number_of_clients from Customers WHERE CustomerName not in ('Around the Horn','Drachenblut Delikatessend') group by City HAVING number_of_clients >= 5 

订购


ORDER BY是一个可选的查询元素,负责对表进行排序。

一个简单的按一列排序的示例。 在此请求中,按客户指定的城市进行排序:

 select * from Customers ORDER BY City 

您可以按几列进行排序,在这种情况下,将按照指定列的顺序进行排序:

 select * from Customers ORDER BY Country, City 

默认情况下,数字的升序排列和文本值的升序排列。 如果需要反向排序,则在ORDER BY子句中的列名之后,添加DESC:

 select * from Customers order by CustomerID DESC 

按一列进行反向排序,按第二列进行默认排序:

 select * from Customers order by Country DESC, City 

加盟


JOIN-一个可选元素,用于通过两个表中都存在的键来联接表。 该键之前有一个ON语句。

在查询中,我们通过键CustomerID将Order和Customer表联接在一起,并且表名通过点被添加到键的列名之前:

 select * from Orders JOIN Customers ON Orders.CustomerID = Customers.CustomerID 

当您需要将一个表与另一个表的值映射时,通常会出现这种情况。 根据任务,可以使用不同类型的连接。 INNER JOIN-交点,向右/向左联接,用于将一个具有其他知识的表映射到另一个表,

 select * from Orders join Customers on Orders.CustomerID = Customers.CustomerID where Customers.CustomerID >10 

在整个JOIN请求中,它嵌入在from元素到where元素之后,这是一个示例请求:

在下面的精美图片中可以看到其他类型的JOIN:


在下一部分中,我们将详细讨论JOIN类型和嵌套查询。

如果您有任何疑问/建议,请随时与我们联系!

Source: https://habr.com/ru/post/zh-CN480838/


All Articles