《sqlite权威指南》读书笔记 (一)
?
一 常量
字符串常量 ? (使用單引號(hào)括住。如果常量中有單引號(hào),使用兩個(gè)單引號(hào)來表示。大小寫敏感)
數(shù)字常量
二進(jìn)制常量
?
二 關(guān)鍵字
關(guān)鍵字大小寫不敏感
?
三 注釋
單行注釋使用 --XXXXXXX
多行注釋使用/*XXXXXX*/
?
四 創(chuàng)建表
CREATE [TEMP | TEMPORARY] TABLE table_name (column_definitions [constraints,]);
?
五 修改表
ALTER TABLE table_name {RENAME TO new_table_name | ADD COLUMN?column_definitions};
?
六 關(guān)系操作
基本操作
Restriction (限制)
Projection (投影)
Cartesian Product (笛卡爾積)
Union (聯(lián)合)
Difference (差)
Rename (重命名)
附加操作
Intersection (交叉)
Natural Join (自然連接)
Assign (賦值)
擴(kuò)展操作
Generalized Projection (廣義投影)
Left Outer Join (左外連接)
Right?Outer Join?(右外連接)
Full?Outer Join?(全外連接)
?
七 LIKE 和 GLOB
SELECT ?column_name FROM table_name WHERE?column_name LIKE 'xxx';
?
LIKE 后跟的模式可以進(jìn)行字符串匹配。
%可以與任意0個(gè)或多個(gè)字符匹配。為貪婪匹配。大小寫不敏感。
'%x' 表示以x結(jié)尾
'x%' 表示以x開頭
'%x%' 表示包含x
_可以與任意一個(gè)字符匹配。
?
可以使用 NOT LIKE 'xxx'表示不包含某模式。
PS:'xx'表示一個(gè)模式,并不是只能與text類型的列進(jìn)行匹配,同樣可以與integer類型的列進(jìn)行匹配。
?
可以將LIKE改為GLOB,兩者用法十分類似,不過?GLOB大小寫敏感,且*和_來表示。
?
八 限定和排序
SELECT?column_name FROM?table_name? ORDER BY?column_name [ASC|DESC] LIMIT 1...9 OFFSET 1....9;
?
ORDER BY 表示排序。默認(rèn)為升序,加入desc表示降序。可以有多列,用逗號(hào)分開。第一字段重復(fù),則根據(jù)第二字段排序,以此類推。
?
LIMIT 后的數(shù)字表示,在排序結(jié)果中返回的行數(shù)。
OFFSET后的數(shù)字表示跳過的行數(shù)。例如:OFFSET 1 表示跳過一行,重第二行開始。
可以簡(jiǎn)略的寫作LIMIT 2,3 和LIMIT 3 OFFSET 2意思一樣。
?
九 函數(shù)和聚合
函數(shù):可以把 upper(column_name) 作為一列,執(zhí)行SELECT?upper(name)......可以將name列的所有行換為大寫。
聚合:理解做“對(duì)表中的每一行執(zhí)行某種操作”。? 執(zhí)行SELECT count(*) From table;可以返回table表中行的數(shù)量。
?
十 分組
“聚合的主要部分就是分組,也就是說,聚合不只是能夠計(jì)算整個(gè)結(jié)果集的聚合值,還可以把結(jié)果集分成多個(gè)組,然后計(jì)算每個(gè)組的聚合值?!?/p>
?
select type_id,name from foods group by type_id;
這一句,會(huì)根據(jù)type_id進(jìn)行分組,name返回該組的最后一條。
select type_id,count(*) from foods group by type_id;
這一句,依然是根據(jù)type_id進(jìn)行分組,count(*) 則是對(duì)改組進(jìn)行聚合求職。
?
十一 去掉重復(fù)
SELECT DISTINCT?column_name FROM?table_name;
該句先得到所有,再進(jìn)行刪除操作
?
十二 多表連接
內(nèi)連接例句:
SELECT * FROM foods INNER JOIN food_types ON?foods.id == food_types.id;
交叉連接例句:
SELECT * FROM foods,food_types;
左連接例句:
SELECT * FROM foods LEFT OUTER JOIN food_types ON?foods.id == food_types.id;
應(yīng)該避免使用隱式連接,雖然可以簡(jiǎn)潔的實(shí)現(xiàn)。
標(biāo)準(zhǔn)形式:
select heading from left_table join_type right_table on join_condition;
?
插入紀(jì)錄
INSERT INTO table_name (column_list) VALUES (value_list);
?
插入一行例句
INSERT INTO foods (name, type_id) VALUES ('Cinnamon Bobka',1);
column_list 中可以包含主鍵字段,但要保證插入的主鍵字段的唯一性,否則會(huì)報(bào)“PRIMARY KEY must be unique”
last_insert_rowid();函數(shù)返回最后一個(gè)增長(zhǎng)值。
插入一組行例句
INSERT INTO foods
SELECT NULL, type_id, name FROM foods where name = 'Choco';
插入多行例句
CREATE TABLE foods2 AS SELECT * FROM FOODS;
?
更新數(shù)據(jù)
UPDATE table_name SET update_list WHERE predicate;
例如:
update foods set name = 'apple',food_types = 3 where name =='banana';
?
刪除數(shù)據(jù)
DELETE FROM table_name WHERE?predicate;
例如:
delete from foods where id > 500;
?
數(shù)據(jù)完整性
域完整性 實(shí)體完整性 引用完整性 用戶定義完整性
?
實(shí)體完整性?
主鍵由至少帶有unique約束的一個(gè)或一組字段組成。
唯一性約束 -- unique
主鍵
如果未定義,則系統(tǒng)自動(dòng)定義。為64bit的整形字段,名為rowid,也叫做_rowid,oid。sqlite為主鍵字段提供自增長(zhǎng)性質(zhì)。如果定義字段類型為 integer primary key,sqlite將為該字段創(chuàng)建默認(rèn)值,并確保其唯一性。實(shí)際上,該字段就是rowid的別名。最大值為2的64次方,當(dāng)達(dá)到最大值時(shí),會(huì)搜索未使用的值。所以,新創(chuàng)建的rowid并不總是遞增的。
autoincrement 會(huì)組織sqlite回收主鍵,并在達(dá)到最大值時(shí)停止。
主鍵即使不使用整型值,系統(tǒng)也會(huì)在內(nèi)部維護(hù)一個(gè)rowid字段。
例如:
sqlite> create table pkey(x text, y text, primary key(x,y));
sqlite> insert into pkey values('x','y');
sqlite> insert into pkey values('x','x');
sqlite> select rowid, x, y from pkey;
rowid|x|y
1|x|y
2|x|x
?
域完整性
默認(rèn)值(default)
如果用insert語句插入記錄時(shí)沒有為該字段制定值,關(guān)鍵字default將為字段提供一個(gè)默認(rèn)值。
是處理非null的一種策略。
格式為 default 值
例如 name not null default NUKNOW 插入語句為指定name字段的值時(shí),會(huì)自動(dòng)用‘NUKNOW’當(dāng)做name的值。
另外,default 接受三種預(yù)定義的保留字,為 current_time,current_data,curremt_timestamp
?
NOT NULL 約束
遇見null值會(huì)報(bào)錯(cuò)。
?
check 約束
可以定義表達(dá)式來判斷值,例如: check(old > 0) 表示年齡必須大于0,插入-1歲會(huì)報(bào)錯(cuò)。
?
外鍵約束
語法如下
create table table_name
( column_definition?references foreign_table (column_name)
? on {delete | update} integrity_action
? [not]?deferrable [initially {deferred|immediate},]
);
?
排序規(guī)則
關(guān)鍵字為:collate
collate nocase 大小寫不敏感 a==A
?
儲(chǔ)存類
sqlite有5個(gè)原始的數(shù)據(jù)類型,被稱作儲(chǔ)存類。
integer 整數(shù) ? ? ? ? ? ? ? ? ? 沒有小數(shù)點(diǎn)被指派為該值。
real 實(shí)數(shù) ? ? ? ? ? ? ? ? ? ? ? ?有小數(shù)點(diǎn)。。。。
text 文本 ? ? ? ? ? ? ? ? ? ? ? ? 有引號(hào)括住。。。。
blob 二進(jìn)制大對(duì)象 ? ? ? ? x‘a(chǎn)bcd’。。。。
NULL 表示沒有值 ? ? ? ? ?用NULL說明的值。。。
typeof()返回值的類型。
一個(gè)字段可以有不同的數(shù)據(jù)類型
排序規(guī)則如下
blob > text > integer real (通過值的大小排序) > NULL
?
視圖
下面是一篇關(guān)于視圖的介紹性文章
視圖的介紹
定義視圖語法如下:
create view name as select-stmt;
刪除視圖的語法如下:
drop view name;
?
索引
創(chuàng)建索引語法:?
create index [unique] index_name on table_name(columns);
刪除索引:
drop index index_name;
索引的排序規(guī)則
創(chuàng)建語法:
create index foods_name_idx on foods (name?collate nocase);
?
觸發(fā)器
語法:
create [temp|temporary] trigger name
[before|after] [insert|delete|update|update of columns] on table
action
可以使用觸發(fā)器在sqlite中實(shí)現(xiàn)可更新的視圖
?
事務(wù)
事務(wù)由3個(gè)命令控制 :begin ?commit ?rollback
begin 開始一個(gè)事務(wù),連接結(jié)束前,未發(fā)出commit,則全部命令撤銷,rollback還原begin之后的所有操作。
savepoint xxx 保存一個(gè)位置,rollback to xxx,返回到某位置
?
數(shù)據(jù)庫(kù)鎖
sqlite有五種不同的鎖狀態(tài) :未加鎖 共享 預(yù)留 未決 排他
?
事務(wù)類型
sqlite有三種不同的失誤類型,為了避免死鎖,因?yàn)閟qlite一個(gè)時(shí)刻允許多個(gè)連接讀取數(shù)據(jù),卻只允許一個(gè)連接寫數(shù)據(jù)。
begin[deferred | immediate | exclusive] transaction;
基本準(zhǔn)則:如果使用的數(shù)據(jù)庫(kù)沒有其他連接,用begin就夠了,但數(shù)據(jù)庫(kù)如果有其他會(huì)對(duì)數(shù)據(jù)庫(kù)執(zhí)行寫操作的連接,就應(yīng)該使用begin?immediate或 begin?exclusive
?
數(shù)據(jù)庫(kù)管理
附加數(shù)據(jù)庫(kù)
attach [database] filename as database_name;
分離數(shù)據(jù)庫(kù)
detach [database] database_name;
轉(zhuǎn)載于:https://www.cnblogs.com/bigben0123/p/4157906.html
總結(jié)
以上是生活随笔為你收集整理的《sqlite权威指南》读书笔记 (一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于百度音乐盒
- 下一篇: discuz uc密码修改