002-解剖SELECT语句

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就只有一条记录,也不需要碍事的LIMITORDER BY了。

总结

对于SELECT语句来说,需要记住:

  1. SELECT语句是对SELECT后面紧跟着的表达式求值,如果表达式里面出现字段,就需要去FROM里面找到这些字段的出处。
  2. FROM里面找到的字段常常会有成千上万个可能结果,SQL会全部返回,所以我们需要使用LIMIT来限制返回的条数
  3. 因为限制了输出条数,顺序就会显得比较重要。只能看那么一点点输出,我们当然希望是按照某种顺序排好,是我们最关心的内容。所以我们使用ORDER BY来控制输出的顺序。
  4. 查询的时候,可以先用WHERE来筛选表,在筛选后的表里面进行查询。

思考

SELECT 1+2 

返回一条记录。

SELECT id FROM items

返回几百万条(等于items表的行数)记录。那么

SELECT id, 1+2 FROM items

返回多少条记录呢?

你可能感兴趣的:(002-解剖SELECT语句)