SQL и Базы Данных – Telegram
SQL и Базы Данных
4.2K subscribers
165 photos
5 videos
183 links
Задачи по базам данных и SQL

Основы языка SQL, задачи и решения к ним.

Админ: @anothertechrock
Download Telegram
Трюк дня. SQL - Сортировка зеркальных строк

Есть БД со следующей структурой:
id team1      team2
1 spartak csk
2 csk spartak
3 real spartak
4 csk real

Нужно написать запрос что-бы узнать сколько раз команды играли между собой в виде:
game          num
spartak-csk 2
real-spartak 1
csk-real 1

Решение будет завтра.

#tips
👍1👏1
Чем NULL отличается от 0

Решение будет вечером.

#вопросы #собеседование
0 - это число.

NULL - это не число, а также NULL не является значением пустой строки. NULL используется для указания того, что данные отсутствуют, неизвестны, неприменимы. NULL не равен ничему, даже другому NULL.

#вопросы #собеседование
👍5🏆3
Вопрос с собеседования.

В чём разница между UNION и UNION ALL?
Ответ на "В чём разница между UNION и UNION ALL?".

Оба UNION и UNION ALL объединяют результат двух разных SQL запросов.

Они отличаются тем, как они обрабатывают дубликаты:

UNION выполняет DISTINCT в результирующем наборе, исключая любые повторяющиеся строки.

UNION ALL не удаляет дубликаты, и поэтому он быстрее, чем UNION.
🔥6
Есть библиотека с книгами. Оперируя сущностями «Книга» и «Автор», Вы хотите сохранить реестр своей библиотеки в БД. Сколько таблиц понадобится для эффективного хранения такой структуры в 3-й нормальной форме?
Anonymous Quiz
5%
1
27%
2
55%
3
3%
4
10%
Узнать ответ
Трюк дня. Получить id покупки с максимальной value для каждого customer.

Например, есть таблица:

id customer value
1 Alex 5
2 Sam 1
3 Sam 3

В результате нужно получить следующее:

id customer value
1 Alex 5
3 Sam 3

В PostgreSQL можно использовать оператор DISTINCT ON:


SELECT
DISTINCT ON(customer)
id,
customer,
value
FROM table
ORDER BY customer, value
DESC, id


#tips
А какие варианты решения вы знаете?
👍3🔥2
Трюк дня. Найти записи с граничными значениями без соединения таблицы на саму себя

Один из вариантов - это сначала найти максимальное значение для каждого ID с помощью GROUP BY, и затем соединить таблицу с самой собой по ID и max значению.
Но есть способ лучше:

SELECT
dat2.*
FROM
(
SELECT
dat.*,
CASE WHEN (num = MAX(num) OVER (PARTITION BY id)) THEN 'y' ELSE 'n' END AS max_num
FROM current_table dat
) dat2
WHERE max_num = 'y'

#tips
👍9💩4
Media is too big
VIEW IN TELEGRAM
Полезные функции и операторы SQL

В этом видео автор рассматривает функции и операторы SQL, которые наиболее полезны в виду их разнообразного применения.

00:00 Вступление
00:24 Работа с полями таблиц в SQL
00:57 Создать таблицу для работы
01:09 Добавить поле в таблицу
01:34 Узнать тип поля
01:48 Переместить поле
02:22 Изменить тип поля
03:19 Переименовать поле
03:37 Удалить поле
03:58 Форматирование записей
05:55 Временные таблицы в SQL

Смотреть это видео на youtube: youtu.be/SglQ7CCkkTw
👍5
Трюк дня. Удаление лишних пробелов в строке с использованием REGEX.

Предположим, есть строка, содержащая такой текст:
This is a test string


Требуется удалить из строки лишние пробелы.


Решение:
Используйте функцию REGEXP_REPLACE:

SELECT
REGEXP_REPLACE('This is a test string','( ){2,}',' ');


#tips
👍12
Вопрос с собеседования

Напишите запрос для получения количества полных месяцев (результат должен быть INTEGER) между двумя TIMESTAMPS: date1 и date2.

#вопросы #собеседование
Ответ на вопрос с собеседования

ABS (TIMESTAMPDIFF (MONTH, date1, date2));

TIMESTAMPDIFF возвращает разницу date2 - date1 в полных месяцах. Поэтому, например,
(MONTH, '2022-01-05 00:00:00',
'2022-05-07 00:00:00') = 4,
а
(MONTH, '2022-01-05 00:00:00',
'2022-05-04 00:00:00') = 3.

Функция ABS возвращает модуль числа, то есть преобразует число из отрицательного в положительное. Охватывает те случаи, когда date1 > date2.

#вопросы #собеседование
3👍3
Трюк дня. Найти второе место по зарплате

Напишите SQL-запрос для получения из таблицы (employee) с зарплатами записи, содержащие вторую по размеру заработную плату.

Например, для таблицы на картинке выше такой запрос должен вернуть 200. Если в таблице нет значения, меньшего, чем самая высокая зарплата — запрос должен вернуть null.

Решение будет вечером.

#tips
Трюк дня. Найти второе место по зарплате. Решение.

Решение 1: использование IFNULL и OFFSET

• IFNULL(expression, alt): эта функция возвращает аргумент expression в случае, если он не равен null. В противном случае возвращается аргумент alt. Мы используем эту функцию чтобы возвратить null, если в таблице не окажется искомого значения.
• OFFSET: этот оператор используется с ORDER BY для того чтобы отбросить первые n строк. Используется для получения второго по величине значения.

SELECT
IFNULL(
(SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1
OFFSET 1
), null) AS sec_salary
FROM employee
LIMIT 1


Решение 2: использование MAX

Здесь выбирается самое большое значение зарплаты, не равное максимальной зарплате, полученной по всей таблице. В результате мы и получаем то, что нужно — вторую по величине зарплату.

SELECT
MAX(salary) AS sec_salary
FROM Employee
WHERE salary != (SELECT MAX(salary) FROM employee)


#tips
5👍4🤔3
Трюк дня. Сравнение с предыдущим

Напишите SQL-запрос, который находит в таблице weather все даты (идентификаторы дат), когда температура была бы выше температуры на предшествующие им даты. То есть, нас интересуют даты, в которые «сегодняшняя» температура выше «вчерашней».

Решение будет завтра.

#tips
👍1
Трюк дня. Сравнение с предыдущим. Решение.

Решение: использование DATEDIFF

DATEDIFF
: эта функция вычисляет разницу между двумя датами. Она используется для того, чтобы обеспечить сравнение именно «сегодняшних» и «вчерашних» температур.

Если сформулировать обычным языком следующий запрос, то окажется, что он выражает следующую идею: нужно выбрать такие идентификаторы, чтобы температура, соответствующая представляемым ими датам, была бы больше, чем температура на «вчерашние» по отношению к ним даты.

SELECT DISTINCT a.Id
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature
AND DATEDIFF(a.Recorddate, b.Recorddate) = 1

#tips
👍8😱2👎1
Media is too big
VIEW IN TELEGRAM
Подзапросы в SQL

В этом видеоуроке автор подробно рассматривает работу с подзапросами в SQL. Вы разберете синтаксис подзапросов и узнаете как их использовать.

0:00 Вступление
0:15 Подзапросы
2:13 Значение подзапросов
4:12 Предикаты с подзапросами
4:26 Использование агрегатных функций
5:49 Оператор IN
8:10 Одиночные столбцы
8:35 Выражение
8:58 Предложение HAVING
9:17 Итог

Смотреть это видео на youtube: youtu.be/pIFiw2IjFHE
Трюк дня. Ранг без RANK()

Напишите SQL-запрос, который будет ранжировать scores из таблицы scores без использования оконной функции. Одинаковые scores должны иметь одинаковый ранг. Ранг, следующий за одинаковыми scores, должен быть следущий целым числом (см. ожидаемый результат на картинке выше).

Решение будет завтра.

#tips
Трюк дня. Ранг без RANK(). Решение.

Соединим таблицу саму на себя, сравнивая score.
Подсчитаем все уникальные значения объединённых score. Это и даёт эквивалент DENSE_RANK().

SELECT s1.score, count(DISTINCT s2.score) AS score_rank
FROM scores s1
JOIN scores s2
ON s1.score <= s2.score
GROUP BY s1.id, s1.score
ORDER BY 1 DESC

#tips
👍7