SQLite数据类型
1、NULL空值
2、INTEGER整数
3、TEXT文本
4、REAL浮点数
5、BLOB二进制数据
可以看到,SQLite 中有两种类型的数字,分别是专门用来表示 整数 的 INTEGER
,以及用来表示带有小数点的数字,也就是 浮点数 的 REAL
。整数、浮点数类型,加上用来表示 文本 类型信息的 TEXT
类型,构成了 SQLite 数据类型的三大支柱。
需要注意的是,我们看到的数据表,展示的是 TEXT
类型数据本身的内容。但在编程过程中使用、表示 TEXT
类型数据时,需要用一对英文 单引号 '
把文本内容包裹起来,就像图片中那样。
除此之外,如果录入数据时,忘记输入了一些值,这个值会被 SQLite 记作 NULL
,属于 NULL
类型。
而如果创建数据表时,没有指定某列属于什么数据类型,SQLite 会默认它为 BLOB
类型,原封不动地进行存储。在计算机看来,它既不属于数字,也不是普通意义上的文本,因此几乎无法对它进行计算、处理、分析。所以我们在创建数据表时,一定要注意各个字段的数据类型。
标准时间格式
SQLite 会把符合 标准时间格式 的文本视作一个日期或是时间。具体格式为 年-月-日 时:分:秒,年、月、日之间用一个 -
连接,时、分、秒之间用一个 :
连接,日期部分和时间部分中间用一个空格隔开。并且当年份不足 4 位,或者月、日、时、分不足 2 位时,需要在前面补 0。比如 2021 年 1 月 1 日下午 2 点整,写成标准时间格式就是 '2021-01-01 14:00'
。
这套标准时间格式不仅可以用来表示日期,还能用来表示一段时间。比如 3 小时 15 分钟可以表示为 '03:15:00'
。
使用 INTEGER
整数类型表示的时间,其实是计算机世界里一种特殊的时间格式——Unix 时间戳。它表示从 1970 年 1 月 1 日午夜开始直到现在某一时刻所经过的秒数。比如 2021 年 1 月 1 日午夜的 Unix 时间戳是 1609430400
。
Unix 时间戳只能用来表示某一天的具体时刻,不能表示一段时间。不过它也有自己的优点,那就是 计算方便。
比如我们想知道 2021 年 1 月 1 日到 5 月 20 日之间经过了多少天,由于前者午夜时分的 Unix 时间戳是 1609430400
,后者午夜的 Unix 时间戳是 1621440000
,两个时间戳的差为 12009600 秒,换算一下,也就是 139 天。
SELECT…FROM…子句
如同我们在第一关中学习的那样,SQL 是一门通用、简单、专精的语言,SQL 语句中涉及到的,都是一些描述性强、易于记忆的单词。这些“单词”,有个专业的称呼,叫做 关键字。
与中文、英文等自然语言类似,SQL 的词与词之间,也需要遵循一定的规律组合在一起,才能表达完整的含义。而这种“规律”即是 SQL 的语法,也是我们学习的重点。遵循 SQL 语法编写语句,我们就能使用关键字完成不同的功能,如搜索、排序、联结,等等。
所有关键字中,最为根本的也最为常用的,大约就是 SELECT
和 FROM
了。
SELECT
,顾名思义,表示 选择 这一动作。放在 SQL 里,表示 选择 一个或若干个字段。
在 SQL 语言中,除了 TEXT
类型的数据,也就是那些用单引号包裹起来的值,其它的要素,比如关键字、数据表名、列名,以及我们后面学到的函数的名字,都是 不区分大小写 的。
其中还有一个很重要的细节,FROM staff
后面有一个英文的分号 ;
。分号 在 SQL 中表示一条 SQL 语句的结束,所以每当写完一条 完整 的 SQL 语句,需要在末尾加上分号,与其它的语句进行区分。
-- 写法一:
SELECT name FROM staff;
-- 写法二:
SELECT name
FROM staff;
-- 写法三:
SELECT name
FROM staff;
-- 写法四:
SELECT
name
FROM
staff;
如果我们想从 staff
数据表中选择出 name
、age
和 hire_date
这三列的话,只需要把把这三列的名字作为待选字段,依次写在 SELECT
关键字后面,列名与列名之间用英文逗号 ,
隔开即可。
SELECT name, age, hire_date
FROM staff;
那如果想选择一张数据表中的 所有列 该怎么办?难不成把所有列明都抄写一遍吗?
咳咳,这么做当然可以。但 SQL 语言还提供了一种更简便的方法:
SELECT *
FROM staff
DISTINCT关键字
单词 distinct 本身就有“独特”的含义,放到 SQL 中,DISTINCT
关键字表明在选择时,只保留 首次 出现的组合,在位置上,则需要紧紧跟在 SELECT
关键字之后。
SELECT DISTINCT department
FROM staff;