SQLite简易入门
本文内容来源:https://www.dataquest.io/mission/129/introduction-to-sql
本文所用数据来源:https://github.com/fivethirtyeight/data/tree/master/college-names
摘要:主要简介了SQLite的一些简易操作(增删改查)
原始数据展示(数据库facts存储了如下的这张表,主要字段描述:
code - 国家代码,name - 国家名称, area - 国土面积, created_at - 创建这个表的时间)

操作数据
查询
#数据展示 SELECT [columnA, columnB, ...] FROM tableName; #如: 查询数据库中code和name两列的数据 SELECT code, name FROM facts; #条件查询,使用where来界定查询条件,如,查询人口大于1亿的国家代码和名称 SELECT code, name FROM facts WHERE population> 100000000;
在where语句中可以使用的比较符号:
- 小于: <
- 小于或等于: <=
- 大于: >
- 大于或等于: >=
- 等于: =
- 不等于: !=
sqlite中可以直接对日期数据进行比较,譬如,查询在2015-11-01 14:00之前创建的数据
SELECT * FROM facts WHERE created_at < "2015-11-01 14:00"
注意:在双引号中就是日期格式的数据,必须按照yyyy-mm-dd HH:MM:SS的格式
限定返回的数据数量
# 有时候只想查看返回数据的前几条,使用limit, 如:查询前五条数据
select * from facts limit 5;
逻辑运算符
可以使用逻辑运算符and和or来组合多重查询条件
SELECT [column1, column2,...] FROM [table1] WHERE [condition1] AND [condition2] #如,人口大于1亿且国土面积大于100000的国家名称 select name from facts where population> 100000000 and area_land> 100000 limit 10;
组合多个查询条件
#如:查询在人口过亿的国家中,出生率大于20或者死亡率小于10的数据 select name from facts where (population >100000000) and (birth_rate > 20 or death_rate < 10);
排序
通过order by语句来指定排序的列,asc是升序,desc是降序
SELECT [column1, column2,...] FROM [table1] WHERE [conditions].. ORDER BY column1 [ASC or DESC] # 按国家名称降序排序 select name from facts order by name desc limit 10; #多列排序,譬如,在一个存储人名的表中,首先对姓排序,然后在同一个姓中再对名排序 select [column1, column2..] from table_name order by column1 (asc or desc), column2 (asc or desc)
查询一张表的数据类型,sqlite中主要有以下的数据类型:
- INTEGER - 类似于python中的整型类型
- REAL - 类似于python中的浮点数类型
- FLOAT - 类似于python中的浮点数类型
- TEXT - 类似于python中的字符串类型
- VARCHAR(255) - 类似于python中的字符串类型
之所以同一个类型有不同的名字,是因为sqlite用来兼容其他数据库所用的,查询一张表的数据类型,使用pragma语句
PRAGMA table_info(tableName); #结果会返回一个列表(截取): [[0, "id", "INTEGER", 1, null, 1], [1, "code", "varchar(255)", 1, null, 0], [2, "name", "varchar(255)", 1, null, 0]]
该列表的内容内容如下,pk = 1表明该字段是一个主键:

插入
往数据库中插入数据,使用insert语句,注意日期数据必须符合格式:yyyy-mm-dd HH:MM:SS
INSERT INTO tableName VALUES (value1, value2, ...); #例子: INSERT INTO facts VALUES (262, "dq", "DataquestLand", 60000, 40000, 20000, 500000, 100, 50, 10, 20, "2016-02-25 12:00:00", "2016-02-25 12:00:00");
如果要插入的数据中有空值,就用NULL代替即可
更新
UPDATE tableName SET column1=value1, column2=value2, ... WHERE column1=value3, column2=value4, ... # 例如,将United States改为DataquestLand update facts set name='DataquestLand' where name='United States';
删除
DELETE FROM tableName WHERE column1=value1, column2=value2, ...; # 例如,将名为Canada的数据全部删除 delete from facts where name='Canada';
使用python和sqlite交互
sqlite数据库并不需要开启一个单独的服务器进程,并且把所有的数据都存储在硬盘上的一个文件中,从python2.5开始,sqlite就集成在了python语言中,所以不需要额外安装库来操作sqlite
连接数据库
import sqlite3 conn = sqlite3.connect(‘countries.db’) #使用connect()方法来连接数据库,该参数指定数据库的名称
python是通过cursor对象来操作sql语句的,cursor对象可以执行如下功能:
- 查询数据库
- 解析从数据库返回的结果
- 将数据库的返回结果转化为python对象
- 将cursor的值保存为本地变量
注意:cursor对象把返回的结果保存到一个元组的列表中,如下
import sqlite3
conn = sqlite3.connect("countries.db") # 连接数据库
cursor = conn.cursor() # 返回一个cursor对象
query = 'select name from facts;' # 将查询语句保存为字符串格式
cursor.execute(query) # 执行查询语句
names = cursor.fetchall() # 保存全部的返回结果
print(names[0:2]) # 显示前两个数据
#结果:一个列表,列表中的每个元素是一个元组
[('Afghanistan,), ('Albania',)]
有时候可能需要逐条返回查询结果,就是用fetchone(),需要一次返回n条结果,就是用fetchmany(n)。因为在cursor对象中会保存一个内部的计数器,在每次得到返回结果时都会增加计数器
# 上面的查询语句等价于这样
import sqlite3
conn = sqlite3.connect("countries.db") # 连接数据库
cursor = conn.cursor() # 返回一个cursor对象
query = 'select name from facts;' # 将查询语句保存为字符串格式
cursor.execute(query) # 执行查询语句
names = cursor.fetchmany(2) # 保存前2条结果
print(names)
在某个进程连接着一个sqlite数据库的时候,其他进程是不能访问该数据库的,所以在操作完数据库之后需要关闭连接,注意,在关闭连接的时候,之前对数据库的更改会自动保存并生效。
conn = sqlite3.connect("countries.db")
conn.close()
操作表结构
上面的内容都是对表中的数据进行操作,现在要对表的结构进行操作,譬如创建新表,增加一列等
增加列
# 往一张表中增加一个新列 ALTER TABLE tableNAme ADD columnName dataType; # 例如,往该表中增加一列名为leader,且数据格式为text alter table facts add leader text;
创建新表
CREATE TABLE dbName.tableName( column1 dataType1 PRIMARY KEY, column2 dataType2, column3 dataType3, ... ); # 例如,在数据库factbook中创建一个新表用来保存国家领导人的信息 CREATE TABLE factbook.leaders( id integer PRIMARY KEY, # 指定主键 name text, country text );
创建具有外键的表
CREATE TABLE factbook.leaders( id integer PRIMARY KEY, name text, country integer, worth float, FOREIGN KEY(country) REFERENCES facts(id) # 该外键指定要连接那个表 );

多表联合查询
SELECT [column1, column2, ...] from tableName1 INNER JOIN tableName2 # 指定另一张表 ON tableName1.column3 == tableName2.column4; # 譬如,查找两张表中编号一致的数据 SELECT * from landmarks INNER JOIN facts ON landmarks.country == facts.id; # 除了INNER JOIN还有LEFT OUTER JOIN(左外连接)
在上面的例子中,landmarks是在左边的表,facts是在右边的表,在执行JOIN的时候,会变成这样

红线左边的就是landmarks表的值,右边就是facts表的值,因为id和name两个字段都重复了,所以右边的表会加上后缀1
- INNER JOIN - 只展示符合查询条件的值,在上图中就是左边的country值等于右边id_1的值的那些行
- LEFT OUTER JOIN - 左表中有不匹配的数据时,在合并的表中的其他字段就显示为NULL
关于JOIN,更多资料参考:http://www.yiibai.com/sqlite/sqlite_using_joins.html
SQLite简易入门的更多相关文章
- 机器学习简易入门(四)- logistic回归
摘要:使用logistic回归来预测某个人的入学申请是否会被接受 声明:(本文的内容非原创,但经过本人翻译和总结而来,转载请注明出处) 本文内容来源:https://www.dataquest.io/ ...
- Pandas简易入门(二)
目录: 处理缺失数据 制作透视图 删除含空数据的行和列 多行索引 使用apply函数 本节主要介绍如何处理缺失的数据,可以参考原文:https://www. ...
- SQLite数据库入门教程
SQLite数据库入门教程 SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同, ...
- 不用搭环境的10分钟AngularJS指令简易入门01(含例子)
不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...
- Web压力测试工具 LoadRunner12.x简易入门教程--(一)回放与录制
LoadRunner12.x简易入门教程--(一)回放与录制 今天在这里分享一下LoadRunner12.x版本的入门使用方法,希望对刚接触LoadRunner的童鞋有所帮助. LoadRun ...
- JNI简易入门
JNI简介 JNI(Java Native Interface)是JDK的一部分,提供了若干API实现了Java和其他语言的通信(主要是C/C++).JNI主要用于以下场景: 贴近硬件底层的功能,Ja ...
- crontab简易入门
前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...
- Golang项目的配置管理——Viper简易入门配置
Golang项目的配置管理--Viper简易入门配置 What is Viper? From:https://github.com/spf13/viper Viper is a complete co ...
- [数据库]Sqlite使用入门
官网的文档结构十分恶劣,大概翻了一下,提供入门指引. 0. sqlite的安装 根据自身情况,在官网下载32位/64位的dll文件以及sqlite-tools-win32-x86-3240000.zi ...
随机推荐
- [PHP] htaccess 探秘
.htaccess访问控制(Allow/Deny) 1. 验证是否支持.htaccess 在目录下新建一个.htaccess 文件,随笔输入一串字符(毫无意义),看看什么反应,如果是500错误,说明目 ...
- [WinForm] 使用反射将业务对象绑定到窗体或控件容器
在WebForm中,可以使用反射将业务对象绑定到 ASP.NET 窗体控件.最近做Winform项目,也参考WebForm中的代码实现同样的功能. Winform没有提供类似WebForm中的 ...
- 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』
作者:阿里云用户mr_wid ,z)NKt# @I6A9do 如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV RsfTUb)< 投票标题: 28.[阿里云 ...
- 【Java线程池快速学习教程】
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- 《Cortex-M0权威指南》之体系结构---程序映像和启动流程
转载请注明来源:cuixiaolei的技术博客 我们先来看看程序映像. 通常,Cortex-M0处理器的程序映像时从地址0x00000000处开始的. 程序映像开始处时向量表,其中包含了异常的其实地址 ...
- 使用spring + cxf +tomcat构建webservice
这里使用maven构建的项目. 首先,我们构建一个maven项目: 然后将pom.xml文件中的内容拷贝到新建项目的pon.xml文件中: <project xmlns="http:/ ...
- spring中配置jndi数据源
spring AplicationContext.xml中的配置 <bean id="dataSource1" class="org.springframewor ...
- vmware workstation 网络管理
其实在VMware Workstation下的网络管理是一个比较复杂的东西,如果你不是很了解他的网络,也许你的实验的时候,尤其是涉及到NAT转换.路由等问题的时候,你可能不知道从哪里下手,这时候你可能 ...
- nginx 反向代理设置
假设对本机80端口的访问为一台服务器,对本机8000端口的访问为另一台服务器,下面这样写一个nginx的反向代理配置,就可以实现所有请求都转移 server {listen 0.0.0.0:80;se ...
- Oracle10GODP连接11G数据库,出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题
一.出现症状 1.使用sqlplus连接正常 2.C#使用10g的ODP.NET连接时,报上面的错误 二.原因 1.Oracle11G之前密码是不区分大小写的,从11G开始默认密码区分大小写 2.使用 ...