image_2025-08-12_15-04-24.png
17.5 KB
Спасибо всем за активное участие и за дискуссию!
При соединении таблиц, LEFT и RIGHT JOIN-ы действительно равноценны и ничего не меняют в выводимом наборе данных, если таблицы в запросе поменять местами. Но, как Вы и написали, если порядок столбцов в блоке SELECT не указан явно (а указана звездочка), то в результирующем наборе столбцы таблиц будут выводиться в порядке указания таблиц в запросе: сначала будут выведены все столбцы первой таблицы запроса, затем столбцы второй таблицы, указанной в запросе и т.д.
При соединении таблиц, LEFT и RIGHT JOIN-ы действительно равноценны и ничего не меняют в выводимом наборе данных, если таблицы в запросе поменять местами. Но, как Вы и написали, если порядок столбцов в блоке SELECT не указан явно (а указана звездочка), то в результирующем наборе столбцы таблиц будут выводиться в порядке указания таблиц в запросе: сначала будут выведены все столбцы первой таблицы запроса, затем столбцы второй таблицы, указанной в запросе и т.д.
👍10❤1
Каким будет результат выполнения следующего запроса (на примере СУБД 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. Идеальный код одной хранимки помещается на одном экране, чтобы не пришлось его прокручивать (конечно, на практике, это далеко не всегда так, но надо к этому стремиться). Если алгоритм большой, то его нужно разбивать на дополнительные функции и процедуры, которые можно использовать в коде основной функции/процедуры.
Чем больше нагрузка и больше одновременно выполняющихся транзакций, тем больше и ответственности при создании хранимых функций и процедур. Хорошо написанный программный код легко сопровождаем и не боится параллельной работы! Ниже собрал для вас основные рекомендации, которые важно учитывать при разработке хранимок (функций, процедур, триггеров).
1. Максимально эффективное обращение к данных (желательно всегда по первичным ключам и индексам);
2. Разделение сложных операций на более простые (сложный update, insert или delete с подзапросами можно упростить - сделать его по ключу, а данные, получаемые подзапросами, можно предварительно положить во временную таблицу или таблицу временного хранения данных);
3. Соблюдение идентичной последовательности работы с таблицами в разных функциях и процедурах (это позволит минимизировать вероятность взаимных блокировок);
4. Форматирование кода (соблюдение отступов, единое оформление, принятое в компании или в конкретной АС), использование регламентов оформления кода;
5. Соблюдение соответствия программы кода хранимки её назначению (процедура, открывающая вклад клиенту, должна открывать вклад клиенту и не должна дополнительно закрывать кредит);
6. Краткое и понятное комментирование неочевидных участков кода;
7. Идеальный код одной хранимки помещается на одном экране, чтобы не пришлось его прокручивать (конечно, на практике, это далеко не всегда так, но надо к этому стремиться). Если алгоритм большой, то его нужно разбивать на дополнительные функции и процедуры, которые можно использовать в коде основной функции/процедуры.
👍4❤3
Всем доброе утро! И опять небольшой тест по основам SQL:
В таблице ORDERS 5 строк:
ID ID_CLIENT TP_ORDER
1 1 1
2 1 1
3 1 2
4 2 NULL
5 2 NULL
В таблице 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
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 р.
Посмотреть программу курса и записаться можно здесь.
- еще есть 3 места;
- обучение по выходным сб, вс (09:00 - 10:00);
- всего 18 уроков, продолжительностью 1 час каждый;
- обучение через Zoom;
- индивидуальная закрытая группа Телеграм, куда я буду выкладывать записи совместных эфиров и конспекты уроков;
- индивидуальная проверка самостоятельных работ;
- цена 9.900 р.
Посмотреть программу курса и записаться можно здесь.
Друзья, напоминаю, что завтра начинаем онлайн обучение SQL, PostgreSQL.
У нас осталось еще 2 места. Можно успеть!
Начнем с самых азов: покажу как устроена база данных, что это такое, что такое SQL, как связываются между собой таблицы, как из них выбирать данные.
Далее расскажу и покажу как работают джоины, как их использовать правильно. Какие задачи ими удобно решать, и где это может привести к ошибкам.
Разберем группировки, подзапросы, запросы из запросов, CTE, аналитические функции и оптимизацию запросов.
Разберем весь DML (часть команд SQL, которыми работают с данными: выбирают, добавляют новые, изменяют и удаляют их) и потом перейдем к DDL, TCL и DCL. Научимся сами проектировать и создавать базы данных, предоставлять доступ к объектам. Разберемся что такое нормализация и денормализация.
Наглядно и на простых примерах покажу что такое транзакция, для чего она нужна. Разберемся и с блокировками: увидим как блокируются таблицы и почему. Научимся работать с данными так, чтобы не вызывать взаимных блокировок (deadlocks)!
В рамках всего обучения мы научимся создавать представления, триггеры и даже немного попрограммируем: создадим несколько функций и парочку стандартных триггеров.
Всего за 18 уроков мы вместе сделаем из Вас востребованных специалистов по базам данных! Я подготовлю Вас к собеседованию и, если нужно, помогу составить резюме.
Обучение провожу очно через Zoom небольшими группами. Каждый урок длится примерно 1 час времени.
Наши эфиры записываю, видео будут доступны в закрытой группе Телеграм. Вы всегда сможете посмотреть наши уроки ещё раз и освежить знания!
Узнать больше и записаться
У нас осталось еще 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
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
👍3❤2
Требуется написать 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'
Таблица 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
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
Какие активные обсуждения вызвала последняя задача! Клёвая совместная работа! Александру выздоровления ☺️
Чтобы решить задачу вывода клиентов, не имеющих в таблице документов записи с типом 'СНИЛС', не используя, при этом, подзапросы, можно воспользоваться 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 за всё!
Узнать больше и записаться можно здесь.
Начинаем на следующей неделе, 2го сентября!
Обучение будет по вт, ср, чт (19:30 - 20:30).
Всего 18 онлайн уроков (6 недель).
Цена: 9.900 за всё!
Узнать больше и записаться можно здесь.
prime-soft.biz
Prime | Курс SQL, PostgreSql
Уроки и курсы SQL, PostgreSQL, Базы данных.
Друзья, спасибо за новые задачи с собеседований! Только, при публикации их здесь, лучше не указывать источник. И, по возможности, немного меняйте текст или данные задач (оставляя смысл).
Таблица реализуемых продуктов (PRODUCTS) имеет вид:
ID NAME
1 Наушники
2 MP-3 плеер
3 Кассета
4 CD-диск
5 Зарядка Nokia
Таблица продаж (SALES) имеет вид:
ID DATE_SALE ID_PRODUCT
1 '2009-04-21' 2
2 '2009-04-21' 1
3 '2009-04-21' 3
4 '2009-04-21' 2
5 '2009-04-21' 4
6 '2009-04-21' 3
7 '2009-04-22' 5
Требуется вывести полный список продуктов и количество сколько каких продали за 21 апреля 2009 года. Товаров, продаж которых не было 21 апреля, тоже нужно вывести. Результат нужно отсортировать по убыванию. Самые продаваемые товары - сверху, которые ни разу не купили - снизу.
Для реализации этого был написан следующий запрос:
SELECT p.ID, p.NAME, COUNT(s.ID) COUNT_SALES
FROM PRODUCTS p
LEFT JOIN SALES s
ON s.ID_PRODUCT = p.ID
WHERE s.DATE_SALE = '2009-04-21'
GROUP BY p.ID, p.NAME
ORDER BY COUNT_SALES NULLS LAST
ID NAME
1 Наушники
2 MP-3 плеер
3 Кассета
4 CD-диск
5 Зарядка Nokia
Таблица продаж (SALES) имеет вид:
ID DATE_SALE ID_PRODUCT
1 '2009-04-21' 2
2 '2009-04-21' 1
3 '2009-04-21' 3
4 '2009-04-21' 2
5 '2009-04-21' 4
6 '2009-04-21' 3
7 '2009-04-22' 5
Требуется вывести полный список продуктов и количество сколько каких продали за 21 апреля 2009 года. Товаров, продаж которых не было 21 апреля, тоже нужно вывести. Результат нужно отсортировать по убыванию. Самые продаваемые товары - сверху, которые ни разу не купили - снизу.
Для реализации этого был написан следующий запрос:
SELECT p.ID, p.NAME, COUNT(s.ID) COUNT_SALES
FROM PRODUCTS p
LEFT JOIN SALES s
ON s.ID_PRODUCT = p.ID
WHERE s.DATE_SALE = '2009-04-21'
GROUP BY p.ID, p.NAME
ORDER BY COUNT_SALES NULLS LAST
❤3
Правильно ли составлен указанный выше запрос?
Anonymous Quiz
33%
Да, правильно
67%
Нет, не правильно
Всех с днём знаний! 🎉
Давайте разберём задачу, похожую на то, что прислали в одном из комментариев. Задача немного дополнена.
Таблица Сотрудников Pers имеет вид:
ID FIO
1 Иванов Иван Иванович
2 Петров Павел Сергеевич
3 Третья Наталья Петровна
4 Четвёртый Ян Борисович
Табллица Должностей Positions имеет вид:
ID NAME
1 Менеджер
2 Топ менеджер
3 Программист
4 Аналитик
Таблица занимаемых сотрудниками должностей имеет вид :
ID_PERS - идентификатор сотрудника
ID_POS - идентификатор должности
DT_START - дата начала работы сотрудника в должности
DT_END - дата окончания работы сотрудника на должности, если значение NULL, то сотрудник работает на должности по настоящее время.
ID_PERS ID_POS DT_START DT_END
1 1 2020-01-15 2021-06-01
1 2 2021-06-02 NULL
2 1 2020-02-01 2022-03-31
2 2 2022-04-01 NULL
3 3 2020-02-01 NULL
4 3 2020-01-16 2020-06-01
5 4 2022-08-09 NULL
Вывести ФИО сотрудников и названия позиций, которые они занимали по состоянию на 01.01.2022. Еще не пришедших к этому времени сотрудников отображать не нужно, только тех, кто работал по состоянию на 01.01.2022 и должности, которые они занимали.
Решение задачи выложу попозже.
Давайте разберём задачу, похожую на то, что прислали в одном из комментариев. Задача немного дополнена.
Таблица Сотрудников Pers имеет вид:
ID FIO
1 Иванов Иван Иванович
2 Петров Павел Сергеевич
3 Третья Наталья Петровна
4 Четвёртый Ян Борисович
Табллица Должностей Positions имеет вид:
ID NAME
1 Менеджер
2 Топ менеджер
3 Программист
4 Аналитик
Таблица занимаемых сотрудниками должностей имеет вид :
ID_PERS - идентификатор сотрудника
ID_POS - идентификатор должности
DT_START - дата начала работы сотрудника в должности
DT_END - дата окончания работы сотрудника на должности, если значение NULL, то сотрудник работает на должности по настоящее время.
ID_PERS ID_POS DT_START DT_END
1 1 2020-01-15 2021-06-01
1 2 2021-06-02 NULL
2 1 2020-02-01 2022-03-31
2 2 2022-04-01 NULL
3 3 2020-02-01 NULL
4 3 2020-01-16 2020-06-01
5 4 2022-08-09 NULL
Вывести ФИО сотрудников и названия позиций, которые они занимали по состоянию на 01.01.2022. Еще не пришедших к этому времени сотрудников отображать не нужно, только тех, кто работал по состоянию на 01.01.2022 и должности, которые они занимали.
Решение задачи выложу попозже.
👍5❤2
MS Excel - мощный инструмент для работы с данными не только для аналитика, но и разработчика! Научитесь реализовать функционал в популярном табличном редакторе и значительно расширите его возможности!
Как писать код правильно, а его выполнение сделать максимально производительным научим на нашем курсе.
Чему мы научимся:
- Эффективно использовать имеющийся функционал (Сводные таблицы, ВПР, ГПР, ПОИСКПОЗ, ИНДЕКС, СЧЁТЕСЛИМН, СУММЕСЛИМН, условное форматирование на основе формул и многое другое). Покажем примеры задач, которые эффективнее всего решать имеющимися возможностями;
- Писать макросы, пользоваться внутренним языком программирования Excel (VBA), который существенно расширяет возможности популярного табличного редактора;
- Автоматизировать работу с данными, подготовку отчётности на основе сырых данных, создание алгоритмов сбора данных для отчетов из файла или внешних файлов, консолидация, сквозные формулы и прочее;
- Реализовывать сложный функционал (например, равномерное распределение документов между сотрудниками, создание графика работы сотрудников с учетом личных данных каждого из них и первичной информации, и прочее);
- Составлять алгоритмы для решения любых задач;
- Оптимизировать код и делать его выполнение быстрее.
Весь курс со скидкой стоит 4.500 р. Узнать подробнее и записаться можно здесь: https://prime-soft.biz/courses/vba
Как писать код правильно, а его выполнение сделать максимально производительным научим на нашем курсе.
Чему мы научимся:
- Эффективно использовать имеющийся функционал (Сводные таблицы, ВПР, ГПР, ПОИСКПОЗ, ИНДЕКС, СЧЁТЕСЛИМН, СУММЕСЛИМН, условное форматирование на основе формул и многое другое). Покажем примеры задач, которые эффективнее всего решать имеющимися возможностями;
- Писать макросы, пользоваться внутренним языком программирования Excel (VBA), который существенно расширяет возможности популярного табличного редактора;
- Автоматизировать работу с данными, подготовку отчётности на основе сырых данных, создание алгоритмов сбора данных для отчетов из файла или внешних файлов, консолидация, сквозные формулы и прочее;
- Реализовывать сложный функционал (например, равномерное распределение документов между сотрудниками, создание графика работы сотрудников с учетом личных данных каждого из них и первичной информации, и прочее);
- Составлять алгоритмы для решения любых задач;
- Оптимизировать код и делать его выполнение быстрее.
Весь курс со скидкой стоит 4.500 р. Узнать подробнее и записаться можно здесь: https://prime-soft.biz/courses/vba
👍1