SQlite3編程總結

|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 DEFAULT30); 

外鍵:利用外鍵約束可以用來建立表與表之間的聯繫,一般是一張表的某個字段,引用着另一張表的主鍵的字段。

  • 創建一個表: 

  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 = (SELECTid 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, NULL) == 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);      // 字符串數據

發佈了82 篇原創文章 · 獲贊 131 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章