sqlite 多條語句 SQLite表示式索引詳解

2021-10-12 09:30:58 字數 2278 閱讀 1006

通常,sql索引引用表的列。但是也可以在涉及表列的表示式上形成索引。

例如,請考慮下表跟蹤各種「帳戶」的美元金額變化

create table account_change( chng_id integer primary key, acct_no integer references account, location integer references locations, amt integer, -- in cents authority text, comment text);create index acctchng_magnitude on account_change(acct_no, abs(amt));
account_change表中的每個條目都記錄存款或提款到帳戶。存款有正數「amt」,提款有負數的「amt」。

acctchng_magnitude索引是超過帳號(「acct_no」)和金額的絕對值。該索引允許對帳戶更改的大小進行有效查詢。例如,要列出帳號$ xyz的並且存款超過$ 100.00的記錄,可以用下列表示式:

select * from account_change where acct_no=$xyz and abs(amt)>=10000;
或者,要按照數量遞減的順序列出對某個特定帳戶($ xyz)的所有記錄,可以這樣:

select * from account_change where acct_no=$xyz order by abs(amt) desc;
如果沒有acctchng_magnitude索引,上述兩個示例查詢都可以正常工作。acctchng_magnitude索引索引僅幫助查詢更快地執行,尤其是在每個帳戶的表中有許多條目的資料庫上。

使用create index語句在乙個或多個表示式上建立新索引,就像在列上建立索引一樣。唯一的區別是表示式被列為要索引的元素而不是列名。

當索引的表示式出現在查詢的where子句或order by子句中時,sqlite查詢計畫程式將考慮在表示式上使用索引,就像在create index語句中編寫的那樣。查詢規劃器不執行代數。為了將where子句約束和order by術語與索引匹配,sqlite要求表示式相同,除了較小的語法差異(如空白更改)。下面是建立的索引:

create table t2(x,y,z);create index t2xy on t2(x+y);
然後執行查詢:

select * from t2 where y+x=22;
上面語句是不會使用索引,因為create index語句(x + y)上的表示式與查詢中顯示的表示式(y + x)不同。這兩個表示式可能在數學上是等價的,但sqlite查詢規劃器認為它們是相同的,而不僅僅是等價的。所以下面重寫查詢:

select * from t2 where x+y=22;
第二個查詢可能會使用索引,因為現在where子句(x + y)中的表示式與索引中的表示式完全匹配。

對create index語句**現的表示式有一些合理的限制:

create index語句中的表示式只能引用被索引的表的列,而不能引用其他表中的列。

create index語句中的表示式可能包含函式呼叫,但僅適用於其輸出始終完全由其輸入引數(又稱: 確定性函式)確定的函式。顯然,像random()這樣的函式在索引中不能很好地工作。但是像sqlite_version()這樣的函式雖然在任何乙個資料庫連線中都是常量,但在底層資料庫檔案的整個生命週期中都不是常量,因此不能在create index語句中使用。

請注意,預設情況下,應用程式定義的sql函式被認為是非確定性的,並且可能不會在create index語句中使用,除非在註冊函式時使用sqlite_deterministic標誌。

create index語句中的表示式可能不使用子查詢。

表示式只能在create index語句中使用,而不能在 create table語句中的unique或primary key約束中使用。

索引表示式的能力已新增到sqlite 版本3.9.0(2015-10-14)。早期版本的sqlite將無法使用在表示式上使用索引的資料庫。

SQLite一條SQL語句插入多條記錄

sqlite 插入多條記錄 為了減少資料庫連線的i o開銷,一般會把多條資料插入放在一條sql語句中一次執行。以前用mysql做開發一直是這樣用的 insert into table col1,col2 values val11,val12 val21,val22 最近用sqlite才發現這個語法並...

php學習之sqlite查詢語句之多條件查詢

一。php mysql多條件 多值查詢示例 index.html 房屋型別 一居室二居室 三居室二。區間式多條件查詢 例子 把該傳的條件傳到php程式裡 比如有三個條件price 1000 3000,name nokia,type 2 在php裡分別接到這些條件,我定義為以下幾個 pmax 3000...

多條SQL語句

中有兩條sql語句 updatedeptrelations delete from sys dept relation where descendant in select temp.descendant from select descendant from sys dept relation w...