Оператор SQL Выбор между отсортированными значениями

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, хотя)

0
задан Spy 16 January 2019 в 13:11
поделиться

1 ответ

Таблицы 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
0
ответ дан Gordon Linoff 16 January 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: