Пишем на SQL
1.92K subscribers
43 photos
7 videos
12 files
116 links
Уроки по SQL. Изучаем базы данных на примере СУБД ORACLE, MySQL, MS SQL Server, PostgreSql

Мой курс по SQL и базам данных:
https://prime-soft.biz/courses/sql

Связь со мной @iliahohlov
Download Telegram
image_2025-08-04_00-25-22.png
16.4 KB
Всем доброго понедельника! Как насчет филворда на тему баз данных на русском?! Сложность не высокая. Всего спрятано 23 слова. Решение опубликую чуть позже.
Спасибо всем за участие! Ниже перечень слов, из которых составлен филворд:

База
Выборка
Да
Запись
Запрос
Зависимость
И
Или
Ключ
Код
Команда
Кортеж
Минус
Не
Объединение
Один
Множество
Нет
Поле
Связь
Столбец
СУБД
Таблица
👍61🤔1🤮1
Сегодня нашёл интересный тест на тему соединений.
В чем разница между LEFT JOIN и RIGHT JOIN, если соединяемые таблицы в запросе поменять местами?
Anonymous Quiz
40%
Разницы нет, это эквивалентные операции
5%
LEFT JOIN всегда быстрее
6%
RIGHT JOIN не поддерживается в некоторых крупных СУБД
49%
Разный порядок столбцов в результате
image_2025-08-12_15-04-24.png
17.5 KB
Спасибо всем за активное участие и за дискуссию!
При соединении таблиц, LEFT и RIGHT JOIN-ы действительно равноценны и ничего не меняют в выводимом наборе данных, если таблицы в запросе поменять местами. Но, как Вы и написали, если порядок столбцов в блоке SELECT не указан явно (а указана звездочка), то в результирующем наборе столбцы таблиц будут выводиться в порядке указания таблиц в запросе: сначала будут выведены все столбцы первой таблицы запроса, затем столбцы второй таблицы, указанной в запросе и т.д.
👍101
Каким будет результат выполнения следующего запроса (на примере СУБД MySQL, PostgreSQL)? SELECT FLOOR(10.9), CEIL(10.1)
Anonymous Quiz
31%
10, 10
40%
10, 11
25%
11, 10
4%
11, 11
image_2025-08-18_08-40-18.png
7.7 KB
Любая СУБД может группировать данные на основе значения не только одного столбца, а, при необходимости, набора столбцов. Тогда строчки, с одинаковыми значениями, указанных в GROUP BY столбцах, будут сливаться в одну. Строчки, у которых, хотя бы в одном из указанных столбцов, значение другое - будут создавать новую группу. Например, подсчитаем сколько сотрудников работает в каждом филиале в каждом отделе:
👍4
image_2025-08-18_08-40-53.png
77.9 KB
Получаем итоги на каждое сочетание название филиала и название отдела:
👍6
Мини-тест на знание основ SQL ⭐️! Что вернёт запрос? SELECT COALESCE(NULL, NULL, 'SQL', 'DB');
Anonymous Quiz
28%
NULL
64%
SQL
8%
DB
Рекомендации по написанию программного кода хранимых функций и процедур

Чем больше нагрузка и больше одновременно выполняющихся транзакций, тем больше и ответственности при создании хранимых функций и процедур. Хорошо написанный программный код легко сопровождаем и не боится параллельной работы! Ниже собрал для вас основные рекомендации, которые важно учитывать при разработке хранимок (функций, процедур, триггеров).

1. Максимально эффективное обращение к данных (желательно всегда по первичным ключам и индексам);

2. Разделение сложных операций на более простые (сложный update, insert или delete с подзапросами можно упростить - сделать его по ключу, а данные, получаемые подзапросами, можно предварительно положить во временную таблицу или таблицу временного хранения данных);

3. Соблюдение идентичной последовательности работы с таблицами в разных функциях и процедурах (это позволит минимизировать вероятность взаимных блокировок);

4. Форматирование кода (соблюдение отступов, единое оформление, принятое в компании или в конкретной АС), использование регламентов оформления кода;

5. Соблюдение соответствия программы кода хранимки её назначению (процедура, открывающая вклад клиенту, должна открывать вклад клиенту и не должна дополнительно закрывать кредит);

6. Краткое и понятное комментирование неочевидных участков кода;

7. Идеальный код одной хранимки помещается на одном экране, чтобы не пришлось его прокручивать (конечно, на практике, это далеко не всегда так, но надо к этому стремиться). Если алгоритм большой, то его нужно разбивать на дополнительные функции и процедуры, которые можно использовать в коде основной функции/процедуры.
👍43
Всем доброе утро! И опять небольшой тест по основам SQL:

В таблице ORDERS 5 строк:
ID ID_CLIENT TP_ORDER
1 1 1
2 1 1
3 1 2
4 2 NULL
5 2 NULL
Какое значение вернет запрос:
SELECT COUNT(DISTINCT TP_ORDER) FROM ORDERS
Anonymous Quiz
3%
NULL
3%
1
47%
2
35%
3
3%
4
3%
5
6%
Будет ошибка выполнения SQL-запроса
В эту субботу начинаем интенсив SQL, PostgreSQL

- еще есть 3 места;
- обучение по выходным сб, вс (09:00 - 10:00);
- всего 18 уроков, продолжительностью 1 час каждый;
- обучение через Zoom;
- индивидуальная закрытая группа Телеграм, куда я буду выкладывать записи совместных эфиров и конспекты уроков;
- индивидуальная проверка самостоятельных работ;
- цена 9.900 р.

Посмотреть программу курса и записаться можно здесь.
Друзья, напоминаю, что завтра начинаем онлайн обучение SQL, PostgreSQL.

У нас осталось еще 2 места. Можно успеть!

Начнем с самых азов: покажу как устроена база данных, что это такое, что такое SQL, как связываются между собой таблицы, как из них выбирать данные.
Далее расскажу и покажу как работают джоины, как их использовать правильно. Какие задачи ими удобно решать, и где это может привести к ошибкам.
Разберем группировки, подзапросы, запросы из запросов, CTE, аналитические функции и оптимизацию запросов.
Разберем весь DML (часть команд SQL, которыми работают с данными: выбирают, добавляют новые, изменяют и удаляют их) и потом перейдем к DDL, TCL и DCL. Научимся сами проектировать и создавать базы данных, предоставлять доступ к объектам. Разберемся что такое нормализация и денормализация.
Наглядно и на простых примерах покажу что такое транзакция, для чего она нужна. Разберемся и с блокировками: увидим как блокируются таблицы и почему. Научимся работать с данными так, чтобы не вызывать взаимных блокировок (deadlocks)!
В рамках всего обучения мы научимся создавать представления, триггеры и даже немного попрограммируем: создадим несколько функций и парочку стандартных триггеров.
Всего за 18 уроков мы вместе сделаем из Вас востребованных специалистов по базам данных! Я подготовлю Вас к собеседованию и, если нужно, помогу составить резюме.

Обучение провожу очно через Zoom небольшими группами. Каждый урок длится примерно 1 час времени.
Наши эфиры записываю, видео будут доступны в закрытой группе Телеграм. Вы всегда сможете посмотреть наши уроки ещё раз и освежить знания!

Узнать больше и записаться
🔥1
Друзья, всем доброе утро и хорошего понедельника!

HAVING в команде SELECT можно использовать в запросах без GROUP BY (без указания столбца или столбцов, по которым группировать данные). Тогда вообще все строки, получаемые запросом, будут сгруппированы в одну единственную строку (вся получаемая таблица - это одна большая группа). С помощью HAVING можно проанализировать общие данные группы, определить нужно ли ей отображаться. Пример:

SELECT COUNT(*)
FROM PERSONS
HAVING COUNT(*) > 10

Пример вывода объектов, расположенных в разных таблицах, у которых количество больше 10:

SELECT 'Столов достаточно' NM_OBJ
FROM TABLES
HAVING COUNT(*) > 10
UNION ALL
SELECT 'Стульев достаточно' NM_OBJ
FROM CHAIRS
HAVING COUNT(*) > 10
👍32
Требуется написать SQL-запрос, выводящий список клиентов, для которых в таблице документов нет записи с типом "СНИЛС", не используя, при этом, подзапросы.
Таблица CLIENTS имеет вид:
ID NAME
1 Иванов
2 Петров
3 Сидоров
4 Ломоносова
5 Веган

Таблица DOCS имеет вид:
ID ID_CLIENT DOC_TYPE DOC_NUM
1 1 'ПАСПОРТ' '1245 12'
2 1 'СНИЛС' '123-123'
3 2 'ПАСПОРТ' '1277 12'
4 3 'СНИЛС' '123-333'
5 5 'ЗАГРАН' '567444'
2
Правильно ли выполнено задание?

SELECT c.* FROM CLIENTS c LEFT JOIN DOCS d ON d.ID_CLIENT = c.ID WHERE d.DOC_TYPE <> 'СНИЛС' OR d.DOC_TYPE IS NULL
Anonymous Quiz
49%
Да
51%
Нет
3👍1
Всем привет!

Какие активные обсуждения вызвала последняя задача! Клёвая совместная работа! Александру выздоровления ☺️

Чтобы решить задачу вывода клиентов, не имеющих в таблице документов записи с типом 'СНИЛС', не используя, при этом, подзапросы, можно воспользоваться LEFT JOIN-ом. Выводя клиентов попробуем присоединить к каждому именно его СНИЛС, а потом во WHERE укажем, чтобы отображались В РЕЗУЛЬТИРУЮШЕЙ ТАБЛИЦЕ только такие клиенты, к которым СНИЛС присоединить НЕ удалось.

SELECT c.*
FROM CLIENTS c
LEFT JOIN DOCS d
ON d.ID_CLIENT = c.ID
AND d.DOC_TYPE = 'СНИЛС'
WHERE d.ID IS NULL

В примере выше к клиентам соединяем только документ с типом 'СНИЛС', поэтому в джоине сразу два условия. Если было бы соединение только по ID_CLIENT, то клиентам присоединились бы все их документы и отсеивание на уровне WHERE могло бы только убрать строки с типом 'СНИЛС', но клиенты всё равно могли бы быть выведены с другим типом документа.

В комментариях под задачей увидел правильные решения!
@IgorSmirnov @sova_gde_hvost
👍8
Друзья, набираю группу на обучение SQL по будням вечером!

Начинаем на следующей неделе, 2го сентября!
Обучение будет по вт, ср, чт (19:30 - 20:30).
Всего 18 онлайн уроков (6 недель).
Цена: 9.900 за всё!

Узнать больше и записаться можно здесь.
Друзья, спасибо за новые задачи с собеседований! Только, при публикации их здесь, лучше не указывать источник. И, по возможности, немного меняйте текст или данные задач (оставляя смысл).