本文内容来源: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简易入门的更多相关文章

  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. iOS UIimage初始化时的两种方法

    第一种方式:UIImage *image = [UIImage imageNamed:@"image"]; 使用这种方式,第一次读取的时候,先把这个图片存到缓存里,下次再使用时直接 ...

  2. JSONP跨域原理和jQuery.getJSON用法

    JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式).本文主要介绍JS ...

  3. 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

    0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...

  4. 【原】 twemproxy ketama一致性hash分析

    转贴请注明原帖位置:http://www.cnblogs.com/basecn/p/4288456.html 测试Twemproxy集群,双主双活 向twemproxy集群做写操作时,发现key的分布 ...

  5. 【JS Note】字符串截取

    Js中字符截取常用的三个函数:slice().substring().substr(). slice(): slice(start,[end]) 第一个参数代表开始位置,第二个参数代表结束位置的下一个 ...

  6. Table of Contents - Lombok

    Installation Lombok Annotations @Getter, @Setter, @ToString, @EqualsAndHashCode & @Data @NoArgsC ...

  7. char*,const char*和string 三者转换

    1. const char* 和string 转换 (1) const char*转换为 string,直接赋值即可. EX: const char* tmp = "tsinghua&quo ...

  8. git基础入门之常用命令操作

    本内容参考:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 初学,有什么不对的地方 ...

  9. C#如何关闭一个窗口的同时打开另一个窗口

    在.net的WinForm程序中,如果是直接起动的Form作为主窗口,那么这个主窗口是不能关闭的,因为它维护了一个Windows消息循环,它一旦关闭了就等于声明整个应用程序结束,所以新打开的窗口也就被 ...

  10. Javascript加载速度慢解决办法

    通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢.解决办法:换一个js包含的方式,让javascript加载速度倍 ...