SQL谋杀案

(Let's go)

SQL市发生一起谋杀事件!这是一个好玩的破案游戏,让你自我驱动地学习SQL概念和命令。

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' 可以匹配 CanadaCalifornia.

另外,还有个不常用的通配符_。它表示匹配其他字符,在_的位置只有一个任意字符。例如'B_b' 会匹配 'Bob''Bub' 但不匹配'Babe''Bb'.

注意: 使用通配符时,不能用 = 号; 而是用LIKE.

SQL还支持数值比较< (小于) and > (大于). 也可以使用关键字 BETWEENAND 字符和数字都可以比较。

已经提到了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,做一些合理的假设。

2.检验结果

检验结果