SQlite學習筆記

SQlite介紹
 
  SQLite是一款開源,輕量級,嵌入式關係型數據庫。是一個學習關係型數據庫的很好的工具。SQLite除了作爲一個存儲容器外,還可以作爲一個單純的數據處理的工具。使用SQLite可以很容易地將應用程序所使用的數據結構轉化爲表,並保存在一個內在數據庫中。通過sql語句操作數據庫中的數據,可以完成很繁重的任務而不必寫自己的算法來對數據結構進行操作和排序

從哪得到SQLite
SQLite 網站(www.sqlite.org)同時提供SQLite的已編譯版本和源程序。用戶可根據不同的操作系統平臺Linux,Mac OS X,Windows,Windows Phone8,Windows Runtime選擇相應的SQLite已編譯版本.比如windows平臺下可下載sqlite-shell-win32-x86-3080100.zip SQLite命令行程序(CLP)。SQLite無需安裝配置。解壓後,通過DOS shell進入工作目錄,在命令行上鍵入sqlite3命令即進入SQLite shell.然後就可以執行數據庫創建,查詢等命令了。

SQLite特殊命令

SQLiteshell將用戶輸入的任何語句都看成是一個查詢命令(query),除非命令是以點(.)開始,以點(.)開始的命令用於特殊操作。鍵入.help或.h 可以得到這些命令的完整列表。鍵入.exit 或.e 退出SQLite shell。

1 與查看數據庫對象相關的命令
.tables ?TABLE? 列出所有的表名,如果指定TABLE只列出符合模式表達式的表的表名.
.indices ?TABLE? 列出所有的索引名.如果指定TABLE只列出符合模式表達式的表的索引.
.schema ?TABLE? 列出所有表的創建語句,如果指定TABLE只列出符合模式表達式的表的創建語句.

2 與數據庫備份相關的命令
.backup ?DB? FILE 以指定的文件名備份數據。 如不指定db 則備份當前打開的數據庫.
.dump ?TABLE? 以sql文本格式導出數據庫所有的表,如果指定TABLE只導出符合模式表達式的表.
.read Filename 執行文件中的sql語句.
.import Filename tab 將文件中的數據導入到指定的表

3 與格式控制相關命令
.show 顯示當前各種設置的值
.echo ON|OFF 打開或關閉回顯
.header ON|OFF  是否顯示錶頭
.output Filaname 將輸出重定向到指定的文件
.output stdout   將輸出重定向的屏幕
.nullvalue string 當遇到NULL 值時,使用此處指定的字符串來替代
.prompt value 替換掉sqlite shell 標準的提示符
.separaor string 改變由.mode和.import命令所使用的分隔符,.separator 指定的字符串只對.mode list有效
.width num1 num2 .. 設置列寬,當.mode 設置爲column時.
.mode  MODE 設置輸出模式 ,MODE只能爲下面的值。默認爲list格式
     csv  comma-separated values 值之間用逗號作爲分隔符
     column 列左對齊
     html
     insert  sql插入語句的格式
     line   每個值一行的格式
     list    以.separator指定的字符串作爲值之間的分隔符. (默認格式)
     tabs   以tab作爲分隔符
     tcl
其它命令
.print string 原義打印字符串

SQL語言
sql(Structured QueryLanguage)是一種數據庫查詢語言,是訪問關係型數據庫的唯一方法,通過sql語言來操作關係型數據庫.
sql與SQLite關係:
如上所說sql是一種操作關係型數據庫的語言,而SQLite則是衆多關係型數據庫中的一種,所以SQLite數據庫也支持使用sql語言來控制數據庫的增刪改查等等.

sql語法

和C語言類似,sql語句必須以分號(;)結尾

1 常量
常量也稱字面值(literal),sql中常量分爲字符串常量、數據常量和二進制常量.

字符串常量:和C語言不同的是,sql字符串常量爲使用單引號擴起來的字符序列.比如'Jerry'.,如果字符串中本身包含單引號,需要雙寫。如“Kenny’schicken”需要寫成:'Kenny''s chicken'

數字常量有整數、十進制數和科學記數法表示的數,如:-1, 3.142, 6.0221415E23.

二進制值用如x'0000'的表示法,其中每個數據是一個16 進制數。二進制值必須由兩個兩個
的16 進制數(8 bits)組成,如:x'01', X'0fff', x'0F0EFF', X'0f0effab'.

關鍵字:和其它編程語言類似,具有特殊含義的單詞稱爲關鍵字,比如select,create,insert,updata,drop等
標識符:數據庫裏的具體對象,如表名或索引名,字段名.
sql不區分大小寫.

2 註釋
單行註釋:以雙減號開始(--).比如:
--創建test表
create table test (id integer primary key,name text );
多行註釋:,多行註釋採用C 風格的形式

3 sql常用語句
數據庫中所有的工作都圍繞表進行。表由若干行和若干列組成,行也被稱爲記錄,列也被稱爲字段.在SQL中,創建和刪除數據庫對象的語句一般被稱爲數據定義語言(data definitionlanguage,DDL),操作這些對象中數據的語句稱爲數據操作語言(data manipulationlanguage,DML)。

1 創建表
創建表的一般格式爲:
CREATE [[TEMP|TEMPORARY] TABLE table_name (column_definitions [,constraints]);

中括號表示可選項
豎線表示在多箇中選一
{}包含一個選項列表,表示必須從中選擇一個

TEMP:聲明創建的表爲臨時表,只存活於當前會話,一旦連接斷開,就會被自動刪除。
table_name:表示表名.
column_definitions:表示一個用逗號分隔的列定義(也稱字段列表),每個字段包括一個字段名、字段類型和字段約束如有多個約束,約束間使用空格分隔.
[, constraints]:表級約束.例如,你可以用UNIQUE約束來規定所有記錄中某個字段的值要各不相同

如下所示爲一個創建表的語句:
CREATE TABLE contacts ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE,
phone TEXT NOT NULL DEFAULT 'UNKNOWN',
UNIQUE (name,phone) );
創建了一個名爲contacts的表,該表包含三個字段,分別爲:
id字段 integer類型 字段約束爲PRIMARY KEY. (表示該字段爲關鍵Key)
name字段 text類型 字段約束爲not null,COLLATE 和NOCASE. (表示該字段值不允許空, 不區分大小寫)
phone字段 text類型 字段約束爲NOT NULL, DEFAULT 'UNKNOWN'(表示該字段值不允許空 默認值爲unknow)
表級約束爲UNIQUE(name,phone)表示(name和phone的組合是唯一的,即允許同名的聯繫人,但不允許同名又同電話號碼的聯繫人).


2 改變表
改變表的一般格式爲:
ALTER TABLE table_name { RENAME TO name | ADD COLUMN column_def}

{}:花括號包含一個選項列表,表示必須從中選擇一個,此處表示你必選使用
alter table table_name rename to name 或
alter table table_name add column column_def語句.

列如:
ALTER TABLE contacts
ADD COLUMN email TEXT NOT NULL DEFAULT '' COLLATE NOCASE;
爲contacts表增加email列

此時使用.schema contacts查詢表contacts的創建語句變爲:
CREATE TABLE contacts ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE,
phone TEXT NOT NULL DEFAULT 'UNKNOWN',
email TEXT NOT NULL DEFAULT '' COLLATE NOCASE,
UNIQUE (name,phone) );
顯然emai字段已被添加進去.

3 select語句(查詢表)
select語句是sql中最最複雜的語句,是sql精華所在.從語法上說,select語句由一系列字句組成,每個字句完成一種特定的操作.select語句中除select字句外,其餘所有的字句都是可選的.

在學習select語句前先了解一下sql的操作符:
我們都知道運算符以一個或多個值作爲輸入,產生一個新的值作爲輸出。sql中值的形式可以是是常量,變量(主要是表的字段名),表達式,或函數返回值.同時sql的支持的運算符如下:
算術運算符 +,-,*,/,%
關係運算符<,<=,>,>=,=,==,<>,!=,like,glob
邏輯運算符 and,or,not,in
位運算符 |,&
其中LIKE運算符含義與相等符(=)很像,只是like運算符支持通配符,百分比(%)匹配任意個字符,下劃線(_)匹配單個字符串.glob和like類似,只是用來匹配文件名.
in 操作符用來判斷 某個值是否在集合當中 比如 2 in (1,2,3) 返回 true(1)


select語句的一般格式:
SELECT DISTINCT heading FROM tables WHERE predicate
GROUP BY columns HAVING predicate
ORDER BY columns LIMIT count,offset;
下圖爲select語句執行過程的流程圖:


在數據庫中表也被稱爲關係(Relation),select語句執行過程介紹:
如果所示:select語句首先從from字句開始執行,from字句接受一個或多個表(表也稱爲關係)作爲輸入,通過對輸入的表執行鏈接操作,形成一個稱爲R1的新表(關係),接着where字句以R1作爲輸入,對R1中的行(也稱記錄)根據指定的條件就行過濾,過濾掉不符合要求的記錄後形成新的稱爲R2的表,接着group子句以R2作爲輸入,根據指定條件見R2劃分成若干組,從而形成一個被稱爲R3的表,接着having字句以R3作爲輸入(having子句和where子句功能類似,用來過濾R3中的組)having子句對組進行過濾後形成新的被稱爲R4的表,select子句以R4作爲輸入,heading用來過濾R4中的某些列形成一個被稱爲R5的新的表,DISTINCT用來去掉R5中重複的行(記錄)後形成新的稱爲R6的表(關係),接着order子句以R6爲輸入,對R5進行排序後形成新的被稱爲R7的表(關係),最後limit子句以R7爲輸入對最終輸出結果的範圍和大小進行限定.

from子句
from子句的參數是由逗號分隔的一個或多個表。from子句通過鏈接將輸入的一個或多個表組合成新的關係R1.R1是最初的關係,所有後續操作都是在R1的基礎上完成的。

where 子句:
where子句用來過濾R1中的行,其參數一般爲一個表達式,表達式定義選行標準,決定了那些行會被過濾掉,那些行會被選入到新的關係R2中。
where expression

group by子句:
group by子句接受where子句的輸出R2作爲輸入,根據某個字段(或多個字段)上的值是否相等將所有記錄分成若干小組.

having 子句:
having子句功能和where子句類似,只是having子句用來過濾的是由group by子句產生的組.

select子句:
select子句用來過濾列,其參數爲一系列以逗號分隔的字段
select [DISTINCT] column1 [,column2 ]

order by子句
用來對輸出的結果進行排序,其參數和select子句很像,都是以逗號分隔的字段,每個字段可指定排序方式爲升序還是降序:
order by column1 asc | desc [, column2 asc | desc];
asc表示升序,desc表示降序.column1表示首先根據column1進行排序,如多個記錄在column1字段相同再根據column2進行排序.

limit子句:
limit子句用來指定輸出結果中記錄的最大數量和偏移量.
limit子句一般格式爲:
{limit max_record | limit max_record offset off | limitoff,max_record}.
select * from station limit 5 offset 1;
表示最多輸出車站表中的5行記錄,從偏移量1開始輸出.該條語句也可省略offset寫成如下形式
select * from station limit 1,5; 注意省略offset後前面數組爲偏移量,後面數組爲大小。

SQLite內置函數
SQLite 提供了多種內置的函數,可以用在各子句中,關於SQLite內置函數的信息參見
SQLite內置函數


多表連接

1 內連接
內連接就是通過兩個字段進行連接,連接過程的實質就是對於第一個表中的每一行,都要遍歷第二個表中的所有行,尋找那些連接字段具有相同值得行,再將他們包含到新的關係中去.

2 交叉連接
如果兩個表沒有通過任何方式關聯,select語句就會產生一種更基礎的連接(也是最根本的),稱爲交叉連接,笛卡爾積或交叉乘積.交叉連接是強制的幾乎無意義的連接,即第一個表中的所有行和第二個表中所有的行聯合起來。交叉連接後形成的新的關係記錄總數等於第一個表記錄數乘以第二個表記錄數.

3 外連接
內連接根據根據給定的連接條件選擇表中的行,外連接則是選擇內連接的所有行外加一些關係外的行。外連接分爲左外連接,右外連接,全外連接。左外連接操作sql語句中的左表,例如:
select * from foods left outer join foods_episodes on foods.id =foods_episodes.food_id;
進行左外連接時,左表中所有匹配的行會被包含到結果集中,不匹配的行也會被包含的結果集中。
右連接的含義和左連接類似.不管是否匹配右表中的行都會包含到結果集中去.全連接則是左右外連接的合集,它包含全部匹配的行,然後是左表和右表中不匹配的行。
SQLite目前只支持左外連接。但右外連接可以通過左外連接實現。

4自然連接
自然連接的實質其實就是內連接的另一種方式。只是語法和習慣上做了些改動。自然連接通過表中共有的字段名稱將兩個表連接起來。其連接條件就是兩個表中共有的字段。故自然連接無需連接條件。但要求兩個表必須包含共有的字段。

多表連接的語法;
1 通過where子句隱含實現內連接
   比如:select * from foods,food_type where foods.id = food_type.food_id;
  當列出數據庫的多個表時,默認會做連接操作,最低限度會做交叉連接,本例中的where是內連接.這種隱式形式雖然很簡潔,但實際上是一種應該避免的過時語法形式。
2 通過使用連接關鍵字顯式指定連接方式.
 其一般形式爲:
 from left_table join_type right_table onjoin_condition

 left_table:左表,right_table:右表
 join_type:連接類型,可以是:inner join, left outer join,right outer join, full outer join,crossjoin分別代表內連接,左外連接,右外連接,全連接,交叉連接.SQLite只支持inner join和left outer join,cross join.

名稱和別名:
別名就是對錶進行重命名,其一般語法格式:
base-name [as] alias
其中as關鍵字是可選的,但很多人傾向保留as關鍵字,這樣是別名顯得更清晰。
別名的用途主要有兩個:一是實現了表的自我連接,二是select語句中執行過程中產生的新的關係命名(比如對子查詢的結果命名後)。

子查詢:
所謂子查詢就是select語句中又嵌套了select語句.子查詢主要用於where子句,和from子句當中.

複合查詢
複合查詢使用三種特殊的關係操作符(聯合,交叉連接,差集)處理多個查詢的結果.
複合查詢操作有如下要求:
1 涉及的關係的字段數目必須相同
2 只能有一個order by子句,且該order by子句放在複合查詢的最末尾,對聯合結果進行排序

1 union(聯合)操作:
輸入兩個關係A和B,將兩者合併成一個只包含A和B中非重複數據的單一關係。
如下sql語句用來找出食物表中頻率最高和頻率最低的食品。
select f.*, top_foods.count from foods f
inner join
  (select food_id, count(food_id) as count fromfoods_episodes
    group by food_id
    order by count(food_id) desc limit 1) top_foods
  on f.id=top_foods.food_id
union
select f.*, bottom_foods.count from foods f
inner join
  (select food_id, count(food_id) as count fromfoods_episodes
    group by food_id
    order by count(food_id) limit 1) bottom_foods
  on f.id=bottom_foods.food_id
order by top_foods.count desc;


2 intersect(交叉)操作:intersect操作輸入兩個關係,選擇那些既在A也在B的行


3 except(差集)操作:except操作輸入兩個關係,選擇那些在A但不在B的行.



4 修改數據
1 插入記錄
使用insert語句插入記錄,其一般格式爲:
insert into table_name (column_list) values (values_list)
table_name:表名
column_list:以逗號分隔的字段列表.
values_list:以逗號分隔的值列表.
如果insert語句爲所有的字段都提供了值,可以省略字段列表.

2 更新記錄
使用update語句更新表中的記錄,該語句可以修改表中的一行或多行一個或多個字段。其一般格式爲:
update table_name set update_list where predicate
update_list:以逗號分隔的字段賦值列表,字段賦值的格式爲:column_name=value
where:where子句.

3 刪除記錄:
使用delete語句刪除表中的記錄,delete語句的一般格式爲;
delete from table_name where predicate
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章