-
SQL谋杀案
(Let's go)
SQL初学者漫游
我们将介绍有关SQL的基本概念,但足以让你追查凶手。如果你想学习完整的SQL,去Select Star SQL看看。这起谋杀案已经发生,大侦探需要你的帮忙。大侦探给了你一份犯罪情况报告,但你不小心搞丢了。你模糊地记得这是一起谋杀案(murder) ,发生时间在2018年1月15日,地点在SQL市。从警察局数据库开始回忆那份你弄丢的犯罪情况报告吧。
所有案件的线索都在一个庞大的数据库里,你需要利用SQL工具在茫茫的信息海洋中打捞关键线索。第一步,从警局的数据库里检索一遍犯罪情况报告相关资料。后面我们会介绍你需要知道的高级命令,你可以在任何代码框中输入SQL语句以实现的你的检索查找。
一些概念定义
1.什么是SQL
SQL是结构化查询语言(Structured Query Language)的简称,是一种和关系型数据库交互的方式,方便人们检索特定有意义的信息。
2.慢着,什么是关系型数据库
一般来说,数据库是管理信息的系统。数据库可以有很多种形式存储数据。数据的结构性越强,就越能帮助人和计算机高效处理数据。
关系型数据库是最常见的一种数据库,它的核心是表,有点像Excel中的表格。表中的每一列有名字和数据类型(如字符、数字等等) ,每一行是具体的实例。“关系”的意思是指不同表之间数据是如何连接的特定规则。
3.什么是ERD
ERD是实体关系图(Entity Relationship Diagram)的简称,是数据库中各个表关联关系的可视化展现。下面有SQL谋杀案相关数据库的ERD。 图中每个表包含名字(上方),列名称的清单(左侧),相关数据类型(右侧,大写)。图中还有一些金钥匙图标,蓝色箭头和灰色箭头。金钥匙表示该列是表的主键,蓝色箭头表示该列是表的外键。如果两张表有关联,由灰色箭头连接表之间匹配的列。主键:表中每行唯一的标识。 外键:用于一张表与另一张表关联数据。这是我们数据库的ERD(线索就在里面,仔细观察,熟悉这幅图):

什么是查询呢
1.试试简单的查询
如果你看一看数据库中的数据,你会发现表格太大了!数据太多了,几乎不可能一行一行看过去查到想要的信息。那咋整呢?
查询就在这里派上用场了。查询是我们用于获取数据库中数据而构造的语句。查询语句读起来像英语。我们来试试一些数据库查询,在下面任何代码框中,点击run可以执行查询语句,第一次执行需要加载数据,耐心等待一会。(注意,SQL命令是大小写不敏感的,但为了便于阅读,一般大写。还可以使用换行或者空格调整命令格式,以便阅读。大多数数据库系统需要命令以';'结尾,但在这个web页面中不需要。)
2.SQL查询语句中有哪些元素呢?
一条查询语句包含:SQL关键字 (比如上面的 'SELECT' 和 'FROM' ),列名 (比如上面的列名type),表名 (比如上面的表名person),通配符 (比如 %
),函数,筛选条件和其他。
SQL关键字
SQL关键字是用于指定查询的操作。SQL关键字是大小写不敏感的,但建议使用大写,以便和其他部分区分开。一些常用的关键字有:
SELECT
SELECT 用于抓取数据库中指定列的数据:
- * (星号): 跟在SELECT后面表示抓取表中全部列;
- 列名: 选择指定列,将列名放在SELECT后,用逗号分隔各列名。
FROM
FROM 指定表; 通过表名加逗号分隔,可以指定多个表。(后面还会学JOIN关键字,你就能找到感觉了)
WHERE
WHERE 语句在查询中用于指定条件筛选结果。
动动手喽!
AND关键字用于多重条件筛选,必须每个条件都满足才会被筛选出来。(OR关键字用于筛选满足任一条件的结果行)
如果你没找到正确的犯罪情况报告,点击show solution按钮,替换为提示的代码。(忽略前面的 /*
) 如果你找到了一条犯罪情况报告,而不是多条相同城市相同犯罪类型的,那么恭喜你,找到了一条关键信息(你最好是把线索记下来,后面回用到的)。
3.通配符和匹配函数
经常你只是知道关键信息的一部分,SQL也能利用好。用特定符号表示未知字符,就是通配符。SQL支持两种通配符。最常用的是%
通配符。
写一个 %
通配符在一条查询语句中,SQL系统会返回匹配其他字符的结果,在通配符的位置可以是任何字符串。例如,
'Ca%a'
可以匹配 Canada
和 California
.
另外,还有个不常用的通配符_
。它表示匹配其他字符,在_
的位置只有一个任意字符。例如'B_b'
会匹配 'Bob'
和 'Bub'
但不匹配'Babe'
或
'Bb'
.
注意: 使用通配符时,不能用 =
号; 而是用LIKE
.
SQL还支持数值比较<
(小于) and >
(大于). 也可以使用关键字 BETWEEN
和 AND
字符和数字都可以比较。
已经提到了SQL命令大小写不敏感,但是 WHERE
查询使用=
和 LIKE
的条件对大小写敏感. 可是有时你不知道数据库中的文本是怎样的,还好SQL提供了两个函数帮你。他们是 UPPER()
和LOWER()
,你可以发现他们是干嘛的,在下面代码框里探索一番吧。
深水区
SQL聚合函数
有时候你的问题可能不是简单地查找某行符合条件的数据。你很可能想知道更复杂的问题,比如谁年龄最大,谁最矮之类的。聚合函数可以帮助解决这些问题。实际上你前面已经学了一个聚合函数COUNT
。有驾照的人中年龄最大的有多大?在数据量不大的时候,你可以直接用肉眼去看,但drivers_license
表中有成千上万条记录。(试试COUNT
,你就知道有多少了!)你不可能靠看数据而找到答案。
SQL提供了一些有用的聚合函数: MAX:查找最大值;MIN:查找最小值;SUM:计算某列的和;AVG:计算某列的平均值;COUNT:某列值的计数。
还有另外一种查找最大最小值的办法,同时可以看到更多的数据,就是通过排序。在列名后使用ORDER BY
很简单地排序。当数据量很大时,排序是个很大的挑战(当大家使用SQL工作时,请使用更好的数据库工具,别用这种基于web版的)。默认条件下,ORDER BY 是升序的,你也可以通过ASC
指定升序,或者DESC
指定降序。
目前你已经具备了足够的SQL知识来找到两个目击者,试试吧!还记得第一条线索吗?
把表格连接起来
1.抓住凶手
到目前,我们已经能够从单一表中查找数据。但如果我们需要遇到复杂问题怎么办,比如从两个不同的表取数。JOIN登场了。
SQL老手会使用好几种JOIN,你可能听说过内连接,外连接,左连接,右连接。这里我们只讨论最常见的内连接。由于内连接太常见了,SQL中可以忽略INNER关键字。
最常见的连接表的方式是使用主键和外键。参考前面的ERD图,看看键在表格之间的关系。可以连接任意列,但是作为键值的列可以提高效率。最简单展示连接操作是如何工作的就是写出来。
有时候你想连接不止一张表。SQL可以在一条查询中连接很多表。
现在你已经知道如何连接表了,你可以找到之前查到的两个目击者的询问记录。试试吧!(还记得前面找到的线索吗,另外多看看ERD图很有帮助)

抓住凶手!
目前为止,你已经有了足够的SQL知识去追查凶手。你可能要仔细看看ERD,做一些合理的假设。