本文内容来源: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 - 创建这个表的时间)

 

操作数据

 

查询

  1. #数据展示
  2.  
  3. SELECT [columnA, columnB, ...]
  4.  
  5. FROM tableName;
  6.  
  7. #如: 查询数据库中code和name两列的数据
  8.  
  9. SELECT code, name
  10.  
  11. FROM facts;
  12.  
  13. #条件查询,使用where来界定查询条件,如,查询人口大于1亿的国家代码和名称
  14.  
  15. SELECT code, name
  16.  
  17. FROM facts
  18.  
  19. WHERE population> 100000000;

在where语句中可以使用的比较符号:

  • 小于: <
  • 小于或等于: <=
  • 大于: >
  • 大于或等于: >=
  • 等于: =
  • 不等于: !=

sqlite中可以直接对日期数据进行比较,譬如,查询在2015-11-01 14:00之前创建的数据

  1. SELECT * FROM facts
  2.  
  3. WHERE created_at < "2015-11-01 14:00"

注意:在双引号中就是日期格式的数据,必须按照yyyy-mm-dd HH:MM:SS的格式

 

限定返回的数据数量

# 有时候只想查看返回数据的前几条,使用limit, 如:查询前五条数据

  1. select * from facts limit 5;

 

逻辑运算符

可以使用逻辑运算符and和or来组合多重查询条件

  1. SELECT [column1, column2,...] FROM [table1]
  2.  
  3. WHERE [condition1] AND [condition2]
  4.  
  5. #如,人口大于1亿且国土面积大于100000的国家名称
  6.  
  7. select name from facts where population> 100000000 and area_land> 100000 limit 10;

 

组合多个查询条件

  1. #如:查询在人口过亿的国家中,出生率大于20或者死亡率小于10的数据
  2.  
  3. select name
  4.  
  5. from facts
  6.  
  7. where (population >100000000) and (birth_rate > 20 or death_rate < 10);

 

排序

通过order by语句来指定排序的列,asc是升序,desc是降序

  1. SELECT [column1, column2,...] FROM [table1]
  2.  
  3. WHERE [conditions]..
  4.  
  5. ORDER BY column1 [ASC or DESC]
  6.  
  7. # 按国家名称降序排序
  8.  
  9. select name from facts order by name desc limit 10;
  10.  
  11. #多列排序,譬如,在一个存储人名的表中,首先对姓排序,然后在同一个姓中再对名排序
  12.  
  13. select [column1, column2..]
  14.  
  15. from table_name
  16.  
  17. order by column1 (asc or desc), column2 (asc or desc)

 

查询一张表的数据类型,sqlite中主要有以下的数据类型:

  • INTEGER - 类似于python中的整型类型
  • REAL - 类似于python中的浮点数类型
  • FLOAT - 类似于python中的浮点数类型
  • TEXT - 类似于python中的字符串类型
  • VARCHAR(255) - 类似于python中的字符串类型

之所以同一个类型有不同的名字,是因为sqlite用来兼容其他数据库所用的,查询一张表的数据类型,使用pragma语句

  1. PRAGMA table_info(tableName);
  2.  
  3. #结果会返回一个列表(截取):
  4.  
  5. [[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

  1. INSERT INTO tableName
  2.  
  3. VALUES (value1, value2, ...);
  4.  
  5. #例子:
  6.  
  7. INSERT INTO facts
  8.  
  9. 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代替即可

 

更新

  1. UPDATE tableName
  2.  
  3. SET column1=value1, column2=value2, ...
  4.  
  5. WHERE column1=value3, column2=value4, ...
  6.  
  7. # 例如,将United States改为DataquestLand
  8.  
  9. update facts
  10.  
  11. set name='DataquestLand'
  12.  
  13. where name='United States';

 

删除

  1. DELETE FROM tableName
  2.  
  3. WHERE column1=value1, column2=value2, ...;
  4.  
  5. # 例如,将名为Canada的数据全部删除
  6.  
  7. delete from facts
  8.  
  9. where name='Canada';

 

使用python和sqlite交互

sqlite数据库并不需要开启一个单独的服务器进程,并且把所有的数据都存储在硬盘上的一个文件中,从python2.5开始,sqlite就集成在了python语言中,所以不需要额外安装库来操作sqlite

 

连接数据库

  1. import sqlite3
  2.  
  3. conn = sqlite3.connect(‘countries.db’) #使用connect()方法来连接数据库,该参数指定数据库的名称

 

python是通过cursor对象来操作sql语句的,cursor对象可以执行如下功能:

  • 查询数据库
  • 解析从数据库返回的结果
  • 将数据库的返回结果转化为python对象
  • 将cursor的值保存为本地变量

注意:cursor对象把返回的结果保存到一个元组的列表中,如下

  1. import sqlite3
  2.  
  3. conn = sqlite3.connect("countries.db") # 连接数据库
  4.  
  5. cursor = conn.cursor() # 返回一个cursor对象
  6.  
  7. query = 'select name from facts;' # 将查询语句保存为字符串格式
  8.  
  9. cursor.execute(query) # 执行查询语句
  10.  
  11. names = cursor.fetchall() # 保存全部的返回结果
  12.  
  13. print(names[0:2]) # 显示前两个数据
  14.  
  15. #结果:一个列表,列表中的每个元素是一个元组
  16.  
  17. [('Afghanistan,), ('Albania',)]

有时候可能需要逐条返回查询结果,就是用fetchone(),需要一次返回n条结果,就是用fetchmany(n)。因为在cursor对象中会保存一个内部的计数器,在每次得到返回结果时都会增加计数器

  1. # 上面的查询语句等价于这样
  2.  
  3. import sqlite3
  4.  
  5. conn = sqlite3.connect("countries.db") # 连接数据库
  6.  
  7. cursor = conn.cursor() # 返回一个cursor对象
  8.  
  9. query = 'select name from facts;' # 将查询语句保存为字符串格式
  10.  
  11. cursor.execute(query) # 执行查询语句
  12.  
  13. names = cursor.fetchmany(2) # 保存前2条结果
  14.  
  15. print(names)

在某个进程连接着一个sqlite数据库的时候,其他进程是不能访问该数据库的,所以在操作完数据库之后需要关闭连接,注意,在关闭连接的时候,之前对数据库的更改会自动保存并生效。

  1. conn = sqlite3.connect("countries.db")
  2.  
  3. conn.close()

 

 

操作表结构

上面的内容都是对表中的数据进行操作,现在要对表的结构进行操作,譬如创建新表,增加一列等

增加列

  1. # 往一张表中增加一个新列
  2.  
  3. ALTER TABLE tableNAme
  4.  
  5. ADD columnName dataType;
  6.  
  7. # 例如,往该表中增加一列名为leader,且数据格式为text
  8.  
  9. alter table facts add leader text;

 

创建新表

  1. CREATE TABLE dbName.tableName(
  2.  
  3. column1 dataType1 PRIMARY KEY,
  4.  
  5. column2 dataType2,
  6.  
  7. column3 dataType3,
  8.  
  9. ...
  10.  
  11. );
  12.  
  13. # 例如,在数据库factbook中创建一个新表用来保存国家领导人的信息
  14.  
  15. CREATE TABLE factbook.leaders(
  16.  
  17. id integer PRIMARY KEY, # 指定主键
  18.  
  19. name text,
  20.  
  21. country text
  22.  
  23. );

创建具有外键的表

  1. CREATE TABLE factbook.leaders(
  2.  
  3. id integer PRIMARY KEY,
  4.  
  5. name text,
  6.  
  7. country integer,
  8.  
  9. worth float,
  10.  
  11. FOREIGN KEY(country) REFERENCES facts(id) # 该外键指定要连接那个表
  12.  
  13. );

 

多表联合查询

  1. SELECT [column1, column2, ...] from tableName1
  2.  
  3. INNER JOIN tableName2 # 指定另一张表
  4.  
  5. ON tableName1.column3 == tableName2.column4;
  6.  
  7. # 譬如,查找两张表中编号一致的数据
  8.  
  9. SELECT * from landmarks
  10.  
  11. INNER JOIN facts
  12.  
  13. ON landmarks.country == facts.id;
  14.  
  15. # 除了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简易入门的更多相关文章

  1. 机器学习简易入门(四)- logistic回归

    摘要:使用logistic回归来预测某个人的入学申请是否会被接受 声明:(本文的内容非原创,但经过本人翻译和总结而来,转载请注明出处) 本文内容来源:https://www.dataquest.io/ ...

  2. Pandas简易入门(二)

    目录:     处理缺失数据     制作透视图     删除含空数据的行和列     多行索引     使用apply函数   本节主要介绍如何处理缺失的数据,可以参考原文:https://www. ...

  3. SQLite数据库入门教程

    SQLite数据库入门教程 SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同, ...

  4. 不用搭环境的10分钟AngularJS指令简易入门01(含例子)

    不用搭环境的10分钟AngularJS指令简易入门01(含例子) `#不用搭环境系列AngularJS教程01,前端新手也可以轻松入坑~阅读本文大概需要10分钟~` AngularJS的指令是一大特色 ...

  5. Web压力测试工具 LoadRunner12.x简易入门教程--(一)回放与录制

        LoadRunner12.x简易入门教程--(一)回放与录制 今天在这里分享一下LoadRunner12.x版本的入门使用方法,希望对刚接触LoadRunner的童鞋有所帮助. LoadRun ...

  6. JNI简易入门

    JNI简介 JNI(Java Native Interface)是JDK的一部分,提供了若干API实现了Java和其他语言的通信(主要是C/C++).JNI主要用于以下场景: 贴近硬件底层的功能,Ja ...

  7. crontab简易入门

    前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...

  8. Golang项目的配置管理——Viper简易入门配置

    Golang项目的配置管理--Viper简易入门配置 What is Viper? From:https://github.com/spf13/viper Viper is a complete co ...

  9. [数据库]Sqlite使用入门

    官网的文档结构十分恶劣,大概翻了一下,提供入门指引. 0. sqlite的安装 根据自身情况,在官网下载32位/64位的dll文件以及sqlite-tools-win32-x86-3240000.zi ...

随机推荐

  1. JAVA数字证书制作生成

    1.加密算法 为了网络通讯中的报文安全,一般需要对报文进行加密,目前常用的加密算法有: 非对称加密算法:又称公钥加密算法,如RSA.DSA/DSS,最常用的就是RSA算法(算法公开,可自行百度了解算法 ...

  2. 程序编码(机器级代码+汇编代码+C代码+反汇编)

    [-1]相关声明 本文总结于csapp: 了解详情,或有兴趣,建议看原版书籍: [0]程序编码 GCC调用了一系列程序,将源代码转化成可执行代码的流程如下: (1)C预处理器扩展源代码,插入所有用#i ...

  3. Shell学习笔记 - 循环语句

    一.for循环 1. 语法格式1 for 变量 in 值1 值2 值3 ... do 程序 done 说明:程序将遍历所有的值,赋值给变量,然后在执行程序.也就是说,后面接多少个值,程序就循环多少次. ...

  4. FastJson的使用方法总结

    本文参考:http://www.tuicool.com/articles/zUbQfa 还可参考:https://www.iflym.com/index.php/code/alibaba-fastjs ...

  5. hdu 4118 树形dp

    思路:其实就是让每一条路有尽量多的人走. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<m ...

  6. sgu 185 最短路建网络流

    题目:给出一个图,从图中找出两条最短路,使得边不重复. 分析:既然是最短路,那么,两条路径上的所有节点的入边(s,x).出边(x,e)必定是最优的,即 dis[x] = dis[s]+edge_dis ...

  7. 浅析js中的this

    this的用法 this在日常javascript编码中很常见, 但是一直以来没有好好总结过. 今天在这里好好总结一下. 本文只讨论浏览器环境. this指向全局 var name = "w ...

  8. 根据不同的分辨率选择不同的css文件

    <SCRIPT language=javascript> <!-- Begin if (screen.width == 640) { document.write('<link ...

  9. Quartz.net官方开发指南系列篇

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  10. Hibernate总结--MyEclipse的小bug

    今天笔者在写一个用S2SH的程序的时候,出现了下面的错误: org.springframework.beans.factory.BeanCreationException: Error creatin ...