五分钟让你学会 SQL(二)

Posted by zhang on

咱们上回书说到,最基础的 sql 查询就是如此的简单。没有看到的可以看下历史文章的上一篇

今天,我们详细了解下基本查询模型SELECT * FROM table外的一些晋级语句,包括 WHERE 条件过滤、oder by 排序、group by 分组查询、 limit 限制条数以及逻辑运算符以及一些并表查询等语法

用的数据库还是上文说到的那个我改造了一下的 U.S. County-Level Data ,下载链接见上文付费部分。→_→

先了解下 SQL 中的逻辑运算符:

逻辑运算符 含义
= 等于
<> 不等与,有的一些 SQL 版本里是!=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在包含范围之间,举例子:SELECT * FROM table WHERE column BETWEEN value1 AND value2
LIKE 查找符合指定模式的值,举例子SELECT * FROM table WHERE column LIKE 'Snohomish'
IN 指定多个可能的值,举例子:SELECT * FROM table WHERE column IN( 'Snohomish','Cook','Orange')

还有一个要知道的就是「%」,它在 SQL 里代表的是通配符。

OK,我们先从条件过滤说起来,针对之前的数据加一下条件(WHERE),只看 county 是 Snohomish 的。

SELECT 
*
FROM covid_19_us
WHERE county LIKE 'Snohomish'

输出:

是不是很神奇?我们还可以看 county 是 Snohomish 和 Cook 的:

SELECT 
*
FROM covid_19_us
WHERE county IN ( 'Snohomish','Cook','Orange')

输出:

当然你还可以根据其他的条件,通过逻辑运算符进行不同的条件过滤。

我还想让输出的数据按照 data_uninx (这个字段内容是记录创建的时间戳)进行倒序看最新的记录,这就要用到order by 排序了:

SELECT 
*
FROM covid_19_us
WHERE county like 'Snohomish'
order by data_uninx desc

输出:

这里解释下,order by column DESC 代表的就是以 column 作为排序的依据,将其进行降序(DESC)排列,如果是升序排列的话,用ASC表示

对了,我还想看看这些数据中按照按照州(state)集合,看看各种的病例数和死亡数加总结果。这时候就要用到group by

SELECT 
    state, 
    sum(cases), 
    sum(deaths) 
FROM covid_19_us 
group by state

输出结果:

最后,这个数据将近 50w 行,从 1 月 1 日到 8 月 22 的全美数据都在这里边,一个是每次查询耗时耗力,我只想看最近的 5 条记录怎么呢?这时候就用到了limit

SELECT 
*
FROM covid_19_us
WHERE county like 'Snohomish'
order by data_uninx desc
limit 5

输出结果:

好了,现在你基本可以开始进行查询了,但是如果你只掌握了这些最基础的用法在工作中似乎还是无法实现「查询自由」,因为我们在前边的学习中,有一个重要的假设:所有数据都在一个表中,但在实际的业务系统中,这样的数据表是很少存在的。为了性能上的一些考虑,一般系统都会进行分库分表进行管理,比如一个商城可能包括了产品表、订单表、用户表,可是你要查询某一个用户买了多少东西,花了多少钱,每个东西的产品参数是什么这类问题时就会涉及到跨越三个表去查询。这时候我们就用到了跨表查询的技能。也就是说我们为了检索我们所需要的数据,将来自不同数据表的数据连接到一起。

听起来复杂的样子……

其实并不难,我们在上一篇文章中提到了「关系型数据库」这个词不知道你还有没有印象,「关系型」数据库最大的好处之一就是「关系」:表和表之间存在关系,我们可以通过「连接」(join)将它们连接到一起。

inner joinleft joinright joinfull join等,我们用的比较多的是一般是inner joinleft join

其中inner join (等值连接)只返回两个表中联结字段相等的行

left join (做连接)则是将左表(table1)返回所有行,即使右表(table2)中没有匹配。如果右表中没有匹配则返回 NULL。

right joinleft join正好相反,右表(table1)返回所有行,即使左表(table1)中没有匹配。如果左表中没有匹配则返回 NULL。

full join则是不管左表(table1)还是右表(table2),只要其中一个表中存在匹配,则返回结果,我们可以理解为是left joinright join结果的合集.

我们还是举个例子:

SELECT 
    covid_19_us.state, 
    sum(covid_19_us.cases), 
    sum(covid_19_us.deaths),
    us.state_abbr 
FROM covid_19_us left join us on covid_19_us.state = us.state
where covid_19_us.state in ('Washington','Illinois','California')
group by covid_19_us.state,us.state_abbr 

输出结果:

ok,SQL 你学会了么,重要的还是要练,只看不练是没有用的……

顺便推荐一个在线 SQL 学习网站:sqlzoo,可以去这里学习下,支持英文、日文、中文,不过中文是繁体中文。可以在上边在线执行 sql 语句。

#About Me

张小璋,野蛮生长成世界500强企业供应链金融产品经理的法语毕业生。微信公众号:张小璋碎碎念(ID: SylvainZhang )。
一直在互联网金融公司从事产品经理工作并负责互联网金融产品线,深耕互联网金融和区块链领域。「PMCAFF」、「人人都是产品经理」专栏作家、「PmTalk」签约作家。