用好这13条SQL语句,就能解决90%的问题(上)

数据科学中90%的任务,可以借助这13条SQL语句解决。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

结构化查询语言 (SQL) 是一种用于管理和操作关系数据库的编程语言。数据分析师和数据科学家广泛使用SQL从大型数据集中发现规律。

SQL 是一种强大的工具,可用于执行各种数据操作任务,包括过滤、排序、分组和聚合数据。在本文中,我将介绍 13 个基本 SQL 语句,借助它们可解决数据科学中90%的任务。这些语句易于理解和实现,可以为使用 SQL 打下坚实的基础。

无论你是刚接触SQL 还是有一定的经验,本文都可以为你提供处理数据的帮助和实用技巧。

1.选取数据

SELECT语句用于从数据库中的一个或多个表中检索数据。你应该掌握使用 SELECT 来搭配 WHERE、ORDER BY 和 GROUP BY 等不同函数对数据进行过滤、排序和分组。下面是一个 SELECT 语句的例子:

SELECT column1, column2, column3
FROM table_name
WHERE condition;

在此示例中column1,column2、 和column3是你要从中检索数据的列的名称,table_name是包含数据的表的名称。该WHERE子句是可选的,但用于指定查询检索数据所必须满足的条件。

下面是一个示例,它从名为“客户”的表中选择客户年龄大于或等于 18 岁的所有记录:

SELECT *
FROM customers
WHERE age >= 18;

2.连接

JOIN 语句用于合并数据库中两个或多个表的数据。你应该掌握使用 JOIN 从多个表中检索数据并根据需要指定连接类型(例如 INNER、LEFT、RIGHT、FULL OUTER)。

以下是 JOIN 语句的几个示例:

内连接

INNER JOIN 仅返回两个表中的列之间存在匹配项的行。这是一个例子:

SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.customer_id;

在此示例中,orders表和customers表使用列customer_id进行连接。结果表将仅包含order_id和两个表中的customer_name列之间存在匹配项的列customer_id。

左连接

LEFT JOIN 返回左表中的所有行和右表中的匹配行。如果右表中没有匹配项,则结果将包含 NULL 值。下面是一个例子:

SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;

本例中,customers表为左表,orders表为右表。该customer_id列用于连接表。结果表将包括表中的所有行customers和表中的匹配行orders。如果表中没有匹配项orders,该order_id列将包含 NULL 值。

右连接

RIGHT JOIN 返回右表中的所有行和左表中的匹配行。如果左表中没有匹配项,则结果将包含 NULL 值。这是一个例子:

SELECT customers.customer_name, orders.order_id 
FROM customers 
RIGHT  JOIN orders 
ON customers.customer_id = orders.customer_id;

本例中,orders表为左表,customers表为右表。该customer_id列用于连接表。结果表将包括表中的所有行orders和表中的匹配行customers。如果表中没有匹配项customers,该customer_name列将包含 NULL 值。

外连接

SQL 中的 OUTER JOIN 用于返回一个或两个表中的所有行,包括不匹配的行。OUTER JOIN 有两种类型:LEFT OUTER JOIN 和 RIGHT OUTER JOIN。

下面是一个 LEFT OUTER JOIN 的例子:

SELECT customers.customer_name, orders.order_id 
FROM customers 
LEFT  OUTER  JOIN orders 
ON customers.customer_id = orders.customer_id;

本例中,customers表为左表,orders表为右表。该customer_id列用于连接表。结果表将包括表中的所有行customers和表中的匹配行orders。如果表中没有匹配项orders,该order_id列将包含 NULL 值。

下面是 RIGHT OUTER JOIN 的示例:

SELECT customers.customer_name, orders.order_id 
FROM customers 
RIGHT  OUTER  JOIN orders 
ON customers.customer_id = orders.customer_id;

本例中,orders表为左表,customers表为右表。该customer_id列用于连接表。结果表将包括表中的所有行orders和表中的匹配行customers。如果表中没有匹配项customers,该customer_name列将包含 NULL 值。

值得注意的是,某些数据库可能不支持 RIGHT OUTER JOIN,但您可以通过使用 LEFT OUTER JOIN 并交换表的顺序来获得相同的结果。

3. Where

WHERE 语句用于根据指定的条件过滤数据。你应该掌握使用 WHERE 来检索满足特定条件的数据。

以下是在 SQL 中使用“where”语句从表中过滤数据的示例:

假设我们有一个名为“employees”的表,其中包含“name”、“department”和“salary”列。我们可以使用“where”语句仅选择在“销售”部门工作且薪水大于 $50,000 的员工:

SELECT name, department, salary 
FROM employees 
WHERE department =  'Sales'  AND salary >  50000 ;

此查询将返回在“销售”部门工作且薪水大于 $50,000 的所有员工的列表,并在结果中显示他们的姓名、部门和薪水。

4. 分组

GROUP BY 语句用于根据一个或多个列对数据进行分组,聚合函数(例如 COUNT、SUM、AVG)可用于计算分组数据的汇总。你应该掌握使用 GROUP BY 来按类别分析数据。

假设我们有一个名为“employees”的表,其中包含“name”、“department”和“salary”列。我们可以使用 GROUP BY 语句按部门对员工进行分组,并计算每个部门的平均工资:

SELECT department, AVG (salary) as avg_salary 
FROM employees 
GROUP  BY department;

此查询将返回所有部门的列表和每个部门的平均工资,计算方法是将该部门员工的所有工资总和除以该部门的员工人数。GROUP BY子句用于按部门对员工进行分组,AVG函数用于计算每个部门的平均工资。

department | avg_salary
-----------------------
Sales      | 65000
Marketing  | 55000
Engineering| 80000

在此示例中,我们可以看到销售部门的平均工资为 65,000 美元,市场部的平均工资为 55,000 美元,工程部的平均工资为 80,000 美元。

5.Having

HAVING语句用于在GROUP BY语句分组后过滤数据。您应该掌握使用HAVING来根据特定条件过滤分组数据。

下面是在 SQL 中使用HAVING子句的示例:

假设有一个名为“orders”的表,其中包含“order_id”、“customer_id”、“product_id”和“quantity”列。目标是找到订购了至少 50 件产品的客户。可以使用GROUP BY子句将订单按客户分组,计算出每个客户订购的每种产品的总数量。然后,可以使用 HAVING 子句来过滤结果,以仅包括订购总量至少为 50 件的客户:

SELECT customer_id, SUM (quantity) AS total_quantity 
FROM orders 
GROUP  BY customer_id 
HAVING  SUM (quantity) >=  50 ;

此查询将返回所有客户及其订购产品总数的列表,但仅包括订购总量至少为 50 件的客户。GROUP BY子句用于按客户对订单进行分组,SUM函数用于计算每个客户订购的产品总数量,HAVING子句用于过滤结果只包含订购了总数量的客户至少50个单位。

查询的输出看起来像这样:

customer_id | total_quantity
---------------------------
123        | 60
456        | 70

在此示例中可以看到,客户 123 总共订购了 60 件产品,客户 456 总共订购了 70 件产品。这两个客户都满足 HAVING 子句中指定的条件,该条件要求总数量至少为 50 个单位。

6. 窗口函数

SQL 中的窗口函数用于对与当前行相关的一组行执行计算。这些函数应用于一个窗口,该窗口是基于指定条件或分区的表中行的子集。以下是 SQL 中窗口函数的一些示例:

  1. ROW_NUMBER():此函数为分区内的每一行分配一个唯一的序列号。ROW_NUMBER() 函数的语法是:

SELECT column1, column2, ..., ROW_NUMBER () OVER ( ORDER  BY column1) AS row_num 
FROM table_name;

此查询将返回一个结果集,其中包含一个附加列“row_num”,该列包含根据“column1”的顺序分配给每一行的序号。

  1. SUM():此函数计算分区内列的总和。SUM() 函数的语法是:

SELECT column1, column2, ..., SUM (column3) OVER ( PARTITION  BY column1) AS column3_sum 
FROM table_name;

此查询将返回一个结果集,其中包含一个附加列“column3_sum”,该列包含基于“column1”的值的每个分区的“column3”的总和。

  1. RANK():此函数根据指定列的值为分区内的每一行分配排名。RANK() 函数的语法是:

SELECT column1, column2, ..., RANK () OVER ( PARTITION  BY column1 ORDER  BY column3 DESC ) AS rank_num 
FROM table_name;

此查询将返回一个结果集,其中包含一个附加列“rank_num”,该列包含每个分区中每行的排名,基于“column3”的降序。

  1. AVG():此函数计算分区内列的平均值。AVG() 函数的语法是:

SELECT column1, column2, ..., AVG (column3) OVER ( PARTITION  BY column1) AS column3_avg 
FROM table_name;

此查询将返回一个结果集,其中包含一个附加列“column3_avg”,该列包含基于“column1”的值的每个分区的“column3”的平均值。

请注意,窗口函数的语法可能因所使用的特定数据库管理系统 (DBMS) 而异。

推荐书单

《MySQL从入门到精通(第2版)》

 《MySQL从入门到精通(第2版)/软件开发视频大讲堂》从初学者角度出发,通过通俗易懂的语言和丰富多彩的实例,详细介绍了MySQL开发需要掌握的各方面技术。

《MySQL从入门到精通(第2版)/软件开发视频大讲堂》共分为4篇24章,包括数据库基础,初识MySQL,使用MySQL图形化管理工具,数据库操作,存储引擎及数据类型,数据表操作,MySQL基础,表数据的增、删、改操作,数据查询,常用函数,索引,视图,数据完整性约束,存储过程与存储函数,触发器,事务,事件,备份与恢复,MySQL性能优化,权限管理及安全控制,PHP管理MySQL数据库中的数据,PHP+MySQL实现物流配送信息网,Python+MySQL实现在线学习笔记,Struts2+Spring+Hibemate+MySQL实现网络商城等内容。所有知识都结合具体实例进行介绍,涉及的程序代码也给出了详细的注释,可以使读者轻松领会MySQL的精髓,快速提高开发技能。

《MySQL从入门到精通(第2版)/软件开发视频大讲堂》【摘要 书评 试读】- 京东图书京东JD.COM图书频道为您提供《MySQL从入门到精通(第2版)/软件开发视频大讲堂》在线选购,本书作者:明日科技,出版社:清华大学出版社。买图书,到京东。网购图书,享受最低优惠折扣!icon-default.png?t=N4P3https://item.jd.com/12973639.html

精彩回顾

ChatGPT教你如何用Python和Matplotlib绘图(上) 

ChatGPT教你如何用Python和Matplotlib绘图(下) 

《事半功倍,使用ChatGPT编写Python函数》

超快速,使用ChatGPT编写回归和分类算法

《如虎添翼,将ChatGPT和Python结合起来!》

《ChatGPT优化Python代码的小技巧》

《使用ChatGPT提升Python编程效率》 

微信搜索关注《Python学研大本营》

访问【IT今日热榜】,发现每日技术热点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值