SQLite中7(8)形參的query語句各形參的用法及簡單示例 ...
SQLite中7(8)形參的query語句的用法
我們先來看看這種7形參的query語句的形參列表:
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) {}
形參依次為:
①String table:要查詢哪張表,以字元串的形式給出,比如說我要查Book表,那麼這個形參就填"Book"
②String[] columns:要查詢該表中的哪一列(哪幾列),以字元串數組的形式給出,比如說我要查name這一列,那麼這個形參這裡就填new String[] {"name"},比如說我要查name和price這兩列,那麼這個形參就填new String[] {"name", "price"}
③String selection:指定約束條件,要求以字元串形式給出,其中可以有占位符(當然也可以沒有),先舉一個沒有占位符的例子:“page > 500”,表示搜索條件是書的頁數大於500,如果使用占位符,那麼這個條件就可以寫成"page > ?",“?”處對應的值由下一個形參給出,該處形參可以有多個條件,例如要搜索書的頁數大於500並且價格小於40元的書籍,那麼該處形參可以填"page > ? and price < ?",兩個"?"的值都由下一個形參給出
④String[] selectionArgs:為占位符提供具體的值,由字元串數組的形式依次給出,例如前文中"page > ?"這個條件,那麼這裡就填new String[] {"500"},前文中"page > ? and price < ?"這個例子,這裡就填new String[] {"500", "40"}
③+④這兩個形參聯合起來來構成查詢的約束條件
⑤String groupBy:簡單來說,這個形參是描述如何分組的,但是這個形參不是那麼好懂,因此我們用一個例子來說明:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
Paul 32 California 20000.0
Allen 25 Texas 15000.0
Teddy 23 Norway 20000.0
Mark 25 Rich-Mond 65000.0
David 27 Texas 85000.0
Kim 22 Texas 45000.0
James 24 Houston 10000.0
Paul 32 California 20000.0
James 44 Texas 5000.0
James 45 Texas 5000.0
在上述表格中可以看到有3個James和2個Paul,但是這有一些不太一樣,兩個Paul的名字、年齡、地址都是一樣的,這說明他們是同一個人,而三個James雖然名字一樣,但是要麼年齡不一樣,要麼地址不一樣,這說明這三個Paul不是同一個人,因此,當我查詢一張總工資表的時候,我可以把兩個Paul合併,但不應該把三個James合併,這個時候就可以用groupBy這個形參了,在本例中判斷是不是同一個人groupBy處填的東西應該為"name, age, address",這樣查詢就會把所有的這三列數據都相同的數據合併成一條數據(但並不是把他們的salary相加起來),也就是結果中只會有一條Paul,但是會有3條James
⑥String having:它的作用是過濾掉一部分數據,舉個例子,還是用上面那張薪水錶格為例,如果你在having這個形參這裡填的是"count(NAME) > 2",那麼你搜到的就只有JAMES這個人的數據,也就是所有NAME出現次數沒有超過2次的人都被過濾掉了,另外,這裡有一點需要強調,如果你打算用having這個形參,groupBy那裡必須不能為空。還有,這裡這個計數計的是原始表格經過第三形參和第四形參構成的約束條件篩選之後的數目,換句話說,這個計數發生在篩選之後,但是發生在groupBy的合併之前
⑦String orderBy:按照哪一列進行排序,列的名字以字元串形式給出,如按照id進行排序,這一個形參就填"id",另外,"desc"表示降序,"asc"表示升序,比如你要按照id進行降序排序,按照name進行升序排序,那麼這個形參你就可以填"id desc, name asc"
p.s這裡再補充一個額外形參:
⑧String limit,這個形參的作用是按照你給的參數分了組合了並過了濾排好序之後,跳過前面的幾個,拿幾個,什麼意思呢?大概就是這個樣子:
我們把不加limit這一形參時理應給出的結果叫做A,那麼如果limit填"3",意思是查詢結果裡面僅為A的前3條數據;如果limit填的是"2, 3",意思是查詢結果是(跳過最前面兩條數據,之後取3條數據),也就是事實上拿到的結果是A中的第3、第4、第5三條數據
簡單總結limit這一形參填"i, j"就是跳過前i條數據,之後取j條數據作為結果
p.s.順帶一提,當這些形參值為null的時候,分別代表的含義總結如下:
順序號 | 形參名稱 | 形參的類型 | 含義 | 值為null時的含義 |
1 | table | String | 要去查詢哪一張表 | 不能為null |
2 | columns | String[] | 要去查詢哪些列 | 查詢所有列 |
3 | selection | String | 約束條件 | 無約束條件,即查詢所有數據 |
4 | selectionArgs | String[] | 補充形參3占位符處所代表的值 | 形參3無占位符時填null |
5 | groupBy | String | 在哪些列都相同的情況下進行合併 | 不啟用groupBy合併 |
6 | having | String | 在形參5不為空的情況下,可以按照出現的次數進行過濾 | 不啟用having過濾 |
7 | orderBy | String | 按照哪些關鍵字排序 | 按照預設排序 |
8 | limit | String | 返回結果是從第幾行開始的,返回幾行 | 無限制(即返回所有查詢到的結果) |
備註:形參8(limit)為null時可以不填,帶limit的8形參query和不帶limit的7形參query這兩個函數是構成重載的。