如果您使用数据,尤其是关系数据,那么结构化查询语言 (SQL) 就是您的通用语言。毫无疑问,SQL 是任何程序员学习的最有用的语言之一。它是我们用来与最常部署的数据库系统(包括 MySQL、PostgreSQL 和 Oracle)进行通信的语言。SQL 过去 50 年来一直是标准数据库查询语言,因为它既具有表达能力又易于使用。
但是提前说明下,并非所有数据结构都支持简单查询。查询的复杂性随着数据集的标准化级别而增加。例如,对于低标准化 (1-2 NF) 数据集,可以使用简单的 SELECT 语句访问所有数据。但如果规范化级别较高(3NF、BCNF),数据将分为多个表,这意味着您需要在创建查询之前使用多个 JOIN 语句来组合数据集。
虽然您需要进行相当多的练习才能执行有效的查询,但您会发现自己一遍又一遍地使用一些顶级命令。它们也往往是最有用的。
本文提供针对公共电影租赁数据集使用最多的 10 个 SQL语句。
要继续阅读本文,您需要下载并安装以下内容:
可以了,好了?让我们开始吧。
创建 PostgreSQL 数据集
在开始练习 SQL 查询之前,我们需要一个用于查询的数据库。在本例中,我们将使用 pgadmin 根据公开的电影租赁数据创建一个 PostgreSQL 数据库,以便更轻松地进行 SQL 管理和查询执行。
步骤 1 –通过执行以下查询创建数据库:
CREATE DATABASE pagila
WITH
OWNER = postgres
ENCODING = 'UTF8'
CONNECTION LIMIT = -1;
在这里我们可以直接看到 CREATE DATABASE 命令,该命令用于创建具有提供名称的数据库。
步骤 2 –通过下载架构定义并使用查询工具选项执行来创建架构:
$curl https://raw.githubusercontent.com/
morenoh149/postgresDBSamples/master/pagila-0.10.1/pagila-schema.sql --输出 schema.sql
一旦加载到 pgadmin 中,我们就可以通过单击向右的前进箭头或按 F5 使用 UI 来执行脚本。
步骤 3 – 将数据加载到数据库中。使用curl工具下载数据,并使用psql工具将其插入数据库:
$curl https://raw.githubusercontent.com/
morenoh149/postgresDBSamples/master/pagila
-0.10.1/pagila-data.sql
--输出 data.sql
$ psql -d pagila -f data.sql
加载后,我们可以使用 pgAdmin UI 来检查数据集表。这是数据库的实体关系图(ERD),显示了数据库中每个元素的关联方式:
前 10 个 SQL 命令
在深入研究示例之前,了解数据库接受的两种不同语言组非常重要:
DDL 或数据定义语言是一组用表、约束或序列描述数据库模式的命令。
例如,这些命令包括我们在本文中使用的 CREATE DATABASE 命令,还包括用于将数据插入表中的 INSERT INTO 命令,以及用于更新数据的 UPDATE 命令。
DML 或数据操作语言是一组允许我们查询数据库状态的命令。
DML 包含所有最常用的 10 个 SQL 命令。
#1 —SELECT
SELECT 语句是 SQL DML 的基础,因为大多数命令都以此运算符开头。我们可以使用它从表中选择单个列或行,或者仅用于计算表达式。以下是数据集中的一些示例:
选择客户表中的所有字段
SELECT * FROM customer;
仅从电影表中选择标题描述和年份字段
SELECT title, description, release_year from film;
使用付款表计算所有租赁销售额的总和
SELECT SUM(amount) from payment;
打印当前日期时间
SELECT now();
#2 —WHERE
当我们想要根据某些条件限制或过滤 SELECT 语句的结果时,我们需要使用 WHERE 命令。以下是数据集中的一些示例:
选择所有价值超过 5 美元的付款
SELECT * from payment where amount > 5;
选择姓氏为“smith”的所有客户
SELECT * from customer where LOWER(last_name)= 'smith';
选择 2005 年 5 月 24 日发生的所有影片租赁
SELECT * FROM rental WHERE DATE(rental_date)='2005-05-24'
#3 —BETWEEN
当我们想要选择某个范围内的值时,我们使用 BETWEEN 命令。我们需要使用 WHERE 运算符提供起点和终点:
选择 2005-05-24 至 2005-05-30 之间发生的所有租赁
SELECT * FROM Rental
WHERE DATE(rental_date) BETWEEN '2005-05-24' AND '2005-05-30';
#4 —AND/OR/NOT
AND、OR 和 NOT 是布尔运算符。它们允许我们应用布尔代数来过滤我们的结果。例如:
选择具有特定 inventory_id 和特定 customer_id 的所有租赁
SELECT * FROM rental WHERE inventory_id=1525 AND customer_id=127;
选择 2005-05-24 或 2005-05-30 发生的所有租赁
SELECT * FROM rental
WHERE DATE(rental_date)='2005-05-24'OR DATE(rental_date)='2005-05-30';
选择 2006 年发行但没有 NC-17 评级的所有电影
SELECT * FROM film
WHERE release_year=2006 AND NOT rating='NC-17';
#5 — MIN/MAX
当我们需要查找列中的最大值或最小值时,我们使用 MIN/MAX 函数。例如:
从胶片表中选择最大和最小更换成本
SELECT MAX(replacement_cost), MIN(replacement_cost) FROM film;
#6 —LIMIT/OFFSET
当我们想要限制结果的数量,或者实现分页结果(从初始位置以外的不同位置开始)时,我们使用 LIMIT 和 OFFSET 运算符:
选择前 50 个结果后的前 10 个付款详细信息
SELECT * FROM payment ORDER BY payment_date
DESC LIMIT 10 OFFSET 50
#7 —IN
IN 运算符用于检查包含条件。例如,我们可以检查要测试的值列表中存在哪些结果。这是一个示例查询:
选择具有相同最大重置成本的所有影片
SELECT film_id, title, replacement_cost FROM film
WHERE replacement_cost IN (SELECT MAX(replacement_cost) FROM film)
#8 —ORDER BY/GROUP BY
当我们想要按升序或降序对结果进行排序时,可以使用 ORDER BY 子句。我们可以使用 GROUP BY 通过计算表中所有行的某些值来创建聚合列。
选择所有影片并按影片长度降序排列(从最长到最短)
SELECT * from film ORDER BY length DESC;
从付款表中选择每个日期以及该日期所有付款的总金额
SELECT DATE(payment_date), SUM(amount)
from payment GROUP BY DATE(payment_date);
从付款表中选择每个日期以及该日期的付款总额,然后按降序排列
SELECT DATE(payment_date) as PaymentDate, SUM(amount)
as Total from payme
#9 —HAVING
如果我们想要过滤使用 GROUP BY 命令产生的聚合函数(例如 SUM 或 AVG),我们需要使用 HAVING 运算符,因为 WHERE 不能与聚合函数一起使用:
从付款表中选择每个日期以及该日期所有付款的总金额,但仅打印总价值超过 3000 美元的付款
SELECT DATE(payment_date) as PaymentDate,
SUM(amount) as total from payment GROUP BY PaymentDate HAVING SUM(amount) > 3000;
选择电影数量、评级和平均重置成本,但仅打印平均重置成本低于 19 美元的电影
SELECT COUNT(film_id), rating, AVG(replacement_cost)
as AvgReplacementC
#10 —INNER JOIN
如果 SELECT 是 SQL 命令的面包和黄油,那么 JOINing 表就是盐和胡椒。我们需要使用 JOIN 将表关系组合在一起并创建公共数据集。
在一张表中同时显示演员和电影详细信息。
SELECT first_name, last_name, title, description
FROM film_actor fa INNER JOIN actor ON (fa.actor_id = actor.actor_id) INNER JOIN film on (fa.film_id = film.film_id);
电影与演员之间存在多对多关系,因此我们使用 film_actor 表作为连接点。我们将 film_actor 和 actor 一起加入,然后将 film_actor 和 film 一起加入。SELECT 运算符现在可以访问两个表中的所有列。
Python 等编程语言中的 SQL 命令
现代数据库系统中还有更多可用的 SQL 命令,包括 INSERT、LIKE、DELETE FULL OUTER JOIN、COUNT、AS 和 DROP。一些专用数据库甚至会有自己的专用命令,例如地理信息系统 (GIS) 的命令,其中包括用于几何查询的ST_contains或ST_covers等函数。
但是,一旦掌握了基础知识,您应该能够轻松学习更专业的查询。当然,创建基本查询是一回事,但创建有用的高性能查询本身就是一种完全不同的学习体验。
然后是在 Python 等编程语言中使用 SQL 命令的整个方面。ActiveState 提供带有多个数据库连接器的 Python 发行版,例如 mysql-python、psycopg2、cx_Oracle、pyodbc 和 pymssql,它们支持您将使用的大多数流行的专有和开源数据库,包括 MySQL、PostgreSQL、Oracle 和 Microsoft SQL 服务器。
Python工作流程庞大且复杂。如果您熟练掌握,还有更多的内容需要学习。
值得庆幸的是,您来对地方了!
我们提供由前百度资深大数据工程师主持的自定进度课程”Python零基础到全栈视频课程”,您将通过大量的实践练习来学习Python入门、网络爬虫、数据分析、机器学习等内容。
如果您想了解培训如何进行,可以访问码易编程的官网:https://mayibiancheng.net/
有任何问题可以想咨询蚂蚁老师 ant_learn_python 微信账号。
点击下方“阅读全文”,可以直达课程主页