Здравствуйте, друзья!
На прошлой неделе на практике понадобилось интересное использование функции ROUND, которым хочу поделиться. Дело было в Оракле.
Основное назначение функции ROUND - это математическое округление числовых значений (в ближайшую сторону).
Пример:
SELECT ROUND(1.271)
FROM DUAL
Результат: 1
Еще пример:
SELECT ROUND(1.58)
FROM DUAL
Результат: 2
Функции ROUND можно дать второй параметр, указать до какого знака после запятой производить округление, пример:
SELECT ROUND(1.271, 1)
FROM DUAL
Результат: 1.3.
То есть мы произвели округление до одного знака после запятой.
На прошлой неделе на практике понадобилось интересное использование функции ROUND, которым хочу поделиться. Дело было в Оракле.
Основное назначение функции ROUND - это математическое округление числовых значений (в ближайшую сторону).
Пример:
SELECT ROUND(1.271)
FROM DUAL
Результат: 1
Еще пример:
SELECT ROUND(1.58)
FROM DUAL
Результат: 2
Функции ROUND можно дать второй параметр, указать до какого знака после запятой производить округление, пример:
SELECT ROUND(1.271, 1)
FROM DUAL
Результат: 1.3.
То есть мы произвели округление до одного знака после запятой.
👍8
Функция ROUND может округлять не только числовые значения, но и даты. И точно также можно указывать до какой части даты (до года, месяца, дня, часа, минуты и т.д) округлить. Например, можно округлить дни в месяце, сделав дату от середины месяца уже датой следующего месяца.
Или можно округлить минуты, чтобы в случае если в дате со временем указано от 30 секунд и больше, чтобы в финальном значении оно сделалось следующей минутой.
Или можно округлить минуты, чтобы в случае если в дате со временем указано от 30 секунд и больше, чтобы в финальном значении оно сделалось следующей минутой.
👍5
Например, ROUND(SOME_DATE, 'HH24') будет округлять до часов, отбросив минуты и секунды. Если количество минут (и секунд) больше получаса, то это сделает в конечном значении следующий час.
ROUND(SOME_DATE, 'MI') округлит до минут и ROUND(SOME_DATE, 'SS') округлит до секунд.
ROUND(SOME_DATE, 'MI') округлит до минут и ROUND(SOME_DATE, 'SS') округлит до секунд.
👍6
Если функция ROUND откругляет число, то результатом работы функции будет округленное число. Если функция ROUND округляет дату, то, она хоть и изменится (например, округлятся часы), но останется датой (например, минуты будут приведены в 00, и конечный результат будет приведён к ближайшем часу - к меньшем или большему в зависимости от количества минут).
👍7
Не привычно округлять даты, да? 🙂
Вот что у нас получилось на прошлой нелеле:
Вот что у нас получилось на прошлой нелеле:
👍5
Всем привет!
Сегодня предлагаю попробовать найти в коде ошибку. Данный запрос должен показывать сотрудников (строчки из таблицы Persons) у которых отсутствует автомобиль (нет записи с идентификатором сотрудника в таблице PersonCars), но, почему-то не выводит ни одной записи из таблицы сотрудников. То есть как будто нет сотрудников без автомобиля. Посмотри внимательно, сможешь увидеть ошибку? Расскажу где закралась ошибка в запросе в следующем сообщении.
Сегодня предлагаю попробовать найти в коде ошибку. Данный запрос должен показывать сотрудников (строчки из таблицы Persons) у которых отсутствует автомобиль (нет записи с идентификатором сотрудника в таблице PersonCars), но, почему-то не выводит ни одной записи из таблицы сотрудников. То есть как будто нет сотрудников без автомобиля. Посмотри внимательно, сможешь увидеть ошибку? Расскажу где закралась ошибка в запросе в следующем сообщении.
👍3
Всем хорошей субботы!
Смог увидеть ошибку? Поставь лайк, если да. Если ты еще только начинаете писать на SQL, то, скорее всего, эта задача будет несколько сложна.
Итак, как ты думаешь, сколько строк вернет данный запрос?
Данный запрос не вернет ни одной строки! Ошибка заключается в том, что подзапрос должен был быть написан так, чтобы проверять подзапросом на отсутствие данных для каждой конкретной строки внешнего, то есть основного, запроса. Подзапрос написан для того, чтобы проверить отсутствие данных в таблице PersonCars для каждого сотрудника из таблицы Persons, который выводится в основном запросе. А сейчас наш подзапрос не связан с внешним запросом! Он проверяет на отсутствие следующих данных: что в таблице PersonCars отсутствуют строчки, в которых PersonID был бы равен самому себе (посмотри еще раз SQL-запрос на фото выше)!
Когда в подзапросе используется имя столбца без указания имени таблицы или алиаса (в нашем случае нужно было указать Person.PersonID), то СУБД сначала ищет столбец который имеется ввиду в рамках своего же SELECT, то есть подзапроса. Только если не находит столбец в таблице из которой выбираются данные или среди таблиц, которые джоинятся, то пробует искать столбец с таким именем во внешнем (основном) запросе. В нашем случае PersonID есть в таблице PersonCars. Поэтому он сравнивается сам с собой. Конечно, для всех строчек PersonCars значение в столбце PersonID равно самому себе. Поэтому, какую бы строчку из таблицы Persons мы ни выводили, всегда существуют данные в таблице PersonCars где бы PersonID был бы равен сам себе. Поэтому NOT EXISTS для всех строчек таблицы Persons даст отрицательный результат и ни один сотрудник не выведется.
Вот исправленное решение:
SELECT *
FROM Persons
WHERE NOT EXISTS (SELECT *
FROM PersonCars
WHERE PersonID = Persons.PersonID)
Если необходимо подзапрос связывать с внешним запросом, например, как в задаче выше, то крайне желательно, все же, в подзапросах, при написании имен столбцов, писать еще и имя таблицы этого столбца.
Поставь лайк, если увидел ошибку в запросе и без меня 👍
Смог увидеть ошибку? Поставь лайк, если да. Если ты еще только начинаете писать на SQL, то, скорее всего, эта задача будет несколько сложна.
Итак, как ты думаешь, сколько строк вернет данный запрос?
Данный запрос не вернет ни одной строки! Ошибка заключается в том, что подзапрос должен был быть написан так, чтобы проверять подзапросом на отсутствие данных для каждой конкретной строки внешнего, то есть основного, запроса. Подзапрос написан для того, чтобы проверить отсутствие данных в таблице PersonCars для каждого сотрудника из таблицы Persons, который выводится в основном запросе. А сейчас наш подзапрос не связан с внешним запросом! Он проверяет на отсутствие следующих данных: что в таблице PersonCars отсутствуют строчки, в которых PersonID был бы равен самому себе (посмотри еще раз SQL-запрос на фото выше)!
Когда в подзапросе используется имя столбца без указания имени таблицы или алиаса (в нашем случае нужно было указать Person.PersonID), то СУБД сначала ищет столбец который имеется ввиду в рамках своего же SELECT, то есть подзапроса. Только если не находит столбец в таблице из которой выбираются данные или среди таблиц, которые джоинятся, то пробует искать столбец с таким именем во внешнем (основном) запросе. В нашем случае PersonID есть в таблице PersonCars. Поэтому он сравнивается сам с собой. Конечно, для всех строчек PersonCars значение в столбце PersonID равно самому себе. Поэтому, какую бы строчку из таблицы Persons мы ни выводили, всегда существуют данные в таблице PersonCars где бы PersonID был бы равен сам себе. Поэтому NOT EXISTS для всех строчек таблицы Persons даст отрицательный результат и ни один сотрудник не выведется.
Вот исправленное решение:
SELECT *
FROM Persons
WHERE NOT EXISTS (SELECT *
FROM PersonCars
WHERE PersonID = Persons.PersonID)
Если необходимо подзапрос связывать с внешним запросом, например, как в задаче выше, то крайне желательно, все же, в подзапросах, при написании имен столбцов, писать еще и имя таблицы этого столбца.
Поставь лайк, если увидел ошибку в запросе и без меня 👍
👍6
"Среда пришла - неделя прошла" 🙂 Надеюсь, у всех есть что-то, что вы узнали новое на этой неделе в копилочку опыта и компетентности.
👍2
Предлагаю немного поразбирать "чужой код". Особенно это будет полезно и ПОНЯТНО, если ты уже знаком с подзапросами в блоке SELECT:
https://zen.yandex.ru/media/id/6141a8eaf1e1477af4f85ca7/62bc3891ac401054d17a7314
https://zen.yandex.ru/media/id/6141a8eaf1e1477af4f85ca7/62bc3891ac401054d17a7314
Дзен | Блогерская платформа
Хитрые решения нетипичных задач с использованием подзапросов в блоке SELECT
В первый же рабочий день нас просит о помощи коллега. Его запрос «почему–то» вызывает ошибку при выполнении: При выполнении данного запроса возникает ошибка: Или, по–русски, эта ошибка отображается так: ORA–01427: подзапрос одиночной строки возвращает более…
👍5
Здравствуйте, друзья! Интересно проверить себя на собеседовании по SQL? Предлагаю вопрос. Ответ, как всегда, в следующем сообщении.
Выберите верные утверждения (возможно несколько вариантов):
1) NULL <> 1
2) NULL <> NULL
3) NULL = NULL
4) NULL IS NOT NULL
5) NULL IS NULL
Выберите верные утверждения (возможно несколько вариантов):
1) NULL <> 1
2) NULL <> NULL
3) NULL = NULL
4) NULL IS NOT NULL
5) NULL IS NULL
👍13
Правильный вариант только один - номер 5. То есть NULL IS NULL. Поставьте, пожалуйста, лайк, кто ответил правильно! 😉
🔥9
Давайте вспомним как делается комментирование SQL кода. И для чего его можно использовать:
https://zen.yandex.ru/media/iliahohlov/kommentirovanie-sqlkoda-62bdfe307a2e4f0f3ba1519f
https://zen.yandex.ru/media/iliahohlov/kommentirovanie-sqlkoda-62bdfe307a2e4f0f3ba1519f
Яндекс Дзен
Комментирование SQL-кода
В SQL, как и во многих компьютерных языках, можно оставлять комментарии прямо в коде. Чтобы, например, пояснять для чего делается тот или иной расчет. Или почему в SQL коде вписана такая дата или такое число. Рассмотрим пример с учебной базы нашего курса…