Какое из перечисленных ниже утверждений верно при условии того, что, в двух СУБД структура таблиц и данные в них одинаковые?
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
53%
2
1%
3
0%
4
👍5🤬5😁2
Всем привет и хорошего окончания рабочей недели!
Айтишник в пятницу вечером заходит в бар, заказывает пиво.
Бармен спрашивает:
— Вам светлое или тёмное?
Айтишник (задумавшись):
— А в чем разница? В производительности?
Айтишник в пятницу вечером заходит в бар, заказывает пиво.
Бармен спрашивает:
— Вам светлое или тёмное?
Айтишник (задумавшись):
— А в чем разница? В производительности?
😁5🤔1
Всем привет! На этой неделе не оставлю Вас без задачи!
Даны две таблицы ORDERS (заказы) и ORDER_ITEMS (позиции заказов). Таблица ORDERS, имеет следующую структуру:
CREATE TABLE
PRIMARY KEY (
);
Таблица ORDER_ITEMS имеет структуру:
CREATE TABLE
PRIMARY KEY (
INDEX
CONSTRAINT
CONSTRAINT
);
Каждый заказ может иметь несколько позиций заказа (несколько строк в таблице ORDER_ITEMS). Столбец ID_PRODUCT указывает на товар позиции заказа, а в столбце AMOUNT хранится его количество (сколько штук товара взято в позицию заказа). Задача: написать запрос, выводящий номера заказов, где все позиции заказа имеют количество (значение в столбце AMOUNT) равным одному.
Решение, как всегда, попозже! Сначала попробуйте, пожалуйста, сами!
Даны две таблицы ORDERS (заказы) и ORDER_ITEMS (позиции заказов). Таблица ORDERS, имеет следующую структуру:
CREATE TABLE
ORDERS
(ID
INT(11) NOT NULL,DATE_ORDER
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,ID_CLIENT
INT(11) NOT NULL,PRIMARY KEY (
ID
) USING BTREE);
Таблица ORDER_ITEMS имеет структуру:
CREATE TABLE
ORDER_ITEMS
(ID
INT(11) NOT NULL,ID_ORDER
INT(11) NOT NULL,ID_PRODUCT
INT(11) NOT NULL DEFAULT '1',AMOUNT
INT(11) NOT NULL DEFAULT '1',PRIMARY KEY (
ID
) USING BTREE,INDEX
indOrder
(ID_ORDER
) USING BTREE,CONSTRAINT
FK_ORDER_ITEMS_ORDERS1
FOREIGN KEY (ID_ORDER
) REFERENCES ORDERS
(ID
) ON UPDATE NO ACTION ON DELETE NO ACTION,CONSTRAINT
FK_ORDER_ITEMS_ORDERS2
FOREIGN KEY (ID_PRODUCT
) REFERENCES PRODUCTS
(ID
) ON UPDATE NO ACTION ON DELETE NO ACTION);
Каждый заказ может иметь несколько позиций заказа (несколько строк в таблице ORDER_ITEMS). Столбец ID_PRODUCT указывает на товар позиции заказа, а в столбце AMOUNT хранится его количество (сколько штук товара взято в позицию заказа). Задача: написать запрос, выводящий номера заказов, где все позиции заказа имеют количество (значение в столбце AMOUNT) равным одному.
Решение, как всегда, попозже! Сначала попробуйте, пожалуйста, сами!
👍3
Спасибо всем за активное участие!
Задачи, похожие на предыдущую, удобно решать с помощью оператора ALL, который, в нашем примере, мог бы проверить что у всех позиций заказа количество такое-то, или, например, единица измерения всех позиций - килограммы.
Решение с помощью оператора ALL:
SELECT ID /* или любую другую информацию о заказах*/
FROM ORDERS
WHERE 1 = ALL (SELECT AMOUNT FROM ORDER_ITEMS WHERE ID_ORDER = ORDERS.ID)
Задачи, похожие на предыдущую, удобно решать с помощью оператора ALL, который, в нашем примере, мог бы проверить что у всех позиций заказа количество такое-то, или, например, единица измерения всех позиций - килограммы.
Решение с помощью оператора ALL:
SELECT ID /* или любую другую информацию о заказах*/
FROM ORDERS
WHERE 1 = ALL (SELECT AMOUNT FROM ORDER_ITEMS WHERE ID_ORDER = ORDERS.ID)
👍12
Вот ещё одна классная задача по SQL (на примере СУБД PostgreSQL).
Таблица GOODS имеет структуру:
CREATE TABLE GOODS (
ARTICLE VARCHAR(20) NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DATE_CREATE DATE DEFAULT CURRENT_DATE).
Таблица GOODS имеет структуру:
CREATE TABLE GOODS (
ARTICLE VARCHAR(20) NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DATE_CREATE DATE DEFAULT CURRENT_DATE).
При выполнении команды INSERT INTO GOODS (ARTICLE, NAME, DATE_CREATE) VALUES ('111', 'Некоторый товар', NULL) какое значение вставится в столбце DATE_CREATE?
Anonymous Quiz
37%
Текущая дата
43%
NULL
19%
Будет ошибка выполнения данной команды
👍1
Хочу поделиться одним замечательным отзывом, который недавно получил от ученика после прохождения курса "Программирования в PL/SQL (ORACLE)":
Спасибо Вам большое за этот курс и возможность прокачать свои знания в PLSQL!
Курс оказался невероятно полезным и структурированным. Материал подается доступно, с практическими примерами, что позволяет легко усваивать даже сложные темы.
Особенно понравилось, что было много практических заданий, которые помогли закрепить теорию на практике.
После прохождения курса я чувствую себя гораздо увереннее в написании сложных SQL-запросов, работе с хранимыми процедурами и оптимизации кода.
Обязательно буду рекомендовать этот курс коллегам и друзьям!
Еще раз большое спасибо за ваш труд и качественное обучение!
Сергей, Вам спасибо, что обучались разработке в ORACLE со мной! Был очень рад пройти с Вами весь курс программирования!
Спасибо Вам большое за этот курс и возможность прокачать свои знания в PLSQL!
Курс оказался невероятно полезным и структурированным. Материал подается доступно, с практическими примерами, что позволяет легко усваивать даже сложные темы.
Особенно понравилось, что было много практических заданий, которые помогли закрепить теорию на практике.
После прохождения курса я чувствую себя гораздо увереннее в написании сложных SQL-запросов, работе с хранимыми процедурами и оптимизации кода.
Обязательно буду рекомендовать этот курс коллегам и друзьям!
Еще раз большое спасибо за ваш труд и качественное обучение!
Сергей, Вам спасибо, что обучались разработке в ORACLE со мной! Был очень рад пройти с Вами весь курс программирования!
👍8🔥4
Всем доброго понедельника!
В базе данных, помимо прочих, есть таблица PRODUCTS:
CREATE TABLE PRODUCTS (
ID INT PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DESCRIPTION VARCHAR(300) NULL DEFAULT NULL);
и таблица PRICES_HIST:
CREATE TABLE PRICES_HIST (
ID_PRODUCT INT,
DATE_PRICE DATE,
VALUE_PRICE DECIMAL(10, 2),
PRIMARY KEY (ID_PRODUCT, DATE_PRICE),
CONSTRAINT FK1 FOREIGN KEY (ID_PRODUCT) REFERENCES PRODUCTS (ID)
)
В базе данных, помимо прочих, есть таблица PRODUCTS:
CREATE TABLE PRODUCTS (
ID INT PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
DESCRIPTION VARCHAR(300) NULL DEFAULT NULL);
и таблица PRICES_HIST:
CREATE TABLE PRICES_HIST (
ID_PRODUCT INT,
DATE_PRICE DATE,
VALUE_PRICE DECIMAL(10, 2),
PRIMARY KEY (ID_PRODUCT, DATE_PRICE),
CONSTRAINT FK1 FOREIGN KEY (ID_PRODUCT) REFERENCES PRODUCTS (ID)
)
👍2
Какая связь между таблицами PRODUCTS и PRICES_HIST?
Anonymous Quiz
17%
Один к одному
70%
Один ко многим
6%
Многие ко многим
7%
Между таблицами связи нет
Тестовые задачи по SQL.pdf
78.9 KB
Небольшой сборник задач на написание SQL-запросов (от простых к сложным). Ссылка на скачивание тестовой базы данных (PostgreSQL) в файле.
🐳9👍5❤1❤🔥1
🚀 Стартует интенсив по SQL и PostgreSQL! 🚀
📅 3 мая | 👥 Группа до 10 человек | 🕘 По Сб и Вс в 9:00
🔹 10 насыщенных онлайн-занятий (с записями)
🔹 Максимум практики – работаем вместе, а не просто слушаем!
🔹 Закрытый Telegram-чат с материалами и поддержкой
🔹 Сертификат после завершения курса
🔹 Помощь с резюме для старта в профессии
💡 Идеально для тех, кто хочет:
✅ Освоить PostgreSQL с нуля
✅ Научиться писать эффективные запросы
✅ Получить реальные навыки для работы
📌 Успей записаться! Группа маленькая – места ограничены.
🔗 Подробнее: https://prime-soft.biz/courses/postgresql
📅 3 мая | 👥 Группа до 10 человек | 🕘 По Сб и Вс в 9:00
🔹 10 насыщенных онлайн-занятий (с записями)
🔹 Максимум практики – работаем вместе, а не просто слушаем!
🔹 Закрытый Telegram-чат с материалами и поддержкой
🔹 Сертификат после завершения курса
🔹 Помощь с резюме для старта в профессии
💡 Идеально для тех, кто хочет:
✅ Освоить PostgreSQL с нуля
✅ Научиться писать эффективные запросы
✅ Получить реальные навыки для работы
📌 Успей записаться! Группа маленькая – места ограничены.
🔗 Подробнее: https://prime-soft.biz/courses/postgresql
prime-soft.biz
Prime | Курс SQL, PostgreSql
Уроки и курсы SQL, PostgreSQL, Базы данных.
Всем привет!
Предлагаю очередную задачу. В базе данных PostgreSQL, среди прочих, есть таблица выставленных счетов INVOICES:
CREATE TABLE INVOICES (
ID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
DATE_CREATE TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ID_CLIENT INTEGER NOT NULL,
DESCRIPTION VARCHAR(300),
CONSTRAINT FK1 FOREIGN KEY (ID_CLIENT) REFERENCES CLIENTS(ID));
CREATE INDEX IND_INVOICES_DATE_CREATE ON INVOICES (DATE_CREATE);
В некотором отчёте АБС количество счетов, выставленных за текущий день формируется SQL запросом:
SELECT COUNT(*) COUNT_INV FROM INVOICES WHERE DATE(DATE_CREATE) = CURRENT_DATE.
Предлагаю очередную задачу. В базе данных PostgreSQL, среди прочих, есть таблица выставленных счетов INVOICES:
CREATE TABLE INVOICES (
ID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
DATE_CREATE TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ID_CLIENT INTEGER NOT NULL,
DESCRIPTION VARCHAR(300),
CONSTRAINT FK1 FOREIGN KEY (ID_CLIENT) REFERENCES CLIENTS(ID));
CREATE INDEX IND_INVOICES_DATE_CREATE ON INVOICES (DATE_CREATE);
В некотором отчёте АБС количество счетов, выставленных за текущий день формируется SQL запросом:
SELECT COUNT(*) COUNT_INV FROM INVOICES WHERE DATE(DATE_CREATE) = CURRENT_DATE.
Как можно оптимизировать выполнение этого запроса?
Anonymous Quiz
17%
Поменять условие: WHERE DATE_CREATE::DATE = CURRENT_DATE
31%
Поменять условие:WHERE DATE_CREATE >= CURRENT_DATE AND DATE_CREATE < CURRENT_DATE + INTERVAL '1 day'
9%
Поменять условие: WHERE to_char(DATE_CREATE, 'dd.mm.yyyy') = to_char(CURRENT_DATE, 'dd.mm.yyyy')
25%
Добавить индекс: CREATE INDEX IND_INVOICES_DATE_CREATE2 ON INVOICES (EXTRACT(DAY FROM DATE_CREATE))
4%
Удалить индекс: DROP INDEX IF EXISTS IND_INVOICES_DATE_CREATE
13%
Оптимизация такого запроса невозможна
👍2