В таблице GOODS ("Товары") для уникальной идентификации записей использовался столбец ARTICLE ("Артикул товара"). Этот столбец был установлен в качестве первичного ключа. С некоторыми последними доработками и расширением функционала, возникла необходимость наличия товаров с одинаковым артикулом. Для идентификации товаров пришлось создать новый отдельный столбец "ID" со сквозной нумерацией.
Этот новый столбец будет являться:
Anonymous Quiz
39%
первичным ключом
23%
суррогатным ключом
21%
первичным и суррогатным ключом
9%
внешним ключом
8%
первичным и внешним ключом
10-ти дневный он-лайн интенсив по SQL и PostgreSql. Начинаем 24.09.2024. У нас уже три участника! Не пропусти! Узнать больше и записаться можно тут: https://prime-soft.biz/courses/postgresql
🔥4❤2
Какая ошибка допущена в следующей SQL команде?
CREATE VIEW CLIENTS_INFO
AS SELECT INN, NAME, PHONE
FROM CLIENTS, CLIENT_CONTACTS
WHERE CLIENTS.CLIENT_ID = CLIENT_CONTACTS.CLIENT_ID
CREATE VIEW CLIENTS_INFO
AS SELECT INN, NAME, PHONE
FROM CLIENTS, CLIENT_CONTACTS
WHERE CLIENTS.CLIENT_ID = CLIENT_CONTACTS.CLIENT_ID
Какая ошибка допущена в указанной SQL команде?
Anonymous Quiz
15%
В блоке SELECT нужно указывать из каких таблиц взяты данные, т.е. INN.CLIENTS, NAME.CLIENTS, ...
12%
Перед SELECT есть AS, который не нужен
5%
Вместо CREATE VIEW CLIENTS_INFO нужно писать CREATE CLIENTS_INFO VIEW
21%
Не нужно указывать обе таблицы в блоке FROM
47%
В блоке SELECT нужно указывать из каких таблиц взяты данные, т.е. CLIENTS.INN, CLIENTS.NAME, ...
👍2
Всем отличного понедельника!
Новая задача с собеседования. Базовый уровень.
В базе данных есть таблица адресов клиентов CLIENT_ADDR. Таблица CLIENT_ADDR, среди прочих, имеет столбец CITY_NAME (город). Какой из запросов ниже покажет 10 городов клиентов (10 значений из столбца CITY_NAME)? Один и тот же город не должен быть показан в результирующей таблице более одного раза. Полученный список городов клиентов должен быть упорядочен по алфавиту.
Новая задача с собеседования. Базовый уровень.
В базе данных есть таблица адресов клиентов CLIENT_ADDR. Таблица CLIENT_ADDR, среди прочих, имеет столбец CITY_NAME (город). Какой из запросов ниже покажет 10 городов клиентов (10 значений из столбца CITY_NAME)? Один и тот же город не должен быть показан в результирующей таблице более одного раза. Полученный список городов клиентов должен быть упорядочен по алфавиту.
Какой запрос покажет 10 городов клиентов без повторов, расположенных по алфавиту?
Anonymous Quiz
3%
SELECT CITY_NAME FROM CLIENT_ADDR ORDER BY CITY_NAME LIMIT 10
6%
SELECT CITY_NAME FROM CLIENT_ADDR SORT BY CITY_NAME DESC LIMIT 10
6%
SELECT DISTINCT CITY_NAME FROM CLIENT_ADDR GROUP BY CITY_NAME LIMIT 11
85%
SELECT DISTINCT CITY_NAME FROM CLIENT_ADDR ORDER BY CITY_NAME LIMIT 10
❤5
Всем хорошей пятницы!
Действительно ли, что:
Oracle запрос SQL, использующий условие EXISTS очень неэффективен, так как подзапрос перезапускается для каждой строки в таблице внешнего запроса.
Есть более эффективные способы написания большинства запросов, которые бы не использовали условие EXISTS.
Ответ:
Для решения каждой задачи есть свои эффективные методы. Если EXISTS применяется в основном запросе выборки из небольшой таблицы для проверки данных в большой таблице, и если выборка из большой таблицы будет вестись по индексам, то его использование будет очень эффективно. Вот пример:
В таблице клиентов не более 1000 строк.
В таблице PAYMENTS миллион строк и таблица проиндексована по столбцу CLIENT_ID.
Нужно выбрать клиентов, по которым была хотя бы одна оплата.
SELECT *
FROM CLIENTS
WHERE EXISTS (SELECT 1 FROM PAYMENTS WHERE PAYMENTS.CLIENT_ID = CLIENTS.CLIENT_ID)
По таблице CLIENTS мы видим полный перебор строк (TABLE ACCESS FULL), но с проверкой есть ли платеж по клиенту. Запрос, отбирая клиентов, проверит есть ли в таблице PAYMENTS хотя бы одна строчка с таким CLIENT_ID. Хотя бы одна. И, так как на таблицу PAYMENTS есть индекс для выборки по столбцу CLIENT_ID, то таблица PAYMENTS вообще не будет читаться! Согласно приведённому запросу нам от неё не нужны данные. Нужно просто проверить есть ли строчка, где бы в столбце CLIENT_ID было бы конкретное значение. СУБД посмотрит в индекс и сразу поймёт есть ли строчка с таким то значением CLIENT_ID. Самого чтения миллионной таблицы не будет.
Многие СУБД, при правильной их настройке, хранят индексы постоянно используемых таблиц в оперативной памяти.
Стоит, всё же, заметить, что при использовании EXISTS или других подзапросов в транзакциях в некоторых СУБД могут быть проблемы.
Расскажу об этом дополнительно!
Действительно ли, что:
Oracle запрос SQL, использующий условие EXISTS очень неэффективен, так как подзапрос перезапускается для каждой строки в таблице внешнего запроса.
Есть более эффективные способы написания большинства запросов, которые бы не использовали условие EXISTS.
Ответ:
Для решения каждой задачи есть свои эффективные методы. Если EXISTS применяется в основном запросе выборки из небольшой таблицы для проверки данных в большой таблице, и если выборка из большой таблицы будет вестись по индексам, то его использование будет очень эффективно. Вот пример:
В таблице клиентов не более 1000 строк.
В таблице PAYMENTS миллион строк и таблица проиндексована по столбцу CLIENT_ID.
Нужно выбрать клиентов, по которым была хотя бы одна оплата.
SELECT *
FROM CLIENTS
WHERE EXISTS (SELECT 1 FROM PAYMENTS WHERE PAYMENTS.CLIENT_ID = CLIENTS.CLIENT_ID)
По таблице CLIENTS мы видим полный перебор строк (TABLE ACCESS FULL), но с проверкой есть ли платеж по клиенту. Запрос, отбирая клиентов, проверит есть ли в таблице PAYMENTS хотя бы одна строчка с таким CLIENT_ID. Хотя бы одна. И, так как на таблицу PAYMENTS есть индекс для выборки по столбцу CLIENT_ID, то таблица PAYMENTS вообще не будет читаться! Согласно приведённому запросу нам от неё не нужны данные. Нужно просто проверить есть ли строчка, где бы в столбце CLIENT_ID было бы конкретное значение. СУБД посмотрит в индекс и сразу поймёт есть ли строчка с таким то значением CLIENT_ID. Самого чтения миллионной таблицы не будет.
Многие СУБД, при правильной их настройке, хранят индексы постоянно используемых таблиц в оперативной памяти.
Стоит, всё же, заметить, что при использовании EXISTS или других подзапросов в транзакциях в некоторых СУБД могут быть проблемы.
Расскажу об этом дополнительно!
👍9
Друзья, всем добрый день!
Очередная задача по SQL!
В базе данных есть две таблицы CODES и CODES2, в каждой из которых есть столбец CODE. В таблицах CODES и CODES2 всего по три строки. В первой строке обеих таблиц в столбце CODE - значение: 1, во второй строке значение тоже 1 и в третьей строке - NULL.
Очередная задача по SQL!
В базе данных есть две таблицы CODES и CODES2, в каждой из которых есть столбец CODE. В таблицах CODES и CODES2 всего по три строки. В первой строке обеих таблиц в столбце CODE - значение: 1, во второй строке значение тоже 1 и в третьей строке - NULL.
👍1
Сколько строк вернёт следующий запрос:
SELECT * FROM CODES JOIN CODES2 ON CODES.CODE = CODES2.CODE
SELECT * FROM CODES JOIN CODES2 ON CODES.CODE = CODES2.CODE
Anonymous Quiz
7%
0
52%
2
38%
4
4%
8
❤4👍3👎2
Друзья, всем отличной пятницы!
На следующей неделе начинаем интенсив SQL, PostgreSQL!
У нас будет:
10 насыщенных онлайн занятий (с записью эфира);
Много совместной работы в режиме онлайн! Будет много практики! Готовимся работать, не просто слушать:)
Закрытая группа Телеграм с записями наших встреч и кратким конспектом! Здесь же я буду отвечать и на все вопросы по самостоятельным задачам (они тоже будут, работа один-на-один с базой данных обязательна).
Сертификат по окончанию он-лайн курса! И помощь в составлении резюме если потребуется!
Подробнее:
https://prime-soft.biz/courses/postgresql
На следующей неделе начинаем интенсив SQL, PostgreSQL!
У нас будет:
10 насыщенных онлайн занятий (с записью эфира);
Много совместной работы в режиме онлайн! Будет много практики! Готовимся работать, не просто слушать:)
Закрытая группа Телеграм с записями наших встреч и кратким конспектом! Здесь же я буду отвечать и на все вопросы по самостоятельным задачам (они тоже будут, работа один-на-один с базой данных обязательна).
Сертификат по окончанию он-лайн курса! И помощь в составлении резюме если потребуется!
Подробнее:
https://prime-soft.biz/courses/postgresql
prime-soft.biz
Prime | Курс SQL, PostgreSql
Уроки и курсы SQL, PostgreSQL, Базы данных.
👍2🔥2
Всем доброго понедельника!
Надеюсь, неделя началась отлично, или, по крайней мере, не плохо☺️
Предлашаю небольшую задачу по SQL, похожую на одну из тех, что мы с Вами уже решали.
Надеюсь, неделя началась отлично, или, по крайней мере, не плохо☺️
Предлашаю небольшую задачу по SQL, похожую на одну из тех, что мы с Вами уже решали.
❤2
В таблице INVOICES две строки. В первой строке в столбце QTY число 25, во второй строке в этом же столбце лежит NULL.
Каким будет результат запроса: SELECT MIN(QTY) FROM INVOICES
Каким будет результат запроса: SELECT MIN(QTY) FROM INVOICES
Anonymous Quiz
9%
Null
5%
0
1%
2
79%
25
0%
27
6%
Выполнение запроса приведёт к SQL ошибке
👍2
В таблице CLIENTS три строки:
ID NAME
1 АО "Проблемы и решения"
2 АО "Решения без проблем"
3 ИП "Иванов Иван Иванович"
В таблице INVOICES две строки:
ID ID_CLIENT DATE_INV
1 1 03.09.2024
2 1 03.09.2024
ID NAME
1 АО "Проблемы и решения"
2 АО "Решения без проблем"
3 ИП "Иванов Иван Иванович"
В таблице INVOICES две строки:
ID ID_CLIENT DATE_INV
1 1 03.09.2024
2 1 03.09.2024
Какое количество строк вернёт запрос SELECT * FROM CLIENTS WHERE EXISTS (SELECT COUNT(*) FROM INVOICES WHERE ID_CLIENT = CLIENTS.ID)
Anonymous Quiz
11%
0
47%
1
24%
2
16%
3
2%
4
1%
6
👍9👎9🦄3
Обучение на ошибках (особенно на своих 😀) - один из самых эффективных методов обучения!
Здесь нужно было заметить неправильное использование EXISTS.
Оператор EXISTS используют для проверки того, возвращается ли что-то подзапросом, указанным в скобках. Как правило, в скобках для оператора EXISTS/NOT EXISTS пишут:
SELECT *
или:
SELECT 1
В задаче выше нарочно допущена ошибка (в EXISTS нарочно написал SELECT COUNT).
SELECT COUNT всегда будет возвращать данные. Написанный в скобочках подзапрос всегда будет возвращать количество, хоть и иногда 0. Но данные-то есть. Ноль - это тоже данные. Поэтому EXISTS будет давать TRUE для каждой из трех строчек основного запроса.
И еще немного по теме COUNT напомню: COUNT всегда возвращает значение. Никогда не возвращает NULL. Если по условиям WHERE (под)запроса не будет подходящих данных, то COUNT вернёт 0, не NULL.
Здесь нужно было заметить неправильное использование EXISTS.
Оператор EXISTS используют для проверки того, возвращается ли что-то подзапросом, указанным в скобках. Как правило, в скобках для оператора EXISTS/NOT EXISTS пишут:
SELECT *
или:
SELECT 1
В задаче выше нарочно допущена ошибка (в EXISTS нарочно написал SELECT COUNT).
SELECT COUNT всегда будет возвращать данные. Написанный в скобочках подзапрос всегда будет возвращать количество, хоть и иногда 0. Но данные-то есть. Ноль - это тоже данные. Поэтому EXISTS будет давать TRUE для каждой из трех строчек основного запроса.
И еще немного по теме COUNT напомню: COUNT всегда возвращает значение. Никогда не возвращает NULL. Если по условиям WHERE (под)запроса не будет подходящих данных, то COUNT вернёт 0, не NULL.
👍29❤2🤯2👎1👾1
В таблице DOCUMENTS четыре строки. В поле DOC_TYPE в первых двух строках число 1, в двух других строках число 2. Запрос SELECT DISTINCT COUNT(DOC_TYPE) FROM DOCUMENTS вернёт число:
Anonymous Quiz
1%
Null
1%
0
7%
1
41%
2
5%
3
32%
4
13%
Выполнение запроса приведёт к SQL ошибке
👍11