数据科学中90%的任务,可以借助这13条SQL语句解决。
结构化查询语言 (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. WhereWHERE 语句用于根据指定的条件过滤数据。你应该掌握使用 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.HavingHAVING语句用于在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 中窗口函数的一些示例:
- ROW_NUMBER():此函数为分区内的每一行分配一个唯一的序列号。ROW_NUMBER() 函数的语法是:
SELECT column1, column2, ..., ROW_NUMBER () OVER ( ORDER BY column1) AS row_num
FROM table_name;
此查询将返回一个结果集,其中包含一个附加列“row_num”,该列包含根据“column1”的顺序分配给每一行的序号。
- SUM():此函数计算分区内列的总和。SUM() 函数的语法是:
SELECT column1, column2, ..., SUM (column3) OVER ( PARTITION BY column1) AS column3_sum
FROM table_name;
此查询将返回一个结果集,其中包含一个附加列“column3_sum”,该列包含基于“column1”的值的每个分区的“column3”的总和。
- RANK():此函数根据指定列的值为分区内的每一行分配排名。RANK() 函数的语法是:
SELECT column1, column2, ..., RANK () OVER ( PARTITION BY column1 ORDER BY column3 DESC ) AS rank_num
FROM table_name;
此查询将返回一个结果集,其中包含一个附加列“rank_num”,该列包含每个分区中每行的排名,基于“column3”的降序。
- AVG():此函数计算分区内列的平均值。AVG() 函数的语法是:
SELECT column1, column2, ..., AVG (column3) OVER ( PARTITION BY column1) AS column3_avg
FROM table_name;
此查询将返回一个结果集,其中包含一个附加列“column3_avg”,该列包含基于“column1”的值的每个分区的“column3”的平均值。
请注意,窗口函数的语法可能因所使用的特定数据库管理系统 (DBMS) 而异。
7.UNION在 SQL 中,UNION运算符用于将两个或多个 SELECT 语句的结果组合成一个结果集。SELECT语句必须具有相同的列数,并且列必须具有兼容的数据类型。重复的行会自动从结果集中删除。
下面是在 SQL 中使用 UNION 运算符的示例:
假设我们有两个名为“customers”和“employees”的表,都有“name”和“city”列。我们想创建一个包含所有居住在纽约市的人(包括客户和员工)的列表。我们可以使用 UNION 运算符来组合两个 SELECT 语句的结果:
SELECT name, city
FROM customers
WHERE city = 'New York'
UNION
SELECT name, city
FROM employees
WHERE city = 'New York' ;
此查询将返回居住在纽约市的所有人的列表,包括客户和员工。第一个 SELECT 语句检索居住在纽约市的所有客户,第二个 SELECT 语句检索居住在纽约市的所有员工。UNION 运算符组合这两个 SELECT 语句的结果并删除任何重复的行。
查询的输出结果如下所示:
name | city| city
-------------------
John Smith | New York
Jane Doe | New York
Bob Johnson | New York
Samantha Lee| New York
在这个例子中,可以看到有四个人住在纽约市,两个来自“customers”表,两个来自“employees”表,UNION 运算符将两个 SELECT 语句的结果组合成一个单个结果集。
8. CREATECREATE 语句用于创建新的数据库表、视图或其他数据库对象。你应该掌握使用 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 INTO customers (id, name, email, phone)
VALUES (1, 'John Doe', 'johndoe@example.com', '555-555-1234');
SELECT * FROM customers;
此查询将在“customers”表中插入一个新行,ID 为 1,姓名为“John Doe”,电子邮件为“ johndoe@example.com ”,电话号码为“555–555–1234” . 第二个查询将从“customers”表中检索所有行,其中包括我们刚刚插入的新行:
id | name | email | phone
--------------------------------------------
1 | John Doe | johndoe@example.com | 555-555-1234
在这个例子中,我们使用CREATE语句在数据库中创建了一个新表,并在表中插入了一条新行。
9. INSERT插入 INSERT 语句用于将数据插入数据库表。你应该掌握使用 INSERT 向数据库表中添加新数据。下面是在 SQL 中使用 INSERT 语句的示例:
假设我们有一个名为“students”的表,其中包含“id”、“name”、“major”和“gpa”列。我们想在表中插入一个新行,记录 ID 为 1234、姓名为“John Doe”、主修“计算机科学”且 GPA 为 3.5 的学生。我们可以使用 INSERT 语句来做到这一点:
INSERT INTO students (id, name, major, gpa)
VALUES (1234, 'John Doe', 'Computer Science', 3.5);
此查询将向“students”表中插入一个新行,其中包含“id”、“name”、“major”和“gpa”列的指定值。INSERT 语句指定我们要插入的表的名称,后面是我们要插入值的列列表。然后我们使用 VALUES 关键字来指定我们想要插入到每一列中的值,按照列的列出顺序。
执行查询后,“students”表将有一个包含以下值的新行:
id | name | major | gpa
-----------------------------------------
1234 | John Doe | Computer Science | 3.5
在这个例子中,我们使用INSERT语句在 "学生 "表中插入了一条新行。
10.UPDATE更新 UPDATE语句用于修改数据库表中的现有数据。你应该掌握使用 UPDATE 来更新表中一个或多个列的值。以下是在 SQL 中使用UPDATE语句的示例:
假设我们有一个名为“students”的表,其中包含“id”、“name”、“major”和“gpa”列。我们想更新 ID 为 1234 的学生的专业和 GPA。我们可以使用UPDATE语句来执行此操作:
UPDATE students
SET major = 'Mathematics', gpa = 3.7
WHERE id = 1234;
此查询将更新 ID 为 1234 的“students”表中行的“major”和“gpa”列。UPDATE 语句指定我们要更新的表的名称,然后是 SET 关键字和列表,以及要更新的列值对。然后,我们使用 WHERE 子句指定要更新的行。在本例中,我们想要更新 ID 为 1234 的行,因此我们指定“WHERE id = 1234”。
执行查询后,“students”表将在 ID 为 1234 的行中更新“major”和“gpa”列的值:
id | name | major | gpa
--------------------------------------
1234 | John Doe | Mathematics | 3.7
在这个例子中,我们使用UPDATE语句更新了 "students"表中某一行的 "专业 "和 "gpa "列。
11.DELETE删除 DELETE 语句用于从数据库表中删除一行或多行。你应该掌握使用DELETE从表中删除数据的方法。下面是在 SQL 中使用DELETE语句的示例:
假设我们有一个名为“students”的表,其中包含“id”、“name”、“major”和“gpa”列。我们想从表中删除 ID 为 1234 的学生。我们可以使用DELETE语句来做到这一点:
从id = 1234的学生中删除;
DELETE FROM students
WHERE id = 1234;
此查询将从“students”表中删除 ID 为 1234 的行。DELETE语句指定我们要从中删除的表的名称, WHERE 子句用于指定要删除的行。在本例中,我们要删除 ID 为 1234 的行,因此我们指定“WHERE id = 1234”。
执行查询后,“students”表将不再有 ID 为 1234 的行:
id | name | major | gpa
--------------------------------------
5678 | Jane Doe | Computer Science | 3.5
在这个例子中,我们使用DELETE语句从"students"表中删除了一条记录。
12.DROP删除DROP 语句用于删除数据库表或其他数据库对象。你应该掌握使用 DROP 从数据库中删除不必要的表或其他对象。DROP 语句的语法因被删除对象的类型而异,一些常见的示例如下所示:
- DROP TABLE:此语句用于删除现有表及其所有数据和索引。DROP TABLE 语句的语法是:
DROP TABLE table_name;
2. DROP INDEX:该语句用于从表中删除现有索引。DROP INDEX 语句的语法是:
DROP INDEX index_name ON table_name;
3. DROP VIEW:该语句用于删除现有视图。DROP VIEW 语句的语法是:
DROP VIEW view_name;
4. DROP PROCEDURE:该语句用于删除一个现有的存储过程。DROP PROCEDURE 语句的语法是:
DROP PROCEDURE procedure_name;
请注意,DROP 语句的确切语法可能因所使用的特定数据库管理系统 (DBMS) 而异。此外,在使用 DROP 语句时要小心,因为它会永久删除指定的对象以及所有关联的数据和索引。请确保在使用 DROP 语句之前备份你的数据。
13.ALTER改变 ALTER语句用于修改数据库表或其他数据库对象的结构。你应该掌握使用 ALTER 添加或删除列、更改数据类型或修改表的其他方面。ALTER 语句的语法因被修改对象的类型而异,但一些常见的示例是:
- ALTER TABLE:该语句用于修改现有表的结构,例如添加或删除列、更改数据类型或设置约束。ALTER TABLE 语句的语法是:
ALTER TABLE table_name
ADD column_name data_type [CONSTRAINT],
MODIFY column_name data_type [constraint],
DROP column_name,
ADD CONSTRAINT constraint_name constraint_definition,
DROP CONSTRAINT constraint_name;
2. ALTER INDEX:该语句用于修改现有索引的结构,例如添加或删除列或更改索引类型。ALTER INDEX 语句的语法是:
ALTER INDEX index_name
ADD column_name,
DROP column_name;
3. ALTER VIEW:此语句用于修改现有视图的定义,例如更改用于创建它的SELECT 语句。ALTER VIEW 语句的语法是:
ALTER VIEW view_name
AS select_statement;
请注意,ALTER 语句的确切语法和窗口函数的语法可能因所使用的特定数据库管理系统 (DBMS) 而异。
转载自公众号 Python学研大本营