Получение, добавление, удаление и изменение данных в таблицах
Хорошо, БД мы создали, таблицы тоже, схему описали, осталось научиться работать с этими самыми данными.
Добавление данных
Для добавления данных в таблицу используется команда INSERT
.
Синтаксис:
Пример:
Из чего состоит запрос:
INSERT INTO customers
- выбираем в какую таблицу будет происходить вставка.(id, first_name, last_name, ...)
- выбираем какие поля мы будем вноситьVALUES (1, 'Ivan', 'Ivanov')
- значения, которые будут добавлены, строго в с том порядке и кол-ве в каком они идут в предыдущем пункте
Генерация значений
В прошлой главе мы рассмотрели параметры AUTOINCREMENT и DEFAULT при создании новой таблицы. Для того, чтобы ими воспользоваться необходимо вместо значения передать NULL. Сделать это можно 2 спообами: указать внутри VALUES значение NULL для этого параметра или не учитывать эту колонку. Пример:
Создаем таблицу с PRIMARY KEY (помним, что если тип данных число, то оно будет AUTOINCREMENT)
Вставляем данные
Как видим, мы не стали указывать для колонки с первичным ключом значения, значит будет передано NULL, значит значение будет автоматиечски сгенерировано.
За свою практику я сталкивался с 2 проблемами такого подхода.
Медленная работа. Порой при очень большом кол-ве вставок в таблицу мы можем получить замедление скорости (Bottleneck) из-за того, что СУБД нужно посчитать какое значение должно достаться записи
Логика работы даной функции редко, но метко может ломаться и приходится потратить приличное кол-во сил на починку. А так как генерация значения не работает, то вставка в таблицу не предоставляется возможной и в итоге функционал нашего сервиса уходит полностью в отказ.
Вышеназванные проблемы стоит учитывать в том момент, когда это необходимо.
Если вы заранее можете предположить, что у вас ожидается большая скорость записи (от 10 000 записей в секунду), то лучше придумать свой вариант для расчета внутри кода.
Если ваше приложение не планирует иметь такие нагрузки, особенно если делаете учебные проекты, то и замораичваться не стоит.
Множественное добавление
Помимо одиночной вставки данных мы можем также вставлять несколько значений используя одну команду INSERT
.
Синтаксис:
Пример:
Получение данных
Для того, чтобы получать данные из конкретной таблицы необходимо использовать команду SEELCT
Синтаксис:
Пример:
first_name | last_name | phone |
---|---|---|
Ivan | Ivanov | 79156782211 |
Vladislav | Petrov | 79991452521 |
Ivan | Vasilyev | 79261009615 |
Сначала мы вводим команду SELECT
, после чего перечисляем названия колонок, которые хотим отобразить, после чего указываем из какой табицы брать данные, в нашем случае это customers
.
Кроме того мы можем с помощью специального символа, указать, что хотим получить вообще все колонки, которые есть
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
1 | Ivan | Ivanov | 79156782211 | iv.iv@ya.ru | Moscow, Lenina St. 1, 100 | 1682334619 |
2 | Vladislav | Petrov | 79991452521 | vlad.p@mail.ru | Ufa, 50 october years St. 9, 11 | 1682447158 |
3 | Ivan | Vasilyev | 79261009615 | vas@mail.com | Vladimir, Lenina St. 32, 78 | 1682447158 |
4 | Gleb | Voroncov | 79675605625 | g.vor@outlook.com | Nalch, bld. 2/В, appt. 11 | 1682667535 |
5 | Maria | Golubeva | 79157788778 | maria@mail.com | Naberezhnye Chelny, Os 423802 A/ya 4 | 1682667536 |
6 | Denis | Pavlenko | 79210019471 | denis@mail.com | Vladimir, Esenina S. Ul., bld. 32, appt. 6 | 1682667537 |
условия
Помимо получения всех значений, мы можем также фильтровать нашу выборку с помощью ключевого слова WHERE
.
Всего существуют следущие условия:
=
- Отбираются значения равные указанному
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
1 | Ivan | Ivanov | 79156782211 | iv.iv@ya.ru | Moscow, Lenina St. 1, 100 | 1682334619 |
3 | Ivan | Vasilyev | 79261009615 | vas@mail.com | Vladimir, Lenina St. 32, 78 | 1682447158 |
>
- Отбираются значения больше указанного
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
4 | Gleb | Voroncov | 79675605625 | g.vor@outlook.com | Nalch, bld. 2/В, appt. 11 | 1682667535 |
5 | Maria | Golubeva | 79157788778 | maria@mail.com | Naberezhnye Chelny, Os 423802 A/ya 4 | 1682667536 |
6 | Denis | Pavlenko | 79210019471 | denis@mail.com | Vladimir, Esenina S. Ul., bld. 32, appt. 6 | 1682667537 |
<
- Отбираются значения меньше указанного
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
1 | Ivan | Ivanov | 79156782211 | iv.iv@ya.ru | Moscow, Lenina St. 1, 100 | 1682334619 |
2 | Vladislav | Petrov | 79991452521 | vlad.p@mail.ru | Ufa, 50 october years St. 9, 11 | 1682447158 |
3 | Ivan | Vasilyev | 79261009615 | vas@mail.com | Vladimir, Lenina St. 32, 78 | 1682447158 |
>=
- Отбираются значения больше или равные указанным
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
4 | Gleb | Voroncov | 79675605625 | g.vor@outlook.com | Nalch, bld. 2/В, appt. 11 | 1682667535 |
5 | Maria | Golubeva | 79157788778 | maria@mail.com | Naberezhnye Chelny, Os 423802 A/ya 4 | 1682667536 |
6 | Denis | Pavlenko | 79210019471 | denis@mail.com | Vladimir, Esenina S. Ul., bld. 32, appt. 6 | 1682667537 |
<=
- Отбираются значения меньше или равные указанным
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
1 | Ivan | Ivanov | 79156782211 | iv.iv@ya.ru | Moscow, Lenina St. 1, 100 | 1682334619 |
2 | Vladislav | Petrov | 79991452521 | vlad.p@mail.ru | Ufa, 50 october years St. 9, 11 | 1682447158 |
3 | Ivan | Vasilyev | 79261009615 | vas@mail.com | Vladimir, Lenina St. 32, 78 | 1682447158 |
4 | Gleb | Voroncov | 79675605625 | g.vor@outlook.com | Nalch, bld. 2/В, appt. 11 | 1682667535 |
!=
- Отбираются значения не равные указанному
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
2 | Vladislav | Petrov | 79991452521 | vlad.p@mail.ru | Ufa, 50 october years St. 9, 11 | 1682447158 |
4 | Gleb | Voroncov | 79675605625 | g.vor@outlook.com | Nalch, bld. 2/В, appt. 11 | 1682667535 |
5 | Maria | Golubeva | 79157788778 | maria@mail.com | Naberezhnye Chelny, Os 423802 A/ya 4 | 1682667536 |
6 | Denis | Pavlenko | 79210019471 | denis@mail.com | Vladimir, Esenina S. Ul., bld. 32, appt. 6 | 1682667537 |
BETWEEN
- Отбираются значения, находящиеся между указанными
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
2 | Vladislav | Petrov | 79991452521 | vlad.p@mail.ru | Ufa, 50 october years St. 9, 11 | 1682447158 |
3 | Ivan | Vasilyev | 79261009615 | vas@mail.com | Vladimir, Lenina St. 32, 78 | 1682447158 |
4 | Gleb | Voroncov | 79675605625 | g.vor@outlook.com | Nalch, bld. 2/В, appt. 11 | 1682667535 |
IN
- Отбираются значения, содержащиеся в указанных
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
1 | Ivan | Ivanov | 79156782211 | iv.iv@ya.ru | Moscow, Lenina St. 1, 100 | 1682334619 |
3 | Ivan | Vasilyev | 79261009615 | vas@mail.com | Vladimir, Lenina St. 32, 78 | 1682447158 |
6 | Denis | Pavlenko | 79210019471 | denis@mail.com | Vladimir, Esenina S. Ul., bld. 32, appt. 6 | 1682667537 |
NOT IN
- Отбираются значения, не содержащиеся в указанных
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
2 | Vladislav | Petrov | 79991452521 | vlad.p@mail.ru | Ufa, 50 october years St. 9, 11 | 1682447158 |
4 | Gleb | Voroncov | 79675605625 | g.vor@outlook.com | Nalch, bld. 2/В, appt. 11 | 1682667535 |
5 | Maria | Golubeva | 79157788778 | maria@mail.com | Naberezhnye Chelny, Os 423802 A/ya 4 | 1682667536 |
LIKE
- Отбираются значения, соответствующие образцу с использованием следующих метасимволов:_
- обозначает любой одиночный символ. Работает по аналогии так же как и в резулярных выражениях синтаксис.
%
- обозначает любое количество символов, включая ноль символов. Работает по аналогии так же как и в резулярных выражениях синтаксис.*
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
1 | Ivan | Ivanov | 79156782211 | iv.iv@ya.ru | Moscow, Lenina St. 1, 100 | 1682334619 |
3 | Ivan | Vasilyev | 79261009615 | vas@mail.com | Vladimir, Lenina St. 1, 100 | 1682447158 |
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
1 | Ivan | Ivanov | 79156782211 | iv.iv@ya.ru | Moscow, Lenina St. 1, 100 | 1682334619 |
2 | Vladislav | Petrov | 79991452521 | vlad.p@mail.ru | Ufa, 50 october years St. 9, 11 | 1682447158 |
id | first_name | last_name | phone | address | register_at | |
---|---|---|---|---|---|---|
1 | Ivan | Ivanov | 79156782211 | iv.iv@ya.ru | Moscow, Lenina St. 1, 100 | 1682334619 |
2 | Vladislav | Petrov | 79991452521 | vlad.p@mail.ru | Ufa, 50 october years St. 9, 11 | 1682447158 |
Сортировка
Для сортировки данных используется ключевое слово ORDER BY
с передачей колонки, по которой будет происходить сортировка и указанием порядке. Порядок задается с помощью ключего слова ASC
- от меньшего к большему и DESC
- от большего к меньшему.
Синтаксис:
Пример:
В данном примере мы получаем список всех товаров отсортированныз по убыванию цены.
Пагинация
Как часто бывает, данных в таблице может быть много и доставать все данные оттуда нам нет смысла, поэтому обычно достают данные по частям.
В SQL мы можем указать сколько элементов необхдимо пропустить помощью ключего слова OFFSET
. Например, у нас есть запрос, который возвращает нам 600 строк, тогда мы указываем OFFSET 20
, тогда первые 20 строк будут пропущены и запрос отобразит нам 580 элементов. Важно понимать, что пропуск идет не от элементов в таблице, а от конечного результата.
Кроме того, у нас нет необходимости в 580 элементах, например на сайте мы часто видим 20-30 элементов, а дальше нам предлагают посмотреть следующую страницу товаров. Для указания лимита выборки используется ключевое слово LIMIT
с кол-вом элементов, которое необхдоимо получить, напрмер если нам нужно будет 30 элементов, то запись будет выглядеть как LIMIT 30
.
Теперь завайте рассмотрим пример из реальной жизни. Наш интернет магазин на сайте хочет показывать покупателям 20 товаров и возможностью постраничного просмотра. Тогда запрос для получения 1 страницы с товарами будет выглядеть следующим образом:
А когда пользователь выбирает 2 страницу, то нам необходимо выполнить запрос с новым отступом:
Изменение данных
Для того, чтобы изменить данные в таблице необходимо использовать команду UPDATE
.
Синтаксис:
Примерер:
Но обновлять все данные в таблице редко когда нам может понадобиться, поэтому операция UPDATE
позволяет использовать условия с помощью WHERE
.
Синтаксис:
Пример:
Удаление данных
Для удаленния данных из таблицы необходимо использовать команду DELETE
.
Синтаксис:
Пример:
Опять таки, удалять все данные неудобно, поэтому мы можем и в этой команде использовать WHERE
.
Синтаксис:
Пример:
Команда TRUNCATE
Операция TRUNCATE
создана для удаления всех данных из таблиц как и команда DELETE
без условия. Частый вопрос на собеседовании: Чем TRUNCATE
отличается от DELETE
? Ответ: TRUNCATE
- это DDL операция, а DELETE
это DML операция. DML удаляет данные построчно, то есть сначала удаляется одна строка, потом вторая и так далее, в то время как DDL операция оперирует таблицей. По сути TRUNCATE
удаляет таблицу полностью и создает заново.
Задание university
Заполните таблицы данными с помощью файла dump.sql приложенного к данному уроку. Для этого введите команду в консоль
sqlite3 путь/до/university < путь/до/dump.sql
.Проверьте, что данные успешно импортированы.
Добавьте новый факультет в таблицу
faculties
с названиемStatistician
и идентификатором равным 5. Назовите ваш скриптinsert_faculties.sql
Создайте скрипт
insert_subject2faculty.sql
с запросом на добавление и добавьте предметы в таблицуsubject2faculty
для этого факультета:mathematics
computer science
business
Создайте скрипт
insert_student2faculty.sql
с запросом на добавление и добавьте студентов в таблицуstudent2faculty
для этого факультета:Trever Springer
Ruperto Skettles
Maribeth Camble
Создайте скрипт
select_teachers_older_30_less_40.sql
с запросом на получение учителей из таблицыteachers
моложе 40 лет, но старше 30 лет.Создайте скрипт
select_y_subjects.sql
с запросом на поллучение предметов из таблицыsubjects
названия которых заканчиваются наy
.
Дополнительный материал
Last updated