目录
SQL介绍
为什么使用数据库
只有输入了需要输入的数据,以及只有某些用户能够将数据输入数据库,才能保证数据的完整性。
可以快速访问数据 - SQL 可使我们从数据库中快速获取结果。 可以优化代码,快速获取结果。
可以很容易共享数据 - 多个人可以访问存储在数据库中的数据,所有访问数据库的用户获得的数据都是一样。
关于 SQL 数据库中所存储数据的几个要点:
数据库中的数据存储在类似于 Excel 电子表格的表中。
大多数情况下,可以将数据库视为一堆 Excel 电子表格。每个电子表格都有行和列。每行保存有关交易、个人、公司等的数据。而每列所保存的数据与你关心的某一特定行相关,如名称、位置、唯一身份等。
同一列中的所有数据必须符合数据类型。
将整个列认为是定量离散的或是某种字符串。这说明如果特定列中有一行字符串,那么整个列可能会更改为文本数据类型。 如果想使用此列进行数学计算,这可能会非常糟糕!
列类型一致是快速使用数据库的主要原因之一。
数据库通常会存储海量数据。因此,知道这些列都是相同类型的数据意味着可快速从数据库获取数据。
SQL 的关键是理解语句。这几个语句包括:
- CREATE TABLE 是一个在数据库中创建新表的语句。
- DROP TABLE 是删除数据库中表的语句。
- SELECT 读取并显示数据。我们将这称为查询。
我们在这里为你介绍两种用于每个查询的语句
- SELECT用于提醒查询要返回哪些列。
- FROM用于提醒查询在哪个表中查询。注意,这个表中需要有列。
LIMIT
LIMIT 命令始终是查询的最后一部分。下面的例子仅显示订单表的前 10 行和所有列:
SELECT *
FROM orders
LIMIT 10;
我们也可以通过将 10 更改为任何其他数字来更改行数。
ORDER BY
ORDER BY 语句可使我们按任意行排序表。ORDER BY 语句始终在 SELECT 和 FROM 语句之后,但位于 LIMIT 语句之前。 学习其他命令时,这些语句的顺序将更为重要。 如果使用 LIMIT 语句,它将始终显示在最后。
提示: 记住可以在 ORDER BY 语句中的列之后添加 DESC
,然后按降序排序,因为默认是按升序排序的。"
练习1:
编写查询,返回 orders 表的先下单的前 10 个订单。包含 id
、occurred_at
和 total_amt_usd
。
编写一个查询,基于 total_amt_usd
返回前 5 个最高的 订单 (orders 表)。包括 id
、account_id
和 total_amt_usd
。
编写一个查询,基于 total
返回前 20 个最低 订单 (orders 表)。包括 id
、account_id
和 total
。
SELECT id, occurred_at, total_amt_usd
FROM orders
ORDER BY occurred_at
LIMIT 10;
SELECT id, occurred_at, total_amt_usd
FROM orders
ORDER BY total_amt_usd DESC
LIMIT 5;
SELECT id, occurred_at, total
FROM orders
ORDER BY total
LIMIT 20;
我们可以一次 ORDER BY 多列。这个语句可以按照从左至右列出的列进行排序。 我们也可以也可以使用 DESC 来翻转排序。
练习2:
- 编写一个查询,返回按从最新到最早排序的 订单 中的前 5 行,但需首先列出每个日期的最大
total_amt_usd
。
- 编写一个查询,返回按从最早到最新排序的 订单 中的前 10 行,但需首先列出每个日期的最小
total_amt_usd
。
SELECT occurred_at,total_amt_usd
FROM orders
ORDER BY occurred_at DESC, total_amt_usd DESC
LIMIT 5;
SELECT occurred_at,total_amt_usd
FROM orders
ORDER BY occurred_at,total_amt_usd
LIMIT 10;
WHERE 语句
我们可以基于必须满足的条件,使用 WHERE 语句来为表格创建子集。下面的视频介绍了如何使用这个语句,在接下来的课程中,我们将学习一些与 WHERE 语句一起使用的常见运算符。
WHERE 语句中使用的常用符号包括:
>
(大于)
<
(小于)
>=
(大于或等于)
<=
(小于或等于)
=
(等于)
!=
(不等于)
练习1:
编写一个查询
- 从 订单 表提取出大于或等于 1000 的
gloss_amt_usd
美元数额的前五行数据(包含所有列)。
- 从 订单 表提取出小于 500 的
total_amt_usd
美元数额的前十行数据(包含所有列)。
select *
from orders
where gloss_amt_usd >= 1000
limit 5;
select *
from orders
where total_amt_usd<500
limit 10;
WHERE 与非数字数据一起使用
WHERE 语句也可以与非数字数据一起使用。在这节课中,我们可以使用 =
和 !=
运算符。 还需要确保在文本数据中使用单引号,而不是双引号(如果原始文本中有引号,就一定要注意)。
通常将 WHERE 与非数字数据字段一起使用时,我们会使用 LIKE、NOT 或 IN 运算符。
- 过滤账户(
accounts
)表格,从该表格中筛选出 Exxon Mobil 的name
、website
和primary point of contact
(primary_poc
)。
SELECT name, website, primary_poc
FROM accounts
WHERE name = 'Exxon Mobil';
逻辑运算符简介
逻辑运算符包括:
- LIKE
可用于进行类似于使用 WHERE 和=
的运算,但是这用于你可能 不 知道自己想准确查找哪些内容的情况。
- IN
用于执行类似于使用 WHERE 和=
的运算,但用于多个条件的情况。
- NOT
这与 IN 和 LIKE 一起使用,用于选择 NOT LIKE 或 NOT IN 某个条件的所有行。
- AND & BETWEEN
可用于组合所有组合条件必须为真的运算。
- OR
可用于组合至少一个组合条件必须为真的运算。
LIKE
LIKE 运算符对于处理文本非常有用。我们将在 WHERE 子句中使用 LIKE。 LIKE 运算符经常与 %
一起使用。 %
告诉我们,我们可能会想要任何数量的字符,产生一组特定的字符或者遵循一组特定的字符。记住,需要用单引号或双引号将传达给 LIKE 运算符的文本括住,因为这个字符串中的大小写字母不一样。 搜索 'T' 与搜索 't' 不同。
练习:
使用 accounts (客户) 表查找
- 所有以 'C' 开头公司名。
- 名称中包含字符串 'one' 的所有公司名。
- 所有以 's' 结尾的公司名。
select *
from accounts
where name like 'C%';
select *
from accounts
where name like '%one%';
select *
from accounts
where name like '%s';
IN
IN 运算符对于数字和文本列都很有用。这个运算符可使我们使用 =
,但对于特定列的多个项目。 可以检查我们要提取数据的一个、两个或多个列值,但这些都在同一个查询中。 在后面的概念中,我们将介绍 OR 运算符,也可以使用这个运算符执行这些任务,但使用 In 运算符编写的查询更清楚一些。
练习:
1、使用 客户 表查找 Walmart、Target 和 Nordstrom 的name (客户名称)
, primary_poc (主要零售店)
, and sales_rep_id (销售代表 id)
。
2、使用 web_events 表查找有关通过 organic
或 adwords
联系的所有个人信息。
select name,primary_poc,sales_rep_id
from accounts
where name in ('Walmart','Target','Nordstrom');
select *
from web_events
WHERE channel IN ('organic', 'adwords');
NOT
NOT 运算符是一个非常有用的运算符,用于与之前介绍的两个运算符 IN 和 LIKE 一起运算。通过指定 NOT LIKE 或 NOT IN,我们可以查找到所有不符合特定条件的行。
我们可以使用这个新运算符来提取前两个概念中不属于查询内容的所有行。
- 使用客户表查找除 Walmart、Target 和 Nordstrom 之外的所有商店的客户名称、主要零售店和销售代表 id。
- 使用 web_events 表查找除通过任何方法联系的个人的所有信息,除了使用
organic
或adwords
方法。
使用客户表查找:
- 所有不以 'C' 开头的公司名。
- 所有名称中不包含字符串 'one' 的公司名。
- 所有不以 's' 结尾的公司名。
SELECT name, primary_poc, sales_rep_id
FROM accounts
WHERE name not IN ('Walmart', 'Target', 'Nordstrom');
SELECT *
FROM web_events
WHERE channel NOT IN ('organic', 'adwords');
SELECT name
FROM accounts
WHERE name NOT LIKE 'C%';
SELECT name
FROM accounts
WHERE name NOT LIKE '%one%';
SELECT name
FROM accounts
WHERE name NOT LIKE '%s';
AND 运算符
AND 运算符用于 WHERE 语句中,用于一次考虑多个逻辑子句。 使用 AND 连接一个新的语句时,需要指定你感兴趣的列。可以同时连接尽可能多的考虑语句。 这个运算符可用于我们迄今为止所学习到的所有运算,包括算术运算符(+
、*
、-
、/
),可以使用 AND 运算符将 LIKE、IN 和 NOT 逻辑连接到一起。
BETWEEN 运算符
有时使用 BETWEEN 比使用 AND 使语句更清楚一些。特别是在 AND 语句的不同部分使用相同的列时,就可以使语句比较清晰。 在上一个视频中,我们可能已经使用了 BETWEEN。
而不是编写:
WHERE column >= 6 AND column <= 10
编写成以下这样,或许会更好:
WHERE column BETWEEN 6 AND 10
使用 AND 和 BETWEEN 运算符的问题
- 编写一个查询,返回所有订单,其中
standard_qty
超过 1000,poster_qty
是 0,gloss_qty
也是 0。
- 使用客户表查找所有不以 'C' 开始但以 's' 结尾的公司名。
- 使用 web_events 表查找通过
organic
或adwords
联系,并在 2016 年的任何时间开通帐户的个人全部信息,并按照从最新到最旧的顺序排列。
SELECT *
FROM orders
WHERE standard_qty > 1000 AND poster_qty = 0 AND gloss_qty = 0;
SELECT name
FROM accounts
WHERE name NOT LIKE 'C%' AND name LIKE '%s';
SELECT *
FROM web_events
WHERE channel IN ('organic', 'adwords') AND occurred_at BETWEEN '2016-01-01' AND '2017-01-01'
ORDER BY occurred_at DESC;
你可能会觉得对日期数据使用 BETWEEN 不太好理解。对于单纯的日期数据而言(只包含年月日不包含时间的数据,比如 '2016-12-31'),其默认时间为日期当天的 00:00:00(也就是午夜时分),而 BETWEEN 通常是不包含端点在内的,这也是为什么将右边的时间点设置为 '2017-01-01' 的原因。
OR 运算符
查找 订单 (orders) id 的列表,其中 gloss_qty
或 poster_qty
大于 4000。只在结果表中包含 id
字段。
编写一个查询,返回订单 (orders) 的列表,其中标准数量 (standard_qty
)为零,光泽度 (gloss_qty
) 或海报数量 (poster_qty
)超过 1000。
查找以 'C' 或 'W' 开头的所有公司名 (company names),主要联系人 (primary contact
) 包含 'ana' 或 'Ana',但不包含 'eana'。
SELECT id
from orders
where gloss_qty>4000 or poster_qty>4000;
select *
from orders
where standard_qty=0 AND (gloss_qty>1000 or poster_qty>1000);
select *
from accounts
where (name like 'C%' OR name like 'W%') AND (primary_poc like '%ana%' or primary_poc like '%Ana%') AND primary_poc NOT like '%cana%'
基础概述
常见命令
IN 运算符对于数字和文本列都很有用。这个运算符可使我们使用 =
,但对于特定列的多个项目。 可以检查我们要提取数据的一个、两个或多个列值,但这些都在同一个查询中。
虽然 SQL 不区分大小写(语句无所谓大小写),我们讨论了一些比较好的方法 关键词的顺序很重要! 使用到目前为止所学习到的所有内容编写自己的语句:
SELECT col1, col2
FROM table1
WHERE col3 > 5 AND col4 LIKE '%os%'
ORDER BY col5
LIMIT 10;
注意,可以检索与 ORDER BY 和 WHERE 语句中不同的列。假设所有这些列的名称都以这种方式(col1
、col2
、col3
、col4
、col5
)存在在 table1
表中,那么这个查询就运行得很好。