Найти тему
Мой конспект

SQL Light. Реляционные БД. Инемного базовых запросов. Убираем повторы при запросе. Условия при запросах. и тп

Многие приложения, которые вы устанавливаете на свои устройства хранят данные на вашем телефоне или планшете.

Например Контакты хранят данные о ваших контактах: имя, номер телефона и тп.

Сохраненные данные являются гарантом того, что пользовательский контент не будет утерян при отсутствии интернета или закрытии приложения.

SQLite - это распространенный способ сохранения данных, предоставляемый Android SDK для приложений Android. SQLite предоставляет реляционную базу данных, которая позволяет вам представлять данные аналогично тому, как вы структурируете данные с помощью классов Kotlin.

Реляционные базы данных

  1. База данных состоит из таблиц.
  2. Базу данных можно назвать реляционной, когда она моделирует отношения между таблицами (у библиотеки может быть несколько читателей)
  3. Таблица определяет группу данных которую вы хотите описать: Читатель, Библиотека, Библиотекарь (по сути название класса)
  4. По столбцам описываются свойства объектов (поля класса: возраст читателя, имя...)
  5. По строкам располагаются объекты класса (читатели например)
  6. В реляционной базе данных каждая таблица содержит уникальный индификатор строк, где каждый объект имеет уникальное значение (т.е. ни в одной из строк таблицы нет похожего значения), это значение - первичный ключ
  7. Когда одна таблица (а их как я написал в базе данных несколько), ссылается на ключ другой таблицы. Это называется внешним ключом (наличие внешнего ключа, говорит о том, что БД реляционная)

Возвращаемся к SQLite

SQLite - это реляционная база данных или компактная библиотека, управляющая реляционными базами данных при помощи языка SQL.

Запрос к базе данных

Чтобы считать данные из БД мы используем SELECT за которым следует имя столбца, за которым следует название таблицы и заканчивается все на точку с запятой " ; "

  • SELECT "column name" FROM "table name" ;
P.S. можно выбирать любое количество колонок в запросе через запятую, если не написать ни одной и поставить * :
  • SELECT * FROM "table name" ;
то SELECT вернет всю таблицу

Агрегатные функции

По сути это функции над столбцами в БД:

  • COUNT(): Возвращает общее количество строк, соответствующих запросу;
  • SUM(): Возвращает сумму значений для всех строк в выбранном столбце;
  • AVG(): Возвращает среднее значение —average— всех значений в выбранном столбце;
  • MIN(): Возвращает наименьшее значение в выбранном столбце;
  • MAX(): Возвращает наибольшее значение в выбранном столбце.

Наш запрос будет выглядеть следующим образом:

  • SELECT AGGREGATE FUNCTION("column name") FROM "table name" ;
Так же имеется ключевое слово DISTINCT оно позволяет нам убрать дубликаты и ставится перед названием колонки:
  • SELECT AGGREGATE FUNCTION( DISTINCT "column name") FROM "table name";

Используй WHERE

Этот запрос выполняет логическую проверку для каждой выбранной строки (для каждого объекта); если проверка возвращает true, она включает строку в результат запроса. Строки, для которых запрос возвращает false, не включаются в результат.

Ну те пишите какой-нибудь запрос по типу:

SELECT "column name" FROM "table name"
WHERE "condition";

SELECT "age" FROM "students"

WHERE name = 'Ivan' ;

И мы получим возраста всех студентов с именем Иван.

  • = знак сравнения
  • != знак неравенства
  • >,<,<=,>= нуууу, думаю и так понятно

Так же конструкция WHERE интересна тем, что мы можем в нее добавить еще одно условие. Ну т.е. допустим вывести возраст студента, когда у нас студента зовут Иван и у него белые волосы.

SELECT "age" FROM "students"
WHERE name = 'Ivan' AND hairColour = 'white' ;

И SQLite выведет нам возраст всех белоголовых иванов из таблицы "студенты".

Всего то добавляем AND между условиями.

Или вместо AND можно использовать OR.

Но при использовании OR мы получим всех студентов с именами Иван и всех белоголовых студентов.

Так же иногда бывает удобно просто исключить какое-то поле допусти хотим получить возраст всех НЕ беловолосых студентов. (для этого юзаем NOT)

SELECT "age" FROM "students"
WHERE NOT hairColour = 'white' ;
  • AND - когда хотим чтобы выполнялось И первое И второе условия
  • OR - когда хотим чтобы выполнялось ИЛИ первое ИЛИ второе условия
  • NOT - когда не хотим чтобы выполнялось какое-либо условие

Поиск по тексту при помощи LIKE

Все просто эта вещь очень похожа на ctrl+f, но если в случае ctrl+f мы ищем необходимую нам строку по всему тексту, то в случае запроса мы это делаем только в рамках определенного свойства объекта (колонки).

SELECT "column name" FROM "table name"
WHERE "column name" LIKE "search string";

Примерчик

SELECT * FROM students
WHERE name LIKE '%Наливкин';

Что за процентики ыыыыыы

Короче тут тоже все просто.

Допустим есть столбец name где есть такие записи:

Иван Иванович Иванов, Петр Иванович Наливкин, Николай Иванович Наливкин ...

% перед искомой строкой: говорит нам о том, что мы ищем записи, оканчивающиеся на Наливкин.

'%Наливкин' = Петр Иванович Наливкин, Николай Иванович Наливкин ...

% после искомой строки: говорит нам о том, что мы ищем записи, начинающиеся на Наливкин.

'Наливкин%' - если написать так, то ничего не выдаст, ведь все наши записи в форме Имя Отчество Фамилия, а следовательно Наливкин будет всегда стоять в конце.

% с обеих сторон строки:

'%Наливкин%': а вот так в результате получим все строки в которых есть слово Наливкин

Группируем результаты при помощи GROUP BY

Когда нам нужно вывести количество каких-то объектов относительно какого-нибудь признака. Например количество товаров по различным странам, количество парков в каком-нибудь городе ... очень удобно использовать group by.

Примерчик
Примерчик
SELECT depno, COUNT(depno) FROM tableName
GROUP BY depno

Сортируем результаты при помощи ORDER BY

Просто пишем ORDER BY и устраиваем жесткую фильтрацию.

SELECT column name FROM tableName
GROUP BY column name DESC

Тут 2 опции:

  • DESC - по убыванию
  • ASC - по возрастанию

Ограничиваем количество результатов LIMIT:

Тут все аналогично сортировке

Пишем LIMIT и ограничиваем количество строк, которые мы хотим вывести. LIMIT 10 и нам выведет только первые 10 строк.

В паре с LIMIT бывает используют OFFSET.

Допустим

LIMIT 10 OFFSET 10

выведет вторые 10 строк и пропустит первые 10.

ТЕ 11-ю, 12-ю, ... , 19-ю и 20-ю.