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