tableColumns
null
для всех столбцов, как в SELECT * FROM ...
new String[] { "column1", "column2", ... }
для конкретных столбцов, как в SELECT column1, column2 FROM ...
- здесь вы также можете поставить сложные выражения: new String[] { "(SELECT max(column1) FROM table1) AS max" }
предоставит вам столбец с именем max
, содержащий максимальное значение column1
whereClause
WHERE
без этого ключевого слова, например "column1 > 5"
?
для вещей, которые являются динамическими, например. "column1=?"
-> см. whereArgs
гдеArgs
?
в whereClause
в том порядке, в каком они появляются другие
whereClause
утверждение после ключевого слова или null
Если вы не используете его. Пример
String[] tableColumns = new String[] {
"column1",
"(SELECT max(column1) FROM table2) AS max"
};
String whereClause = "column1 = ? OR column1 = ?";
String[] whereArgs = new String[] {
"value1",
"value2"
};
String orderBy = "column1";
Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs,
null, null, orderBy);
// since we have a named column we can do
int idx = c.getColumnIndex("max");
эквивалентен следующему необработанному запросу
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Используя версию Where / Bind -Args, вы получаете автоматически экранированные значения, и вам не нужно беспокоиться, если входные данные содержат '
.
Небезопасно: String whereClause = "column1='" + value + "'";
Safe: String whereClause = "column1=?";
, потому что если значение содержит '
, ваш оператор либо прерывается, либо вы получаете исключения или делаете непреднамеренные действия, например value = "XYZ'; DROP TABLE table1;--"
может даже отбросить вашу таблицу, поскольку утверждение станет двумя операторами и комментарий:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
с использованием версии args XYZ'; DROP TABLE table1;--
будет экранирован до 'XYZ''; DROP TABLE table1;--'
и будет рассматриваться только как значение. Даже если '
не предназначен для плохих вещей, все еще довольно распространено, что люди имеют его в своих именах или используют его в текстах, именах файлов, паролях и т. Д. Поэтому всегда используйте версию args. (Это нормально строить int
и другие примитивы непосредственно в whereClause
, хотя)
Таблицы SQL представляют неупорядоченных множеств. SQL-запросы возвращают неупорядоченных наборов. , , с одним исключением: если самый внешний select
имеет соответствующий order by
.
Итак, order by
в подзапросе не имеет никакого эффекта. Некоторые базы данных даже не допускают order by
в этом случае. В других случаях может выглядеть , как будто результаты упорядочены, но изменения в данных или среде могут изменить это.
В вашем случае подзапрос не нужен. Вы, вероятно, знаете это, но вам следует написать:
SELECT p.*
FROM people p
WHERE p.people_Age BETWEEN 20 AND 25
ORDER BY p.age DESC