|SQLite3簡介
SQLite3只是一個輕型的嵌入式數據庫引擎,占用資源非常低,處理速度比Mysql還快,專門用於移動設備上進行適量的數據存取,它只是一個文件,不需要服務器進程。
常用術語:表(table)、字段(column,列,屬性)、記錄(row,record)。
|SQL(structured query language)語句
特點:不區分大小寫,每條語句后加";"結尾。
關鍵字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,數據庫中不能使用關鍵字命名表和字段。
數據定義語句(DDL:Data Definition Language)
- 新建表 ⟹ create:create table 表名 (字段名1 字段類型1,字段名2 字段類型2,。。。); create table if not exists 表名 (字段名1 字段類型1,字段名2 字段類型2,。。。);
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);
- 刪除表 ⟹ drop:dorp table 表名;drop table if exists 表名;
DROP TABLE IF EXISTS t_person;
數據操作語句(DML:Data Manipulation language)
- 添加表中的數據 ⟹ insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串內容用單引號。
INSERT INTO t_person (name, age) VALUES ('大明', 22);
- 修改表中的數據 ⟹ update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;
UPDATE t_person SET name = '小明', age = 10; // 把表中name字段的值全部改成小明,age字段的值全部改成10。
UPDATE t_person SET age = 12 WHERE name = '小明'; // 把表中name字段值是小明的age值改為12。
- 刪除表中的數據 ⟹ delete:delete from 表名;delete from 表名 where 字段 = 字段值。
DELETE FROM t_person; // 刪除表中的所有記錄。
DELETE FROM t_person WHERE age = 25; // 刪除表中字段age等於25的這條記錄。
DELETE FROM t_person WHERE age > 12 AND age < 15; // 刪除表中年齡大於12且小於15的記錄。
數據查詢語句(DQL:Data Query Language)
- select:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查詢所有的字段)
- 表別名:select 字段1 別名, 字段2 別名,。。。from 表名 別名;select 字段1 別名, 字段2 as 別名,。。。from 表名 as 別名;select 別名.字段1,別名.字段2,。。。from 表名 別名;
SELECT name, age FROM t_person WHERE age < 80;
SELECT * FROM t_person WHERE age < 80;
SELECT name, age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90;
- 計算記錄條數:select count(字段或者*) from 表名;
SELECT count(name) FROM t_person ren WHERE ren.age > 80;
SELECT count(*) FROM t_person ren WHERE ren.age > 80;
- where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;
- order by:select * from 表名 order by 字段(默認升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC; // 先按年齡降序,再按名字升序。
- limit:select * from 表名 limit 數值1,數值2;分頁查詢,數值1表示跳過前面多少條,數值2表示取出之后多少條。select * from 表名 limit 數值2;(跳過前面0條,相當於select * from 表名 limit 0,數值2,表示最前面多少條數據)
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC LIMIT 3, 5; // 先篩選,后排序,再分頁。
- like:模糊查詢,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;
SELECT * FROM t_person WHERE name like '%明%';
存儲類型:integer(整型)、real(浮點型)、text(文本字符串)、blob(二進制數據)。
實際上SQLite是無類型的,建表時聲明的類型是為了方便程序員之間的交流,是一種良好的編程規范。
字段約束:
- not null:字段的值不能為空。
- unique:字段的值必需唯一。
- default:指定字段的默認值。
- primary key:主鍵,用來唯一的標識某條記錄,相當於記錄的身份證。主鍵可以是一個或多個字段,應由計算機自動生成和管理。主鍵字段默認包含了not null和unique兩個約束。
- autoincrement:當主鍵是integer類型時,應該增加autoincrement約束,能實現主鍵值的自動增長。
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE, age integer NOT NULL DEFAULT 30);
外鍵:利用外鍵約束可以用來建立表與表之間的聯系,一般是一張表的某個字段,引用着另一張表的主鍵的字段。
- 創建一個表:
CREATE TABLE IF NOT EXISTS t_class (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE);
- 創建一個帶外鍵的表:t_student表中有一個叫做fk_student_class的外鍵,這個外鍵的作用是讓t_student表中的class_id字段引用t_class表中的id字段。
CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL, class_id integer NOT NULL, CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES t_class(id));
- 利用外鍵來查詢多張表中的數據:
SELECT t.name t_name, t.age t_age, tc.name c_name FROM t_student t, t_class tc WHERE t.class_id = tc.id; // 查詢所有學生對應的班級
SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE name = '四班'); // 查詢四班的所有學生
|SQLite3的使用
1、導入libsqlite3.dylib庫,包含頭文件#import <sqlite3.h>。
2、打開或者創建數據庫。
-
1 sqlite3 *sq = NULL; // 一個打開的數據庫實例 2 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"]; 3 4 // 根據文件路徑打開數據庫,如果不存在,則會創建一個新的數據庫。 5 // 數據庫文件的路徑必須以C字符串(而非NSString)傳入。 6 int result = sqlite3_open(path.UTF8String, &sq); 7 if (result == SQLITE_OK) { 8 self.sq = sq; 9 NSLog(@"打開數據成功"); 10 const char *sql = "CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"; 11 char *errmsg = NULL; // 用來存儲錯誤信息 12 // 可以執行任何SQL語句,比如創表、更新、插入和刪除操作。但是一般不用它執行查詢語句,因為它不會返回查詢到的數據。 13 result = sqlite3_exec(self.sq, sql, NULL, NULL, &errmsg); 14 if (result == SQLITE_OK) { 15 NSLog(@"創表成功"); 16 } else { 17 NSLog(@"創表失敗:%@", [NSString stringWithUTF8String:errmsg]); 18 } 19 } else { 20 NSLog(@"打開數據庫失敗"); 21 }
3、執行不返回數據的SQL語句。
- 執行創表語句。
1 const char *sql = "CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"; 2 char *errmsg = NULL; // 用來存儲錯誤信息 3 // 可以執行任何SQL語句,比如創表、更新、插入和刪除操作。但是一般不用它執行查詢語句,因為它不會返回查詢到的數據。 4 result = sqlite3_exec(self.sq, sql, NULL, NULL, &errmsg); 5 if (result == SQLITE_OK) { 6 NSLog(@"創表成功"); 7 } else { 8 NSLog(@"創表失敗:%s", errmsg); 9 }
- 執行添加數據語句(增、刪、改)。
1 NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_person (name, age) VALUES ('%@', %d);", @"夏明", 22]; 2 char *errmsg = NULL; 3 int result = sqlite3_exec(self.sq, sql.UTF8String, NULL, NULL, &errmsg); 4 if (result == SQLITE_OK) { 5 NSLog(@"添加數據成功"); 6 } else { 7 NSLog(@"添加數據失敗:%s", errmsg); 8 }
- 執行更新、刪除語句和執行創表、添加語句基本類似,只需更改sql語句即可。
4、執行返回數據的SQL語句(查)。
-
1 // 進行查詢前的准備工作 2 const char *sql = "SELECT name, age FROM t_person WHERE age < 30;"; 3 sqlite3_stmt *stmt = NULL; // 用來取數據的 4 // -1代表系統會自動計算SQL語句的長度 5 if (sqlite3_prepare_v2(self.sq, sql, -1, &stmt, nil) == SQLITE_OK) { 6 NSLog(@"查詢語句沒問題"); 7 // 每調一次sqlite3_step()函數,stmt就會指向下一條記錄 8 while(sqlite3_step(stmt) == SQLITE_ROW) { 9 // 取出第0列字段的值 10 const unsigned char *name = sqlite3_column_text(stmt, 0); 11 // 取出第1列字段的值 12 int age = sqlite3_column_int(stmt, 1); 13 NSLog(@"name = %s, age = %d", name, age); 14 } 15 } else { 16 NSLog(@"查詢語句有問題"); 17 }
5、關閉數據庫:sqlite3_close(db)。
|總結
1.打開數據庫
int sqlite3_open(
const char *filename, // 數據庫的文件路徑
sqlite3 **ppDb // 數據庫實例
);
2.執行任何SQL語句
int sqlite3_exec(
sqlite3*, // 一個打開的數據庫實例
const char *sql, // 需要執行的SQL語句
int (*callback)(void*,int,char**,char**), // SQL語句執行完畢后的回調
void *, // 回調函數的第1個參數
char **errmsg // 錯誤信息
);
3.檢查SQL語句的合法性(查詢前的准備)
int sqlite3_prepare_v2(
sqlite3 *db, // 數據庫實例
const char *zSql, // 需要檢查的SQL語句
int nByte, // SQL語句的最大字節長度
sqlite3_stmt **ppStmt, // sqlite3_stmt實例,用來獲得數據庫數據
const char **pzTail
);
4.查詢一行數據
int sqlite3_step(sqlite3_stmt*); // 如果查詢到一行數據,就會返回SQLITE_ROW
5.利用stmt獲得某一字段的值(字段的下標從0開始)
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點數據
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數據
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數據
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進制文本數據
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串數據