SQLite簡易入門

來源:互聯網
上載者:User

標籤:

本文內容來源: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

SQLite簡易入門

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.