ch
Feedback
Пишем на SQL

Пишем на SQL

前往频道在 Telegram

Уроки по SQL. Изучаем базы данных на примере СУБД ORACLE, MySQL, MS SQL Server, PostgreSql Мой курс по SQL и базам данных: https://prime-soft.biz/courses/sql Связь со мной @iliahohlov

显示更多
1 891
订阅者
-124 小时
-57
-730
帖子存档
Аудит - это хорошо! Особенно, когда он комплексный! На прошлой неделе для одной из компаний подмосковья, для которой мы пишем и сопровождаем программное обеспечение уже более 10ти лет, подготовили результат аудита нашего программного кода. Компания, которая подготавливала аудит, разумеется сторонняя, и должна была дать оценку нашей работе. На подготовку результатов аудита ушло около трёх недель. Интересно, наверное, узнать результаты? В целом код неплохой (уже хорошо), но местами, в рамках одного запроса, допущено дублирование фрагментов SQL-кода. В рамках кода хранимых процедур отсутствуют составные индексы. Начну с последнего: составные индексы у нас есть (интересно как они смотрели), иногда без последнего столбца в списке столбцов индекса, но на месте это не играло особой роли. Дублирование фрагментов SQL-кода в рамках одного запроса иногда делается намерено: получение одних данных по разным условиям из одних и тех же таблицы иногда лучше сделать через UNION, не используя сложные вычисления или оператор OR. Подходить к оценке кода, который отлаживался 10 лет нужно комплексно. Обязательно брать во внимание что и как используется. Даже собственную оценку нужно ставить под сомнения. Как резульат: нам пришлось давать свои комментарии заказчику по пунктам аудита🙂 Принимаем во внимание , что и за три недели очень сложно комплексно оценить программный код, который писался, дополнялся в течение 10ти лет.

Всем привет и хороших выходных! Сегодня утром провёл очередной урок онлайн-обучения SQL, PostgreSQL через Zoom. У нас пятый уроки из 18ти и мы уже учимся группировать данные. Если кому-то пока сложно даются группировки, сложно понять какое поле указывать в блоке SELECT, какое в блоке GROUP BY, то вот мини правило (это если пока сложно даются группировки, то можно пока просто запомнить его): все столбцы, которые мы хотим показать в блоке SELECT без агрегатных функций, должны быть и в блоке GROUP BY (например если мы группируем данные по PersonID и хотим вывести в блоке SELECT не только PersonID, но и FIO, то FIO также следует поместить в блок GROUP BY), но столбцы, которые есть в блоке GROUP BY, не обязательно выводить в блоке SELECT (по желанию). Возможно, его лучше прочитать два раза ☺️ Кстати, новая группа выходного дня онлайн обучения начинается уже на следующих выходных. Будем учиться по субботам и воскресеньям с 10:30 до 11:30. У нас уже 4 человека. Посмотреть программу курса и записаться можно здесь.

Друзья, до вторника (09.09.2025) продлеваем летние скидки на обучение SQL и обучение программированию в PL/SQL (ORACLE)! 🎁 Весь курс SQL и базам данных за 8.900 программа обучения записаться и оплатить Весь курс Программирования в PL/SQL (ORACLE) за 14.500 программа обучения записаться и оплатить Курс SQL + Программирование в PL/SQL (ORACLE) за 16.900 записаться и оплатить Всё обучение индивидуальное! Начать можем сразу после оплаты! Время на обучение не ограниченно (но желательно проходить не менее 1-2 урока в неделю). Буду рад дополнительным вопросам на почту info@prime-soft.biz или под постом.

image_2025-09-05_11-01-17.png0.48 KB

Все задачи по базам данных можно решить множеством способов. Из составленных решений выбирается наиболее эффективное и простое в написании. Спасибо Вам за активность по этой задаче! Понравилось, как просто решил задачу @Skiffrusspb. К сотрудникам можно присоединить занимаемые позиции по идентификатору сотрудника с дополнительным условием, что дата, на которую формируют запрос, входит в период занимаемой должности. Должна присоединиться максимум одна запись из таблицы истории занимаемых должностей. В один и тот же день сотрудник ведь может работать только на одной должности, поэтому только одна строчка из PersPositions для каждого сотрудника может найтись, или ни одна вообще, если сотрудник уже уволился к указанной дате. Александр, я добавил COALESCE при сравнении с датой окончания. Если дата окончания не указана, то будет подставляться текущий день, в результате еще немного упростил код:
SELECT p.*,
       pp.dt_start, pp.dt_end,
       po.name  POS_NAME
  FROM Pers p
  JOIN PersPositions pp
    ON pp.ID_PERS = p.ID
   AND '2022-01-01' BETWEEN pp.DT_START AND COALESCE(pp.DT_END, CURRENT_DATE)
  JOIN Positions po
    ON po.ID = pp.id_pos

Доброе утро, друзья! Спасибо за активное участие в решении предыдущей задачи! Я тоже подготовил небольшое видео разбора её решения: https://rutube.ru/video/654cce66166fd0ea16af5b7d63f18746/

MS Excel - мощный инструмент для работы с данными не только для аналитика, но и разработчика! Научитесь реализовать функционал в популярном табличном редакторе и значительно расширите его возможности! Как писать код правильно, а его выполнение сделать максимально производительным научим на нашем курсе. Чему мы научимся: - Эффективно использовать имеющийся функционал (Сводные таблицы, ВПР, ГПР, ПОИСКПОЗ, ИНДЕКС, СЧЁТЕСЛИМН, СУММЕСЛИМН, условное форматирование на основе формул и многое другое). Покажем примеры задач, которые эффективнее всего решать имеющимися возможностями; - Писать макросы, пользоваться внутренним языком программирования Excel (VBA), который существенно расширяет возможности популярного табличного редактора; - Автоматизировать работу с данными, подготовку отчётности на основе сырых данных, создание алгоритмов сбора данных для отчетов из файла или внешних файлов, консолидация, сквозные формулы и прочее; - Реализовывать сложный функционал (например, равномерное распределение документов между сотрудниками, создание графика работы сотрудников с учетом личных данных каждого из них и первичной информации, и прочее); - Составлять алгоритмы для решения любых задач; - Оптимизировать код и делать его выполнение быстрее. Весь курс со скидкой стоит 4.500 р. Узнать подробнее и записаться можно здесь: https://prime-soft.biz/courses/vba

Всех с днём знаний! 🎉 Давайте разберём задачу, похожую на то, что прислали в одном из комментариев. Задача немного дополнена. Таблица Сотрудников 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           2020-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 и должности, которые они занимали. Решение задачи выложу попозже.

Правильно ли составлен указанный выше запрос?
Anonymous voting

Таблица реализуемых продуктов (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

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

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

Всем привет! Какие активные обсуждения вызвала последняя задача! Клёвая совместная работа! Александру выздоровления ☺️ Чтобы решить задачу вывода клиентов, не имеющих в таблице документов записи с типом 'СНИЛС', не используя, при этом, подзапросы, можно воспользоваться 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

Правильно ли выполнено задание? 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 voting

Требуется написать 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'

Друзья, всем доброе утро и хорошего понедельника! 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

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

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

Какое значение вернет запрос: SELECT COUNT(DISTINCT TP_ORDER) FROM ORDERS
Anonymous voting

Всем доброе утро! И опять небольшой тест по основам SQL: В таблице ORDERS 5 строк: ID ID_CLIENT TP_ORDER 1 1 1 2 1 1 3 1 2 4 2 NULL 5 2 NULL