SQL基础知识

SQL基础知识

(一)基本语句SELECTFROMWHEREORDERLIMIT
一段SQL语言实例如下:

SELECT col1, col2
FROM table1
WHERE col3  > 5 AND col4 LIKE '%os%'
ORDER BY col5
LIMIT 10;

SELECT :读取并显示数据。我们将这称为查询
DROP TABLE:是删除数据库中表的语句
CREATE TABLE:是一个在数据库中创建新表的语句

  • 真实情境很少用到DROPCREATE语句,需要很高的权限,往往数据管理员才可以
  • 每个查询至少有一个 SELECTFROM 语句,其中:
    SELECT 语句用于放置要显示数据的列
    FROM语句用于放置要从中提取数据的表

  • SQL 查询忽略空格,因此可以根据需要在代码之间添加尽可能多的空格和空行,并且查询结果是相同的

  • 分号
    根据 SQL 环境,查询结尾可能需要一个执行的分号。我们认为在每个语句的末尾添加一个分号是最好的做法,如果环境能够一次显示多个结果,那么这样做还可以一次运行多个命令。

最好的做法:

SELECT account_id
FROM orders;

(二)基本操作

  • 查询:
    SELECT:用于提醒查询要返回哪些列。
    FROM:用于提醒查询在哪个表中查询。注意,这个表中需要有列。
SELECT *  
FROM orders;

练习
尝试编写自己的查询,以便为 orders 表中的所有订单选择 idaccount_idoccurred_at

SELECT id, account_id, occurred_at
FROM orders

文本格式化最佳方法

  • 大写命令(SELECT、FROM),小写查询中的其他内容是常见做法
  • 表和变量名中不需要空格
  • 通常在列名中使用下划线,避免使用空格
    在 SQL 中使用空格有点麻烦。 在 Postgres 中,如果列或表名称中有空格,就需要使用双引号括住这些列/表名称
    例如:FROM \”Table Name\”,而不是 FROM table_name)。在其他环境中,可能会使用方括号,例如:FROM [Table Name]
  • 查询中使用空格
SELECT account_id FROM orders

等价于

SELECT account_id
FROM orders
  • SQL 不区分大小写

    • LIMIT 数字限制返回结果的行数
SELECT *
FROM demo.orders
ORDER BY occurred_at
LIMIT 10

默认升序排列(ascending)
末尾加DESC:降序排列
练习
编写一个查询,将响应限制在前 15 行,和包括 web_events 表中的 occurred_at、account_id 和 channel 字段

SELECT occurred_at, account_id, channel
FROM web_events
LIMIT 15;
  • ORDER按顺序返回查询结果
SELECT account_id,total_amt_usd
FROM orders
ORDER BY account_id,total_amt_usd DESC
-- id递增,且在id相同的前提下,total_amt_usd降序排列
SELECT account_id,total_amt_usd
FROM orders
ORDER BY total_amt_usd DESC,account_id
-- total_amt_usd严格降序排列

练习
1、编写查询,返回 orders 表的前 10 个订单。包含 id、occurred_at 和 total_amt_usd

SELECT id, occurred_at, total_amt_usd
FROM orders
ORDER BY occurred_at
LIMIT 10;

2、编写一个查询,基于 total_amt_usd 返回前 5 个最高的 订单 (orders 表)。包括 id、account_id 和 total_amt_usd

SELECT id, account_id, total_amt_usd
FROM orders
ORDER BY total_amt_usd DESC 
LIMIT 5;

3、编写一个查询,基于 total 返回前 20 个最低 订单 (orders 表)。包括 id、account_id 和 total

SELECT id, account_id, total
FROM orders
ORDER BY total
LIMIT 20;

4、编写一个查询,返回按从最新到最早排序的 订单 中的前 5 行,但需首先列出每个日期的最大 total_amt_usd

SELECT *
FROM orders
ORDER BY occurred_at DESC, total_amt_usd DESC
LIMIT 5;

5、编写一个查询,返回按从最早到最新排序的 订单 中的前 10 行,但需首先列出每个日期的最小 total_amt_usd

SELECT *
FROM orders
ORDER BY occurred_at, total_amt_usd
LIMIT 10;

WHERE:添加查找限制条件,常用到符号><>=<=!==
练习
1、从 订单 表提取出大于或等于 1000 的 gloss_amt_usd 美元数额的前五行数据(包含所有列)

SELECT *
FROM orders
WHERE gloss_amt_usd >= 1000
LIMIT 5;

2、从 订单 表提取出小于 500 的 total_amt_usd美元数额的前十行数据(包含所有列)

SELECT *
FROM orders
WHERE total_amt_usd < 500
LIMIT 10;

同时,WHERE 语句也可以与非数字数据一起使用。我们可以使用 = 和 != 运算符。 还需要确保在文本数据中使用引号
:单引号或双引号都可以 - 如果原始文本中有引号,就一定要注意

通常将 WHERE 与非数字数据字段一起使用时,我们会使用 LIKENOTIN 运算符
练习
过滤账户(accounts )表格,从该表格中筛选出 Exxon Mobil 的 name、website 和 primary point of contact (primary_poc)

SELECT name, website, primary_poc
FROM accounts
WHERE name = 'Exxon Mobil';
  • LIMIT限制返回的行数
SELECT *
FROM orders
WHERE count_id=4251
ORDER BY occurred_at
LIMIT 100

其中,WHERE要放在FROM之后,ORDER BYLIMIT之前
支持非值查找,用单引号括起来

派生列:将现有的列组合,生成的新列称为派生列
常见运算:+-*/

运算顺序
PEMDAS 规则:http://www.purplemath.com/modules/orderops.htm

  • 合并几列创建一个新的列
    derived column(派生列):将现有列进行组合
SELECT account_id,
       occurred_at,
       standard_qty,
       gloss_qty,
       poster_qty,
       gloss_qty + poster_qty AS nonstandard_qty
FROM orders

可以添加新的列,名字为:nonstandard_qty
命名惯例:无代码和空格
练习
1、创建一个用 standard_amt_usd 除以 standard_qty 的列,查找每个订单中标准纸的单价。将结果限制到前 10 个订单,并包含 id 和 account_id 字段

SELECT id, account_id, standard_amt_usd/standard_qty AS unit_price
FROM orders
LIMIT 10;

2、编写一个查询,查找每个订单海报纸的收入百分比。 只需使用以 _usd 结尾的列。 (在这个查询中试一下不使用总列)。包含 id 和 account_id 字段

SELECT id, account_id,
poster_amt_usd/(standard_amt_usd + gloss_amt_usd + poster_amt_usd) AS post_per
FROM orders;

逻辑运算的简介LIKEINNOTAND & BETWEENOR
LIKE
可用于进行类似于使用 WHERE 和 = 的运算,但是这用于你可能 不 知道自己想准确查找哪些内容的情况。
IN:用于执行类似于使用 WHERE= 的运算,但用于多个条件的情况。
NOT:这与INLIKE 一起使用,用于选择 NOT LIKENOT IN某个条件的所有行
AND & BETWEEN:可用于组合所有组合条件必须为真的运算。
OR:可用于组合至少一个组合条件必须为真的运算

详解:
LIKE寻找包含某个字段的信息
需要使用通配符(wildcard),下面的通配符是%

SELECT *
FROM web_events_full
WHERE referer_url LIKE '%google%';

%代表任意数量的字符
练习
1、所有以 ‘C’ 开头公司名。

SELECT name
FROM accounts
WHERE name LIKE 'C%';

2、名称中包含字符串 ‘one’ 的所有公司名。

SELECT name
FROM accounts
WHERE name LIKE '%one%';

3、所有以 ‘s’ 结尾的公司名。

SELECT name
FROM accounts
WHERE name LIKE '%s';

IN限制查找的字段范围

SELECT *
FROM accounts
WHERE name IN('Walmart','Apple')

单引号(‘’)将字符串括起来,值可以直接输入

SELECT *
FROM accounts
WHERE account_id IN(1001,1021)

调出账户里的1001号和1021号的信息

练习
使用 客户 表查找 Walmart、Target 和 Nordstrom 的name (客户名称), primary_poc (主要零售店), and sales_rep_id (销售代表 id)

练习
编写一个查询,查找每个订单海报纸的收入百分比。 只需使用以 _usd 结尾的列。 (在这个查询中试一下不使用总列)。包含 id 和 account_id 字段

SELECT id,account_id,poster_amt_usd/(standard_amt_usd+gloss_amt_usd+poster_amt_usd) AS post_per
FROM orders
LIMIT 10
  • NOT查找条件取反
SELECT sales_rep_id,name
FROM accounts
WHERE sales_rep_id NOT IN(321500,321570)
ORDER BY sales_rep_id
  • AND和BETWEEN条件的取与
SELECT *
FROM orders
WHERE occurred_at >= '2016-04-01' AND occurred_at <= '2016-10-01'
ORDER BY occurred_at DESC

练习
使用客户表查找所有不以 ‘C’ 开始但以 ‘s’ 结尾的公司名

select name
FROM accounts
WHERE name NOT LIKE 'C%' and name LIKE '%s'

练习
使用 web_events 表查找通过 organicadwords 联系,并在 2016 年的任何时间开通帐户的个人全部信息,并按照从最新到最旧的顺序排列。

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 一般情况下不包括端点值,假设时间是 00:00:00(即午夜),这就是我们将右边的时间点设置为 '2017-01-01' 的原因了
SELECT account_id,
       occurred_at,
       standard_qty,
       gloss_qty,
       poster_qty
FROM orders
WHERE (standard_qty = 0 OR gloss_qty = 0 OR poster_qty = 0)
AND occurred at >= '2016-10-01'

练习
查找以 ‘C’ 或 ‘W’ 开头的所有公司名 (company names),主要联系人 (primary contact) 包含 ‘ana’ 或 ‘Ana’,但不包含 ‘eana

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 '%eana%'

SQL命令概述

语句使用方法其他详细信息
SELECTSELECT Col1,Col2,…提供你需要的列
FROMFROM Table提供列所在的表格
LIMITLIMIT10
ORDER BYORDER BY Col根据列命令表格。与 DESC 一起使用
WHEREWHERE Col > 5用于过滤结果的一个条件语句
LIKEWHERE Col LIKE ‘%me%’仅提取出列文本中具有 ‘me’ 的行
INWHERE Col IN (‘Y’, ‘N’)仅过滤行对应的列为 ‘Y’ 或 ‘N’
NOTWHERE Col NOT IN (‘Y’, “N’)NOT 经常与 LIKE 和 IN 一起使用
ANDWHERE Col1 > 5 AND Col2 < 3过滤两个或多个条件必须为真的行
ORWHERE Col1 > 5 OR Col2 < 3过滤一个条件必须为真的行
BETWEENWHERE Col BETWEEN 3 AND 5一般情况下,语法比使用 AND 简单一些

其他

  • 不区分大小写
  • 关键词顺序很重要
SELECT col1, col2
FROM table1
WHERE col3  > 5 AND col4 LIKE '%os%'
ORDER BY col5
LIMIT 10;

移动平均值
移动平均值用于将数据线性化,以便更容易观察长期趋势,也不会因日常波动而错乱。
例如,假设你想可视化服装零售店的销售趋势。从每天的数据开始,而图表看起来太不稳定,因为更多的人在周末购物,所以销售额会在周末飙升。
使用移动平均值可使每日波动平滑一些,也可以观察长期趋势。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值