數(shù)據(jù)庫 - sqlite3 基礎(chǔ) - 結(jié)合 fmdb

http://www.runoob.com/sqlite/sqlite-tutorial.html
sqlite基礎(chǔ)教程蠢古,菜鳥網(wǎng)站柒傻。
iOS開發(fā)用到fmdb比較多,其實也就是執(zhí)行SQL語句;這里簡單使用了基礎(chǔ)教程的SQL語句胀茵。

sqlite3

mac 終端直接進(jìn)入 sqlite3:
sqlite3

數(shù)據(jù)類型

創(chuàng)建數(shù)據(jù)庫

  • 創(chuàng)建(進(jìn)入)數(shù)據(jù)庫
    $sqlite3 DatabaseName.db

  • 檢查數(shù)據(jù)庫是否存在
    sqlite>.databases

  • 退出數(shù)據(jù)庫
    sqlite>.quit

  • .db 與 .sql 互轉(zhuǎn)
    $sqlite3 testDB.db .dump > testDB.sql
    $sqlite3 testDB.db < testDB.sql

  • 對應(yīng) fmdb

    self.dataBase = [FMDatabase databaseWithPath:dbPath];
    BOOL isOpen = [self.dataBase open];
    if (isOpen) {
        NSLog(@"db open ok ");
    }
    
    [self.dataBase close];

創(chuàng)建表 CREATE

CREATE TABLE tebleName (
id INTEGER PRIMARY KEY(one or more columns),
name TEXT,
age INTEGER,
mobile datatype,
);

  • 對應(yīng) fmdb
    NSString *tableName = @"tableName";
    NSString *nameKey = @"name";
    NSString *ageKey = @"age";
    NSString *createTableSql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (id INTEGER PRIMARY KEY AUTOINCREMENT, %@ TEXT, %@ INTEGER)",tableName, nameKey, ageKey];
    
    BOOL isCreateTable = [self.dataBase executeUpdate:createTableSql];
    if (isCreateTable) {
        NSLog(@"建表 ok");
    }

刪除表 DROP

DROP TABLE tableName;

  • 對應(yīng) fmdb
    NSString *deleteTableSql = [NSString stringWithFormat:@"DROP TABLE %@",tableName];
    BOOL isDeleteTable = [self.dataBase executeUpdate:deleteTableSql];
    if (isDeleteTable) {
        NSLog(@"刪表 ok");
    }

插入數(shù)據(jù) INSERT

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
或者
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

  • 對應(yīng) fmdb
    // 插法1
   NSString *insertNameValue = @"張三";
    NSInteger insertAgeValue = 19;
    
    NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO %@ (%@, %@) VALUES ('%@', %zi)", tableName, nameKey, ageKey, insertNameValue, insertAgeValue];
    BOOL isInsert = [self.dataBase executeUpdate:insertSql];
    if (isInsert) {
        NSLog(@"插入 ok");
    }

    // 插法2,注意 Value 個數(shù)要與創(chuàng)建時一致挟阻,下面的 9999 就是上面的 ID
    NSString *insertSql2 = [NSString stringWithFormat:@"INSERT INTO %@ VALUES (9999, '%@', %zi)" , tableName, insertNameValue, insertAgeValue];
    BOOL isInsert2 = [self.dataBase executeUpdate:insertSql2];
    if (isInsert2) {
        NSLog(@"插入2 ok");
    }

更新數(shù)據(jù) UPDATE

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

    NSString *updateSql = [NSString stringWithFormat:@"UPDATE %@ SET %@ = %zi WHERE %@ = '%@'",tableName, ageKey, 12, nameKey, @"張三"];
    BOOL isUpdate = [self.dataBase executeUpdate:updateSql];
    if (isUpdate) {
        NSLog(@"更新 成功");
    }

刪除數(shù)據(jù) DELETE

DELETE FROM table_name
WHERE [condition];

    NSString *deleteSql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ != %zi", tableName, ageKey, 12];
    BOOL isDelete = [self.dataBase executeUpdate:deleteSql];
    if (isDelete) {
        NSLog(@"刪除 ok");
    }

查詢

SELECT column1, column2, columnN FROM table_name;
SELECT * FROM table_name;

// 下面幾個是輸出格式設(shè)置
sqlite>.header on
sqlite>.mode column
sqlite>.width 10, 20, 10
sqlite> SELECT * FROM COMPANY;

  • 對應(yīng) fmdb
    NSString *searchSql = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ = '%@' AND %@ = %zi ",tableName, nameKey, @"張三", ageKey, 25];
    FMResultSet *result = [self.dataBase executeQuery:searchSql];
    while ([result next]) {
        NSString *name = [result stringForColumn:@"name"];
        NSInteger age = [result intForColumn:@"age"];
        NSLog(@"%@ - %zi",name, age);
    }
    [result close];

運算符

比較運算符:=,!=,>,>=........
邏輯運算符:AND, BETWEEN, EXISTS, IN, LIKE, GLOB, NOT......

舉幾個栗子

    // 模糊搜索 張%(%:多個琼娘,_:一個)
    NSString *searchSql1 = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ LIKE '%@'", tableName, nameKey, @"張%"];
    // 模糊搜索 張* (區(qū)分大小寫),(*:多個峭弟,?:一個)
    NSString *searchSql2 = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ GLOB '%@'", tableName, nameKey, @"張*"];
    // 搜索 年齡是 19 和 29 的
    NSString *searchSql3 = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ IN %@", tableName, ageKey, @"(19,29)"];
    // 搜索 年齡 20-30 之間的
    NSString *searchSql4 = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ BETWEEN %zi AND %zi",tableName, ageKey, 20,30];

其他表達(dá)式 - 個數(shù) 時間

SELECT COUNT(*) AS "RECORDS" FROM COMPANY;
SELECT CURRENT_TIMESTAMP;

    NSString *searchSql11 = [NSString stringWithFormat:@"SELECT COUNT(*) AS COUNT FROM %@",tableName];
    NSString *searchSql12 = [NSString stringWithFormat:@"SELECT CURRENT_TIMESTAMP"];
    
    [self.dataBase executeStatements:searchSql12 withResultBlock:^int(NSDictionary *resultsDictionary) {
        
        NSLog(@"%@",resultsDictionary);
        return 0;
    }];

獲取部分?jǐn)?shù)據(jù) LIMIT

sqlite> SELECT * FROM COMPANY LIMIT 3 OFFSET 2;

    // 2開始脱拼,取3個
    NSString *limitSql = [NSString stringWithFormat:@"SELECT * FROM %@ LIMIT %zi OFFSET %zi",tableName, 3,2];
    

排序 ORDER BY

獲取的數(shù)據(jù)進(jìn)行排序瞒瘸,對表本身沒有變化

SELECT * FROM COMPANY ORDER BY SALARY ASC;// DESC

    NSString *orderSql = [NSString stringWithFormat:@"SELECT * FROM %@ ORDER BY %@ ASC",tableName, nameKey];
    FMResultSet *re = [self.dataBase executeQuery:orderSql];
    while ([re next]) {
        NSString *name = [re stringForColumn:@"name"];
        NSInteger age = [re intForColumn:@"age"];
        NSInteger iid = [re intForColumn:@"id"];
        NSLog(@"%zi :::%@ - %zi",iid,name, age);
    }
    [re close];

分組(計算流水總額) GROUP BY

數(shù)據(jù)表內(nèi)是不同人的,花費流水挪拟,使用group挨务,對name合并,計算SUM(cost)總額

SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;

    NSString *orderSql = [NSString stringWithFormat:@"SELECT name, SUM(cost) FROM %@ GROUP BY %@",tableName, nameKey];
    FMResultSet *re = [self.dataBase executeQuery:orderSql];
    while ([re next]) {
        NSString *name = [re stringForColumn:@"name"];
        NSInteger cost = [re intForColumn:@"SUM(cost)"];
        NSLog(@"%@ - %zi",name, cost);
    }
    [re close];

WHERE 子句上的二次過濾語句 HAVING

    NSString *orderSql = [NSString stringWithFormat:@"SELECT name, SUM(age) FROM %@ GROUP BY %@ HAVING COUNT(name) > 2 ORDER BY %@ ASC",tableName, nameKey,nameKey];
    FMResultSet *re = [self.dataBase executeQuery:orderSql];
    while ([re next]) {
        NSString *name = [re stringForColumn:@"name"];
        NSInteger sumage = [re intForColumn:@"SUM(age)"];
        NSLog(@":::%@ - %zi",name, sumage);
    }
    [re close];

去重復(fù)數(shù)據(jù) DISTINCT

SELECT DISTINCT name FROM COMPANY;

    NSString *orderSql = [NSString stringWithFormat:@"SELECT Distinct name FROM %@",tableName];
    FMResultSet *re = [self.dataBase executeQuery:orderSql];
    while ([re next]) {
        NSString *name = [re stringForColumn:@"name"];
        NSLog(@":::%@ - ",name);
    }
    [re close];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玉组,一起剝皮案震驚了整個濱河市谎柄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惯雳,老刑警劉巖朝巫,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異石景,居然都是意外死亡劈猿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門潮孽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揪荣,“玉大人,你說我怎么就攤上這事往史≌叹保” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵椎例,是天一觀的道長挨决。 經(jīng)常有香客問我,道長订歪,這世上最難降的妖魔是什么脖祈? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮刷晋,結(jié)果婚禮上盖高,老公的妹妹穿的比我還像新娘。我一直安慰自己眼虱,他們只是感情好喻奥,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒙幻,像睡著了一般映凳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邮破,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天诈豌,我揣著相機與錄音仆救,去河邊找鬼。 笑死矫渔,一個胖子當(dāng)著我的面吹牛彤蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庙洼,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼顿痪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油够?” 一聲冷哼從身側(cè)響起蚁袭,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎石咬,沒想到半個月后揩悄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡鬼悠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年删性,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焕窝。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹬挺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出它掂,到底是詐尸還是另有隱情巴帮,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布群发,位于F島的核電站晰韵,受9級特大地震影響发乔,放射性物質(zhì)發(fā)生泄漏熟妓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一栏尚、第九天 我趴在偏房一處隱蔽的房頂上張望起愈。 院中可真熱鬧,春花似錦译仗、人聲如沸抬虽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春敏弃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背功氨。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留手幢,地道東北人捷凄。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像围来,于是被迫代替她去往敵國和親跺涤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容