Пишем на SQL
1.93K subscribers
38 photos
6 videos
7 files
97 links
Уроки по SQL. Изучаем базы данных на примере СУБД ORACLE, MySQL, MS SQL Server, PostgreSql
Download Telegram
Добрый вечер, дорогие друзья!

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

Здравствуйте, Илья. Меня Шолпан зовут. Я ваша бывшая студентка. Сегодня я получила оффер (как сейчас модно говорить). Моя работа будет связана непосредственно с SQL. Работодатель, перед собеседованием скинул мне на почту задания по SQL, которые я с легкостью решила. Хочу вам сказать, человеческое спасибо, за то, что вы так доходчиво объясняли материал (а курсов по SQL, я пересмотрела много). Также благодарю Юлию, которая мне помогала с домашними заданиями. После ваших курсов, после полученного багажа знаний, я начала изучать Python, хочу отметить, что я с таким наслаждением слушала преподавателя, потому что мне, основные термины в программировании были понятны, тоесть я не лезла в интернет, что бы находить значение слов, а с удовольствием слушала лектора и получала новые знания.

В понедельник приступаю к новой работе, работать буду с sql. Я выросла на ступень выше. Благодарю вас за ваш талант преподавателя. Успехов вам в вашей работе и семейного счастья.
🔥21👍9
Добрый день, друзья!

Предлагаю очередную задачу по SQL. Есть два запроса.

Запрос 1:
SELECT o.*,
(SELECT COUNT(*)
FROM ORDER_ITEMS
WHERE ID_ORDER = o.ID) AS COUNT_ITEMS
FROM ORDERS o
WHERE o.ID = 10

Запрос 2:
SELECT o.*,
COALESCE( (SELECT COUNT(*)
FROM ORDER_ITEMS
WHERE ID_ORDER = o.ID), 0) AS COUNT_ITEMS
FROM ORDERS o
WHERE o.ID = 10
👍5
В таблице ORDER_ITEMS нет строк со значением 10 в столбце ID_ORDER. Результат выполнения обеих запросов:
Anonymous Quiz
56%
будет одинаков
44%
будет разный
This media is not supported in your browser
VIEW IN TELEGRAM
Видео от Ilia Khokhlov
🔥11👍7
Всем доброй пятницы и хороших выходных!
9
Доброе утро, друзья!
Всем хорошего понедельника и продуктивной недели!

Спасибо, что продолжаете делиться интересными задачами по SQL.

Предлагаю поучаствовать в решении ещё одной задачи, которая поступила в прошлую пятницу. Текст задачи немного переделал и конкретизировал.

Дана таблица ACCOUNTS, содержащая данные о счетах клиентов (у клиента может быть несколько счетов). Среди прочих, в таблице ACCOUNTS есть следующие важные для нас столбцы:
        ID_CLIENT - идентификатор клиента
        DT_OPEN – дата открытия счета
        DT_CLOSE – дата закрытия счета

Если дата закрытия счёта не заполнена (содержит значение NULL), то счет открыт на текущий день.

Требуется написать SQL-запрос, который должен посчитать количество клиентов с открытым счетом помесячно. Учитывать только счета, которые были открыты более одного дня. При решении нельзя использовать оператор DISTINCT.

Если счёт открыт в марте и закрыт в мае, то клиент с таким счетом должен войти в количество клиентов с открытым счетом во всех месяцах с марта по май включительно.

Отчёт должен быть вида:

Год      Месяц        Колво откр.клиентов
2005    январь         23
2005    февраль      89
2005    март            167
....

Попозже опубликую один из вариантов решения!
Пишем на SQL
Доброе утро, друзья! Всем хорошего понедельника и продуктивной недели! Спасибо, что продолжаете делиться интересными задачами по SQL. Предлагаю поучаствовать в решении ещё одной задачи, которая поступила в прошлую пятницу. Текст задачи немного переделал…
Всем доброго вторника!

По предыдущей задаче скоро возьму и сделаю видеоразбор единственного присланного решения! Интересное решение придумал Виталий! Кто-то попытался вникнуть в то, как была решена задача? 😉
Мощно, да?! Скоро сделаю видеоразбор!
👍3
Всем доброго вечера!

Наконец, нашёл время разобрать решение предыдущей задачи, присланное Виталием!

Виталий, спасибо за участие!

Изначально собирался подготовить небольшое видео разбора решения (именно видео), но, в итоге, решил ограничиться текстовым вариантом. Надеюсь не повлияет на восприятие.

Начинается решение с созданием CTE (временной таблицы данных, которой будет дано собственное имя и которая будет "жить" пока выполняется скрипт получения данных). Про CTE я уже записывал небольшое видео здесь: https://youtu.be/xuoIfDBKI7I

Инструкция WITH отбирает в набор данных счета, с даты открытия по дату закрытия которых прошло более одного дня. При отсутствии даты закрытия рассчитывается по текущую дату. И называется это потом "t".

И вот дальше самое интересное 😀 к полученному набору данных "t" коннектятся данные этого же набора данных своего клиента по количеству раз, равным количеству месяцев, на протяжении которых был открыт счёт. Может быть здесь немного переделать и соединять по идентификатору счета (должен же быть такой столбец в таблице счетов)?
Очень любопытно: ORACLE оценил план выполнения запроса как достаточно нетрудоёмкий, но я не смог дождаться результата выполнения запроса (ждал более 10ти минут). Я бы, всё же, немного переделал запрос по части размноживания (дублирования) строк каждого счета по количеству месяцев в котором он был открыт на способ с помощью обычного джоина. К таблице счетов, или CTE с именем "t" можно приджоинить динамически созданную таблицу месяцев. К каждому счету можно приджоинить столько месяцев, сколько счёт был открыт. То есть идея такая же, но использование обычного джоина заместо сложного CONNET BY заметно (иногда очень заметно) упростит выполнение запроса!

Спасибо большое за внимание к задаче и участие в её решении!
1👍1
В базе данных есть таблица VOUCHERS, в которой, среди прочих, есть столбец ID_CODE, определённый как INT NOT NULL.
В таблице всего три строки со значением 1 (один) в этом столбце, у остальных строк в этом столбце другое значение.
👍4
Сколько строк вернёт следующий запрос:

SELECT * FROM VOUCHERS WHERE ID_CODE IN (1, NULL)
Anonymous Quiz
17%
1
56%
3
6%
0
22%
Запрос не выполнится. Будет SQL-ошибка.
👍1🔥1
Усложненная версия предыдущей задачи

В базе данных есть таблица VOUCHERS, в которой, среди прочих, есть столбец ID_CODE, определённый как NUMBER (с возможностью сохранения значений NULL).

В таблице всего пять строк.
У трёх строк значение 1 (один) в этом столбце, и ещё у двух строк значение в этом столбце NULL.
👍2
Сколько строк вернёт следующий запрос:

SELECT * FROM VOUCHERS WHERE ID_CODE IN (1, NULL)
Anonymous Quiz
30%
3
46%
5
7%
0
18%
Запрос не сможет выполняться. Будет SQL-ошибка
В каком порядке выводятся данные, получаемые SQL-запросом, если в запросе не указан ORDER BY?

- данные выводятся в таком порядке, в котором их проще вывести для СУБД. При отсутствии блока ORDER BY один и тот же запрос, запускаемый в разное время, даже может выводить одни и те же данные в разном порядке.
6👌5🔥1
Всем привет!

А вот и задача на этот понедельник! По сложности назначаю 1 звёздочку! Проверьте себя, ничего не забыли из основы основ? И внимательно читаем условие задачи, ато обидно будет ответить не правильно на достаточно простой задаче 😉

Таблица PERS определена следующим образом:
(ID NUMBER NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL)

Запрос
SELECT COUNT(*)
FROM PERS
WHERE NAME = 'Иванов Иван Иванович'
возвращает число 2.
🔥2
Сколько строк вернёт следующий запрос?

SELECT DISTINCT ID, NAME FROM PERS WHERE NAME = 'Иванов Иван Иванович'
Anonymous Quiz
1%
0
29%
1
58%
2
11%
Запрос может вернуть любое количество строк
5👍2
Сегодня вечером напишу объяснение правильного ответа!
👍2
Оператор DISTINCT оставляет в результирующей таблице строки с неповторимым набором значений во всех выводимых (командой SELECT) столбцах. Несмотря на то, что в столбце NAME для всех выводящихся строк значение одинаковое, в столбце ID - значение для этих строк, разное (т.к. столбец ID определён как первичный ключ). Оператор DISTINCT убрал бы вторую строку (и последующие), если бы совпали значения по всем выводящимся столбцам.
11👍1
Всем доброго понедельника!

А вот и ещё одна небольшая задача по SQL🙂👇

В таблице INVOICES две строки. В первой строке в столбце QTY число 25, во второй строке в этом же столбце лежит NULL.
Какой будет результат запроса?

SELECT SUM(QTY) FROM INVOICES
Anonymous Quiz
68%
25
2%
0
15%
NULL
15%
Выполнение запроса приведёт к SQL ошибке
4