Доброе утро, друзья!
Напоминаю, что завтра начинаем интенсив по SQL, PostgreSQL. Обучение будет идти по выходным по утрам. Всего 10 онлайн занятий (5 недель). Плюс закрытая группа Телеграм, куда я буду выкладывать записи наших онлайн встреч. На онлайн уроках будет интерактив, будем работать, не просто смотреть. После каждого урока - самостоятельная практическая работа, решение которой я буду проверять индивидуально. По завершению интенсива - сертификат!
Записаться и оплатить рос.картой здесь: https://prime-soft.biz/pay/209
Для оплаты из-за граница напишите на info@prime-soft.biz
Напоминаю, что завтра начинаем интенсив по SQL, PostgreSQL. Обучение будет идти по выходным по утрам. Всего 10 онлайн занятий (5 недель). Плюс закрытая группа Телеграм, куда я буду выкладывать записи наших онлайн встреч. На онлайн уроках будет интерактив, будем работать, не просто смотреть. После каждого урока - самостоятельная практическая работа, решение которой я буду проверять индивидуально. По завершению интенсива - сертификат!
Записаться и оплатить рос.картой здесь: https://prime-soft.biz/pay/209
Для оплаты из-за граница напишите на info@prime-soft.biz
В базе данных есть таблицы TMP_TABLE и TMP_TABLE2, определённые следующим образом:
CREATE TABLE TMP_TABLE(
VAL_STR VARCHAR(100) DEFAULT NULL);
CREATE TABLE TMP_TABLE2(
VAL_STR VARCHAR(100) NOT NULL);
В обеих перечисленных таблицах нет ни одной строки. Что произойдёт при выполнении следующей команды?
CREATE TABLE TMP_TABLE(
VAL_STR VARCHAR(100) DEFAULT NULL);
CREATE TABLE TMP_TABLE2(
VAL_STR VARCHAR(100) NOT NULL);
В обеих перечисленных таблицах нет ни одной строки. Что произойдёт при выполнении следующей команды?
INSERT INTO TMP_TABLE
(VAL_STR)
SELECT VAL_STR FROM TMP_TABLE2
(VAL_STR)
SELECT VAL_STR FROM TMP_TABLE2
Anonymous Quiz
19%
Запрос выдаст SQL-ошибку
12%
Вставится строка в таблицу TMP_TABLE со значением NULL в столбце VAL_STR
11%
Вставится строка в таблицу TMP_TABLE со значением '' в столбце VAL_STR
59%
Запрос успешно выполнится, но не добавит строк в таблицу TMP_TABLE
👍2
Всем привет!
В таблицах TBL1 и TBL2 есть столбец NOMER. В таблице TBL1 три строки, в таблице TBL2 четыре строки.
Какое минимальное и какое максимальное количество строк мы можем получить в результате следующего запроса?
SELECT *
FROM TBL1
LEFT JOIN TBL2
ON TBL1.NOMER = TBL2.NOMER
В таблицах TBL1 и TBL2 есть столбец NOMER. В таблице TBL1 три строки, в таблице TBL2 четыре строки.
Какое минимальное и какое максимальное количество строк мы можем получить в результате следующего запроса?
SELECT *
FROM TBL1
LEFT JOIN TBL2
ON TBL1.NOMER = TBL2.NOMER
❤1
Какое минимальное и какое максимальное количество строк может вернуть написанный выше запрос?
Anonymous Quiz
13%
Минимально 0, максимально 4
8%
Минимально 0, максимально 12
6%
Минимально 1, максимально 3
26%
Минимально 3, максимально 3
14%
Минимально 3, максимально 4
24%
Минимально 3, максимально 12
5%
Минимально 4, максимально 4
2%
Минимально 4, максимально 12
👍3
Всем доброе пятничное утро🙂
Один монитор - скорее всего работает в айти.
Два монитора - программист.
Три монитора - системный администратор.
Четыре монитора - охранник.
Один монитор - скорее всего работает в айти.
Два монитора - программист.
Три монитора - системный администратор.
Четыре монитора - охранник.
😁40👍6💩1
Всем доброго вечера!
В ряде случаев, помимо вывода требуемой информации, SQL-запросы пишут так, чтобы получать дополнительные какие-то числа или текст. К примеру, может потребоваться номер строки выводимых данных (по порядку) или какой-то признак четная строка или нечётная.
В разных СУБД такое можно сделать разными способами, но часто алгоритмы похожи.
Для вывода номера строки (вместе с остальными выводящимися данными) можно использовать аналитическую (оконную) функцию ROW_NUMBER.
Для вывода признака чётная строка или нечётная можно использовать обычную функцию MOD, возвращающую остаток от деления. Если число (например, номер строки таблицы) разделилось полностью на два (без остатка), значит число чётное (значит строка чётная).
Для чего может потребоваться выводить признак строки чётная строка или нечётная? Например, для дальнейшего цветового оформления выводимых табличных данных: если в строке в столбце-признаке такое-то значение, то сделать фон строки немного темнее/светлее.
Или, например, для равномерного распределения строк выводимых данных на две группы. А если функции MOD указать не число 2 в качестве делителя, а какое-то другое, то можно равномерно распределить все строки таблицы на это указанное количество групп.
В ряде случаев, помимо вывода требуемой информации, SQL-запросы пишут так, чтобы получать дополнительные какие-то числа или текст. К примеру, может потребоваться номер строки выводимых данных (по порядку) или какой-то признак четная строка или нечётная.
В разных СУБД такое можно сделать разными способами, но часто алгоритмы похожи.
Для вывода номера строки (вместе с остальными выводящимися данными) можно использовать аналитическую (оконную) функцию ROW_NUMBER.
Для вывода признака чётная строка или нечётная можно использовать обычную функцию MOD, возвращающую остаток от деления. Если число (например, номер строки таблицы) разделилось полностью на два (без остатка), значит число чётное (значит строка чётная).
Для чего может потребоваться выводить признак строки чётная строка или нечётная? Например, для дальнейшего цветового оформления выводимых табличных данных: если в строке в столбце-признаке такое-то значение, то сделать фон строки немного темнее/светлее.
Или, например, для равномерного распределения строк выводимых данных на две группы. А если функции MOD указать не число 2 в качестве делителя, а какое-то другое, то можно равномерно распределить все строки таблицы на это указанное количество групп.
👍20
Друзья, всех с наступающими праздниками!
С НОВЫМ ГОДОМ И РОЖДЕСТВОМ! 🎉
Всего самого наилучшего в новом году, новых достижений, доброго здоровья и мирного неба над головой!
Всего самого наилучшего!
🥳🎄🙂
С НОВЫМ ГОДОМ И РОЖДЕСТВОМ! 🎉
Всего самого наилучшего в новом году, новых достижений, доброго здоровья и мирного неба над головой!
Всего самого наилучшего!
🥳🎄🙂
🍾23🎉12🎄7❤4🕊2
Добрый день, друзья!
Вот хорошая SQL-задачка на начало года! Итак, пусть в некоторой базе данных есть таблица изменения цен товаров - PRICES_HIST. При каждом изменении цены товара, в таблицу записывается идентификатор товара, дата, с которой начинает действовать новая цена, и само значение цены. Таблица PRICES_HIST определена следующим образом:
CREATE TABLE PRICES_HIST (
ID_PRODUCT INT,
DATE_PRICE DATE,
VALUE_PRICE DECIMAL(10, 2),
PRIMARY KEY (ID_PRODUCT, DATE_PRICE)
)
ID_PRODUCT - идентификатор продукта; DATE_PRICE - дата, начиная с которой действует цена указанного продукта;
VALUE_PRICE - само значение цены.
Первичный ключ таблицы - составной. Состоит из столбцов ID_PRODUCT и DATE_PRICE. Невозможно на одну и ту же дату одному и тому же товару устанавливать цену несколько раз.
Запрос ниже должен возвращать идентификаторы продуктов с их актуальной стоимостью (на текущую дату).
SELECT ph.*
FROM PRICES_HIST ph
WHERE DATE_PRICE = (SELECT MAX(DATE_PRICE) FROM PRICES_HIST WHERE ID_PRODUCT = ph.ID_PRODUCT AND DATE_PRICE <= CURRENT_DATE)
СУБД PostgreSQL
Вот хорошая SQL-задачка на начало года! Итак, пусть в некоторой базе данных есть таблица изменения цен товаров - PRICES_HIST. При каждом изменении цены товара, в таблицу записывается идентификатор товара, дата, с которой начинает действовать новая цена, и само значение цены. Таблица PRICES_HIST определена следующим образом:
CREATE TABLE PRICES_HIST (
ID_PRODUCT INT,
DATE_PRICE DATE,
VALUE_PRICE DECIMAL(10, 2),
PRIMARY KEY (ID_PRODUCT, DATE_PRICE)
)
ID_PRODUCT - идентификатор продукта; DATE_PRICE - дата, начиная с которой действует цена указанного продукта;
VALUE_PRICE - само значение цены.
Первичный ключ таблицы - составной. Состоит из столбцов ID_PRODUCT и DATE_PRICE. Невозможно на одну и ту же дату одному и тому же товару устанавливать цену несколько раз.
Запрос ниже должен возвращать идентификаторы продуктов с их актуальной стоимостью (на текущую дату).
SELECT ph.*
FROM PRICES_HIST ph
WHERE DATE_PRICE = (SELECT MAX(DATE_PRICE) FROM PRICES_HIST WHERE ID_PRODUCT = ph.ID_PRODUCT AND DATE_PRICE <= CURRENT_DATE)
СУБД PostgreSQL
Есть два SQL запроса, предназначенные для выполнения на разных СУБД.
Запрос для PostgreSql:
SELECT * FROM ORDERS ORDER BY DATE_CREATE DESC NULLS LAST LIMIT 10
Запрос для ORACLE:
SELECT * FROM (SELECT * FROM ORDERS ORDER BY DATE_CREATE DESC NULLS LAST) WHERE ROWNUM <= 10
Запрос для PostgreSql:
SELECT * FROM ORDERS ORDER BY DATE_CREATE DESC NULLS LAST LIMIT 10
Запрос для ORACLE:
SELECT * FROM (SELECT * FROM ORDERS ORDER BY DATE_CREATE DESC NULLS LAST) WHERE ROWNUM <= 10
Какое из перечисленных ниже утверждений верно при условии того, что, в двух СУБД структура таблиц и данные в них одинаковые?
Anonymous Quiz
35%
Оба запроса написаны корректно и будут возвращать одинаковый набор данных;
28%
Оба запроса написаны корректно, но будут возвращать разный набор данных;
6%
Запрос для PostgreSql содержит ошибку и не сможет быть выполнен;
22%
Запрос для ORACLE содержит ошибку и не сможет быть выполнен;
9%
Запросы для обеих СУБД написаны с ошибкой и не могут быть выполнены.
В базе данных (на примере СУБД ORACLE), среди прочих, есть три таблицы, определённые следующим образом:
/* Таблица Сотрудники */
CREATE TABLE PERS (
ID NUMBER PRIMARY KEY,
FIO VARCHAR(100) NOT NULL,
PHONE VARCHAR(10) DEFAULT '' NOT NULL);
/* Автомобили сотрудников */
CREATE TABLE CARS (
ID NUMBER PRIMARY KEY,
BRAND VARCHAR(50) NOT NULL,
MODEL VARCHAR(50) NOT NULL,
ID_PERS_OWNER NUMBER NOT NULL,
CONSTRAINT FK_CAR_OWNER FOREIGN KEY
(ID_PERS_OWNER) REFERENCES PERS(ID)
);
/* Сотрудники-водители */
CREATE TABLE DRIVERS (
ID_PERS NUMBER PRIMARY KEY,
DRIVE_LICENSE_NUM VARCHAR(20) DEFAULT NULL,
CONSTRAINT FK_PERS_DRIVER FOREIGN KEY
(ID_PERS) REFERENCES PERS(ID)
);
В таблице PERS данные:
ID FIO PHONE
1 Иванов И.И. 9057553111
2 Петров П.П. 9104454545
3 Сидоров А.И. 9113457778
В таблице CARS данные:
ID BRAD MODEL ID_PERS_OWNER
1 Ауди А4 1
2 Фиат Панда 2
3 Форд Мондео 2
Какой результат вернёт выполнение следующего SQL-скрипта, состоящего из трёх команд?
TRUNCATE TABLE DRIVERS;
INSERT INTO DRIVERS
(ID_PERS)
SELECT p.ID
FROM PERS p
JOIN CARS c
On c.ID_PERS_OWNER = p.ID;
SELECT COUNT(*)
FROM DRIVERS;
/* Таблица Сотрудники */
CREATE TABLE PERS (
ID NUMBER PRIMARY KEY,
FIO VARCHAR(100) NOT NULL,
PHONE VARCHAR(10) DEFAULT '' NOT NULL);
/* Автомобили сотрудников */
CREATE TABLE CARS (
ID NUMBER PRIMARY KEY,
BRAND VARCHAR(50) NOT NULL,
MODEL VARCHAR(50) NOT NULL,
ID_PERS_OWNER NUMBER NOT NULL,
CONSTRAINT FK_CAR_OWNER FOREIGN KEY
(ID_PERS_OWNER) REFERENCES PERS(ID)
);
/* Сотрудники-водители */
CREATE TABLE DRIVERS (
ID_PERS NUMBER PRIMARY KEY,
DRIVE_LICENSE_NUM VARCHAR(20) DEFAULT NULL,
CONSTRAINT FK_PERS_DRIVER FOREIGN KEY
(ID_PERS) REFERENCES PERS(ID)
);
В таблице PERS данные:
ID FIO PHONE
1 Иванов И.И. 9057553111
2 Петров П.П. 9104454545
3 Сидоров А.И. 9113457778
В таблице CARS данные:
ID BRAD MODEL ID_PERS_OWNER
1 Ауди А4 1
2 Фиат Панда 2
3 Форд Мондео 2
Какой результат вернёт выполнение следующего SQL-скрипта, состоящего из трёх команд?
TRUNCATE TABLE DRIVERS;
INSERT INTO DRIVERS
(ID_PERS)
SELECT p.ID
FROM PERS p
JOIN CARS c
On c.ID_PERS_OWNER = p.ID;
SELECT COUNT(*)
FROM DRIVERS;
👍3
Какой результат вернёт выполнение следующего SQL-скрипта, состоящего из трёх команд?
Anonymous Quiz
7%
Результатом будет число 0
3%
Результатом будет число 1
19%
Результатом будет число 2
30%
Результатом будет число 3
4%
Результатом будет число 4
6%
Результатом может быть любое число, так неизвестны начальные данные таблицы DRIVERS
32%
Выполнение данного скрипта приведёт к SQL-ошибке
👍2
Спасибо всем за активное участие!
При выполнении скрипта из трёх команд, вторая команда не сможет выполниться и вернёт SQL-ошибку (для гуру: нарушение ограничения уникальности).
Выполнение командой INSERT вставки данных (которые готовит SELECT), привело бы к наличию строк в таблице DRIVERS с одинаковым значением в столбце ID_PERS, который является первичным ключом, а это недопустимо.
Из-за того, что в запросе SELECT, который готовит данные для INSERT-а, к таблице PERS присоединяется таблица CARS, данные строки PERS могут быть выведены несколько раз (по количеству приджоинившихся автомобилей к одному и тому же сотруднику). Лучше всего, если не понятно, прочитать предыдущее предложение два раза. Итак, одно и тот же значение из столбца ID таблицы PERS могло бы быть выведено несколько раз. Самым простым способом доработать скрипт, чтобы он больше не "падал" на этой ошибке, могло бы быть использование DISTINCT сразу после слова SELECT:
TRUNCATE TABLE DRIVERS;
INSERT INTO DRIVERS
(ID_PERS)
SELECT DISTINCT p.ID
FROM PERS p
JOIN CARS c
On c.ID_PERS_OWNER = p.ID;
SELECT COUNT(*)
FROM DRIVERS;
При выполнении скрипта из трёх команд, вторая команда не сможет выполниться и вернёт SQL-ошибку (для гуру: нарушение ограничения уникальности).
Выполнение командой INSERT вставки данных (которые готовит SELECT), привело бы к наличию строк в таблице DRIVERS с одинаковым значением в столбце ID_PERS, который является первичным ключом, а это недопустимо.
Из-за того, что в запросе SELECT, который готовит данные для INSERT-а, к таблице PERS присоединяется таблица CARS, данные строки PERS могут быть выведены несколько раз (по количеству приджоинившихся автомобилей к одному и тому же сотруднику). Лучше всего, если не понятно, прочитать предыдущее предложение два раза. Итак, одно и тот же значение из столбца ID таблицы PERS могло бы быть выведено несколько раз. Самым простым способом доработать скрипт, чтобы он больше не "падал" на этой ошибке, могло бы быть использование DISTINCT сразу после слова SELECT:
TRUNCATE TABLE DRIVERS;
INSERT INTO DRIVERS
(ID_PERS)
SELECT DISTINCT p.ID
FROM PERS p
JOIN CARS c
On c.ID_PERS_OWNER = p.ID;
SELECT COUNT(*)
FROM DRIVERS;
❤2
Всем хорошего понедельника!
Написал небольшую статью про интересные возможности СУБД PostgreSQL! https://dzen.ru/a/Z6CFVDYbRyD1JoNY
Буду рад Вашему лайку!
Написал небольшую статью про интересные возможности СУБД PostgreSQL! https://dzen.ru/a/Z6CFVDYbRyD1JoNY
Буду рад Вашему лайку!
Дзен | Статьи
3 возможности PostgreSql, которые удивили меня больше всего!
Статья автора «Илья Хохлов» в Дзене ✍: 1.
👍11🔥8
Всем привет! Очень рад узнать, что соскучались по задачкам (прочёл в комментарии).
Вот ещё одна задачка по SQL. В базе данных, среди прочих, есть таблицы CODES_ALL и CODES_2024, у которых есть всего один столбец CODE, определённый как первичный ключ.
Не используя подзапросы, напишите такую команду INSERT, которая бы вставила в таблицу CODES_ALL коды из таблицы CODES_2024 которых ещё нет в таблице CODES_ALL.
Позже напишу один из вариантов решения этой задачи!
Вот ещё одна задачка по SQL. В базе данных, среди прочих, есть таблицы CODES_ALL и CODES_2024, у которых есть всего один столбец CODE, определённый как первичный ключ.
Не используя подзапросы, напишите такую команду INSERT, которая бы вставила в таблицу CODES_ALL коды из таблицы CODES_2024 которых ещё нет в таблице CODES_ALL.
Позже напишу один из вариантов решения этой задачи!
👍2❤1
Спасибо за активное участие!
Большое количество ответов. И немного дискуссии - всё как любят в айти)
Мне понравилось решерие Бориса, именно такой способ в качестве решения этой задачи я и хотел написать! Он самый простой и будет работать на всех современных СУБД (PostgreSql, MySql, ORACLE, MS SQL Server и т.д.).
Решение с помощью INSERT-а на основе SELECT-а. INSERT вставляет в целевую таблицу строки, которые начитывает (готовит) SELECT.
Борис отобрал значения из таблицы CODES_2024 для которых не нашлось ещё такого кода в таблице CODES_ALL. Эти значения и будут вставлены в CODES_ALL.
Решения подобных проблем я описал в своей статье в Дзене: https://dzen.ru/a/YrBUMUU2jxB4P8Ry
Большое количество ответов. И немного дискуссии - всё как любят в айти)
Мне понравилось решерие Бориса, именно такой способ в качестве решения этой задачи я и хотел написать! Он самый простой и будет работать на всех современных СУБД (PostgreSql, MySql, ORACLE, MS SQL Server и т.д.).
Решение с помощью INSERT-а на основе SELECT-а. INSERT вставляет в целевую таблицу строки, которые начитывает (готовит) SELECT.
Борис отобрал значения из таблицы CODES_2024 для которых не нашлось ещё такого кода в таблице CODES_ALL. Эти значения и будут вставлены в CODES_ALL.
Решения подобных проблем я описал в своей статье в Дзене: https://dzen.ru/a/YrBUMUU2jxB4P8Ry
Дзен | Статьи
КАК ВСТАВИТЬ ТОЛЬКО НЕДОСТАЮЩИЕ СТРОКИ ИЗ ОДНОЙ ТАБЛИЦЫ В ДРУГУЮ, НЕ ИСПОЛЬЗУЯ ПОДЗАПРОСЫ И MERGE
Статья автора «Илья Хохлов» в Дзене ✍: MERGE есть не во всех СУБД, да и подзапросы могут негативно сказаться на производительности.
👍4
Поле D_NUM таблицы DOCS имеет тип данных VARCHAR(4) и отмечено как NOT NULL. В таблице DOCS пока 2 строки. В первой строке D_NUM имеет значение "2888" и во второй строке "3477". Какое количество строк вернёт запрос: SELECT * FROM DOCS WHERE D_NUM != NULL
Anonymous Quiz
43%
0
4%
1
52%
2
1%
3
0%
4
👍5🤬5😁2