sqlite3

[toc]

[TOC]

资源

1、核心源码

本地资源:sqlite-snapshot-202007301737.tar.gz
网站下载最新版本 https://www.sqlite.com/download.html

2、安装

A、linux安装

一般情况下,linux默认支持 sqlite3,如centos7.5
没有默认支持也没关系,简单的两条语句即搞定:
tar -xf sqlite-snapshot-202007301737.tar.gz
cd sqlite-snapshot-202007301737 
./configure && make && make install

B、windows安装

可以采用仿 linux 环境安装。
也可以不安装,直接放到项目中一并编译。
windows上的 sqlite 客户端十分好用

对tcl的支持

源码包中除了sqlite源码本身之外,还有一个 tcl 扩展接口。扩展库。
同时支持 windows 和 linux ,安装也十分方便。
readme.txt 说的清楚,也是简单的一句:
./configure && make && make install

一、图形界面查询操作

1、准确查询

select * from tableName where position=="myPosition"
然后点击下面的"Execute SQL"按钮

2、模糊匹配

select * from tableName where position like "%Position"

说明:where position中的position是表中的一个列名

多种查询方法,支持中文

select * from myTbl where name!="Mr.Zhou"
select * from 姓氏表 where 姓!="周"
select * from myTble where name=zhou
select * from myTble where name==zhou 一个等号和两个等号效果相同
select * from myTbl where name like "%甫" 能查询到皇甫,%是匹配关键字
select myTbl.pos from myTbl inner join secTbl on myTbl.name=secTbl.name  这样查询出的结果可能有重复
select distinct myTbl.pos from myTbl inner join secTbl on myTbl.name=secTbl.name  加上distinct关键字后,查询出的结果不再重复

sqlite3版权问题

已加入 public domain<br>就是任何人都可以随便使用

全部文档

sqlite.com/download.html
全部说明文档,压缩包约3.5M,或者到 runoob 上看sqlite也不错

linux C 操作数据库

https://blog.csdn.net/qq_30594349/article/details/53015708?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db = NULL;
static char *errmsg = NULL;
int main()
{
    int ret;
    int insert;
    ret = sqlite3_open("test.db", &db);
    if(ret)
    {
        printf("can not open database.\n");
    }
    else
    {
        printf("open database succsee.\n");
    }
    insert =  sqlite3_exec(db, "insert into test_table values('wujibing',111,222)", 0, 0, &errmsg);//插入
    //insert = sqlite3_exec(db, "delete from test_table where name='xu'", 0, 0, &errmsg);//删除
    //insert = sqlite3_exec(db, "delete from test_table", 0, 0, &errmsg);//清空
    printf("exec_ret: %d\n", insert);
    printf("errMsg: %d\n", errmsg);
    sqlite3_close(db);
    return 0;
}

#include <stdio.h>
#include <sqlite3.h>

static sqlite3 *db = NULL;
static char **Result = NULL;
static char *errmsg = NULL;

int main()
{
    int ret;
    int i;
    int j;
    int nrow;
    int ncolumn;

    ret = sqlite3_open("test.db", &db);
//    sqlite3_exec(db, ".head on", 0, 0, &errmsg);
    ret = sqlite3_get_table(db, "select * from test_table", &Result, &nrow, &ncolumn, &errmsg);
    if(ret)
    {
        printf("can not open database.\n");
    }
    else
    {
        printf("open database success.\n");
        for(i = 0; i <= nrow; i++)
        {
            for(j = 0; j < ncolumn; j++)
            {
                printf("%s|", Result[i * ncolumn + j]);
            }
            printf("\n");
        }
    }
    sqlite3_free_table(Result);
    sqlite3_close(db);

    return 0;
}

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

static sqlite3 *db;

void create_table(sqlite3 *db)
{
    char *sql = NULL;
    char *errmsg = NULL;
    int ret;

    sql = "create table if not exists mytable (id integer primary key, name text)";
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
         printf("create table error: %s\n", errmsg);
    }
}

void insert_record(sqlite3 *db)
{
    char sql[100];
    char *errmsg = NULL;
    int name;

    int ret;
    int id;

    printf("Please input phone1 and phone2:\n");
    printf("phone1: ");
    scanf("%d", &id);
    getchar();
    printf("name: ");
    scanf("%d", &name);
    getchar();

    sprintf(sql, "insert into test_table values(%d, %d)", id, name);

    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("insert table error: %s\n", errmsg);
    }
}

int displaycb(void *para, int ncolumn, char ** columnvalue, char *columnname[])
{
    int i;

    printf("total column is %d\n", ncolumn);

    for(i = 0; i < ncolumn; i++)
    {
        printf("col_name: %s-----> col_value: %s\n", columnname[i], columnvalue[i]);
        printf("============================\n");

    }
    return 0;
}

void inquire_usecb(sqlite3 *db)
{
    char *sql = NULL;
    char *errmsg = NULL;
    int ret;

    sql = "select * from mytable";
    ret = sqlite3_exec(db, sql, displaycb, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("select is error: %s\n", errmsg);
    }
}

int main()
{
    int ret;

    ret = sqlite3_open("test.db", &db);

    sqlite3_exec(db,"select * from test_table",displaycb, NULL, NULL);
    insert_record(db);
    sqlite3_close(db);

    return 0;
}

windows下操作数据库

https://www.cnblogs.com/tfanalysis/p/4073756.html

一个sqlite包sqlite-snapshot-201612131847,里面包含sqlite,竟然还同时包含一个tcl引擎

sqlite配置两个主键列

create table tableName(
col1 date, col2 integer, col3 text, primary key(col1, col2))

关键技巧,血泪史

linux C 读取sqlite3数据库,当文件比较大时,比如超过1G,`sqlite3_exec(db, "select * from tableName", prcessCalBack, NULL, NULL) ` 返回就会十分慢,极其耗时,估计也正是因为这个原因,sqlite才搞了一个callBack函数,以便让用户能够尽快看到结果。
  可是对于刚刚接触数据库操作,理解还不深的同学。通常做法是,等函数执行结束,才执行显示操作。给人带来极差的用户体验。
     正确做法,应该要起多进程,将callBack函数放在别的进程中。因为sqlite3_exec将结果传输给回调的时间还是很短的。

【深入理解SQLite3之sqlite3_exec及回调函数_猪哥的专栏-CSDN博客_sqlite3_exec】 https://blog.csdn.net/u012351051/article/details/90382391

虽然文章写的不错,但没有深入研究。当数据达到百万条记录时,可以快速执行回调函数。但是sqlite3_exec函数内部会卡很久。这个问题该如何解决

【SQLite查询优化(转) - 不得闲 - 博客园】https://www.cnblogs.com/DxSoft/archive/2011/02/12/1952871.html  这个写的很细

 问题最终解决,解决办法是在windows上,用sqlite3客户端,在查询的关键字上创建了一个索引,数据库空间立即从1.5G变成1.9G,但是查询速度立即秒返回。

多表查询的各种玩法

select aTbl.* bTbl.* cTbl.*
from cTbl
inner join a.tbl on ( c.s1==a.s1 and c.s2 == a.s2)
inner join b.tbl on ( c.t1==b.t1 and c.t2 == b.t2)

大数据量查询时,采用==比较,效率比采用like要快太多,能明显感觉到。两千万条的记录,like 要等至少五秒,或者更多,采用等号(==)感觉无延时

查询重复的关键孜

1、参考资料

【SQL SQLite 筛选(查询)出 重复数据_我的分享,希望能帮到你-CSDN博客】
https://blog.csdn.net/shanxing200/article/details/52556570

2、具体操作

SELECT id AS 编号,
       title AS 影片名称,
       shortName AS 拼音,
       date AS 年份,
       actor AS 演员,
       type AS 类别,
       description AS 简介,
       filepath AS 路径,
       area AS 国家
 FROM mediainfo tempTable
 WHERE (tempTable.title) IN (
     SELECT title FROM mediainfo
     GROUP BY title
     HAVING count( * ) >= 2
     ORDER BY title
 );

亲自实践

可以按照任意一个关键孜来搜索
select * from myTbl group by myTbl.key1

逐步增加条件,至少两条记录
select * from myTbl group by myTbl.key1
having count(*) >=2

在排序一下
select * from myTbl group by myTbl.key1
having count(*) >=2 order by mytbl.key1

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注