什么是SQL

SQL, 全称为Structured Query Language(结构化查询语言)。 要讲SQL就绕不开database(数据库), 平时所说的数据库,一般就是指的 Relational database(关系型数据库).

大家知道数据库是用来存储大量数据的一种软件,那么SQL呢是用来操作数据里的数据,具体来说SQL可以做数据查询,数据更新,写入数据等等。

如果把数据库比作盘子,那数据就是盘子里的菜,SQL则是你的筷子。

timg

因为SQL和数据库是天生的一对,又相对简单,目前世界上大部分网站和APP背后的数据都是建立在SQL数据库基础之上。

关系型数据库(Relational databases)

在学习SQL语法之前有必要解释一下什么是关系型数据库(Relational databases)?数据库由若干张(Table)组成,这里说的数据Table很像Excel里的表; 正如Excel里的表格,Table也是由 行(rows)列(columns)组成

一个Table存储一个类别的数据,每一行是一条数据,每一列是这种数据的一个属性; Table就像一个二维的表格,列(columns)是有限固定的,行(rows)是无限不固定的

举个例子, 比如我们数据库里有一张表(Table). 是用来存储世界上所有的狗,每一行(rows)是一条狗的信息。那么你会在这个狗Table里存储 哪些狗的属性列(columns)呢?比如 编号,名字,体重,身高,品种,年龄,毛发颜色。

SELECT 语句, 通常又称为 查询 (queries), 正如其名, SELECT 可以用来从数据库中取出数据. 一条 SELECT 语句或者叫一个查询, 可以描述我们要从什么表取数据, 要取哪些数据,在返回之前怎么对结果做一些转化计算等等. 我们接下来会说明 SELECT 的语法,看 SELECT 是怎么来实现上述的取数据任务的。

你可以把一个表(Table)想象成一个类别的事物,比如 狗 (Dogs), 表里的每一行就是 一条狗,每一列代表了狗的一种属性,比如: 颜色,长度等等)

现在有了这么一张表,最常见的一种查询就是取出表中的 一个或某几个属性列(注意:是所有数据的某几个属性列)

Select 查询某些属性列(specific columns)的语法
SELECT column(列名), another_column, …
FROM mytable(表名);
查询的结果是一个二维的表格,由行(rows)和列(columns)组成, 看起来像是复制了一遍原有的表(Table),只不过列是我们选定的,而不是所有的列.

如果我们想取出所有列的数据, 当然可以把所有列名写上,不过更简单的方式用星号 (*) 来代表所有列.如下:

1
2
3
4
Select 查询所有列
SELECT *
FROM mytable(表名);
SELECT * FROM table.

这条语句经常用来在不清楚table(表)中有什么数据时,能取出所有的数据瞜一眼。

如果数据表里有100万行数据?真实世界中确实存在,世界上肯定有100万条狗那么多. 如果数据量这么大 之前的SQL语句很可能运行时会崩溃(想象一下你一次性下载1T的电影)

真实情况下,我们很少直接查所有行,即使查询出来也看不完。为了更精确的查询出特定数据,我们需要学习一个新的SQL语法:SELECT查询的 WHERE 子句. 一个查询的 WHERE子句用来描述哪些行应该进入结果,具体就是通过 condition条件 限定这些行的属性满足某些具体条件。比如:WHERE 体重大于 10KG的狗。你可以把 WHERE想象成一个 筛子,每一个特定的筛子都可以筛下某些豆子。

条件查询语法

1
2
3
4
5
SELECT column, another_column, …
FROM mytable
WHERE condition
AND/OR another_condition
AND/OR …;

注:这里的 condition 都是描述属性列的,具体会在下面的表格体现。
可以用 AND or OR 这两个关键字来组装多个条件(表示并且,或者) (ie. num_wheels >= 4 AND doors <= 2 这个组合表示 num_wheels属性 大于等于 4 并且 doors 属性小于等于 2). 下面的具体语法规则,可以用来筛选数字属性列(包括 整数,浮点数) :

Operator(关键字)Condition(意思)SQL Example(例子)
=, !=, < <=, >, >=Standard numerical operators 基础的 大于,等于等比较col_name != 4
BETWEEN … AND …Number is within range of two values (inclusive) 在两个数之间col_name BETWEEN 1.5 AND10.5
NOT BETWEEN … AND …Number is not within range of two values (inclusive) 不在两个数之间col_name NOT BETWEEN 1 AND10
IN (…)Number exists in a list 在一个列表col_name IN (2, 4, 6)
NOT IN (…)Number does not exist in a list 不在一个列表col_name NOT IN (1, 3, 5)

越是精确的条件筛选,会让结果更容易理解,同时因为条件在返回之前筛掉不必要的结果,SQL的运行速度也会快很多(想象一下你只是想看下最近有哪些大片上映,你没必要下载整个电影看一遍).

如果属性是字符串, 我们会用到字符串相关的一些操作符号,其中 LIKE(模糊查询) 和 %(通配符) 是新增的两个. 下面这个表格对字符串操作符有详细的描述:

Operator(操作符)Condition(解释)Example(例子)
=Case sensitive exact string comparison (notice the single equals)完全等于col_name = “abc”
!= or <>Case sensitive exact string inequality comparison 不等于col_name != “abcd”
LIKECase insensitive exact string comparison 没有用通配符等价于 =col_name LIKE “ABC”
NOT LIKECase insensitive exact string inequality comparison 没有用通配符等价于 !=col_name NOT LIKE”ABCD”
%Used anywhere in a string to match a sequence of zero or more characters (only with LIKE or NOT LIKE) 通配符,代表匹配0个以上的字符col_name LIKE “%AT%” (matches “AT”, “ATTIC”, “CAT” or even “BATS”) “%AT%” 代表AT 前后可以有任意字符
_Used anywhere in a string to match a single character (only with LIKE or NOT LIKE) 和% 相似,代表1个字符colname LIKE “AN“ (matches “AND”, but not “AN”)
IN (…)String exists in a list 在列表col_name IN (“A”, “B”, “C”)
NOT IN (…)String does not exist in a list 不在列表col_name NOT IN (“D”, “E”, “F”)