zoukankan      html  css  js  c++  java
  • 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 - 创建这个表的时间)

    Image 010

     

    操作数据

     

    查询

    #数据展示
    
    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表明该字段是一个主键:

    图片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)  # 该外键指定要连接那个表
    
    );

    Image 011

     

    多表联合查询

    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的时候,会变成这样

    Image 012

    红线左边的就是landmarks表的值,右边就是facts表的值,因为id和name两个字段都重复了,所以右边的表会加上后缀1

    • INNER JOIN - 只展示符合查询条件的值,在上图中就是左边的country值等于右边id_1的值的那些行
    • LEFT OUTER JOIN - 左表中有不匹配的数据时,在合并的表中的其他字段就显示为NULL

    关于JOIN,更多资料参考:http://www.yiibai.com/sqlite/sqlite_using_joins.html

  • 相关阅读:
    pytorch图像处理的问题
    MWCNN中使用的haar小波变换 pytorch
    GhostNet: More Features from Cheap Operations
    人脸检测和识别以及检测中loss学习
    人脸检测和识别以及检测中loss学习
    C++ string的find类函数的使用
    pytorch各个版本的.whl文件下载地址
    人脸识别和检测中loss学习
    人脸识别和检测中loss学习
    人脸识别和检测中错误数据的三种类别
  • 原文地址:https://www.cnblogs.com/kylinlin/p/5251165.html
Copyright © 2011-2022 走看看