SQLite简易入门
本文內容來源:https://www.dataquest.io/mission/129/introduction-to-sql
本文所用數據來源:https://github.com/fivethirtyeight/data/tree/master/college-names
摘要:主要簡介了SQLite的一些簡易操作(增刪改查)
原始數據展示(數據庫facts存儲了如下的這張表,主要字段描述:
code - 國家代碼,name - 國家名稱, area - 國土面積, created_at - 創建這個表的時間)
?
操作數據
?
查詢
#數據展示SELECT [columnA, columnB, ...]FROM tableName;#如: 查詢數據庫中code和name兩列的數據SELECT code, nameFROM facts;#條件查詢,使用where來界定查詢條件,如,查詢人口大于1億的國家代碼和名稱SELECT code, nameFROM factsWHERE population> 100000000;在where語句中可以使用的比較符號:
- 小于: <
- 小于或等于: <=
- 大于: >
- 大于或等于: >=
- 等于: =
- 不等于: !=
sqlite中可以直接對日期數據進行比較,譬如,查詢在2015-11-01 14:00之前創建的數據
SELECT * FROM facts WHERE created_at < "2015-11-01 14:00"注意:在雙引號中就是日期格式的數據,必須按照yyyy-mm-dd HH:MM:SS的格式
?
限定返回的數據數量
# 有時候只想查看返回數據的前幾條,使用limit, 如:查詢前五條數據
select * from facts limit 5;?
邏輯運算符
可以使用邏輯運算符and和or來組合多重查詢條件
SELECT [column1, column2,...] FROM [table1]WHERE [condition1] AND [condition2]#如,人口大于1億且國土面積大于100000的國家名稱select name from facts where population> 100000000 and area_land> 100000 limit 10;?
組合多個查詢條件
#如:查詢在人口過億的國家中,出生率大于20或者死亡率小于10的數據select namefrom factswhere (population >100000000) and (birth_rate > 20 or death_rate < 10);?
排序
通過order by語句來指定排序的列,asc是升序,desc是降序
SELECT [column1, column2,...] FROM [table1]WHERE [conditions]..ORDER BY column1 [ASC or DESC]# 按國家名稱降序排序select name from facts order by name desc limit 10;#多列排序,譬如,在一個存儲人名的表中,首先對姓排序,然后在同一個姓中再對名排序select [column1, column2..]from table_nameorder by column1 (asc or desc), column2 (asc or desc)?
查詢一張表的數據類型,sqlite中主要有以下的數據類型:
- INTEGER - 類似于python中的整型類型
- REAL - 類似于python中的浮點數類型
- FLOAT - 類似于python中的浮點數類型
- TEXT - 類似于python中的字符串類型
- VARCHAR(255) - 類似于python中的字符串類型
之所以同一個類型有不同的名字,是因為sqlite用來兼容其他數據庫所用的,查詢一張表的數據類型,使用pragma語句
PRAGMA table_info(tableName);#結果會返回一個列表(截取):[[0, "id", "INTEGER", 1, null, 1], [1, "code", "varchar(255)", 1, null, 0], [2, "name", "varchar(255)", 1, null, 0]]該列表的內容內容如下,pk = 1表明該字段是一個主鍵:
?
插入
往數據庫中插入數據,使用insert語句,注意日期數據必須符合格式:yyyy-mm-dd HH:MM:SS
INSERT INTO tableNameVALUES (value1, value2, ...);#例子:INSERT INTO factsVALUES (262, "dq", "DataquestLand", 60000, 40000, 20000, 500000, 100, 50, 10, 20, "2016-02-25 12:00:00", "2016-02-25 12:00:00");如果要插入的數據中有空值,就用NULL代替即可
?
更新
UPDATE tableNameSET column1=value1, column2=value2, ...WHERE column1=value3, column2=value4, ...# 例如,將United States改為DataquestLandupdate factsset name='DataquestLand'where name='United States';?
刪除
DELETE FROM tableNameWHERE column1=value1, column2=value2, ...;# 例如,將名為Canada的數據全部刪除delete from factswhere name='Canada';?
使用python和sqlite交互
sqlite數據庫并不需要開啟一個單獨的服務器進程,并且把所有的數據都存儲在硬盤上的一個文件中,從python2.5開始,sqlite就集成在了python語言中,所以不需要額外安裝庫來操作sqlite
?
連接數據庫
import sqlite3conn = sqlite3.connect(‘countries.db’) #使用connect()方法來連接數據庫,該參數指定數據庫的名稱?
python是通過cursor對象來操作sql語句的,cursor對象可以執行如下功能:
- 查詢數據庫
- 解析從數據庫返回的結果
- 將數據庫的返回結果轉化為python對象
- 將cursor的值保存為本地變量
注意:cursor對象把返回的結果保存到一個元組的列表中,如下
import sqlite3conn = sqlite3.connect("countries.db") # 連接數據庫cursor = conn.cursor() # 返回一個cursor對象query = 'select name from facts;' # 將查詢語句保存為字符串格式cursor.execute(query) # 執行查詢語句names = cursor.fetchall() # 保存全部的返回結果print(names[0:2]) # 顯示前兩個數據#結果:一個列表,列表中的每個元素是一個元組[('Afghanistan,), ('Albania',)]有時候可能需要逐條返回查詢結果,就是用fetchone(),需要一次返回n條結果,就是用fetchmany(n)。因為在cursor對象中會保存一個內部的計數器,在每次得到返回結果時都會增加計數器
# 上面的查詢語句等價于這樣import sqlite3conn = sqlite3.connect("countries.db") # 連接數據庫cursor = conn.cursor() # 返回一個cursor對象query = 'select name from facts;' # 將查詢語句保存為字符串格式cursor.execute(query) # 執行查詢語句names = cursor.fetchmany(2) # 保存前2條結果print(names)在某個進程連接著一個sqlite數據庫的時候,其他進程是不能訪問該數據庫的,所以在操作完數據庫之后需要關閉連接,注意,在關閉連接的時候,之前對數據庫的更改會自動保存并生效。
conn = sqlite3.connect("countries.db")conn.close()?
?
操作表結構
上面的內容都是對表中的數據進行操作,現在要對表的結構進行操作,譬如創建新表,增加一列等
增加列
# 往一張表中增加一個新列ALTER TABLE tableNAmeADD columnName dataType;# 例如,往該表中增加一列名為leader,且數據格式為textalter table facts add leader text;?
創建新表
CREATE TABLE dbName.tableName(column1 dataType1 PRIMARY KEY,column2 dataType2,column3 dataType3,...);# 例如,在數據庫factbook中創建一個新表用來保存國家領導人的信息CREATE TABLE factbook.leaders(id integer PRIMARY KEY, # 指定主鍵name text,country text);創建具有外鍵的表
CREATE TABLE factbook.leaders(id integer PRIMARY KEY,name text,country integer,worth float,FOREIGN KEY(country) REFERENCES facts(id) # 該外鍵指定要連接那個表);?
多表聯合查詢
SELECT [column1, column2, ...] from tableName1INNER JOIN tableName2 # 指定另一張表ON tableName1.column3 == tableName2.column4;# 譬如,查找兩張表中編號一致的數據SELECT * from landmarksINNER JOIN factsON landmarks.country == facts.id;# 除了INNER JOIN還有LEFT OUTER JOIN(左外連接)在上面的例子中,landmarks是在左邊的表,facts是在右邊的表,在執行JOIN的時候,會變成這樣
紅線左邊的就是landmarks表的值,右邊就是facts表的值,因為id和name兩個字段都重復了,所以右邊的表會加上后綴1
- INNER JOIN - 只展示符合查詢條件的值,在上圖中就是左邊的country值等于右邊id_1的值的那些行
- LEFT OUTER JOIN - 左表中有不匹配的數據時,在合并的表中的其他字段就顯示為NULL
關于JOIN,更多資料參考:http://www.yiibai.com/sqlite/sqlite_using_joins.html
轉載于:https://www.cnblogs.com/kylinlin/p/5251165.html
總結
以上是生活随笔為你收集整理的SQLite简易入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]玩转Asp.net MVC 的八
- 下一篇: 陈鑫136201010502