Примеры SQL в PostgreSQL 1 ПРИМЕР 1 1. 2. 3. 4. 5. 6. Соединиться с базой данных booktown на сервере баз данных server. Просмотреть список имеющихся на сервере баз данных. Просмотреть список зарегистрированных пользователей слэш-командой \du и командами языка SQL: SELECT * FROM pg_user; SELECT usename, usesysid FROM pg_user; Просмотреть список групп пользователей SELECT * FROM pg_group; Просмотреть список таблиц базы данных booktown. Для следующих таблиц определить их структуру (перечень полей и соответствующие им типы данных) и составить графическую схему данных (какие поля являются общими, связующими для таблиц). Предложить смысловую интерпретацию для каждой таблицы и всех ее полей. Посмотреть все данные таблицы можно оператором: SELECT * FROM имя_таблицы; Рабочие таблицы: authors, books, customers, editions, publishers, shipments, stock, subjects. 2 ПРИМЕР 2 Подключиться к базе данных booktown и выполнить следующие запросы: 1. Все сведения о книгах. 2. Все сведения об изданиях книг. 3. Код и название всех книг. 4. ISBN, номер издания, дата издания и тип обложки для всех изданий. 5. Неповторяющиеся коды издательств, выпускавших книги. 6. Неповторяющиеся коды тем, по которым написаны книги. 7. Для каждого кода ISBN получить прибыль магазина в случае продажи всех имеющихся в наличии экземпляров. 8. Названия всех книг, упорядоченные по алфавиту. 9. Фамилии и имена всех покупателей, отсортированные по алфавиту (если есть однофамильцы, то они должны быть отсортированы по именам). 10. Список всех ISBN с указанием розничной цены, упорядоченный от самых дорогих к самым дешевым. 11. Код ISBN и затраты магазина на закупку соответствующих имеющихся в наличии книг. Упорядочить по стоимости закупки (всех имеющихся экземпляров). 12. Код ISBN, номер издания и дата издания для всех книг в таком порядке, чтобы сначала шли книги, издававшиеся наибольшее количество раз. Книги с одним и тем же количеством изданий упорядочить по дате издания. 13. Код ISBN и имеющееся количество для десяти книг, в наибольшем количестве имеющихся на складе. 14. Все данные о последних пяти покупках. 15. Все данные о первых семи покупках, не считая трех самых первых (т.е. следующие семь после первых трех). 16. Самая дорогая цена (розничная) книги. 17. Самая малая разница между ценой закупки и ценой продажи. 18. Код ISBN и название типа обложки («твердая» / «мягкая») для всех изданий. Упорядочить по названию типа обложки. 19. Код ISBN, цена закупки, цена продажи, величина наценки, процент наценки и класс всех книг. Если цена продажи более, чем на 10 % превышает цену закупки, то класс – «VIP», иначе – «эконом». Упорядочить по убыванию процента наценки. 3 ПРИМЕР 3 Выполнить следующие запросы к базе данных booktown: 1. Вся информация о переиздании (т.е. не первое издание, а второе и выше) книг, так чтобы сначала списка шли книги, выдержавшие наибольшее количество переизданий. 2. Вся информация об издании книг с типом h в порядке их публикации. 3. Информация об изданиях книг до XXI века. 4. Информация об имеющихся книгах на складе (stock). Отсортировать по убыванию количества, отсутствующие книги не выводить. 5. Код ISBN и отпускная цена для книг с отпускной ценой в диапазоне от 20 до 30 в порядке возрастания цены. 6. Список покупателей, которых зовут Jean. 7. Код ISBN, имеющееся количество и отпускная цена для книг, имеющихся на складе в количестве, не меньшем 50, или с отпускной ценой, меньшей 20. 8. Код ISBN, тип обложки и дата издания для книг в мягкой (бумажной) обложке, изданных в период с 1990 по 2010 гг. Упорядочить по дате издания. 9. Код ISBN, номер издания и дата издания для книг, изданных впервые или в XXI веке. 10. Названия книг, написанных автором с кодом 1809 по теме с кодом 15. 11. Код ISBN и дата покупки для покупок в период с 10-го по 15 августа 2001 года. Отсортировать по дате покупки. 12. Названия книг и коды авторов для книг, написанных авторами с кодами 1809, 7805, 1212, 15990 и 25041. Упорядочить по коду автора. 13. Названия книг и коды авторов для книг, написанных авторами, чьи номера не 1809, 7805, 1212, 15990 и 25041. Упорядочить по коду автора. 14. Название темы и отдел для тем, расположенных в отделах Main St, Black Raven Dr, Productivity Ave и Creativity St. Отсортировать по названию темы. 15. Фамилия и имя авторов, имена которых начинаются на Marg. 16. Названия книг, в которых присутствует предлог in. 17. Названия книг, в которых присутствует The или the. 18. Названия книг, в которых нет ни The, ни the. 19. Фамилии авторов, чьи имена не известны. 20. Код темы, название темы и отдел для тем с кодом, большим 10, и известным отделом. 4 ПРИМЕР 4 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Выполнить следующие запросы к базе данных booktown: Код isbn, дата издания, цена продажи и количество экземпляров для всех изданий на складе. Дата покупки, код покупателя, дата издания, тип обложки для всех покупок. Отсортировать по дате издания. Дата покупки, фамилия и имя покупателя для всех покупок. Отсортировать по фамилии и имени покупателя. Список авторов с названиями написанных ими книг, отсортированный по авторам. Список названий книг и фамилий их авторов с указанием темы, отсортировать по названию книги. Фамилия и имя покупателя, название купленной им книги для всех покупок. Отсортировать по покупателям. Все пары: название издательства, фамилия автора (произведение которого было издано данным издательством). Упорядочить по названию издательства. Фамилия и имя покупателя, название издательства купленной им книги для всех покупок. Упорядочить по покупателю. Список номеров ISBN и тип обложки для книг в бумажном переплете с указанием издательств, выпустивших книгу; список отсортировать по издательствам. Фамилия автора и название тем, которые он отразил в своих произведениях. Упорядочить по автору. Код ISBN, название книги, фамилия автора, затраты магазина на закупку всех имеющихся в наличии экземпляров. Отсортировать так, чтобы в начале списка шли самые малозатратные издания. Название и число экземпляров книг, количество которых на складе равно нулю. Упорядочить по названию. Название и дата продажи книги, которая была куплена самой первой в магазине. Фамилия и имя автора книги, купленной предпоследней. Указать также дату продажи. Название книги, дата издания, первое или повторное издание для всех изданий (если издание 1, то «первое»; иначе – «повторное»). Отсортировать по названию книги. Название книги, издательство и тип обложки для книг, изданных издательством Roc в твердом переплете. Упорядочить по названию книги. 5 17. Название и тема книг, относящихся к темам Science и Science Fiction. Отсортировать по названию книги. 18. Названия книг, которые приобрела Annie Jackson (с указанием покупателя). 19. Название и издатель книг, изданных не издательствами Ace Books, Roc, Penguin, Doubleday, Random House. 20. Название книги и адрес издательства для книг, изданных не в городе New York. 6 ПРИМЕР 5 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Выполнить следующие запросы к базе данных booktown: Общее количество книг на складе (stock). Количество книг с розничной ценой выше 30. Выручка магазина при реализации всех книг. Средняя цена (cost) книги. Средняя цена (cost) для имеющихся книг на складе (stock). Даты наиболее ранней и наиболее поздней публикаций. Количество совершенных покупок. Количество покупателей, совершавших покупки. Количество покупателей с различными фамилиями, совершавших покупки. Количество авторов, написавших какие-либо книги. Количество изданий, выпущенных в твердой и мягкой обложке. Количество первых изданий, вторых и так далее. В таком же порядке. Количество книг, которые приобрел каждый покупатель. Отсортировать по покупателю. Список покупателей-однофамильцев с подсчетом их количества. Количество кодов isbn, которые были изданы каждым издательством. Отсортировать по названию издательства. Количество книг различных названий, которые выпустило каждое издательство. Отсортировать по названию издательства. Количество кодов isbn, которые были изданы каждым издательством, находящимся в городе New York. Отсортировать так, чтобы сначала шли издательства, выпустившие наибольшее количество изданий (кодов isbn). Количество кодов isbn, которые были изданы каждым издательством, находящимся в городе New York. Издательства, выпустившие менее двух изданий (кодов isbn), не выводить. Отсортировать так, чтобы сначала шли издательства, выпустившие наибольшее количество изданий (кодов isbn). Первая дата публикации для каждого автора. Упорядочить по датам. Фамилии авторов, чьи произведения не имеют изданий выше второго. Фамилии авторов, все издания которых имеются в наличии в количестве не менее 50 экземпляров. Фамилии авторов, все книги которых выходили только в бумажной обложке. Отсортировать по фамилии автора. Наибольшее количество книг, написанных одним автором. Наименьшее количество изданий, выпущенных одним издательством. 7 ПРИМЕР 6 Следующие запросы к базе данных booktown рекомендуется набирать в файлах (по одному запросу в файле). Запустить запрос из файла можно командой \i имя_файла. Подзапросы и представления сопровождать комментариями, поясняющими их назначение. 1. Пусть автор получает половину от стоимости (cost) каждой проданной книги. Определить прибыль каждого автора. Отсортировать по авторам. 2. Определить, сколько книг было на складе до продажи. Отсортировать по кодам isbn. 3. Список тем, нашедших отражение в произведениях только одного автора. Отсортировать по названию темы. 4. Список покупателей, купивших более одной книги, но все на одну и ту же тему. Отсортировать по покупателю. 5. Список покупателей, купивших книги и в твердой, и в бумажной обложках. Отсортировать по покупателям. 6. Список тем, книги по которым выдержали наибольшее количество изданий. 7. Название самой популярной у покупателей темы (тем). 8. Код isbn, автор и издатель бестселлера(ов) – самой покупающейся книги. 9. Издатель, средняя цена книг которого самая дешевая. 10. Для каждой темы определить, сколько книг издано в жесткой и сколько – в бумажной обложках. Отсортировать по теме. 11. Фамилии авторов, писавших на одну и ту же тему несколько раз. Отсортировать по фамилии автора. 12. Список покупателей, покупавших одно и то же произведение несколько раз. Отсортировать по покупателю. 13. Список авторов, не написавших ни одной книги. Отсортировать по автору. 14. Названия тем, которые никогда не были изданы. Упорядочить по названию темы. 15. Коды ISBN книг с наименьшей разницей между ценой закупки и ценой продажи. 16. Название издательства (издательств), выпустивших наибольшее количество книг (с различными isbn). 17. Список издателей, книги которых хуже всего продаются. 18. Все различные пары кодов isbn, относящихся к одной и той же книге. 8 19. Все различные пары авторов, писавших на одну и ту же тему. 20. Все различные пары авторов, никогда не писавших на одну и ту же тему. 9 ПРИМЕР 7 1. 2. 3. 4. 5. 6. 7. 8. 9. Переключиться в БД с номером вашей группы (команда монитора: \c имяБазыДанных) и создать в этой БД таблицу для хранения данных о людях, характеризуемых фамилиями, именами, возрастом (число прожитых лет), весом (в кг) и ростом (в см). Внести в созданную таблицу данные о шести произвольных людях в возрасте от 16 до 50 лет, имеющих вес от 40,5 до 99,5 кг и рост 150 – 195 см. Создать вторую таблицу, включив в нее из первой таблицы данные о людях старше 20 лет и выше 180 см. Создать третью таблицу – копию первой таблицы, но не содержащую столбца с именами людей. Преобразовать третью таблицу таким образом, чтобы она содержала данные о росте в дюймах, а весе – в фунтах (1 фунт = 454 г, 1 дюйм = 2,54 см). Из третьей таблицы удалить строки, содержащие сведения о людях моложе 20 лет. Добавить в третью таблицу данные о фамилии и возрасте еще двух произвольных человек. Удалить из первой таблицы сведения о людях, чьи фамилии есть во второй таблице. Продемонстрировав все созданные таблицы преподавателю, уничтожить все таблицы. 10 ПРИМЕР 8 Все работы по созданию и модификации таблиц следует выполнять в базе данных с номером вашей группы. 1. Создать таблицу для хранения данных о студентах с полями: фамилия, номер зачетки, адрес, год поступления в университет, номер специальности, номер группы; ввести ограничения первичного ключа, отсутствия пустых значений для фамилии и года поступления, значение специальности по умолчанию 0220100. 2. Заполнить данными созданную таблицу (не менее 5 записей), при вводе попытаться ввести записи с дублирующимися номерами зачетных книжек, однофамильцами, без фамилии, без года поступления в университет, без специальности; зафиксировать в отчете свои действия и реакцию на них сервера БД (что происходит и почему). Привести в отчете окончательный вид созданной таблицы. 3. Создать таблицу для хранения данных о сдаче студентами различных экзаменов по дисциплинам с оценками и заполнить ее данными (каждый студент сдает не менее трех экзаменов); задать первичный ключ в таблице; обеспечить выполнение условий целостности данных, чтобы экзамены сдавались только студентами, у которых есть зачетные книжки, а при удалении записей о студентах удалялись бы и записи о сданных ими экзаменах (каскадное удаление). Продемонстрировав все созданные таблицы преподавателю, уничтожить таблицы. 11