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]%'
表示J
或M
开头挑战题答案
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语言来读写数据库