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这两个函数是构成重载的。