sqlite初步
查询是数据库中最频繁的操作,但学习查询指令,最起码要有可供查询的表格。比如现在有下面这些2022排名前20的国家GDP的数据,当然格式是csv的,我们要做的第一步就是将其转为sqilte格式。
1,美国,美洲,254600,0.253204
2,中国,亚洲,179600,0.178628
3,日本,亚洲,42300,0.042075
4,德国,欧洲,40700,0.040494
5,印度,亚洲,33900,0.033662
6,英国,欧洲,30700,0.030535
7,法国,欧洲,27800,0.027674
8,俄罗斯,欧洲,22400,0.022279
9,加拿大,美洲,21400,0.021279
10,意大利,欧洲,20100,0.019992
11,巴西,美洲,19200,0.019094
12,澳大利亚,大洋洲,16800,0.016661
13,韩国,亚洲,16700,0.016559
14,墨西哥,美洲,14100,0.014063
15,西班牙,欧洲,14000,0.013897
16,印尼,亚洲,13200,0.013117
17,沙特阿拉伯,亚洲,11100,0.01102
18,荷兰,欧洲,9911.15,0.009856
19,土耳其,欧洲,9059.88,0.009009
20,瑞士,欧洲,8077.06,0.008032
这个十分容易,一个.import命令轻松搞定,但在导入之前,需要新建一个表格,以设定表格并规范数据类型
C:\Users\Laser\Documents\00\0814>sqlite3 gdp.db
sqlite> create table gdp(rank int, nation text, continent text, gdp real, ratio real);
sqlite> .separator ',' -- 将分隔符设为逗号
sqlite> .import gdp.csv gdp
sqlite> .tables
gdp
sqlite> .mode column
sqlite> select * from gdp;
rank nation continent gdp ratio
---- ------ --------- -------- --------
1 美国 美洲 254600.0 0.253204
2 中国 亚洲 179600.0 0.178628
-- select * f会把表的所有内容打印出来
其中real为实数类型;.separator用于设置输入输出时的分隔符,如果不设置,可能会把导入的数据识别为一列。
.mode column将sqlite命令行在屏幕上的输出设为column模式
select最简单的用法就是查询列,比如现在只想输出国家和gdp两列,那么方法如下
> select nation, gdp from gdp;
nation gdp
------ --------
美国 254600.0
中国 179600.0
日本 42300.0
没有where字句的select是没有灵魂的,有了where,select就可以自由地定制筛选条件,从而真正意义上做到查询,比如现在想知道GDP前20国家中,有几个亚洲国家,那么就可以像下面这样
sqlite> select * from gdp where continent="亚洲";
rank nation continent gdp ratio
---- ------ --------- -------- --------
2 中国 亚洲 179600.0 0.178628
3 日本 亚洲 42300.0 0.042075
5 印度 亚洲 33900.0 0.033662
13 韩国 亚洲 16700.0 0.016559
16 印尼 亚洲 13200.0 0.013117
17 沙特阿拉伯 亚洲 11100.0 0.01102
即where后面可以接表达式,其支持的比较运算符中规中矩,大致如下
运算符 | 真值条件 | 运算符 | 真值条件 |
---|---|---|---|
==, =, is | 左右相等 | !=, <>, not is | 左右不等 |
> | 左大于右 | < | 左小于右 |
>=, !< | 左大等于右 | <=, !> | 左小等于右 |
除了比较运算,select也支持算术计算,加减乘除还有求余分别是±*/%,示例如下
sqlite> select 1+1;
1+1
---
2
如果想把所有gdp大于2万亿的亚洲国家都挑选出来,那么光是比较和算术运算符已经不够了,还得需要逻辑计算,sqlite中的与、或、非分别是and, or和not。
sqlite> select nation from gdp where continent="亚洲" and gdp > 20000;
nation
------
中国
日本
印度
如果想查看gdp在1到2万亿的亚洲国家,那么使用between…and运算符就会比较便捷
sqlite> select * from gdp where gdp between 10000 and 20000;
rank nation continent gdp ratio
---- ------ --------- ------- --------
11 巴西 美洲 19200.0 0.019094
12 澳大利亚 大洋洲 16800.0 0.016661
13 韩国 亚洲 16700.0 0.016559
14 墨西哥 美洲 14100.0 0.014063
15 西班牙 欧洲 14000.0 0.013897
16 印尼 亚洲 13200.0 0.013117
17 沙特阿拉伯 亚洲 11100.0 0.01102
sqlite还支持位运算,包括与、或、非,分别是&, |, ~;以及二进制左移位和右移位<<, >>。
通过运算符in,可以判断某个元素是否在某个集合中。
sqlite> select * from gdp where nation in ("中国", "美国");
rank nation continent gdp ratio
---- ------ --------- -------- --------
1 美国 美洲 254600.0 0.253204
2 中国 亚洲 179600.0 0.178628
通过like和glob可以进行通配符匹配字符串,其中glob对大小写敏感。由于我们数据中都是汉字,所以可以查询一下结尾是“国”的国家GDP
sqlite> select * from gdp where nation glob "?国";
rank nation continent gdp ratio
---- ------ --------- -------- --------
1 美国 美洲 254600.0 0.253204
2 中国 亚洲 179600.0 0.178628
4 德国 欧洲 40700.0 0.040494
6 英国 欧洲 30700.0 0.030535
7 法国 欧洲 27800.0 0.027674
13 韩国 亚洲 16700.0 0.016559