春的追溯 發表於 2022-6-13 10:55:48

一篇文章带你掌握SQLite3基本用法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、基本语法</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1.常用指令</a></li><li><a href="#_lab2_0_1">2.数据类型</a></li><li><a href="#_lab2_0_2">3.创建数据库</a></li><li><a href="#_lab2_0_3">4. 导入/导出数据库</a></li><li><a href="#_lab2_0_4">5.创建表</a></li><li><a href="#_lab2_0_5">6.查看表的详细信息</a></li><li><a href="#_lab2_0_6">7.删除表</a></li><li><a href="#_lab2_0_7">8.插入数据</a></li><li><a href="#_lab2_0_8">9.格式化输出</a></li><li><a href="#_lab2_0_9">10.输出表</a></li><li><a href="#_lab2_0_10">11.运算符</a></li><li><a href="#_lab2_0_11">12.where子句</a></li><li><a href="#_lab2_0_12">13.删除记录表中的数据</a></li><li><a href="#_lab2_0_13">14.update语句</a></li></ul><li><a href="#_label1">二、C/C++操作 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_14">1.接口API</a></li><li><a href="#_lab2_1_15">2.连接数据库</a></li><li><a href="#_lab2_1_16">3.创建表</a></li><li><a href="#_lab2_1_17">4.插入数据</a></li><li><a href="#_lab2_1_18">5.查表操作</a></li><li><a href="#_lab2_1_19">6.数据删除操作</a></li><li><a href="#_lab2_1_20">7.UPDATE 操作</a></li></ul><li><a href="#_label2">三:结语</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、基本语法</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1.常用指令</h3>
<div class="jb51code"><pre class="brush:sql;">.open filename --打开文件
-- 注解
.show --显示SQLite 命令提示符的默认设置
.q --退出
.databases --显示数据库(注:显示打开的数据库)
.help--帮助
.dump--导入导出数据库
.tables--查看表</pre></div>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2.数据类型</h3>
<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><td>存储类型</td><td>描述</td></tr><tr><td>NULL</td><td>空值</td></tr><tr><td>int</td><td>整形</td></tr><tr><td>text</td><td>一个文本字符串</td></tr><tr><td>blob</td><td>一个blob数据</td></tr><tr><td>integer</td><td><p>一个带符号的整数,根据值的大小存储在1、2</p>
<p>、3、4、6或8字节中</p></td></tr><tr><td>real</td><td>值是一个浮点值,存储为8字节的浮点数</td></tr><tr><td>......</td><td>......</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>3.创建数据库</h3>
<div class="jb51code"><pre class="brush:sql;">.open test.db --没有就创建
sqlite3 DatabaseName.db</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324543.png" /></p>
<p>上面的命令将在当前目录下创建一个文件 <strong>testDB.db</strong>。该文件将被 SQLite 引擎用作数据库。如果您已经注意到 sqlite3 命令在成功创建数据库文件之后,将提供一个 <strong>sqlite&gt;</strong> 提示符。</p>
<p><strong>.databases </strong> 命令用于检查它是否在数据库列表中。</p>
<p><strong>.open 操作</strong></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324544.png" /></p>
<p class="maodian"><a name="_lab2_0_3"></a></p><h3>4. 导入/导出数据库</h3>
<div class="jb51code"><pre class="brush:sql;">sqlite3 test.db .dump &gt; filename --导出
sqlite3 test.db &lt; filename --导入</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324545.png" /></p>
<p>上面的转换流整个 <strong>testDB.db</strong> 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 <strong>testDB.sql</strong> 中。您可以通过简单的方式从生成的 testDB.sql 恢复,如下所示 我删掉testDB.db后:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324646.png" /></p>
<p class="maodian"><a name="_lab2_0_4"></a></p><h3>5.创建表</h3>
<div class="jb51code"><pre class="brush:sql;">--注意,在打开数据库时才能操作
CREATE TABLE database_name.table_name(
   column1 datatypePRIMARY KEY(one or more columns),
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);</pre></div>
<p>CREATE TABLE 是告诉数据库系统创建一个新表的关键字。CREATE TABLE 语句后跟着表的唯一的名称或标识。您也可以选择指定带有 table_name 的 database_name。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324647.png" /></p>
<p>如上图所示,我们创建了COMPANY&nbsp;&nbsp;&nbsp;&nbsp; DEPARTMENT两个表。其中ID 作为主键,NOT NULL 的约束表示在表中创建纪录时这些字段不能为 NULL。</p>
<p class="maodian"><a name="_lab2_0_5"></a></p><h3>6.查看表的详细信息</h3>
<div class="jb51code"><pre class="brush:sql;">.schema --注意:打开数据库时才能操作</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324648.png" /></p>
<p class="maodian"><a name="_lab2_0_6"></a></p><h3>7.删除表</h3>
<div class="jb51code"><pre class="brush:sql;">DROP TABLE database_name.table_name;</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324649.png" /></p>
<p>如上,删除了名为DEPARTMENT的表</p>
<p class="maodian"><a name="_lab2_0_7"></a></p><h3>8.插入数据</h3>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
</pre></div>
<p>在这里,column1, column2,...columnN 是要插入数据的表中的列的名称。</p>
<p>如果要为表中的所有列添加值,您也可以不需要在 SQLite 查询中指定列名称。但要确保值的顺序与列在表中的顺序一致。SQLite 的 INSERT INTO 语法如下:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);</pre></div>
<p>现在,我已经创建了COMPANY表,如下</p>
<div class="jb51code"><pre class="brush:sql;">CREATE TABLE COMPANY(
   ID INT PRIMARY KEY   NOT NULL,
   NAME         TEXT    NOT NULL,
   AGE            INT   NOT NULL,
   ADDRESS      CHAR(50),
   SALARY         REAL
);</pre></div>
<p>现在,下面的语句将在 COMPANY 表中创建六个记录:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'David', 27, 'Texas', 85000.00 );

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );</pre></div>
<p>输出结果如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324650.png" /></p>
<p>&nbsp;我们也可以使用第二种语法在COMPANY 表中创建一个记录,如下所示:</p>
<div class="jb51code"><pre class="brush:sql;">INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );</pre></div>
<p>输出结果如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324651.png" /></p>
<p class="maodian"><a name="_lab2_0_8"></a></p><h3>9.格式化输出</h3>
<div class="jb51code"><pre class="brush:sql;">.header on
.mode column
.timer on --开启CPU定时器
SELECT * FROM table_name; --显示表table_name</pre></div>
<p>非格式化输出</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324652.png" /></p>
<p>格式化输出</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324653.png" /></p>
<p class="maodian"><a name="_lab2_0_9"></a></p><h3>10.输出表</h3>
<p><strong>完整输出</strong></p>
<div class="jb51code"><pre class="brush:sql;">.header on
.mode column
SELECT * FROM COMPANY;</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324653.png" /></p>
<p><strong>输出指定列</strong></p>
<div class="jb51code"><pre class="brush:sql;">.header on
.mode column
SELECT ID, NAME, SALARY FROM COMPANY; --只输出ID, NAME和SALARY三列</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324654.png" /></p>
<p><strong>设置输出列的宽度</strong></p>
<div class="jb51code"><pre class="brush:sql;">.width num1,num1,num3....
SELECT * FROM COMPANY;</pre></div>
<p>下面 <strong>.width</strong> 命令设置第一列的宽度为 10,第二列的宽度为 20,第三列的宽度为 10。输出结果如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324655.png" /></p>
<p class="maodian"><a name="_lab2_0_10"></a></p><h3>11.运算符</h3>
<p>sqlite运算符主要用于 SQLite 语句的 WHERE 子句中执行操作,如比较和算术运算。</p>
<p>运算符用于指定 SQLite 语句中的条件,并在语句中连接多个条件。</p>
<p><strong>算术运算符:</strong></p>
<p>运算符描述实例+加法 - 把运算符两边的值相加a + b 将得到 30-减法 - 左操作数减去右操作数a - b 将得到 -10*乘法 - 把运算符两边的值相乘a * b 将得到 200/除法 - 左操作数除以右操作数b / a 将得到 2%取模 - 左操作数除以右操作数后得到的余数b % a will give 0</p>
<p><strong>比较运算符</strong></p>
<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><th>运算符</th><th>描述</th><th>实例</th></tr><tr><td>+</td><td>加法 - 把运算符两边的值相加</td><td>a + b 将得到 30</td></tr><tr><td>-</td><td>减法 - 左操作数减去右操作数</td><td>a - b 将得到 -10</td></tr><tr><td>*</td><td>乘法 - 把运算符两边的值相乘</td><td>a * b 将得到 200</td></tr><tr><td>/</td><td>除法 - 左操作数除以右操作数</td><td>b / a 将得到 2</td></tr><tr><td>%</td><td>取模 - 左操作数除以右操作数后得到的余数</td><td>b % a will give 0</td></tr></tbody></table>
<p><strong>逻辑运算符</strong></p>
<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><th>运算符</th><th>描述</th><th>实例</th></tr><tr><td>==</td><td>检查两个操作数的值是否相等,如果相等则条件为真。</td><td>(a == b) 不为真。</td></tr><tr><td>=</td><td>检查两个操作数的值是否相等,如果相等则条件为真。</td><td>(a = b) 不为真。</td></tr><tr><td>!=</td><td>检查两个操作数的值是否相等,如果不相等则条件为真。</td><td>(a != b) 为真。</td></tr><tr><td>&lt;&gt;</td><td>检查两个操作数的值是否相等,如果不相等则条件为真。</td><td>(a &lt;&gt; b) 为真。</td></tr><tr><td>&gt;</td><td>检查左操作数的值是否大于右操作数的值,如果是则条件为真。</td><td>(a &gt; b) 不为真。</td></tr><tr><td>&lt;</td><td>检查左操作数的值是否小于右操作数的值,如果是则条件为真。</td><td>(a &lt; b) 为真。</td></tr><tr><td>&gt;=</td><td>检查左操作数的值是否大于等于右操作数的值,如果是则条件为真。</td><td>(a &gt;= b) 不为真。</td></tr><tr><td>&lt;=</td><td>检查左操作数的值是否小于等于右操作数的值,如果是则条件为真。</td><td>(a &lt;= b) 为真。</td></tr><tr><td>!&lt;</td><td>检查左操作数的值是否不小于右操作数的值,如果是则条件为真。</td><td>(a !&lt; b) 为假。</td></tr><tr><td>!&gt;</td><td>检查左操作数的值是否不大于右操作数的值,如果是则条件为真。</td><td>(a !&gt; b) 为真。</td></tr></tbody></table>
<p><strong>位运算符 &nbsp;</strong></p>
<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><th>p</th><th>q</th><th>p &amp; q</th><th>p | q</th></tr><tr><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>0</td><td>1</td><td>0</td><td>1</td></tr><tr><td>1</td><td>1</td><td>1</td><td>1</td></tr><tr><td>1</td><td>0</td><td>0</td><td>1</td></tr></tbody></table>
<p><strong>下面直接上例子</strong></p>
<p>我有COMPANY 表如下:</p>
<div class="jb51code"><pre class="brush:sql;">ID          NAME      AGE         ADDRESS   SALARY
--------------------------------------------------
1         Paul      32          California20000.0
2         Allen       25          Texas       15000.0
3         Teddy       23          Norway      20000.0
4         Mark      25          Rich-Mond   65000.0
5         David       27          Texas       85000.0
6         Kim         22          South-Hall45000.0
7         James       24          Houston   10000.0</pre></div>
<p>用 SELECT列出SALARY 大于 50,000.00 的所有记录:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM COMPANY WHERE SALARY &gt; 50000;</pre></div>
<p>输出结果如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324656.png" /></p>
<p>用 SELECT列出SALARY 等于的所有记录:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM COMPANY WHERE SALARY = 20000;</pre></div>
<p>输出结果如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324657.png" /></p>
<p>用 SELECT列出AGE 大于等于 25 <strong>且</strong>SALARY大于等于 65000.00的所有记录:</p>
<div class="jb51code"><pre class="brush:sql;">SELECT * FROM COMPANY WHERE AGE &gt;= 25 AND SALARY &gt;= 65000;</pre></div>
<p>输出结果如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324658.png" /></p>
<p class="maodian"><a name="_lab2_0_11"></a></p><h3>12.where子句</h3>
<p>SQLite的 <strong>WHERE</strong> 子句用于指定从一个表或多个表中获取数据的条件。如果满足给定的条件,即为真(true)时,则从表中返回特定的值。您可以使用 WHERE 子句来过滤记录,只获取需要的记录。WHERE 子句不仅可用在 SELECT 语句中,它也可用在 UPDATE、DELETE 语句中,等等。用例参考运算符。</p>
<p class="maodian"><a name="_lab2_0_12"></a></p><h3>13.删除记录表中的数据</h3>
<p>SQLite中,删除记录表数据为<strong>DELETE</strong>语句,我们可以使用带有 WHERE 子句的 DELETE。</p>
<p><strong>语法如下:</strong></p>
<div class="jb51code"><pre class="brush:sql;">DELETE FROM table_name WHERE ;</pre></div>
<p>我们有以下记录表:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324659.png" /></p>
<p>删除ID为7的列:</p>
<div class="jb51code"><pre class="brush:sql;">DELETE FROM COMPANY WHERE ID = 7;</pre></div>
<p>再次输出结果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324660.png" /></p>
<p class="maodian"><a name="_lab2_0_13"></a></p><h3>14.update语句</h3>
<p>SQLite 的 <strong>UPDATE</strong> 查询用于修改表中已有的记录。可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新。</p>
<p>语法:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE table_name 
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE ;</pre></div>
<p>注:这三行实为同一行。</p>
<p>现在我有数据表如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324661.png" /></p>
<p>把COMPANY表中ID 为 6 的客户地址改为Texas:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE COMPANY SET ADDRESS = 'Texas' WHERE ID = 6;</pre></div>
<p>修改结果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324662.png" /></p>
<p>如果您想修改 COMPANY 表中 ADDRESS 和 SALARY 列的所有值,则不需要使用 WHERE 子句,UPDATE 查询如下:</p>
<div class="jb51code"><pre class="brush:sql;">UPDATE COMPANY SET ADDRESS = 'Texas', SALARY = 20000.00;</pre></div>
<p>修改结果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324663.png" /></p>
<p class="maodian"><a name="_label1"></a></p><h2>二、C/C++操作 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</h2>
<p class="maodian"><a name="_lab2_1_14"></a></p><h3>1.接口API</h3>
<p>下面接口能满足我们的基本需求,需要学习更多的操作,我们可以参考官方文档。</p>
<table border="1" cellpadding="1" cellspacing="1"><tbody><tr><th>序号</th><th>API &amp; 描述</th></tr><tr><td>1</td><td>sqlite3_open(const char *filename, sqlite3 **ppDb)<p>该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。</p>
<p>如果 filename 参数是 NULL 或 &#39;:memory:&#39;,那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。</p>
<p>如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。</p></td></tr><tr><td>2</td><td>sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)<p>该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。</p>
<p>在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。</p>
<p>sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。</p></td></tr><tr><td>3</td><td>sqlite3_close(sqlite3*)<p>该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。</p>
<p>如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。</p></td></tr></tbody></table>
<p class="maodian"><a name="_lab2_1_15"></a></p><h3>2.连接数据库</h3>
<p>下面的 C 代码段显示了如何连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;stdio.h&gt;
#include &lt;sqlite3.h&gt;

int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;

   rc = sqlite3_open("test.db", &amp;db);

   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
   sqlite3_close(db);
}</pre></div>
<p>编译命令 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div class="jb51code"><pre class="brush:cpp;">gcc lianjie.c -l sqlite3</pre></div>
<p>运行结果</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324764.png" /></p>
<p>终端输入ls -l命令发现多了个test.db文件,如图:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324765.png" /></p>
<p class="maodian"><a name="_lab2_1_16"></a></p><h3>3.创建表</h3>
<p>C语言创建表与终端创建操作差不多,只不过命令由sqlite3_exec()函数的sql参数传入。格式如下:</p>
<div class="jb51code"><pre class="brush:cpp;">sql = "CREATE TABLE COMPANY("\
         "ID INT PRIMARY KEY   NOT NULL," \
         "NAME         TEXT    NOT NULL," \
         "AGE            INT   NOT NULL," \
         "ADDRESS      CHAR(50)," \
         "SALARY         REAL );";</pre></div>
<p>示例代码:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sqlite3.h&gt;

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   for(i=0; i&lt;argc; i++){
      printf("%s = %s\n", azColName, argv ? argv : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   intrc;
   char *sql;

   /* Open database */
   rc = sqlite3_open("test.db", &amp;db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stdout, "Opened database successfully\n");
   }

   /* Create SQL statement */
   sql = "CREATE TABLE COMPANY("\
         "ID INT PRIMARY KEY   NOT NULL," \
         "NAME         TEXT    NOT NULL," \
         "AGE            INT   NOT NULL," \
         "ADDRESS      CHAR(50)," \
         "SALARY         REAL );";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, 0, &amp;zErrMsg);
   if( rc != SQLITE_OK ){
   fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Table created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}</pre></div>
<p>输出结果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324766.png" /></p>
<p>再次ls -l:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324767.png" /></p>
<p>我们可以看到,test.db文件大小明显变大了。</p>
<p class="maodian"><a name="_lab2_1_17"></a></p><h3>4.插入数据</h3>
<p>与创建表类似,sql参数设为:</p>
<div class="jb51code"><pre class="brush:cpp;">sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "\
         "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "\
         "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "   \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";</pre></div>
<p>示例代码:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sqlite3.h&gt;

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   for(i=0; i&lt;argc; i++){
      printf("%s = %s\n", azColName, argv ? argv : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;

   /* Open database */
   rc = sqlite3_open("test.db", &amp;db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }

   /* Create SQL statement */
   sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "\
         "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "\
         "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "   \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, 0, &amp;zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Records created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}</pre></div>
<p>输出结果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324768.png" /></p>
<p class="maodian"><a name="_lab2_1_18"></a></p><h3>5.查表操作</h3>
<p>sqlite3_exec()给我们提供了一个回调函数,其声明如下:</p>
<div class="jb51code"><pre class="brush:cpp;">typedef int (*sqlite3_callback)(
void*,    /* Data provided in the 4th argument of sqlite3_exec() */
int,      /* The number of columns in row */
char**,   /* An array of strings representing fields in the row */
char**    /* An array of strings representing column names */
);</pre></div>
<p>第一个参数:即第四个参数传入的数据</p>
<p>第二个参数:行中的列数</p>
<p>第三个参数:表示行中字段的字符串数组,即各行中的数据</p>
<p>第四个参数:表示列名的字符串数组,创建链表时设置的</p>
<p>执行流程:查表,是否还有符合条件数据。有,执行sqlite3_callback()函数;没有,退出</p>
<p>用法讲完了,下面看例子:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sqlite3.h&gt;

static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i&lt;argc; i++){
      printf("%s = %s\n", azColName, argv ? argv : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";

   /* Open database */
   rc = sqlite3_open("test.db", &amp;db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }

   /* Create SQL statement */
   sql = "SELECT * from COMPANY";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &amp;zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}</pre></div>
<p>上面程序显示了如何从前面创建的 COMPANY 表中获取并显示记录,输出结果如下:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324769.png" /></p>
<p>这里我没有特殊指明查询条件,表示查询全部。</p>
<p class="maodian"><a name="_lab2_1_19"></a></p><h3>6.数据删除操作</h3>
<p>sql参数设置:</p>
<div class="jb51code"><pre class="brush:cpp;">sql = "DELETE from COMPANY where ID=2; " \\删除ID等于2的行
         "SELECT * from COMPANY";      \\显示表</pre></div>
<p>这里跟上面不同的是多了一个命令,表面sql参数可由多个命令组成。</p>
<p>示例代码:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sqlite3.h&gt;

static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i&lt;argc; i++){
      printf("%s = %s\n", azColName, argv ? argv : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";

   /* Open database */
   rc = sqlite3_open("test.db", &amp;db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }

   /* Create merged SQL statement */
   sql = "DELETE from COMPANY where ID=2; " \
         "SELECT * from COMPANY";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &amp;zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}</pre></div>
<p>输出:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324770.png" /></p>
<p class="maodian"><a name="_lab2_1_20"></a></p><h3>7.UPDATE 操作</h3>
<p>操作示例:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sqlite3.h&gt;

static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i&lt;argc; i++){
      printf("%s = %s\n", azColName, argv ? argv : "NULL");
   }
   printf("\n");
   return 0;
}

int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";

   /* Open database */
   rc = sqlite3_open("test.db", &amp;db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }

   /* Create merged SQL statement */
   sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \
         "SELECT * from COMPANY";

   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &amp;zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}</pre></div>
<p>输出结果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202206/2022061310324771.png" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>三:结语</h2>
<p>现在,关于sqlite3的基本用法都讲完了,有不对的地方欢迎指出。</p>
頁: [1]
查看完整版本: 一篇文章带你掌握SQLite3基本用法