一、簡(jiǎn)介
1辕漂、什么是SQLite
SQLite是一款輕型的嵌入式數(shù)據(jù)庫
它占用資源非常的低呢灶,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了
它的處理速度比Mysql钉嘹、PostgreSQL這兩款著名的數(shù)據(jù)庫都還快
2鸯乃、什么是數(shù)據(jù)庫
數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲(chǔ)和管理數(shù)據(jù)的倉(cāng)庫
3跋涣、數(shù)據(jù)庫可以分為2大種類
關(guān)系型數(shù)據(jù)庫(主流)
對(duì)象型數(shù)據(jù)庫
4缨睡、常用關(guān)系型數(shù)據(jù)庫
PC端:Oracle鸟悴、MySQL、SQL Server奖年、Access细诸、DB2、Sybase
嵌入式\移動(dòng)客戶端:SQLite
5陋守、Navicat 數(shù)據(jù)庫管理軟件
Navicat是一款著名的數(shù)據(jù)庫管理軟件震贵,支持大部分主流數(shù)據(jù)庫(包括SQLite)
6、數(shù)據(jù)庫的使用:
6.2.SQL 語句
如何在程序運(yùn)行過程中操作數(shù)據(jù)庫中的數(shù)據(jù)
那得先學(xué)會(huì)使用SQL語句
什么是SQL
SQL(structured query language):結(jié)構(gòu)化查詢語言
SQL是一種對(duì)關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行定義和操作的語言? ? - SQL語言簡(jiǎn)潔嗅义,語法簡(jiǎn)單屏歹,好學(xué)好用
什么是SQL語句
使用SQL語言編寫出來的句子\代碼,就是SQL語句
在程序運(yùn)行過程中之碗,要想操作(增刪改查蝙眶,CRUD)數(shù)據(jù)庫中的數(shù)據(jù),必須使用SQL語句
SQL語句的特點(diǎn)
不區(qū)分大小寫(比如數(shù)據(jù)庫認(rèn)為user和UsEr是一樣的)
每條語句都必須以分號(hào) ; 結(jié)尾
SQL中的常用關(guān)鍵字有
select褪那、insert幽纷、update、delete博敬、from友浸、create、where偏窝、desc收恢、order、by祭往、group伦意、table、alter硼补、view驮肉、index等
數(shù)據(jù)庫中不可以使用關(guān)鍵字來命名表、字段
SQL語句的種類
數(shù)據(jù)定義語句(DDL:Data Definition Language)
包括create和drop等操作
在數(shù)據(jù)庫中創(chuàng)建新表或刪除表(create table或drop table)
數(shù)據(jù)操作語句(DML:Data Manipulation Language)
包括insert已骇、update离钝、delete等操作
上面的3種操作分別用于添加、修改褪储、刪除表中的數(shù)據(jù)
數(shù)據(jù)查詢語句(DQL:Data Query Language)
可以用于查詢獲得表中的數(shù)據(jù)
關(guān)鍵字select是DQL(也是所有SQL)用得最多的操作
其他DQL常用的關(guān)鍵字有where卵渴,order by,group by和having
6.3.DDL
創(chuàng)表
格式
create table表名 (字段名1 字段類型1, 字段名2 字段類型2, …) ;
create table if not exists表名 (字段名1 字段類型1, 字段名2 字段類型2, …) ;
示例createtablet_student (idinteger,nametext, age inetger, scorereal) ;
字段類型
SQLite將數(shù)據(jù)劃分為以下幾種存儲(chǔ)類型:
integer: 整型值real : 浮點(diǎn)值text : 文本字符串blob : 二進(jìn)制數(shù)據(jù)(比如文件)
實(shí)際上SQLite是無類型的
就算聲明為integer類型鲤竹,還是能存儲(chǔ)字符串文本(主鍵除外)
建表時(shí)聲明啥類型或者不聲明類型都可以奖恰,也就意味著創(chuàng)表語句可以這么寫:
createtablet_student(name, age);
為了保持良好的編程規(guī)范、方便程序員之間的交流,編寫建表語句的時(shí)候最好加上每個(gè)字段的具體類型
刪表
格式
droptable表名 ;droptableifexists表名 ;示例droptablet_student ;
6.4.DML
插入數(shù)據(jù)(insert)
格式insertinto表名 (字段1, 字段2, …)values(字段1的值, 字段2的值, …) ;示例insertintot_student (name, age)values(‘mj’,10) ;注意? 數(shù)據(jù)庫中的字符串內(nèi)容應(yīng)該用單引號(hào) ’ 括住
更新數(shù)據(jù)庫(update)
格式? update 表名set字段1= 字段1的值, 字段2= 字段2的值, … ;? 示例? update t_studentsetname = ‘jack’, age =20;? 注意? 上面的示例會(huì)將t_student表中所有記錄的name都改為jack瑟啃,age都改為20
刪除數(shù)據(jù)(delete)
格式deletefrom表名 ;示例deletefromt_student ;注意? 上面的示例會(huì)將t_student表中所有記錄都刪掉
6.5.條件語句
如果只想更新或者刪除某些固定的記錄论泛,那就必須在DML語句后加上一些條件
條件語句的常見格式
where字段 = 某個(gè)值 ;// 不能用兩個(gè) =where字段is某個(gè)值 ;// is 相當(dāng)于 =where字段 != 某個(gè)值 ;where字段isnot 某個(gè)值 ;// is not 相當(dāng)于 !=where字段 > 某個(gè)值 ;where字段1= 某個(gè)值 and 字段2> 某個(gè)值 ;// and相當(dāng)于C語言中的 &&where字段1= 某個(gè)值 or 字段2= 某個(gè)值 ;//? or 相當(dāng)于C語言中的 ||
eg:
將t_student表中年齡大于10 并且 姓名不等于jack的記錄,年齡都改為 5updatet_studentsetage =5whereage >10andname!= ‘jack’ ;刪除t_student表中年齡小于等于10 或者 年齡大于30的記錄deletefromt_studentwhereage <=10orage >30;猜猜下面語句的作用updatet_studentsetscore = agewherename= ‘jack’ ;將t_student表中名字等于jack的記錄蛹屿,score字段的值 都改為 age字段的值
6.6.DQL
格式
select字段1, 字段2, …from表名 ;select*from表名;//? 查詢所有的字段
示例
selectname, agefromt_student ;select*fromt_student ;select*fromt_studentwhereage >10;//? 條件查詢
其別名
格式(字段和表都可以起別名)select 字段1別名 , 字段2別名 , …from表名 別名 ;select 字段1別名, 字段2as別名, …from表名as別名 ;select 別名.字段1, 別名.字段2, …from表名 別名 ;示例selectnamemyname, age myagefromt_student ;給name起個(gè)叫做myname的別名屁奏,給age起個(gè)叫做myage的別名select s.name, s.agefromt_student s ;給t_student表起個(gè)別名叫做s,利用s來引用表中的字
計(jì)算數(shù)量
格式selectcount(字段)from表名;selectcount(*)from表名;? 示例selectcount(age)fromt_student;selectcount(*)fromt_studentwherescore >=60;
6.7.排序
排序
查詢出來的結(jié)果可以用order by進(jìn)行排序select *fromt_studentorderby字段 ;select *fromt_studentorderbyage ;默認(rèn)是按照升序排序(由小到大)错负,也可以變?yōu)榻敌颍ㄓ纱蟮叫坟瓢。﹕elect *fromt_studentorderbyagedesc;//降序select *fromt_studentorderbyageasc;// 升序(默認(rèn))? 也可以用多個(gè)字段進(jìn)行排序select *fromt_studentorderbyageasc, heightdesc;先按照年齡排序(升序),年齡相等就按照身高排序(降序)
limit
使用limit可以精確地控制查詢結(jié)果的數(shù)量犹撒,比如每次只查詢10條數(shù)據(jù)? 格式? select * from 表名 limit 數(shù)值1, 數(shù)值2;? 示例? select * from t_student limit4,8;? 可以理解為:跳過最前面4條語句折联,然后取8條記錄
分頁查詢
limit常用來做分頁查詢,比如每頁固定顯示5條數(shù)據(jù)识颊,? ? ? 那么應(yīng)該這樣取數(shù)據(jù)? 第1頁:limit0,5第2頁:limit5,5第3頁:limit10,5…? 第n頁:limit5*(n-1),5猜猜下面語句的作用? select * from t_student limit7;? 相當(dāng)于select * from t_student limit0,7;? 表示取最前面的7條記錄
6.8.約束
簡(jiǎn)單約束
建表時(shí)可以給特定的字段設(shè)置一些約束條件诚镰,常見的約束? not null :規(guī)定字段的值不能為null? unique :規(guī)定字段的值必須唯一? default :指定字段的默認(rèn)值? (建議:盡量給字段設(shè)定嚴(yán)格的約束,以保證數(shù)據(jù)的規(guī)范性? 示例createtablet_student (idinteger,nametextnotnullunique, ageintegernotnulldefault1) ;name字段不能為null祥款,并且唯一? age字段不能為null清笨,并且默認(rèn)為1
主鍵約束
如果t_student表中就name和age兩個(gè)字段,而且有些記錄的name和age字段的值都一樣時(shí)刃跛,那么就沒法區(qū)分這些數(shù)據(jù)抠艾,造成數(shù)據(jù)庫的記錄不唯一,這樣就不方便管理數(shù)據(jù)
良好的數(shù)據(jù)庫編程規(guī)范應(yīng)該要保證每條記錄的唯一性桨昙,為此检号,增加了主鍵約束
也就是說,每張表都必須有一個(gè)主鍵蛙酪,用來標(biāo)識(shí)記錄的唯一
什么是主鍵
主鍵(Primary Key谨敛,簡(jiǎn)稱PK)用來唯一地標(biāo)識(shí)某一條記錄
例如t_student可以增加一個(gè)id字段作為主鍵,相當(dāng)于人的身份證
主鍵可以是一個(gè)字段或多個(gè)字段
主鍵的設(shè)計(jì)原則
主鍵應(yīng)當(dāng)是對(duì)用戶沒有意義的
永遠(yuǎn)也不要更新主鍵
主鍵不應(yīng)包含動(dòng)態(tài)變化的數(shù)據(jù)
主鍵應(yīng)當(dāng)由計(jì)算機(jī)自動(dòng)生成
主鍵的聲明
在創(chuàng)表的時(shí)候用primary key聲明一個(gè)主鍵
createtablet_student (idintegerprimarykey,nametext, ageinteger) ;integer類型的id作為t_student表的主鍵
主鍵字段
只要聲明為primary key滤否,就說明是一個(gè)主鍵字段
主鍵字段默認(rèn)就包含了not null和unique兩個(gè)約束
如果想要讓主鍵自動(dòng)增長(zhǎng)(必須是integer類型),應(yīng)該增加autoincrement
createtablet_student (idintegerprimarykeyautoincrement,nametext, ageinteger) ;
外鍵約束
利用外鍵約束可以用來建立表與表之間的聯(lián)系
外鍵的一般情況是:一張表的某個(gè)字段最仑,引用著另一張表的主鍵字段
新建一個(gè)外鍵createtablet_student (idintegerprimarykeyautoincrement,nametext, ageinteger, class_idinteger,constraintfk_student_class foreignkey(class_id)referencest_class (id));
t_student表中有一個(gè)叫做fk_t_student_class_id_t_class_id的外鍵
這個(gè)外鍵的作用是用t_student表中的class_id字段引用t_class表的id字段
表連接查詢
什么是表連接查詢:需要聯(lián)合多張表才能查到想要的數(shù)據(jù)
表連接的類型
內(nèi)連接:inner join 或者 join? (顯示的是左右表都有完整字段值的記錄)
左外連接:left outer join (保證左表數(shù)據(jù)的完整性)
示例查詢0316iOS班的所有學(xué)生select s.name,s.agefromt_student s, t_classcwheres.class_id =c.idandc.name= ‘0316iOS’;
文/Sunshine_Whboy(簡(jiǎn)書作者)
原文鏈接:http://www.reibang.com/p/fa753e380390
著作權(quán)歸作者所有藐俺,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書作者”泥彤。
iOS 開發(fā)中關(guān)于 FMDB 框架的使用:
FMDB的細(xì)節(jié)
1.數(shù)據(jù)庫是什么時(shí)候打開的欲芹?
在實(shí)例化queue時(shí)就打開了
2. FMDB操作多線程是如何實(shí)現(xiàn)的?
是使用GCD的串行對(duì)列來實(shí)現(xiàn)多線程處理的
3. FMDB的數(shù)據(jù)庫操作吟吝,F(xiàn)MDatabaseQueue默認(rèn)是在主線程上
4. FMDB的多線程操作方式:
串行隊(duì)列-保證隊(duì)列中的任務(wù)按照順序派發(fā)菱父,調(diào)度
同步任務(wù)-不會(huì)開啟線程,任務(wù)順序執(zhí)行
FMDB本質(zhì)上可以允許在后臺(tái)線程執(zhí)行數(shù)據(jù)操作,但是要求所有的數(shù)據(jù)操作浙宜,必須順序執(zhí)行官辽!
多線程:串行隊(duì)列,異步任務(wù)粟瞬,開啟一條線程同仆,所有任務(wù)順序執(zhí)行!
如果也要讓FMDB具有多線程功能裙品,需要自己開啟一個(gè)并發(fā)隊(duì)列俗批,讓所有數(shù)據(jù)操作由并發(fā)隊(duì)列調(diào)度
5.一定注意:在使用FMDB時(shí),一定不要嵌套任務(wù)使用市怎,否則會(huì)死鎖岁忘!本質(zhì)上是為了保證數(shù)據(jù)安全!
關(guān)于學(xué)習(xí)一個(gè)第三方框架:
1.要看官網(wǎng)的文檔
2.要看頭文件
3.要自己寫測(cè)試代碼区匠!