1. 程式人生 > >淺析Linux中SQL及其用法

淺析Linux中SQL及其用法

 嵌入式資料庫介紹

隨著電子技術的飛速發展,嵌入式系統中的儲存器容量和效能也在迅速提高,這為擴大嵌入式的應用領域提供了必要的物理基礎。展望未來,嵌入式系統正在向網路化、智慧化等高階應用方向發展。在這個發展過程中,嵌入式系統內的資料量會急劇膨脹。因此,嵌入式資料庫的作用將會變得越來越重要。

由於嵌入式平臺和應用領域的多樣化,所以嵌入式資料庫的體系結構與執行模式和企業級資料庫有很大的區別。嵌入式資料庫的主要特性如下:

(1)嵌入性

嵌入性是嵌入式資料庫的根本特性。嵌入式資料庫不但可以嵌入到各種軟體中,也能嵌入到硬體中。

(2)可移植性

可移植性是嵌入性的基本保證。嵌入式資料庫必須能夠支援各種硬體平臺。

(3)實時性

在嵌入式領域,實時性是一個重要的指標。所以嵌入式資料庫也需要具有較高的實時效能。

(4)伸縮性

伸縮性使嵌入式資料庫能夠滿足各種應用需要,提高嵌入式系統的效能。

(5)可移動性

隨著嵌入式系統的網路化發展,可移動性也正變得越來越重要。所以嵌入式資料庫需要滿足可移動性的要求。

為了更好的滿足嵌入式應用的需求,嵌入式資料庫本身需要具有企業級資料庫的基本功能(比如一致性、安全性等)。此外,嵌入式資料庫也必須提供一套完整的SQL介面,以滿足應用開發的需要。

總而言之,嵌入式資料庫的應用環境是非常苛刻的。嵌入式資料庫需要在滿足應用要求的前提下保證高效的執行效能。

根據應用方式的不同,嵌入式資料庫可以大致分為以下幾類:

(1)C/S嵌入式資料庫

   C/S嵌入式資料庫可以看成是企業級資料庫的一個精簡版,一般運用在對實時性要求不高的系統中。

(2)面向軟體嵌入式資料庫

    面向軟體嵌入式資料庫以元件的形式嵌入到軟體中,一般運用在對執行速度和安全性要求較高的系統中。

(3)面向硬體嵌入式資料庫

面向硬體嵌入式資料庫直接嵌入到硬體裝置中,一般運用在對實時性和穩定性要求較高的系統中。

(4)記憶體嵌入式資料庫

    記憶體嵌入式資料庫直接執行在記憶體中,所以執行效能非常高。但資料無法永久儲存。

2. SQLite介紹

SQLite是一款輕量級的開源嵌入式資料庫,由D.Richard Hipp在2000年釋出。SQLite使用方便,效能出眾,廣泛應用於消費電子、醫療、工業控制、軍事等各種領域。SQLite主要具有以下特點:

l  效能:SQLite對資料庫的訪問效能很高,其執行速度比Mysql、PostgreSQL等開源數

據庫要快很多。

l  體積:SQLite的體積非常小巧,最低只需要幾百K的記憶體就可以執行。

l  可移植性:SQLite的能支援各種32位和64位體系的硬體平臺,也能在Windows、Linux、

BSD、Mac OS、Solaries等軟體平臺中執行。

l  穩定性:SQLite支援事務的ACID特性,既原子性、一致性、隔離性、永續性

l  SQL支援:SQLite支援ANSI SQL92中的大多數標準,提供了對子查詢、檢視、觸發

器等機制的支援。

l  介面:SQLite為C、Java、PHP、Python、Tcl等多種語言提供了API介面。

SQLite總體採用了模組化設計

(1)介面。介面由SQLite C API函式組成。所有的應用程式都必須通過介面訪問SQLite資料庫。

(2)編譯器。編譯器由詞法分析、語法分析和中間程式碼生成三個模組組成。其中,詞法分析模組和語法分析模組負責檢查SQL語句的語法,然後把生成的語法樹傳遞給中間程式碼生成模組。中間程式碼生成模組負責生成SQLite引擎可以識別的中間程式碼。

(3)資料庫引擎。資料庫引擎是SQLite的核心,負責執行中間程式碼,指揮資料庫的具體操作。

(4)後臺。後臺由B樹、頁快取和系統呼叫三個模組組成。其中,B樹負責維護索引,頁快取負責頁面資料的傳送,系統呼叫負責和作業系統互動,最終實現資料庫的訪問。

11.2 SQLite3的使用

11.2.1 SQLite3的命令

解壓縮後進入sqlite-3.6.12的根目錄,首先命令“./configure”生成Makefile檔案,接著執行命令“make”對原始碼進行編譯,最後執行命令“make install”安裝SQLite3。安裝完畢後,可以執行命令sqlite3檢視SQLite3是否能正常執行,如下所示:

[[email protected] ~]#sqlite3

SQLite version 3.6.12

Enter".help" for instructions

Enter SQLstatements terminated with a ";"

sqlite>

可以看到,SQLite3啟動後會停留在提示符sqlite>處,等待使用者輸入SQL語句。

在使用SQLite3前需要先了解下SQLite3支援的資料型別。SQLite3支援的基本資料型別主要有以下幾類:

l  NULL

l  NUMERIC

l  INTEGER

l  REAL

l  TEXT

SQLite3會自動把其他資料型別轉換成以上5類基本資料型別,轉換規則如下所示:

l  char、clob、test、varchar—> TEXT

l  integer—>INTEGER

l  real、double、float—> REAL

l  blob—>NULL

l  其餘資料型別都轉變成NUMERIC

下面通過一個例項來演示SQLite3的使用方法。

(1)      新建一個數據庫

新建資料庫test.db(使用.db字尾是為了標識資料庫檔案)。在test.db中新建一個表test_table,該表具有name,、sex、age三列。SQLite3的具體操作如下所示:

[[email protected]]# sqlite3 test.db

SQLite version 3.6.12

Enter".help" for instructions

Enter SQLstatements terminated with a ";"

sqlite>create table test_table(name, sex, age);

如果資料庫test.db已經存在,則命令“sqlite3 test.db”會在當前目錄下開啟test.db。如果資料庫test.db不存在,則命令“sqlite3 test.db”會在當前目錄下新建資料庫test.db。為了提高效率,SQLite3並不會馬上建立test.db,而是等到第一個表建立完成後才會在物理上建立資料庫。

由於SQLite3能根據插入資料的實際型別動態改變列的型別,所以在create語句中並不要求給出列的型別。

(2)      建立索引

為了加快表的查詢速度,往往在主鍵上新增索引。如下所示的是在name列上新增索引的過程。

sqlite>create index test_index on test_table(name);

(3)      操作資料

如下所示的是在test_table中進行資料的插入、更新、刪除操作:

sqlite>insert into test_table values ('xiaoming', 'male', 20);

sqlite>insert into test_table values ('xiaohong', 'female', 18);

sqlite>select * from test_table;

xiaoming|male|20

xiaohong|female|18

sqlite>update test_table set age=19 where name = 'xiaohong';

sqlite>select * from test_table;

xiaoming|male|20

xiaohong|female|19

sqlite>delete from test_table where name = 'xiaoming';

sqlite>select * from test_table;

xiaohong|female|19

(4)      批量操作資料庫

如下所示的是在test_table中連續插入兩條記錄:

sqlite> begin;

sqlite>insert into test_table values ('xiaoxue', 'female', 18);

sqlite>insert into test_table values ('xiaoliu', 'male', 20);

sqlite> commit;

sqlite>select * from test_table;

xiaohong|female|19

xiaoxue|male|18

xiaoliu|male|20

執行命令commit後,才會把插入的資料寫入資料庫中。

(5)      資料庫的匯入匯出

如下所示的是把test.db匯出到sql檔案中:

[[email protected]]# sqlite3 test.db ".dump" > test.sql;

test.sql檔案的內容如下所示:

BEGINTRANSACTION;

CREATE TABLEtest_table(name, sex, age);

INSERT INTO"test_table" VALUES('xiaohong','female',19);

CREATE INDEXtest_index on test_table(name);

COMMIT;

如下所示的是匯入test.sql檔案(匯入前刪除原有的test.db):

[[email protected]]# sqlite3 test.db < test.sql;

通過對test.sql檔案的匯入匯出,可以實現資料庫檔案的備份。

11.2.2 SQLite3的C介面

以上介紹的是SQLite3資料庫的命令操作方式。在實際使用中,一般都是應用程式需要對資料庫進行訪問。為此,SQLite3提供了各種程式語言的使用介面(本書介紹C語言介面)。SQLite3具有幾十個C介面,下面介紹一些常用的C介面。

l  sqlite_open

作用:開啟SQLite3資料庫

原型:int sqlite3_open(const char *dbname, sqlite3 **db)

引數:

dbname:資料庫的名稱;

db:資料庫的控制代碼;

返回值:返回值的具體含義如表11-1所示:

表11-1

返回值

識別符號

含義

0

SQLITE_OK

操作成功

1

SQLITE_ERROR

操作失敗

2

SQLITE_INTERNAL

內部邏輯錯誤

3

SQLITE_PERM

訪問許可權錯誤

4

SQLITE_ABORT

操作異常

5

SQLITE_BUSY

資料庫被鎖定

6

SQLITE_LOCKED

表被鎖定

7

SQLITE_NOMEM

記憶體申請失敗

8

SQLITE_READONLY

寫只讀資料庫

9

SQLITE_INTERRUPT

內部中斷

10

SQLITE_IOERR

I/O錯誤

11

SQLITE_CORRUPT

資料庫映象格式錯誤

12

SQLITE_NOTFOUND

找不到檔案或資料

13

SQLITE_FULL

資料庫已滿

14

SQLITE_CANTOPEN

無法開啟資料庫檔案

15

SQLITE_PROTOCOL

鎖協議出錯

16

SQLITE_EMPTY

表為空

17

SQLITE_SCHEMA

資料庫體系發生改變

18

SQLITE_TOOBIG

記錄資料溢位

19

SQLITE_CONSTRAINT

違反約束產生異常

20

SQLITE_MISMATCH

資料型別不匹配

21

SQLITE_MISUSE

資料庫使用不正確

22

SQLITE_NOLFS

系統不支援

23

SQLITE_AUTH

未獲授權

100

SQLITE_ROW

sqlite_step()

101

SQLITE_DONE

sqlite_step()結束執行

l  sqlite_colse

作用:關閉SQLite3資料庫

原型:int sqlite_close(sqlite3 *db)

例如:

l  test.c:

#include <stdio.h>

#include <sqlite3.h>

static    sqlite3 *db=NULL;

int main()

{

   int rc;

   rc= sqlite3_open("test.db", &db);

   if(rc)

   {

      printf("can't open database!\n");

   }

   else

   {

      printf("open database success!\n");

   }

   sqlite3_close(db);

   return 0;

}

執行命令“gcc –o test test.c –lsqlite3”進行編譯,執行test的結果如下所示:

[[email protected]]# open database success!

l  sqlite_exec

作用:執行SQL語句

原型:int sqlite3_exec(sqlite3 *db, const char *sql, int(*callback)(void*,int,char**,char**), void *, char **errmsg)

引數:

db:資料庫;

sql:SQL語句;

callback:回滾;

errmsg:錯誤資訊

例如:

l  test.c:

#include <stdio.h>

#include <sqlite3.h>

static sqlite3 *db=NULL;

static char *errmsg=NULL;

int main()

{

   int rc;

   rc = sqlite3_open("test.db", &db);

   rc = sqlite3_exec(db,"insert into test_table values('daobao','male', 24)", 0, 0, &errmsg);

   if(rc)

   {

      printf("exec fail!\n");

   }

   else

   {

      printf("exec success!\n");

   }

   sqlite3_close(db);

   return 0;

}

編譯完成後,執行test的結果如下所示:

[[email protected]]# ./test

exec success!

[[email protected]]# sqlite3 test.db

SQLite version 3.6.11

Enter".help" for instructions

Enter SQLstatements terminated with a ";"

sqlite>select * from test_table;

daobao|male|24

l  sqlite3_get_table

作用:執行SQL查詢

原型:int sqlite3_get_table(sqlite3 *db, const char *zSql, char***pazResult, int *pnRow,            int *pnColumn,char **pzErrmsg)

引數:

db:資料庫;

zSql:SQL語句;

pazResult:查詢結果集;

pnRow:結果集的行數;

pnColumn:結果集的列數;

errmsg:錯誤資訊;

l  sqlite3_free_table

作用:登出結果集

原型:void sqlite3_free_table(char **result)

引數:

result:結果集;

例如:

l  test.c:

#include <stdio.h>

#include <sqlite3.h>

static sqlite3 *db=NULL;

static char **Result=NULL;

static char *errmsg=NULL;

int main()

{

  int rc, i, j;

  int nrow;

  int ncolumn;

  rc= sqlite3_open("test.db", &db);

  rc= sqlite3_get_table(db, "select * from test_table",&Result, &nrow, &ncolumn,

&errmsg);

    if(rc)

    {

       printf("query fail!\n");

    }

    else

    {

       printf("query success!\n");

       for(i = 1; i <= nrow; i++)

       {

          for(j = 0; j < ncolumn; j++)

          {

             printf("%s | ", Result[i* ncolumn + j]);

          }

          printf("\n");

       }

    }

    sqlite3_free_table(Result);

    sqlite3_close(db);

    return 0;

}

編譯完成後,執行test的結果如下所示:

[[email protected]]# ./test

query success!

xiaohong |female | 19 |

xiaoxue | female| 18 |

xiaoliu | male |20 |

daobao | male |24 |

l  sqlite3_prepare

作用:把SQL語句編譯成位元組碼,由後面的執行函式去執行

原型:int sqlite3_prepare(sqlite3 *db, const char *zSql, int nByte,sqlite3_stmt **stmt, const char **pTail)

引數:

db:資料庫;

zSql:SQL語句;

nByte:SQL語句的最大位元組數;

stmt:Statement控制代碼;

pTail:SQL語句無用部分的指標;

l  sqlite3_step

作用:步步執行SQL語句位元組碼

原型:int sqlite3_step (sqlite3_stmt *)

例如:

l  test.c:

#include<stdio.h>

#include<sqlite3.h>

static  sqlite3 *db=NULL;

static  sqlite3_stmt *stmt=NULL;

int main()

{

    int rc, i, j;

    int ncolumn;

    rc= sqlite3_open("test.db",&db);

    rc=sqlite3_prepare(db,"select * fromtest_table",-1,&stmt,0);

    if(rc)

    {

       printf("query fail!\n");

    }

    else

    {

       printf("query success!\n");

       rc=sqlite3_step(stmt);

       ncolumn=sqlite3_column_count(stmt);

       while(rc==SQLITE_ROW)

       {

          for(i=0; i<2; i++)

          {

              printf("%s | ",sqlite3_column_text(stmt,i));

          }

          printf("\n");

          rc=sqlite3_step(stmt);

       }

    }

    sqlite3_finalize(stmt);

    sqlite3_close(db);

    return 0;

}

編譯完成後,執行test的結果如下所示:

[[email protected]]# ./test

query success!

xiaohong |female | 19 |

xiaoxue | female| 18 |

xiaoliu | male |20 |

daobao | male |24 |

    在程式中訪問SQLite3資料庫時,要注意C API的介面定義和資料型別是否正確,否則會得到錯誤的訪問結果。

相關推薦

淺析LinuxSQL及其用法

 嵌入式資料庫介紹 隨著電子技術的飛速發展,嵌入式系統中的儲存器容量和效能也在迅速提高,這為擴大嵌入式的應用領域提供了必要的物理基礎。展望未來,嵌入式系統正在向網路化、智慧化等高階應用方向發展。在這個發展過程中,嵌入式系統內的資料量會急劇膨脹。因此,嵌入式資料庫的作用將會變

Linuxsudo的用法

ber code als 安裝 有效 ould using span 帶來 在linux中的用戶只有2種:root和非root。而非root即普通用戶的權限非常低,基本處理自己的home目錄,其他好多地方連查看的權利也沒有,更不要說安裝軟件了。 為了避免來回切換root,l

Linuxfind的用法

查找1、使用find命令可以解決,find語法如下:find命令選項-name:按照文件名查找文件。-perm:按照文件權限來查找文件。-prune:使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那麽-prune將被find命令忽略。-user: 按照文件屬主來查找文件

linux的if用法和簡單的循環

linux if if用法來一波今天來一波在linux總if的簡單用法,實用與否還需要自己來判定。上一次在for中沒有提及shell腳本中格式問題,今天來補一下如若知道的,略過就好。。。在linux中,shell開頭一般是很重要的,但是卻又都是註釋要不要都行!這是為什麽呢?在上圖中顯示第一行#!/bin/ba

linuxwc命令用法

字節 統計字符 -- 幫助信息 linux系統 count 沒有 標準 讀取 Linux系統中的wc(Word Count)命令的功能為統計指定文件中的字節數、字數、行數,並將統計結果顯示輸出。 1.命令格式: wc [選項]文件... 2.命令功能: 統計指定文件中的字節

Linuxfind常見用法示例

depth 需要 option 為什麽 語法 其他 文件訪問 this man Linux中find常見用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; fi

Linuxiptables的用法

iptables linux iptables 防火墻 1 iptablesiptables命令用於創建數據過濾與NAT規則,在iptables命令中設置數據過濾或處理數據包的策略叫做規則,將多個規則合成一個鏈。1.1 iptables的控制類型ACCEPT:允許通過LOG:記錄日誌信息,然後傳給

linuxgrep的用法

grep1、grep [內容] /data/boy 只顯示該文件中的內容,其他不顯。grep一般常用參數: - i :匹配時忽略大小寫 - n :匹配的內容開頭顯示行號 - v : 匹配沒有"搜索字符串"的內容,即過濾匹配內容 --color=auto

Linuxsed的用法

sed1、sed 流編輯器,實現對文字的增刪改替換查,能同時處理多個文件多行的內容,可以不對原文件改動,把整個文件輸入到屏幕,可以把只匹配到模式的內容輸入到屏幕上。還可以對原文件改動,但是不會再屏幕上返回結果。2、命令格式:sed [選項] ‘[命令]’[文件]sed命令的常用選項:-n :只打印模式

linux 特殊符號用法詳解

引號 zabbix 目錄 sele cond 特殊符號 zab set speed 星號(*) 當用於shell變量時, [root@zabbix_nuc ~]# sql=‘select * from mysql.user‘ [root@zabbix_nuc ~]# ech

Linux的括號用法

結果 數值 條件 匹配模式 初始化 技術分享 最長 file 算術 一、Linux中的小括號(也叫圓括號)“( )”的用法 1.單小括號() 1)數組賦值或者初始化數組; 2)子Shell賦值:小括號中的內容會開啟一個子shell獨立運行;括號中以分號連接,最後一個命令不需

linuxtar命令用法

log mco file 並且 unrar 過程 lin 文件名 壓縮歸檔 -c: 建立壓縮檔案-x:解壓-t:查看內容-r:向壓縮歸檔文件末尾追加文件-u:更新原壓縮包中的文件 這五個是獨立的命令,壓縮解壓都要用到其中一個,可以和別的命令連用但只能用其中一個。下面的參數是

Linuxfind命令用法全匯總,看完就沒有不會用的!

分用 想要 單個 ges 基本上 特定 cda size 以及 Linux 查找命令是Linux系統中最重要和最常用的命令之一。查找用於根據與參數匹配的文件指定的條件來搜索和查找文件和目錄列表的命令。查找可以在各種條件下使用,您可以通過權限,用戶,組,文件類型,日期,大小等

linuxmariadb基本用法詳解(企業級)

資料庫 表的每一個列名字的頭   叫做欄位 是高階的exel表格軟體 資料庫種類 sqlserver  sqllite  db2   oracle  > mysql   比較多   其中my

linuxscp的用法

scp就是secure copy,一個在linux下用來進行遠端拷貝檔案的命令。 有時我們需要獲得遠端伺服器上的某個檔案,該伺服器既沒有配置ftp伺服器,也沒有做共享,無法通過常規途徑獲得檔案時,只需要通過簡單的scp命令便可達到目的。 一、將本機檔案複製到遠端伺服器上

以爬取“我要愛死你”貴州行政區劃為例,淺析lxmletree的用法

lxml是python中一個非常強大的解析庫。其中的etree更是常常用來判斷網頁中某一節點是否存在,並獲取相應的文字或屬性。 一、用法詳解 1、匯入etree import requests from lxml import etree 2、獲取網頁資訊並生成etree選擇

linux sed的用法詳解

sed 是操作,過濾和轉換文字內容的強大工具,sed可以從檔案和管道中讀取輸入。 sed 命令語法 sed [ option ] {sed -commands} {input -file} -e :執行多個sed命令 -n :只顯示操作行 -i

Linuxfind命令用法全彙總

Linux 查詢命令是Linux系統中最重要和最常用的命令之一。查詢用於根據與引數匹配的檔案指定的條件來搜尋和查詢檔案和目錄列表的命令。查詢可以在各種條件下使用,您可以通過許可權,使用者,組,檔案型別,日期,大小等可能的條件查詢檔案。 第一部分:查詢名稱查詢檔

mybatis的mapper.xmlsql用法

剛接觸的時候會有些摸不到頭腦,為此在網上搜索了一些相關的參考給自己作為借鑑 1.根據id查詢 select * from test_tb_info where 1=1 <if test="id != null and id !=''"> and info.id=#{id}

Linuxexport的用法與環境變數的設定

參考自 常用用法 # 功能說明:設定或顯示環境變數。 # export [-fnp][變數名稱]=[變數設定值] # 只在本次登入中有效 # 再增加的路徑用:追加 export PATH=$PATH:/home/jason001 說明 在shell