導(dǎo)語:
數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲(chǔ)和管理數(shù)據(jù)的倉庫.請(qǐng)不要被「數(shù)據(jù)庫」三個(gè)字所迷惑缚窿,數(shù)據(jù)庫的語法是十分簡(jiǎn)單棘幸。
一、認(rèn)識(shí)數(shù)據(jù)庫
數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織倦零、存儲(chǔ)和管理數(shù)據(jù)的倉庫,我們可以很方便的對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行增误续、刪吨悍、改、查操作蹋嵌。
iOS中數(shù)據(jù)存儲(chǔ)的方式
Plist(NSArray \ NSDictionary)
Preference(偏好設(shè)置 \ NSUserDefaults)
NSCoding(NSKeyedArchiver \ NSkeyedUnarchiver)
對(duì)數(shù)據(jù)操作(增育瓜、刪、改栽烂、查)不方便
SQLite3(數(shù)據(jù)庫)
Core Data(對(duì) SQLite 的封裝)
數(shù)據(jù)庫可以分為2大種類
關(guān)系型數(shù)據(jù)庫(主流)
對(duì)象型數(shù)據(jù)庫
常用的關(guān)系數(shù)據(jù)庫
PC 端:Oracle躏仇、MySQL、SQL Server
移動(dòng)客戶端:SQLite
是一款輕型的數(shù)據(jù)庫
設(shè)計(jì)目標(biāo)是嵌入式的
占用的資源是非常低的腺办,在嵌入式設(shè)備中焰手,可能只需要幾百 K 的內(nèi)存就夠了
它的處理速度比 Mysql、PostgreSQL 這兩款著名的數(shù)據(jù)庫都還快
關(guān)系型數(shù)據(jù)庫
存儲(chǔ)數(shù)據(jù)和 Excel 很像
一個(gè) 字段(COL) 存儲(chǔ)一個(gè)值怀喉,類似于對(duì)象的一個(gè)屬性
一行(ROW) 存儲(chǔ)一條記錄,保存一個(gè)對(duì)象里面的所有屬性
一個(gè)表(TABLE) 存儲(chǔ)一系列數(shù)據(jù)书妻,類似于對(duì)象數(shù)組
相關(guān)術(shù)語
字段(Field / Col):一個(gè)字段存儲(chǔ)一個(gè)值,Sqlite 提供 INTEGER(整型)磺送,REAL(實(shí)數(shù)型)驻子,TEXT(字符型),BLOB(二進(jìn)制數(shù))估灿,NULL (空)五種類型的數(shù)據(jù)
SQLite 在存儲(chǔ)時(shí)崇呵,本質(zhì)上并不區(qū)分準(zhǔn)確的數(shù)據(jù)類型
主鍵:Primary Key簡(jiǎn)稱PK,唯一地標(biāo)示一條記錄馅袁,具有以下特點(diǎn):
名字:xxx_id
類型:Integer
自動(dòng)增長
準(zhǔn)確數(shù)值由數(shù)據(jù)庫決定域慷,程序員不用關(guān)心
開發(fā)數(shù)據(jù)庫的步驟
建立數(shù)據(jù)庫 -> 存儲(chǔ)數(shù)據(jù)的文件
創(chuàng)建數(shù)據(jù)表 -> 每一張數(shù)據(jù)表存儲(chǔ)一類數(shù)據(jù)
數(shù)據(jù)表添加字段(column,列,屬性)
操作數(shù)據(jù):增/刪/查/改
移動(dòng)應(yīng)用中使用數(shù)據(jù)庫的好處
將網(wǎng)絡(luò)數(shù)據(jù)存儲(chǔ)在本地,不用每次都去網(wǎng)絡(luò)加載汗销,減少用戶網(wǎng)絡(luò)流量開銷
推薦工具
需要破解版的請(qǐng)私信或在評(píng)論區(qū)留下郵箱犹褒,有空就給你們發(fā)。
二弛针、SQLite 命令
我們?cè)?iOS 應(yīng)用程序中無法使用圖形化界面操作數(shù)據(jù)庫叠骑。在程序運(yùn)行過程中操作數(shù)據(jù)庫中的數(shù)據(jù)需要通過 SQL 語句
什么是 SQL
SQL(structured query language):結(jié)構(gòu)化查詢語言
SQL 是對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行定義和操作的語言
SQL 語言簡(jiǎn)潔,語法簡(jiǎn)單削茁,好學(xué)好用
什么是 SQL 語句
使用 SQL 語言編寫出來的句子\代碼宙枷,就是 SQL 語句
在程序運(yùn)行過程中,要想操作(增/刪/改/查)數(shù)據(jù)庫中的數(shù)據(jù),必須使用 SQL 語句
SQL 語句的種類
1. DDL(Data Definition Language)- 數(shù)據(jù)定義語句
命令描述
CREATE創(chuàng)建一個(gè)新的表茧跋,一個(gè)表的視圖慰丛,或者數(shù)據(jù)庫中的其他對(duì)象
ALTER修改數(shù)據(jù)庫中的某個(gè)已有的數(shù)據(jù)庫對(duì)象,比如一個(gè)表
DROP刪除整個(gè)表瘾杭,或者表的視圖诅病,或者數(shù)據(jù)庫中的其他對(duì)象
不需要記憶,可以直接從客戶端軟件復(fù)制/粘貼
2. DML(Data Manipulation Language)- 數(shù)據(jù)操作語句
命令描述
INSERT新增數(shù)據(jù)
UPDATE修改數(shù)據(jù)
DELETE刪除數(shù)據(jù)
需要掌握,語法固定
3. DQL(Data Query Language)- 數(shù)據(jù)查詢語句
命令描述
SELECT查詢數(shù)據(jù)
需要掌握一些簡(jiǎn)單的查詢指令
SQL 語句的特點(diǎn)
不區(qū)分大小寫(比如數(shù)據(jù)庫認(rèn)為 user 和 UsEr 是一樣的)
每條語句建議以分號(hào) ; 結(jié)尾( ; 用于區(qū)分多條 SQL 語句)
SQL 中的常用關(guān)鍵字有 select贤笆、insert蝇棉、update、delete芥永、from银萍、create、where恤左、desc贴唇、order、by飞袋、group戳气、table、alter巧鸭、view瓶您、index 等等
數(shù)據(jù)庫中不可以使用關(guān)鍵字來命名 表、字段
三纲仍、案例
DDL - 數(shù)據(jù)定義語句
創(chuàng)建表
格式:CREATE TABLE IF NOT EXISTS 表名 (字段名1 字段類型1, 字段名2 字段類型2, …);
/*
? 創(chuàng)建數(shù)據(jù)表
? DDL CREATE
? CREATE TABLE? ? --創(chuàng)建數(shù)據(jù)表
? T_Student? ? ? ? --數(shù)據(jù)表名稱
? (
? id? ? ? ? ? ? ? ? --字段名稱
? ? ? INTEGER? ? ? ? --字段類型
? ? ? NOT NULL? ? --字段約束, NOT NULL表示字段的值不能為空
? ? ? PRIMARY KEY? ? --表示主鍵
? ? ? AUTOINCREMENT? ? --自動(dòng)增長
? ,? ? ? ? ? ? ? ? --多個(gè)字段之間用,分開
? name? ? ? ? ? ? --字段名稱
? ? ? TEXT? ? ? ? --字段的類型
? ...
? )
? ;? ? ? ? ? ? ? ? --表示一段sql語句結(jié)束
? 注意:
? ? ? 1.數(shù)據(jù)表名稱和字段名稱可以用""引起來,也可以不用
? ? ? 2.DDL語句不需要熟練的被下來.開發(fā)的時(shí)候可以在Navicat里面創(chuàng)建好表,在把DDL復(fù)制過來
? ? ? 3.數(shù)據(jù)表已經(jīng)存在,還創(chuàng)建表會(huì)報(bào)'數(shù)據(jù)表已經(jīng)存在'的錯(cuò)誤,需要加IF NOT EXISTS 表示數(shù)據(jù)表不存在才創(chuàng)建
*/CREATE TABLE IF NOT EXISTST_Student(? id INTEGER NOTNULLPRIMARY KEY AUTOINCREMENT,? name text,? age integer,? height real,? score real);CREATE TABLE IF NOT EXISTST_Person(? id INTEGER NOTNULLPRIMARY KEY AUTOINCREMENT,? name text,? age integer,? height real);
刪除表
格式:DROP TABLE IF EXISTS 表名;
/*
? DDL刪除表
? DROP TABLE T_Student? ? --刪除T_Student這張表
*/DROP TABLE T_Person;
DML - 數(shù)據(jù)操作語句
插入數(shù)據(jù)
格式:INSERT INTO 表名 (字段1, 字段2, …) VALUES (字段1的值, 字段2的值, …);
/*
? DML插入數(shù)據(jù)
? INSERT INTO? ? ? ? --表示插入數(shù)據(jù)
? T_Person? ? ? ? --插入數(shù)據(jù)的數(shù)據(jù)表名稱
? (name, age, height)? ? ? ? --表示要設(shè)置哪些字段的值
? VALUES
? ('zhangsan', 18, 1.65)? ? --每個(gè)字段對(duì)應(yīng)的值
? 注意:
? ? ? 1.字段名和字段值要對(duì)應(yīng)
? ? ? 2.sqlite其實(shí)是沒有數(shù)據(jù)類型的,DDL語句中的類型只是給我們程序員看的
? ? ? 3.字符串需要用‘’
*/INSERT INTOT_Person(name, age, height)VALUES('lisi1',15,1.70);INSERT INTOT_Person(name, age, height)VALUES('lisi2',15,1.70);INSERT INTOT_Person(name, age, height)VALUES('lisi3',18,1.80);INSERT INTOT_Person(name, age, height)VALUES('lisi4',17,1.78);INSERT INTOT_Person(name, age, height)VALUES('zhangsan1',18,1.72);INSERT INTOT_Person(name, age, height)VALUES('zhangsan2',18,1.75);INSERT INTOT_Person(name, age, height)VALUES('zhangsan3',28,1.71);INSERT INTOT_Person(name, age, height)VALUES('zhangsan4',16,1.79);INSERT INTOT_Person(name, age, height)VALUES('wangwu111',28,1.69);INSERT INTOT_Person(name, age, height)VALUES('wangwu222',10,1.49);INSERT INTOT_Person(name, age, height)VALUES('wangwu333',20,1.75);INSERT INTOT_Person(name, age, height)VALUES('wangwu',20,1.79);INSERT INTOT_Person(name, age, height)VALUES('zhaoliu0',20,1.77);INSERT INTOT_Person(name, age, height)VALUES('zhaoliu1',21,1.77);INSERT INTOT_Person(name, age, height)VALUES('zhaoliu2',26,1.87);
更新數(shù)據(jù)
格式:UPDATE 表名 SET 字段1 = 字段1的值, 字段2 = 字段2的值, … ;
/*
? DML更新數(shù)據(jù)
? UPDATE T_Person? ? ? ? --更新T_Person中的數(shù)據(jù)
? SET
? 字段名稱=字段的值;? ? ? ? --更新的字段名=字段值
? ...? ? ? ? ? ? ? ? ? ? --更多的字段
? WHERE? ? ? ? ? ? ? ? --設(shè)置更新條件
? 字段名稱=字段的值
? 注意:
? ? ? 1.如果不設(shè)置更新數(shù)據(jù)的條件,默認(rèn)會(huì)更新所有數(shù)據(jù)
*/UPDATE T_Person SET name ='wangwu', height =180WHERE id =3;
刪除數(shù)據(jù)
格式:DELETE FROM 表名
/*
? DML刪除數(shù)據(jù)
? DELETE FROM? ? T_Person? ? --刪除T_Person中的數(shù)據(jù)
? WHERE? ? ? ? ? ? --設(shè)置刪除數(shù)據(jù)的條件
? id=14? ? ? ? ? ? --表示刪除id=14的這條記錄
*/DELETE FROM T_Person WHEREid=6;
條件語句
如果只想 更新呀袱、 者刪 或 查詢 除某些固定的記錄,那就必須在SQL 語句 后面 加上一些條件
條件語句的常見格式
WHERE 字段 = 某個(gè)值 ; // 不能用兩個(gè) =
WHERE 字段 is 某個(gè)值 ; // is 相當(dāng)于 =
WHERE 字段 != 某個(gè)值 ;
WHERE 字段 is not 某個(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語言中的 ||
DQL - 數(shù)據(jù)查詢語句
查詢數(shù)據(jù)
格式:SELECT 字段1, 字段2, … FROM 表名;
-- 查詢指定字段-- 查詢所有字段-- 查詢 age <20的記錄的 name, age 字段-- 查詢 age <20的記錄的所有字段-- 查詢記錄總數(shù)-- 查詢 age <18的記錄總數(shù)-- 查詢最大 age-- 查詢最小 age-- 查詢所有記錄的所有字段,根據(jù) age 排序(默認(rèn)升序排序,ASC)-- 查詢所有記錄的所有字段,根據(jù) age 降序排序(DESC)-- 使用多個(gè)字段排序,先按age降序排序,當(dāng)age相同時(shí)再根據(jù)height降序排序-- 返回指定的記錄/*
? LIMIT 常用于分頁, 比如一頁顯示3條數(shù)據(jù)
*/-- 取出年齡最大的3條記錄-- 查詢時(shí)給字段取別名
/*
? ? SELECT? ? ? ? --查詢
? ? name,? ? --需要的字段
? ? age,? ? --需要的字段
? ? FROM 表名;? ? --從哪張表里查找
*/SELECT name, age FROM T_Person;-- 查詢 age <20的人名SELECT name FROM T_Person WHERE age <20;-- * 查詢所有的字段SELECT * FROM T_Person;-- 查詢 age >20記錄的所有字段SELECT * FROM T_Person WHERE age >20;-- 查詢記錄總數(shù)SELECTcount(*)FROM T_Person;-- 查詢age <18的記錄總數(shù)SELECTcount(*)FROM T_Person WHERE age < 18;-- 查詢最大的年齡SELECTMAX(age)FROM T_Person;-- 查詢最小的年齡SELECTMIN(age)FROM T_Person;-- ORDER BY age 根據(jù)age排序,默認(rèn)排序升序(ASC)SELECT * FROM T_Person ORDER BY age;-- 根據(jù)age降序排序(DESC)SELECT * FROM T_Person ORDER BY age DESC;-- 使用多個(gè)字段排序,先按age降序排序,當(dāng)age相同時(shí)再根據(jù)height降序排序SELECT * FROM T_Person ORDER BY age DESC, height DESC;-- LIMIT 返回指定的記錄數(shù)-- 前面的數(shù)值: 跳過的記錄條數(shù)-- 后面的數(shù)值: 返回的記錄條數(shù)SELECT * FROM T_Person LIMIT2,3;/*
? ? LIMIT 常用于分頁, 比如一頁顯示3條數(shù)據(jù)
? ? 第一頁: LIMIT 0, 3? ? --取最前面的3條數(shù)據(jù)
? ? 第二頁: LIMIT 3, 3? ? --跳過前面3條取3條數(shù)據(jù)
? ? 第三頁: LIMIT 6, 3? ? --跳過前面6條取3條數(shù)據(jù)
? ? 第n頁:? LIMIT (n - 1) * 3, 3
? ? 注意: LIMIT 0,3; 前面的數(shù)值為0時(shí),可以省略 0, LIMIT 3;
*/SELECT * FROM T_Person LIMIT0,3;SELECT * FROM T_Person LIMIT3,3;SELECT * FROM T_Person LIMIT6,3;SELECT * FROM T_Person LIMIT9,3;--LIMIT0,3; 前面的數(shù)值為0時(shí),可以省略0, LIMIT3;SELECT * FROM T_Person LIMIT3;/*
? ? 取出年齡最大的3條記錄
? ? ? ? 1.按年齡降序排序,年齡大的在前面
? ? ? ? 3.取出前3條記錄.
*/SELECT * FROM T_Person ORDER BY age DESC LIMIT3;
查詢時(shí)給字段取別名
/*
? 別名格式:
? 字段名 AS 別名. 可以省略 AS 關(guān)鍵字
*/SELECTid, name AS Stu_Name, height Stu_Height FROM T_Person LIMIT20;
排序
在 DQL 后面添加 ORDER BY 字段名
SELECT * FROM 表名 ORDER BY 字段名;
多個(gè)字段進(jìn)行排序
SELECT * FROM 表名 ORDER BY 字段名1, 字段名2;
ASC 表示 升序, DESC 表示 降序,默認(rèn) 升序
四郑叠、約束
簡(jiǎn)單約束
建表時(shí)可以給特定的字段設(shè)置一些約束條件夜赵,常見的約束有
NOT NULL :規(guī)定字段的值不能為null
UNIQUE :規(guī)定字段的值必須唯一
DEFAULT :指定字段的默認(rèn)值 (建議:盡量給字段設(shè)定嚴(yán)格的約束,以保證數(shù)據(jù)的規(guī)范性)
示例
CREATE TABLET_Person(id integer, name text NOTNULLUNIQUE, age integer NOTNULLDEFAULT1);// name 字段不能為 NULL乡革,并且唯一// age 字段不能為 NULL寇僧,并且默認(rèn)為1
主鍵約束
如果 T_Person 表中就 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)于人的身份證
外鍵約束
利用 外鍵約束 可以用來 建立表與表之間 的聯(lián)系
外鍵的一般情況是:一張表的某個(gè)字段,引用著另一張表的主鍵字段
新建一個(gè)外鍵
CREATE TABLE T_Student (id integer primary key autoincrement, name text, age integer, class_id integer, constraint fk_student_class foreign key (class_id) references t_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ù)的完整性)
示例
查詢 iOS08 班的所有學(xué)生SELECT s.name,s.age FROM t_student s, t_class cwheres.class_id = c.id AND c.name = ‘0316iOS’;
作者:劉鄧詔初
鏈接:http://www.reibang.com/p/51aec65a06df
來源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有视粮,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處细办。