SQL有很多语句,最常用的就是从数据库里面取数据的SELECT语句。这次我们把SELECT语句的每个部分的拆分出来,一点一点的掌握SELECT。
最简单的SELECT
最简单的SELECT只有SELECT后面接表达式:
SELECT 1, 1+2, 6-4, 2*3, 'a';
返回:
1,3,2,6,a
所以SELECT语句就是返回SELECT
后面紧跟着这些表达式的值,每个表达式的结果是一列。
理解FROM
SELECT语句并不一定需要FROM。只有当表达式里面出现字段引用的时候才会尝试从FROM语句里面去寻找。比如说:
SELECT a;
在Presto中执行后会返回:
Column 'a' cannot be resolved
因为你尝试引用字段a,但是又没有配套的FROM
,计算机不知道从哪里去找字段a。
SELECT a FROM items;
当然这也会返回报错,因为items
表里面没有a字段,计算机从items
表里面一波搜索,还是没有找到。
SELECT id FROM items;
这也就可以正常执行了。因为items
表里面确实有id
字段。但是这个SELECT id
和之前的SELECT 1+2
不一样:
因为items
表里面有几百万行,也就是有几百万个id
。那么返回哪个id
呢?SQL的设定是全部返回,所以我们得到了几百万行的返回。
这样返回的几百万行数据全部输出的话,会非常的不雅观,甚至可能导致程序崩溃,所以我们需要LIMIT
。
用LIMIT限制返回的条数
SELECT id FROM items LIMIT 10;
这样就能限制返回的条数在10了。不过很多软件考虑到很多新手会忘记LIMIT
,所以会默认加一个LIMIT
作为保护。比如我们现在使用的superset
就会默认添加LIMIT。
用ORDER BY控制返回的顺序
SELECT id FROM items LIMIT 10;
这样能够返回10条记录,但如果我想知道id最小的10条记录呢?这么做:
SELECT id FROM items ORDER BY id LIMIT 10;
那如果要最大怎么办呢?添加DESC
。
SELECT id FROM items ORDER BY id DESC LIMIT 10;
用WHERE来筛选表
items
里面有几百万行数据,但我们可能并不需要关心所有的数据,就像Excel里面筛选功能,先把FROM里面的表去除掉一些不想要的数据,然后再做别的操作。比如:
SELECT id FROM items WHERE id < 1000000 ORDER BY id DESC LIMIT 10;
就是我们只关心items
表中id
小于1000000
的记录(相当于id
大于等于1000000
的记录从items
表里面消失了),然后输出id
最大的10条记录。
用WHERE还可以筛选到只剩下一条记录,比如001中提到的:
SELECT id, zh_title FROM items WHERE id = 1234567;
因为id
等于1234567
就只有一条记录,也不需要碍事的LIMIT
和ORDER BY
了。
总结
对于SELECT语句来说,需要记住:
- SELECT语句是对
SELECT
后面紧跟着的表达式求值,如果表达式里面出现字段,就需要去FROM
里面找到这些字段的出处。 - 从
FROM
里面找到的字段常常会有成千上万个可能结果,SQL会全部返回,所以我们需要使用LIMIT
来限制返回的条数 - 因为限制了输出条数,顺序就会显得比较重要。只能看那么一点点输出,我们当然希望是按照某种顺序排好,是我们最关心的内容。所以我们使用
ORDER BY
来控制输出的顺序。 - 查询的时候,可以先用WHERE来筛选表,在筛选后的表里面进行查询。
思考
SELECT 1+2
返回一条记录。
SELECT id FROM items
返回几百万条(等于items表的行数)记录。那么
SELECT id, 1+2 FROM items
返回多少条记录呢?