LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

13个SQL语句:解决90%的数据科学问题!你都知道哪些?

admin
2024年1月22日 12:5 本文热度 517

「前言」

"欢迎进入SQL的奇妙世界,这是一种被数据分析师和数据科学家视为宝藏的编程语言。想象一下,有一天你醒来,发现自己被成堆的数据包围。别担心,SQL就像一根魔法棒,可以帮助你从这些混乱数据中抽丝剥茧。

使用SQL,你可以像魔术师一样操作数据,无论是过滤、排序、分组还是聚合数据。在这篇文章中,我们将介绍13个必备SQL语句,它们就像你的数据科学工具箱里的瑞士军刀,简单易学,却能帮你解决90%的数据任务问题。

无论你是SQL新手,还是已经在数据海洋里畅游的老手,这篇文章都会像一盏灯塔,照亮你数据处理的道路。让我们开始吧,一起揭开SQL的神秘面纱,发现其中的乐趣和实用技巧吧!"

. . .

1. 检索(SELECT)

SELECT语句用于从数据库中的一个或多个表中检索数据。您应该掌握使用SELECT来过滤、排序和分组数据,使用不同的函数,如WHEREORDER BYGROUP BY。语法:

SELECT column1, column2, column3FROM table_nameWHERE condition;

在这个例子中,column1column2column3是您想要从中检索数据的列的名称,table_name是包含数据的表的名称。WHERE子句是可选的,用于指定查询检索数据必须满足的条件。

示例:从顾客表中选择客户年龄大于或等于18岁的所有记录

SELECT *FROM customersWHERE age >= 18;

. . .

2. 连接(JOIN)

JOIN语句用于组合数据库中两个或多个表的数据,作为数据分析师或数据科学家,掌握使用JOIN从多个表中检索数据,是必备技能之一。常用的连接类型主要有内连接、左连接、右连接以及外连接。

2.1 内连接(INNER JOIN)

内连接只返回两张表中满足连接条件且指定列的所有匹配行。例如下面的示例:

SELECT e.employee_name, d.department_nameFROM employees eINNER JOIN departments dON e.department_id = d.department_id;

在这个示例中,员工表(employees)和部门表(departments)使用department_id列作为连接条件,结果集只返回两个表中部门编号相同的员工姓名和部门名称。

2.2 左连接(LEFT JOIN)

也叫左外连接(LEFT OUTER JOIN),它会返回左表的所有行和右表中的匹配行,如果右表中不满足匹配条件,则结果中对应列的行以NULL填充。例如:

SELECT customers.customer_name, orders.order_idFROM customersLEFT JOIN ordersON customers.customer_id = orders.customer_id;

在这个例子中,顾客表(customers)是左表,订单表(orders)是右表。使用customer_id列作为连接条件。结果集将包括customers表中的所有行和orders表中的匹配行。如果orders表中没有匹配项,则order_id列的值将以NULL填充。

2.3 右连接(RIGHT JOIN)

也叫右外连接(RIGHT OUTER JOIN),与左连接刚好相反,右连接的结果集会返回右表的所有行和左表中的匹配行,如果左表中不满足匹配条件,则结果中对应列的行以NULL填充。例如:

SELECT customers.customer_name, orders.order_idFROM customersRIGHT JOIN ordersON customers.customer_id = orders.customer_id;

在这个例子中,订单表(orders)是左表,顾客表(customers)是右表。使用customer_id列作为连接条件。结果集将包括orders表中的所有行和customers表中的匹配行。如果customers表中没有匹配项,则customer_name列的值将以NULL填充。

2.4 全连接(FULL JOIN)

也叫全外连接(FULL OUTER JOIN),其结果集会返回两张表的所有行,包括非匹配行(以NULL表示),相当于两个数据集的并集。例如:

SELECT e.employee_name, d.department_nameFROM employees eFULL OUTER JOIN departments dON e.department_id = d.department_id;

以上示例将返回所有员工和部门的信息,包括还未分配部门的新员工(部门名称以NULL表示)以及还没有员工的新部门(员工姓名以NULL表示)。

💡 值得注意的是,某些数据库并不支持全连接(如MySQL),可用左连接、右连接加UNION (ALL)实现全连接效果。

. . .

3. 过滤(WHERE)

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

以下是在SQL中使用WHERE语句过滤表中数据的示例:

假设我们有一个名为“employees”的表,其中包含name(姓名)、department(部门)和salary(薪水)等列。我们可以使用WHERE语句选择那些在“Sales”(销售)部门工作且薪水超过50,000美元的员工:

SELECT name, department, salaryFROM employeesWHERE department = 'Sales' AND salary > 50000;

这个查询将返回所有在“Sales”(销售)部门工作且薪水超过50,000美元的员工名单,查询结果中会显示他们的姓名、部门和薪水。

. . .

4. 分组(GROUP BY)

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

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

SELECT department, AVG(salary) as avg_salaryFROM employeesGROUP BY department;

这个查询将返回所有部门及其平均薪水的列表,该平均薪水是通过计算该部门所有员工薪水之和然后除以该部门员工数得出的。GROUP BY子句用于按部门对员工进行分组,AVG函数用于计算每个部门的平均薪水。

如果有需要,我们还可以按部门平均薪水降序输出结果:

SELECT department, AVG(salary) as avg_salaryFROM employeesGROUP BY departmentORDER BY avg_salary DESC;

. . .

5. 过滤(HAVING)

这个过滤与WHERE不同,HAVING是用于对分组后的结果进行过滤,它用在GROUP BY子句之后,而WHERE则是用于对分组前表中的单行数据进行过滤。

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

假设我们有一个名为“orders”的表,其中包含order_id(订单编号)、customer_id(客户编号)、product_id(产品编号)和quantity(数量)等列。我们想要找到下单的产品总数不低于50的客户。我们可以使用GROUP BY子句按客户对订单进行分组,并计算每个客户订购的每种产品的总数量。然后使用HAVING子句对结果进行过滤,从而筛选出符合条件的客户:

SELECT customer_id, SUM(quantity) AS total_quantityFROM ordersGROUP BY customer_idHAVING SUM(quantity) >= 50;

这个查询将返回所有客户及其订购的产品总数量的列表,但只包括那些产品总数不低于50的客户。GROUP BY子句用于按客户对订单进行分组,SUM函数用于计算每个客户订购的产品总数量,HAVING子句用于过滤结果,仅包括那些总共订购产品总数不低于50的客户。

. . .

6. 窗口函数

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

  1. ROW_NUMBER():这个函数为分区内的每一行分配一个唯一的连续编号(即连续不跳跃排名)。ROW_NUMBER()函数的语法如下:
ROW_NUMBER() OVER (    [PARTITION BY partition_expression, ... ]    ORDER BY sort_expression [ASC | DESC], ...)
  • PARTITION BY:这是可选的。它将结果集划分为多个分区,然后对每个分区应用ROW_NUMBER函数。如果不指定,函数会将整个结果集视为一个单一分区。
  • ORDER BY:用于指定行号分配的顺序。每个分区可以有不同的顺序。

示例:

SELECT EmployeeID,        Department,        Salary,       ROW_NUMBER() OVER (         PARTITION BY Department          ORDER BY Salary DESC       ) AS RowNumFROM Employees;

这个查询将返回每个员工的编号、部门、薪水以及在部门内的薪水排名(由高到低)。

  1. SUM():用于计算分区内某列的总和。语法如下:
SELECT column1,        column2, ...,        SUM(column3) OVER (PARTITION BY column1) AS column3_sumFROM table_name;

这个查询将返回一个结果集,并带有一个额外的列column3_sum,该列包含基于column1值的每个分区中column3的总和。

  1. RANK():这个函数根据指定列的值为分区内的每一行分配一个排名(允许同名并列,且会跳过同名次所占用的序号,因此也称为连续跳跃式排名)。语法如下:
SELECT column1,        column2, ...,        RANK() OVER (PARTITION BY column1 ORDER BY column3 DESC) AS rank_numFROM table_name;

这个查询将返回一个结果集,并带有一个额外的列rank_num,该列包含基于column3降序排列的每个分区内每一行的排名。

  1. AVG():这个函数计算分区内某列的平均值。语法如下:
SELECT column1,        column2, ...,        AVG(column3) OVER (PARTITION BY column1) AS column3_avgFROM table_name;

这个查询将返回一个结果集,并带有一个额外的列column3_avg,该列包含基于column1值的每个分区中column3的平均值。

💡请注意,窗口函数的语法可能会根据使用的具体数据库管理系统(DBMS)而有所不同。

. . .

7. 组合(UNION)

在SQL中,UNION运算符用于将两个或多个SELECT语句的结果组合成一个结果集。SELECT语句必须有相同数量的列,且列必须具有兼容的数据类型。结果集中的重复行会自动被移除(如果想要包含重复行,请使用UNION ALL)。

以下是在SQL中使用UNION运算符的示例:

假设我们有两个表“customers”(客户)和“employees”(员工),它们都包含name(姓名)和city(城市)列。我们想创建一个名单,列出所有住在纽约市的人(包括客户和员工)。这里就可以使用UNION运算符来组合两个SELECT语句的结果:

SELECT name, cityFROM customersWHERE city = 'New York'UNIONSELECT name, cityFROM employeesWHERE city = 'New York';

这个查询将返回所有住在纽约市的人的名单,包括客户和员工。第一个SELECT语句检索所有住在纽约市的客户,而第二个SELECT语句检索所有住在纽约市的员工。UNION运算符结合这两个SELECT语句的结果,并移除重复行。

Tips:如果允许包含重复行,且查询表数据量较大的情况下,可以使用UNION ALL提升查询性能,因为UNION要排除重复行会涉及排序操作。

. . .

8. 创建(CREATE)

CREATE语句用于创建新的数据库表、视图或其他数据库对象。以下是在SQL中使用CREATE语句的示例:

假设我们想要创建一个名为“customers”的新表,其中包含id(编号)、name(姓名)、email(电子邮件)和phone(电话)等列。我们可以使用CREATE语句来实现这一点:

CREATE TABLE customers (  id INT PRIMARY KEY,  name VARCHAR(50),  email VARCHAR(100),  phone VARCHAR(20));

这个查询将创建一个名为“customers”的新表,包含四列:“id”(编号)、“name”(姓名)、“email”(电子邮件)和“phone”(电话)。其中,“id”列被定义为整数类型,并设置为表的主键。“name”列被定义为最大长度为50个字符的字符串,而“email”和“phone”列也被定义为字符串,其最大长度分别为100和20个字符。

在执行这个查询之后,我们可以对“customers”表进行常规的增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)操作。比如,添加向表中添加数据并检索它们:

INSERT INTO customers (id, name, email, phone)VALUES (1, 'Jack Zhang', 'jackzhang@example.com', '18888888888');
SELECT * FROM customers;

这个查询将向“customers”表中插入一行新数据,包括编号为1、姓名为“Jack Zhang”、电子邮件为“jackzhang@example.com”和电话号码为“18888888888”。第二个查询将从“customers”表中检索所有行,其中包括我们刚刚插入的新行:

id | name       | email                 | phone--------------------------------------------1  | Jack Zhang | jackzhang@example.com | 18888888888

在这个例子中,我们使用CREATE语句在数据库中创建了一个新表,并向该表中插入了一行新数据。

. . .

9. 插入(INSERT)

INSERT语句用于向数据库表中插入数据。以下是在SQL中使用INSERT语句的示例:

假设我们有一个名为“students”的表,其中包含id(编号)、name(姓名)、major(专业)和gpa(绩点平均值)等列。我们想要为一位编号为1234、姓名为“Jack Zhang”、专业为“Software Engineering”(软件工程)、绩点为3.5的学生在表中插入一行新数据。可以使用INSERT语句来实现这一点:

INSERT INTO students (id, name, major, gpa)VALUES (1234, 'Jack Zhang', 'Software Engineering', 3.5);

这个查询将向“students”表中插入一行新数据,并为id(编号)、name(姓名)、major(专业)和gpa(绩点平均值)列指定了相应的值。INSERT语句首先指定我们要插入数据的表的名称,然后列出我们想要插入值的列。接着我们使用VALUES关键字来指定我们想要插入到每一列中的值,按照列出的顺序。

在执行这个查询之后,“students”表将包含一行新数据,其值如下:

id   | name       | major                | gpa-----------------------------------------1234 | Jack Zhang | Software Engineering | 3.5

在这个示例中,我们使用INSERT语句向学生表中插入了一条新数据。

. . .

10. 更新(UPDATE)

UPDATE语句用于修改数据库表中现有的数据。以下是在SQL中使用UPDATE语句的示例:

假设我们有一个名为“students”的表,其中包含id(编号)、name(姓名)、major(专业)和gpa(绩点平均值)等列。我们想要更新编号为1234的学生的专业和绩点。可以使用UPDATE语句来实现这一点:

UPDATE studentsSET major = 'Computer Science', gpa = 3.7WHERE id = 1234;

这个查询将更新“students”表中编号为1234的行的major(专业)和gpa(绩点平均值)列。UPDATE语句首先指定我们想要更新的表的名称,接着是SET关键字和我们想要更新的列-值对列表。然后我们使用WHERE子句来指定我们想要更新的行。在这个案例中,我们想要更新编号为1234的行,所以我们指定WHERE id = 1234

在执行这个查询之后,“students”表中编号为1234的行的majorgpa列将会被更新为新的值:

id   | name      | major           | gpa--------------------------------------1234 | John Doe | Computer Science | 3.7

. . .

11. 删除(DELETE)记录

DELETE语句用于从数据库表中删除一个或多个行。以下是在SQL中使用DELETE语句的示例:

假设我们有一个名为“students”的表,其中包含id(编号)、name(姓名)、major(专业)和gpa(绩点平均值)等列。我们想要从表中删除编号为1234的学生。可以使用DELETE语句来实现这一点:

DELETE FROM studentsWHERE id = 1234;

这个查询将从“students”表中移除编号为1234的行。DELETE语句首先指定我们想要从中删除数据的表的名称,接着使用WHERE子句来指定我们想要删除的行。在这个案例中,我们想要删除编号为1234的行,所以我们指定WHERE id = 1234

在执行这个查询之后,“students”表将不再包含编号为1234的行。

. . .

12. 删除(DROP)数据库对象

DROP语句用于删除数据库表或其他数据库对象。DROP语句的语法根据被删除对象的类型而有所不同,以下是一些常见的例子:

  1. DROP TABLE:这个语句用于删除现有的表及其所有数据和索引。语法如下:
DROP TABLE table_name;
  1. DROP INDEX:这个语句用于从表中删除现有的索引。语法如下:
DROP INDEX index_name ON table_name;
  1. DROP VIEW:这个语句用于删除现有的视图。语法如下:
DROP VIEW view_name;
  1. DROP PROCEDURE:这个语句用于删除现有的存储过程。语法如下:
DROP PROCEDURE procedure_name;

💡请注意,DROP语句的确切语法可能会根据所使用的具体数据库管理系统(DBMS)而有所不同。此外,在使用DROP语句时要小心,因为它会永久删除指定的对象及其所有相关数据和索引。因此,在使用DROP语句之前,请确保备份您的数据。

. . .

13. 修改(ALTER)

ALTER语句用于修改数据库表或其他数据库对象的结构。你应该掌握使用ALTER语句来添加或移除列、更改数据类型或修改表的其他方面。ALTER语句的语法根据被修改对象的类型而有所不同,以下是一些常见的例子:

  1. ALTER TABLE:这个语句用于修改现有表的结构,比如添加或删除列、更改数据类型或设置约束。语法如下:
ALTER TABLE table_nameADD column_name data_type [constraint],MODIFY column_name data_type [constraint],DROP column_name,ADD CONSTRAINT constraint_name constraint_definition,DROP CONSTRAINT constraint_name;
  1. ALTER INDEX:这个语句用于修改现有索引的结构,例如添加或移除列或更改索引类型。语法如下:
ALTER INDEX index_nameADD column_name,DROP column_name;
  1. ALTER VIEW:这个语句用于修改现有视图的定义,例如更改用于创建视图的SELECT语句。语法如下:
ALTER VIEW view_nameAS select_statement;

请注意,ALTER语句的确切语法可能会根据所使用的具体数据库管理系统(DBMS)而有所不同。



该文章在 2024/1/22 12:05:38 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved