of {$slidecount} ½ {$title} ATZJG.NET {$author}

首页






SQLite3 的基本操作(一)
数据库原理及应用实验


Haifeng Xu


(hfxu@yzu.edu.cn)

This slide is based on

References:

目录

历史

SQLite3 简介

SQLite 是一个 C 语言库,实现了一个小型、快速、自成一体、高可靠性、全功能的 SQL 数据库引擎。SQLite 是世界上最常用的数据库引擎。SQLite 内置于所有手机和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。

SQLite 官方网站

下载 SQLite

SQLite 的官方网址是: https://sqlite.org/

下载

https://sqlite.org/download.html

我们下载文件 sqlite-autoconf-3350500.tar.gz

解压缩后

编译 SQLite3

编译 SQLite3

我们使用 Visual Studio 自带的 nmake 编译. 为此打开 Visual Studio 2019 Developer Command Prompt

nmake /f Makefile.msc
D:\download\sqlite\version3_35\sqlite-autoconf-3350500>nmake /f Makefile.msc

Microsoft (R) 程序维护实用工具 14.28.29913.0 版
版权所有 (C) Microsoft Corporation。  保留所有权利。


D:\download\sqlite\version3_35\sqlite-autoconf-3350500>(echo VERSION = ^#define SQLITE_VERSION        "3.35.5"  1>>rcver.vc )
        cl -nologo -W4 -DINCLUDE_MSVC_H=1   -DSQLITE_OS_WIN=1 -I. -I. -fp:precise -MT -DNDEBUG -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -DSQLITE_THREADSAFE=1 -DSQLITE_THREAD_OVERRIDE_LOCK=-1 -DSQLITE_TEMP_STORE=1  -DSQLITE_MAX_TRIGGER_DEPTH=100  -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_STMTVTAB=1 -DSQLITE_ENABLE_DBPAGE_VTAB=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_ENABLE_BYTECODE_VTAB=1 -DSQLITE_ENABLE_DESERIALIZE=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_ENABLE_MATH_FUNCTIONS   -O2 -Zi -Fosqlite3.lo -Fdsqlite3.pdb  -c sqlite3.c
sqlite3.c
        echo #ifndef SQLITE_RESOURCE_VERSION > sqlite3rc.h
        echo #define SQLITE_RESOURCE_VERSION          3,35,5 >> sqlite3rc.h
        echo #endif >> sqlite3rc.h
        rc -DSQLITE_OS_WIN=1 -I. -I.   -DNDEBUG -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -DSQLITE_THREADSAFE=1 -DSQLITE_THREAD_OVERRIDE_LOCK=-1 -DSQLITE_TEMP_STORE=1  -DSQLITE_MAX_TRIGGER_DEPTH=100  -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_STMTVTAB=1 -DSQLITE_ENABLE_DBPAGE_VTAB=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_ENABLE_BYTECODE_VTAB=1 -DSQLITE_ENABLE_DESERIALIZE=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_ENABLE_MATH_FUNCTIONS   -r -fo sqlite3res.lo -DRC_VERONLY .\sqlite3.rc
Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384
Copyright (C) Microsoft Corporation.  All rights reserved.

        csc.exe /target:exe .\Replace.cs
Microsoft(R) Visual C# 编译器 版本 3.9.0-6.21160.10 (59eedc33)
版权所有(C) Microsoft Corporation。保留所有权利。

        echo EXPORTS > sqlite3.def
        dumpbin /all sqlite3.lo  | .\Replace.exe "^\s+/EXPORT:_?(sqlite3(?:session|changeset|changegroup|rebaser|rbu)?_[^@,]*)(?:@\d+|,DATA)?$" $1 true  | sort >> sqlite3.def
        link.exe /DEBUG  /NOLOGO  /DLL /DEF:sqlite3.def /OUT:sqlite3.dll sqlite3.lo sqlite3res.lo
  正在创建库 sqlite3.lib 和对象 sqlite3.exp
        cl -nologo -W4 -DINCLUDE_MSVC_H=1   -DSQLITE_OS_WIN=1 -I. -I. -fp:precise -MT -DNDEBUG -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -DSQLITE_THREADSAFE=1 -DSQLITE_THREAD_OVERRIDE_LOCK=-1 -DSQLITE_TEMP_STORE=1  -DSQLITE_MAX_TRIGGER_DEPTH=100  -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_STMTVTAB=1 -DSQLITE_ENABLE_DBPAGE_VTAB=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_ENABLE_BYTECODE_VTAB=1 -DSQLITE_ENABLE_DESERIALIZE=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_ENABLE_MATH_FUNCTIONS   -O2 -Zi -Fesqlite3.exe  -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_EXPLAIN_COMMENTS=1 -DSQLITE_ENABLE_OFFSET_SQL_FUNC=1 -DSQLITE_ENABLE_DESERIALIZE=1 -DHAVE_READLINE=0 shell.c sqlite3.c  /link /pdb:sqlite3sh.pdb /DEBUG  /NOLOGO   sqlite3res.lo
shell.c
shell.c(18998): warning C4819: 该文件包含不能在当前代码页(0)中表示的字符。请将该文件保存为 Unicode 格 式以防止数据丢失
shell.c(19011): warning C4819: 该文件包含不能在当前代码页(0)中表示的字符。请将该文件保存为 Unicode 格 式以防止数据丢失
sqlite3.c
正在生成代码...
LINK : 没有找到 sqlite3.exe 或上一个增量链接没有生成它;正在执行完全链接

安装 SQLite3

安装 SQLite3

SQLite3 不需要安装, 只需将编译好的 sqlite3.exe 拷贝到某个目录就可以了.

为了使用方便, 这里将 sqlite3.exe 保存到 D:\bin 目录下, 且已经将 D:\bin 放到系统变量 PATH 中.

建立数据库

建立数据库

SQLite 中数据库使用 .db 文件存储. 现在创建 test.db 数据库

sqlite3 test.db

创建数据库 book

创建数据库 book

先进入到工作目录, 比如 D:\work\cs\Database\sqlite, 建立文件夹 book. 并在此文件夹中建立文件 schema.sql, 内容如下:

CREATE TABLE book (
  title varchar(100),
  author varchar(30),
  press varchar(50),
  ISBN  char(17)
);

这里属性 ISBN 采用 char(17) 是因为新版 ISBN 的格式是由13个数字或字母组成, 共五部分, 各部分之间使用分隔符 `-` 连接.

ISBN(International Standard Book Number,国际标准书号)是非期刊书籍上的条形码,其实只是EAN-13的子集(只讨论现使用的ISBN-13)。前三位在978~979范围内。

978/979-组号(国家、地区、语言的代号)-出版社代码-书序号-校验码

请参见 https://zhidao.baidu.com/question/63460283.html

创建数据库 book

建立数据库 book.db

D:\work\cs\Database\sqlite\book>sqlite3 book.db
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.

显示当前数据库

sqlite> .database
main: D:\work\cs\Database\sqlite\book\book.db r/w

使用 .read 命令从文件 schema.sql 读入上面的 SQL 语句.

sqlite> .read schema.sql

查看数据库中的表

sqlite> .table
book
sqlite>

查看数据库模式

sqlite> .schema
CREATE TABLE book (
  title varchar(100),
  author varchar(30),
  press varchar(50),
  ISBN  char(17)
);

录入数据

下面需要将下列十条记录录入到表中.

"数据结构与算法分析(C++描述)","Mark Allen Weiss","人民邮电出版社","978-7-115-13923-8"
"基础代数学","项武义","人民教育出版社","978-7-107-17679-1"
"解析数论基础","潘承洞 潘承彪","哈尔滨工业大学出版社","978-7-5603-6004-1"
"从一元一次方程到伽罗瓦理论","冯承天","华东师范大学出版社","978-7-5675-8738-0"
"数学分析","梅加强","高等教育出版社","978-7-04-032289-7"
"多复变函数论","萧荫堂 陈志华 钟家庆","高等教育出版社","978-7-04-036268-8"
"C Primer Plus","Stephen Prata","人民邮电出版社","978-7-115-39059-2"
"Riemannian Geometry","Peter Peterson","科学出版社","978-7-03-018294-4"
"微型计算机基本原理与应用","王克义","北京大学出版社","978-7-301-25687-9"
"调和分析讲义(实变方法)","周民强","北京大学出版社","978-7-301-04137-6"

可以逐条录入

sqlite> INSERT INTO book VALUES("数据结构与算法分析(C++描述)","Mark Allen Weiss","人民邮电出版社","978-7-115-13923-8");

查看刚录入的记录

sqlite> SELECT * FROM book;
数据结构与算法分析(C++描述)|Mark Allen Weiss|人民邮电出版社|978-7-115-13923-8

更改输出样式

.headers on|off 显示|隐藏 表头 (Turn display of headers on or off)
.timer on|off 将 SQL 计时器打开|关闭 ( Turn SQL timer on or off )

.mode MODE 设置输出模式为MODE, 例如 .mode column 左对齐. 这里的 MODE 可以有很多选择.

sqlite> .header on
sqlite> .mode column
sqlite> .timer on
sqlite> SELECT * FROM book;
title             author            press    ISBN
----------------  ----------------  -------  -----------------
数据结构与算法分析(C++描述)  Mark Allen Weiss  人民邮电出版社  978-7-115-13923-8
Run Time: real 0.005 user 0.000000 sys 0.000000

从文件导入数据

将上面的数据保存到文件 data.csv 中.

先删除表 book 中的数据, 刚才只插入了一条记录. 可以使用 delete 删除所有记录, SQLite 中没有 truncate 命令用于清空数据表.

sqlite> delete from book where 1;

可以使用 .import 命令导入 csv 文件中的数据. 这里要注意先将 data.csv 文件改为 UTF-8 编码保存.

由于使用的是 .csv 文件, 故将 SQLite 中的分隔符改为逗号.

sqlite> .separator ","

导入数据

sqlite> .import data.csv book

查看数据

sqlite> select * from book;
数据结构与算法分析(C++描述),Mark Allen Weiss,人民邮电出版社,978-7-115-13923-8
基础代数学,项武义,人民教育出版社,978-7-107-17679-1
解析数论基础,潘承洞 潘承彪,哈尔滨工业大学出版社,978-7-5603-6004-1
从一元一次方程到伽罗瓦理论,冯承天,华东师范大学出版社,978-7-5675-8738-0
数学分析,梅加强,高等教育出版社,978-7-04-032289-7
多复变函数论,萧荫堂 陈志华 钟家庆,高等教育出版社,978-7-04-036268-8
C Primer Plus,Stephen Prata,人民邮电出版社,978-7-115-39059-2
Riemannian Geometry,Peter Peterson,科学出版社,978-7-03-018294-4
微型计算机基本原理与应用,王克义,北京大学出版社,978-7-301-25687-9
调和分析讲义(实变方法),周民强,北京大学出版社,978-7-301-04137-6
sqlite> select * from book where press="高等教育出版社";
数学分析,梅加强,高等教育出版社,978-7-04-032289-7
多复变函数论,萧荫堂 陈志华 钟家庆,高等教育出版社,978-7-04-036268-8

查询所有由高等教育出版社出版的图书.

sqlite> select * from book where press="高等教育出版社";
数学分析,梅加强,高等教育出版社,978-7-04-032289-7
多复变函数论,萧荫堂 陈志华 钟家庆,高等教育出版社,978-7-04-036268-8

退出 SQLite3

使用 .quit 命令, 或 .q

sqlite> .quit

使用 sqlite3.exe 直接执行查询语句

查询数据库 book.db 中表 book 的所有记录.

D:\work\cs\Database\sqlite\book>sqlite3 book.db "select * from book"
数据结构与算法分析(C++描述)|Mark Allen Weiss|人民邮电出版社|978-7-115-13923-8
基础代数学|项武义|人民教育出版社|978-7-107-17679-1
解析数论基础|潘承洞 潘承彪|哈尔滨工业大学出版社|978-7-5603-6004-1
从一元一次方程到伽罗瓦理论|冯承天|华东师范大学出版社|978-7-5675-8738-0
数学分析|梅加强|高等教育出版社|978-7-04-032289-7
多复变函数论|萧荫堂 陈志华 钟家庆|高等教育出版社|978-7-04-036268-8
C Primer Plus|Stephen Prata|人民邮电出版社|978-7-115-39059-2
Riemannian Geometry|Peter Peterson|科学出版社|978-7-03-018294-4
微型计算机基本原理与应用|王克义|北京大学出版社|978-7-301-25687-9
调和分析讲义(实变方法)|周民强|北京大学出版社|978-7-301-04137-6

查询 book 表中所有由人民邮电出版社出版的图书.

D:\work\cs\Database\sqlite\book>sqlite3 book.db "select * from book where press=\"人民邮电出版社\""
数据结构与算法分析(C++描述)|Mark Allen Weiss|人民邮电出版社|978-7-115-13923-8
C Primer Plus|Stephen Prata|人民邮电出版社|978-7-115-39059-2

可以看到 SQLite3 默认使用 | 为分隔符.

保存设定

保存设定

一般的, 重新启动 SQLite3 后, 所有设置将变为默认设置. 为保存之前的设定, 可以将设定保存在指定文件 .sqliterc 中.

比如将下面三行语句保存到文本文件 .sqliterc

.mode list
.separator ", "
.headers on

并将该文件放到用户目录中, 例如: C:\Users\haife , 然后再启动 SQLite3.

D:\work\cs\Database\sqlite\book>sqlite3 book.db
-- Loading resources from C:\Users\haife/.sqliterc
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite>
sqlite> select * from book;
title, author, press, ISBN
数据结构与算法分析(C++描述), Mark Allen Weiss, 人民邮电出版社, 978-7-115-13923-8
基础代数学, 项武义, 人民教育出版社, 978-7-107-17679-1
解析数论基础, 潘承洞 潘承彪, 哈尔滨工业大学出版社, 978-7-5603-6004-1
从一元一次方程到伽罗瓦理论, 冯承天, 华东师范大学出版社, 978-7-5675-8738-0
数学分析, 梅加强, 高等教育出版社, 978-7-04-032289-7
多复变函数论, 萧荫堂 陈志华 钟家庆, 高等教育出版社, 978-7-04-036268-8
C Primer Plus, Stephen Prata, 人民邮电出版社, 978-7-115-39059-2
Riemannian Geometry, Peter Peterson, 科学出版社, 978-7-03-018294-4
微型计算机基本原理与应用, 王克义, 北京大学出版社, 978-7-301-25687-9
调和分析讲义(实变方法), 周民强, 北京大学出版社, 978-7-301-04137-6

.命令

.命令的规则

sqlite>  .mode ascii
   ...>  

.help -- 是可以运行的, 尝试下面的例子

sqlite> .help --This is help command
Nothing matches '--This'
sqlite> .help .help
.help ?-all? ?PATTERN?   Show help text for PATTERN
sqlite> .help -- This is help command
.backup ?DB? FILE        Backup DB (default "main") to FILE
       --append            Use the appendvfs
       --async             Write to FILE without journal and fsync()
.dump ?OBJECTS?          Render database content as SQL
   Options:
     --data-only            Output only INSERT statements
     --newlines             Allow unescaped newline characters in output
     --nosys                Omit system tables (ex: "sqlite_stat1")
     --preserve-rowids      Include ROWID values in the output
   OBJECTS is a LIKE pattern for tables, indexes, triggers or views to dump
   Additional LIKE patterns can be given in subsequent arguments
.excel                   Display the output of next command in spreadsheet
   --bom                   Put a UTF8 byte-order mark on intermediate file
.filectrl CMD ...        Run various sqlite3_file_control() operations
   --schema SCHEMA         Use SCHEMA instead of "main"
   --help                  Show CMD details
.fullschema ?--indent?   Show schema and the content of sqlite_stat tables
.import FILE TABLE       Import data from FILE into TABLE
   Options:
     --ascii               Use \037 and \036 as column and row separators
     --csv                 Use , and \n as column and row separators
     --skip N              Skip the first N rows of input
     -v                    "Verbose" - increase auxiliary output
   Notes:
     *  If TABLE does not exist, it is created.  The first row of input
        determines the column names.
     *  If neither --csv or --ascii are used, the input mode is derived
        from the ".mode" output mode
     *  If FILE begins with "|" then it is a command that generates the
        input text.
.once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE
     If FILE begins with '|' then open as a pipe
       --bom  Put a UTF8 byte-order mark at the beginning
       -e     Send output to the system text editor
       -x     Send output as CSV to a spreadsheet (same as ".excel")
.open ?OPTIONS? ?FILE?   Close existing database and reopen FILE
     Options:
        --append        Use appendvfs to append database to the end of FILE
        --deserialize   Load into memory using sqlite3_deserialize()
        --hexdb         Load the output of "dbtotxt" as an in-memory db
        --maxsize N     Maximum size for --hexdb or --deserialized database
        --new           Initialize FILE to an empty database
        --nofollow      Do not follow symbolic links
        --readonly      Open FILE readonly
        --zip           FILE is a ZIP archive
.output ?FILE?           Send output to FILE or stdout if FILE is omitted
   If FILE begins with '|' then open it as a pipe.
   Options:
     --bom                 Prefix output with a UTF8 byte-order mark
     -e                    Send output to the system text editor
     -x                    Send output as CSV to a spreadsheet
.progress N              Invoke progress handler after every N opcodes
   --limit N                 Interrupt after N progress callbacks
   --once                    Do no more than one progress interrupt
   --quiet|-q                No output except at interrupts
   --reset                   Reset the count for each input and interrupt
.recover                 Recover as much data as possible from corrupt db.
   --freelist-corrupt       Assume the freelist is corrupt
   --recovery-db NAME       Store recovery metadata in database file NAME
   --lost-and-found TABLE   Alternative name for the lost-and-found table
   --no-rowids              Do not attempt to recover rowid values
                            that are not also INTEGER PRIMARY KEYs
.schema ?PATTERN?        Show the CREATE statements matching PATTERN
   Options:
      --indent             Try to pretty-print the schema
      --nosys              Omit objects whose names start with "sqlite_"
.selftest ?OPTIONS?      Run tests defined in the SELFTEST table
    Options:
       --init               Create a new SELFTEST table
       -v                   Verbose output
.sha3sum ...             Compute a SHA3 hash of database content
    Options:
      --schema              Also hash the sqlite_schema table
      --sha3-224            Use the sha3-224 algorithm
      --sha3-256            Use the sha3-256 algorithm (default)
      --sha3-384            Use the sha3-384 algorithm
      --sha3-512            Use the sha3-512 algorithm
    Any other argument is a LIKE pattern for tables to hash
.trace ?OPTIONS?         Output each SQL statement as it is run
    FILE                    Send output to FILE
    stdout                  Send output to stdout
    stderr                  Send output to stderr
    off                     Disable tracing
    --expanded              Expand query parameters
    --plain                 Show SQL as it is input
    --stmt                  Trace statement execution (SQLITE_TRACE_STMT)
    --profile               Profile statements (SQLITE_TRACE_PROFILE)
    --row                   Trace each row (SQLITE_TRACE_ROW)
    --close                 Trace connection close (SQLITE_TRACE_CLOSE)
sqlite> 

.mode

.mode 的模式

.mode MODE 中 MODE 可以有哪些模式.

 .mode 列表
Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl

尝试几种模式

.mode quote

sqlite> .mode quote
sqlite> select * from book;
'title','author','press','ISBN'
'数据结构与算法分析(C++描述)','Mark Allen Weiss','人民邮电出版社','978-7-115-13923-8'
'基础代数学','项武义','人民教育出版社','978-7-107-17679-1'
'解析数论基础','潘承洞 潘承彪','哈尔滨工业大学出版社','978-7-5603-6004-1'
'从一元一次方程到伽罗瓦理论','冯承天','华东师范大学出版社','978-7-5675-8738-0'
'数学分析','梅加强','高等教育出版社','978-7-04-032289-7'
'多复变函数论','萧荫堂 陈志华 钟家庆','高等教育出版社','978-7-04-036268-8'
'C Primer Plus','Stephen Prata','人民邮电出版社','978-7-115-39059-2'
'Riemannian Geometry','Peter Peterson','科学出版社','978-7-03-018294-4'
'微型计算机基本原理与应用','王克义','北京大学出版社','978-7-301-25687-9'
'调和分析讲义(实变方法)','周民强','北京大学出版社','978-7-301-04137-6'

.mode line

sqlite> .mode line
sqlite> select * from book;
 title = 数据结构与算法分析(C++描述)
author = Mark Allen Weiss
 press = 人民邮电出版社
  ISBN = 978-7-115-13923-8

 title = 基础代数学
author = 项武义
 press = 人民教育出版社
  ISBN = 978-7-107-17679-1

 title = 解析数论基础
author = 潘承洞 潘承彪
 press = 哈尔滨工业大学出版社
  ISBN = 978-7-5603-6004-1

 title = 从一元一次方程到伽罗瓦理论
author = 冯承天
 press = 华东师范大学出版社
  ISBN = 978-7-5675-8738-0

 title = 数学分析
author = 梅加强
 press = 高等教育出版社
  ISBN = 978-7-04-032289-7

 title = 多复变函数论
author = 萧荫堂 陈志华 钟家庆
 press = 高等教育出版社
  ISBN = 978-7-04-036268-8

 title = C Primer Plus
author = Stephen Prata
 press = 人民邮电出版社
  ISBN = 978-7-115-39059-2

 title = Riemannian Geometry
author = Peter Peterson
 press = 科学出版社
  ISBN = 978-7-03-018294-4

 title = 微型计算机基本原理与应用
author = 王克义
 press = 北京大学出版社
  ISBN = 978-7-301-25687-9

 title = 调和分析讲义(实变方法)
author = 周民强
 press = 北京大学出版社
  ISBN = 978-7-301-04137-6

GUI 工具

GUI 工具

SQLite Browser

sqlite-gui

sqlite expert

SQLite Admininstrator

End






Thanks very much!