SQLite

SQLite

基本流程

1
2
3
4
5
6
7
8
9
//打开数据库
sqlite3 *sqldb = NULL;
int res = sqlite3_open(db_file_name.c_str(), &sqldb);
if (res != SQLITE_OK) {
    fprintf(stderr, "Can not open database: %s\n", sqlite3_errmsg(sqldb));
    return false;
}
// 关闭数据库
sqlite3_close(sqldb);

常用语句

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
SELECT column1, column2, columnN FROM table_name; --从表 table_name 中选择column1, column2, columnN列
SELECT * FROM table_name; --选择所有列


SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );  --列出了 AGE 的值为 25 或 27 的所有记录
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
--直接看菜鸟教程吧,很详细

常用函数

sqlite3_exec(),称为便捷函数,封装了好多任务。

1
int sqlite3_exec(sqlite3*, const char* sql, sqlite_callback, void* data, char** errmmsg); 

sqlite3* 表示指向数据库的指针;

sql 为执行的sql语句;

callback回调函数

1
typedef int (*sqlite3_callback) (void*, int, char**,char**);

void *是为sqlite3_exec()第四个参数提供的数据,

int代表列的数目,

char** 一个指向指针数组的指针,每个指针指向一个结果行中的列数据,

char**一个指向指针数组的指针,其中每个指针指向一个结果行中的列名。

声明的回调函数,如果这个函数是类成员函数,把它声明成static

C++成员函数实际上隐藏了一个参数:this,C++调用类的成员函数的时候,隐含把类指针当成函数的第一个参数传递进去。

结果,这造成跟前面说的 sqlite 回调函数的参数不相符。只有当把成员函数声明成static时,它才没有多余的隐含的this参数。

void *data为回调函数的第一个参数指向提供给回调函数的应用程序特定的数据,也是回调函数的第一个参数;

errmsg 为错误信息,是指向错误消息字符串的指针 。sqlite_exec() 有两个错误消息来源,返回值和可读的字符串errmsg。

sqlite3_prepare_v2()

1
int sqlite3_prepare_v2(sqlite3* db, const char* sql, int sql_len, sqlite3_stmt** stmt, const char** tail);

sqlite3* 表示指向数据库的指针;

sql 为执行的sql语句;

sql_len表示SQL 语句的长度。如果设置为 -1,则 SQLite 将自动计算字符串的长度

stmt用于存储编译后的语句对象

tail用于存储 SQL 语句中未使用的部分

sqlite3_get_table()

1
int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );

resultp表示查询结果,一维数组

nrow表示查询记录(行数)

ncolumn表示列数

SQL 必知必会

file->Open DataBase URI…选择书籍sqlite数据库下载的.sqlite文件。

各种语句–直接看菜鸟教程吧,很详细

检索

SELECT:从 SQLite 数据库表中获取数据,以结果表的形式返回数据

1
2
SELECT column1, column2, columnN FROM table_name;
SELECT * FROM table_name;  --检索所有列

DISTINCT:只返回不同的值(检索去重)(作用于所有列,不仅仅是其后的那一列)

1
2
SELECT DISTINCT column1, column2,.....columnN 
FROM table_name

LIMIT:限制由 SELECT 语句返回的数据数量。 可搭配OFFSET

1
2
3
4
SELECT column1, column2, columnN 
FROM table_name
LIMIT [no of rows] OFFSET [row num]
--LIMIT后为检索的行数,OFFSET后指从那行开始(检索行从0开始)

ORDER BY:基于一个或多个列按升序或降序顺序排列数据。

  • ASC 默认值,从小到大,升序排列
  • DESC 从大到小,降序排列 (对每列都进行降序,需要对每一列指定DESC关键字)
1
2
3
SELECT column-list 
FROM table_name 
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

挑战题答案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#lesson 2
--1
select cust_id from Customers
--2
select distinct prod_id from OrderItems
--3
/*select */
select cust_id from Customers

#lesson 3
--1
select cust_name from Customers order by cust_name desc
--2
select cust_id, order_num from Orders order by cust_id, order_date desc
--3
select quantity, item_price from OrderItems order by quantity desc, item_price desc
--4 多,少by
select vend_name from Vendors order by vend_name desc

过滤

WHERE:用于指定从一个表或多个表中获取数据的条件 (搜索、过滤条件,FROM子句之后)

1
2
3
SELECT column1, column2, columnN 
FROM table_name
WHERE [condition]

条件操作符

操作符说明操作符说明
=等于>大于
<>不等于>=大于等于
!=不等于!>不大于
<小于BETWEEN [] AND []两值之间
<=小于等于IS NULL为NULL值
!<不小于

AND/OR:连接运算符

1
2
3
4
5
6
7
SELECT column1, column2, columnN 
FROM table_name
WHERE [condition1] AND [condition2]...AND [conditionN];
-----------------------------------------------------
SELECT column1, column2, columnN 
FROM table_name
WHERE [condition1] OR [condition2]...OR [conditionN]

IN:用于把某个值与一系列指定列表的值进行比较。

1
2
3
4
SELECT * 
FROM COMPANY 
WHERE AGE IN ( 25, 27 )
--- 列出了 AGE 的值为 25 或 27 的所有记录

NOT:否定其后跟的条件

1
2
3
4
SELECT * 
FROM COMPANY 
WHERE AGE NOT IN ( 25, 27 )
--- 列出了 AGE 的值既不是 25 也不是 27 的所有记录

LIKE:匹配通配符指定模式的文本值

  • %:代表0,1或多个字符
  • _:代表单个字符
  • []:指定一个字符集 WHERE condition LIKE '[JM]%' 表示JM开头

挑战题答案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#lesson 4
--1
select prod_id, prod_name from Products where prod_price=9.49
--2
select prod_id, prod_name from Products where prod_price>=9
--3
select distinct order_num from OrderItems where quantity>=100
--4
select prod_name, prod_price from Products where prod_price between 3 and 6 order by prod_price
#lesson 5
--1
select vend_name from Vendors where vend_country = 'USA' and vend_state = 'CA' 
--2
select order_num, prod_id, quantity from OrderItems where prod_id in ('BR01', 'BR02', 'BR03') and quantity >= 100
--3  lesson 4中第4题
select prod_name, prod_price from Products where (prod_price >= 3 and prod_price <= 6) order by prod_price
--4
select vend_name from Vendors where vend_country = 'USA' and vend_state = 'CA' order by vend_name
#lesson 6
--1
select prod_name, prod_desc from Products where prod_desc like '%toy%'
--2
select prod_name, prod_desc from Products where not prod_desc like '%toy%' order by prod_name
--3
select prod_name, prod_desc from Products where prod_desc like '%toy%' and prod_desc like '%carrots%'
--4
select prod_name, prod_desc from Products where prod_desc like '%toy%carrots%'

函数

AS:取别名;把表或列重命名

1
2
3
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];

运算:+-*/

拼接 Concat()或者+或者||

文本处理函数

函数说明
LENGTH()返回字符串长度
LOWER()转换为小写
UPPER()转化为大写
LEFT()返回字符串左边的字符
RIGHT()返回字符串右边的字符
LTRIM()去掉字符串左边的空格
RTRIM()去掉字符串右边的空格
SUBSTR()提取字符串组成
SOUNDEX()返回字符串的SOUNDEX值(发音类似)

日期时间处理函数

SQLite 日期 & 时间

数值处理函数

ABS() COS() EXP() PI() SIN() TAN() SQRT()

聚集汇总函数

COUNT():计算一个数据库表中的行数。

MAX/MIN() :某列的最大值/最小值。

AVG():某列的平均值。

SUM() :某列计算总和。

挑战题答案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#lesson 7
--1
select vend_id, vend_name as vname, vend_address as vaddress, vend_city as vcity from Vendors order by vname
--2
select prod_id, prod_price, prod_price*0.9 as sale_price from Products
#lesson 8
--1
select cust_id, cust_name, upper(substr(cust_contact,1,2)  || substr(cust_city,1,3)) as user_login from Customers
--2
select order_num, order_date from Orders where (strftime('%Y', order_date)='2020' and  strftime('%m', order_date)='01') order by order_date
#lesson 9
--1
select sum(quantity) as items_ordered from OrderItems
--2
select sum(quantity) as items_ordered from OrderItems where prod_id = 'BR01'
--3
select max(prod_price)  from Products where prod_price <= 10

分组

直接使用

1
2
3
sqlite3 ./***.db
sqlite> .schema
sqlite> .exit

拓展阅读

官方

SQLite中文网

菜鸟教程-SQLite

SQLite3 API编程手册

玩转SQLite6:使用C语言来读写数据库

0%