Сортировка результата выборки
Без ORDER BY SQLite не обещает стабильный
порядок строк.
Явная сортировка задает колонку и направление
ASC или DESC. Список имен можно
вывести по алфавиту возрастания:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("sorted.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
char* err = nullptr;
if (sqlite3_exec(
db,
"CREATE TABLE IF NOT EXISTS cities ("
"id INTEGER PRIMARY KEY,"
"name TEXT NOT NULL"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO cities (name) VALUES ('rome')",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO cities (name) VALUES ('oslo')",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO cities (name) VALUES ('lima')",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
sqlite3_stmt* stmt = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT name FROM cities ORDER BY name ASC",
-1,
&stmt,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
while (sqlite3_step(stmt) == SQLITE_ROW) {
const char* name =
reinterpret_cast<const char*>(
sqlite3_column_text(stmt, 0)
);
std::cout << name << "\n";
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
Числовые поля сортируют отдельно. DESC
ставит большие значения первыми:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("sorted.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
char* err = nullptr;
if (sqlite3_exec(
db,
"CREATE TABLE IF NOT EXISTS scores ("
"id INTEGER PRIMARY KEY,"
"points INTEGER NOT NULL"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO scores (points) VALUES (10)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO scores (points) VALUES (30)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO scores (points) VALUES (20)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
sqlite3_stmt* stmt = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT points FROM scores ORDER BY points DESC",
-1,
&stmt,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
while (sqlite3_step(stmt) == SQLITE_ROW) {
std::cout << sqlite3_column_int(stmt, 0) << "\n";
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
Создайте таблицу bins в store.db
с полем label, добавьте три метки и
выведите их по алфавиту.
Добавьте поле weight, запишите три веса
и выведите значения от большего к меньшему.