sqlite3筆記

Sqlite3 test.db  — 創建數據庫
sqlite3 test.db .dump > test.sql  —  .dump 點命令來導出完整的數據庫在一個文本文件中

sqlite3 test.db < test.sql — 從生成的 test.sql 恢復

————————————————————————

所有的點命令只在 SQLite命令行中可用   sqlite_master 

————————————————————————

在命令行中打開一個已存在的數據庫
.open /Users/zhangzhennan/test.db

————————————————————————

列出所有數據庫中的表
.tables
SELECT tbl_name FROM sqlite_master WHERE type = 'table';

列出表信息
.schema wp_posts
select sql from sqlite_master where type='table' and tbl_name = 'wp_posts'  

————————————————————————

Insert 語句
import sqlite3;
connect = sqlite3.connect('/Users/xxx/test.db');
print('connection successful')
c = connect.cursor();
c.execute('''
INSERT INTO wp_posts (post_title,post_content)\
VALUES ('我是一個標題', '我是一段內容')
''')
c.close()
connect.commit()
connect.close()

————————————————————————

無法刪除列的變通方法 (使用一個表來填充另一個表)

ALTER TABLE wp_posts RENAME TO wp_posts_back;//先將表重命名 
CREATE TABLE wp_posts(
   id INTEGER PRIMARY KEY AUTOINCREMENT,
   post_title CHAR(150),
   post_content TEXT
); //重新創建表
INSERT INTO wp_posts (post_title, post_content) select post_title,post_content from wp_posts_back
//將舊錶的內容插入到新表中 
DROP TABLE wp_posts_back; //刪除舊錶

————————————————————————

Select 語句
sqlite> select * from wp_posts; 

Where 語句
sqlite> select * from wp_posts where id ==5;

Update 語句 
update wp_posts set post_title = '我要修改標題' where id in (9,11) // 修改 9 11
update wp_posts set post_title = '我要修改標題' where id between 9 and 11 // 修改9 10 11 

Like 語句
百分號(%)代表零個、一個或多個數字或字符。下劃線(_)代表一個單一的數字或字符
select * from wp_posts where post_title like '%標'; // 以標結尾
select * from wp_posts where post_title like '標%'; // 以標開頭
select * from wp_posts where post_title like ‘%標%’; // 有標的

glob 語句  與 LIKE 運算符不同的是,GLOB 是大小寫敏感  
星號(*)代表零個、一個或多個數字或字符。問號(?)代表一個單一的數字或字符

Limit 語句
sqlite> select * from wp_posts limit 4 offset 2; // 從第二行開始取4行數據 

Order by 語句 asc desc 
sqlite> select * from wp_posts order by id desc;  // 根據某列可以多列進行升降序排列   

group by  GROUP BY 子句放在 WHERE 子句之後(如果有的話),放在 ORDER BY 子句之前    
sqlite> select post_title,sum(post_content) from wp_posts group by post_title;
aa|11
bb|77
cc|99

having 語句 
WHERE 子句在所選列上設置條件,而 HAVING 子句則在由 GROUP BY 子句創建的分組上設置條件 
sqlite> select post_title,sum(post_content) from wp_posts group by post_title having post_title == 'bb';
bb|77   

Distinct 語句 去重複 
sqlite> select distinct post_title from wp_posts;
aa
bb
cc

————————————————————————

約束 
Not null、  default、 unique、 primary key 、check(約束確保某列中的所有值滿足一定條件)

CREATE TABLE wp_posts5(
   id INTEGER PRIMARY KEY AUTOINCREMENT,
   post_title CHAR(150) UNIQUE,
   post_content TEXT CHECK(LENGTH(post_content) > 0)  // post_content字符長度必須大於0
);

————————————————————————
Join 連接 cross join inner join outer join 

Cross join  返回被連接的兩個表所有數據行的笛卡爾積,返回到的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。 
比如a表有5條數據,b表有3條數據,那麼最後的結果有5*3=15條數據

sqlite> select * from wp_posts,wp_posts3; // 等同於下面sql
sqlite> select * from wp_posts cross join wp_posts3;

sqlite> select * from wp_posts 'wp1',wp_posts3 'wp3' where wp1.id = wp3.id; // 等同下面sql 
sqlite> select * from wp_posts cross join wp_posts3 where wp_posts.id = wp_posts3.id; 


Inner join 每個匹配對的列值會合併成一個結果行,在兩張表進行連接查詢時,只保留兩張表中完全匹配的結果集 join(默認inner join)
sqlite> select * from wp_posts 'wp1' join wp_posts3 'wp3' on wp1.id = wp3.id;
1|aa|11|1|我是一個標題|我是內容

如果兩張表的關聯字段名相同,也可以使用USING子句 
sqlite> select * from wp_posts 'wp1' join wp_posts3 'wp3' using (id); 

左外連接就是關聯的兩張或多張表中,根據關聯條件,顯示匹配的記錄,左表中有的記錄,但是右表中沒有匹配上的,以空(null)顯示。
LEFT OUTER JOIN也可以簡寫成LEFT JOIN,效果是一樣的 ,在兩張表進行連接查詢時,會返回左表所有的行,即使在右表中沒有匹配的記錄

sqlite> select * from wp_posts3 left join wp_posts on wp_posts3.id == wp_posts.id;
1|我是一個標題|我是內容|1|aa|11
7|我是一個標題2|我是內容2|||

Sqlite3 不支持 right join 、full join  

————————————————————————
Union 合併兩個或多個 SELECT 語句的結果,不返回任何重複的行
UNION ALL  不去重複
SELECT 被選擇的列數必須是相同

sqlite> select * from wp_posts3 union select * from wp_posts4;

————————————————————————
Null 、is not null  null和空白有區別的 


As 別名 可以省略as 

————————————————————————
Trigger 觸發器
BEFORE 或 AFTER 關鍵字決定何時執行觸發器動作
for each row 是操作語句每影響到一行的時候就觸發一次,也就是刪了 10 行就觸發 10 次,而 for each state 一條操作語句就觸發一次,有時沒有被影響的行也執行。sqlite 只實現了 for each row 的觸發

// 更新wp_posts4表中行的post_title則觸發觸發器
create trigger leyi after update of post_title on wp_posts4
begin
insert into wp_posts5 (post_title,post_content) values ('在wp_posts4中更新了一條數據','如題');
end;

// wp_posts4表中插入行時則觸發觸發器
create trigger hello after insert on wp_posts4
begin
insert into wp_posts5 (post_title, post_content) values ('hello', 'world');
end;

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章