Работа с единственным значением
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Пусть требуется выбрать данные о тех изданиях, цена которых больше среднего значения. Это можно сделать с помощью следующего запроса:

SELECT *

FROM editions

WHERE cost > (SELECT AVG(cost)

         FROM editions);

В данном запросе сначала выполняется подзапрос (SELECT AVG(cost) FROM editions). Он возвращает единственное значение (а не набор записей) – среднее значение столбца cost. Точнее, данный подзапрос возвращает единственную запись, содержащую единственное поле. Далее выполняется внешний запрос, который выводит все столбцы таблицы editions и записи, в которых значение столбца cost больше значения, полученного с помощью подзапроса. Таким образом, сначала выполняется подзапрос, а затем внешний запрос, использующий результат подзапроса.

 

Работа со списком значений из одного столбца

Рассмотрим применение подзапросов, возвращающих не единственное значение, а список значений из одного столбца. Получим все данные о покупках, которые совершили покупатели с именем James:

SELECT *

FROM shipments

WHERE customer_id IN (SELECT id

                 FROM customers

                 WHERE first_name = 'James');

Сначала выполняется подзапрос, возвращающий список идентификаторов покупателей, которых зовут James. Далее, внешний запрос сравнивает значение поля customer_id из каждой записи таблицы shipments с полученным списком. Если сравнение успешно (сравниваемое значение имеется в списке), то запись о покупке добавляется в итоговый набор.

Теперь сформулируем запрос, возвращающий коды ISBN, книги с которыми никто не покупал:

SELECT isbn

FROM editions

WHERE isbn NOT IN (SELECT isbn

            FROM shipments);

Чтобы секция IN сравнивала несколько полей, следует сгруппировать их имена в круглые скобки в секции WHERE непосредственно перед IN. Сгруппированные поля должны соответствовать полям целевого списка подзапроса как по количеству, так и по типу данных.

Например, получим данные обо всех книгах в бумажной обложке, отсутствующих на складе:

SELECT isbn, cost, retail

FROM stock

WHERE (isbn, stock) IN (SELECT isbn, 0

            FROM editions

                 WHERE type = 'p');

Подзапрос к таблице editions группирует поле isbn с целочисленной константой 0 для всех книг в бумажной обложке. Возвращаемые подзапросом записи сравниваются с полем isbn и stock таблицы stock с использованием ключевого слова IN.

 

Пусть подзапрос возвращает несколько записей. Тогда чтобы в условии внешнего оператора WHERE можно было использовать операторы сравнения, требующие единственного значения, используются кванторы ALL и SOME (ANY).

Получим список книг с самой высокой ценой:

SELECT *

FROM stock AS s1

WHERE s1.retail >= ALL (SELECT s2.retail

                 FROM stock AS s2);

Подзапрос SELECT s2.retail FROM stock AS s2 возвращает список цен всех книг. Выражение >= ALL означает, что внешний запрос должен вернуть только те записи, в которых значение столбца retail больше или равен каждого значения, возвращенного вложенным подзапросом.

Итоговый набор книг будет иным, если вместо квантора ALL применить SOME или ANY:

SELECT *

FROM stock AS s1

WHERE s1.retail > SOME (SELECT s2.retail

                 FROM stock AS s2);

Этот запрос вернет список книг, цена которых выше цены хотя бы одной какой-либо книги.

 

Работа с набором записей

Вообще говоря, подзапрос может быть вставлен не только в операторы WHERE и HAVING, но и в оператор FROM. В этом случае подзапросу необходимо присвоить псевдоним.

Допустим, что имеется таблица Рейсы (Начальный_пункт, Конечный_пункт), содержащая сведения о том, из каких пунктов и в какие можно попасть с помощью того или иного авиарейса. Получим сведения, в какие пункты можно попасть, сделав не более одной пересадки (т.е. без пересадок или с одной пересадкой), только из пункта А:

SELECT *

FROM

(SELECT Начальный_пункт, Конечный_пункт

FROM Рейсы

UNION

SELECT T1.Начальный_пункт, T2.Конечный_пункт

FROM Рейсы T1, Рейсы T2

WHERE T1.Конечный_пункт = T2.Начальный_пункт) AS T

WHERE T.Начальный_пункт = 'A';

 

Связанные подзапросы

 

Связанные (коррелированные) подзапросы позволяют выразить более сложные вопросы относительно сведений, хранящихся в базе данных. При выполнении запросов, содержащих связанные подзапросы, нет такого четкого разделения по времени выполнения между подзапросом и запросом, как в случае простых подзапросов. В случае простых подзапросов сначала выполняется подзапрос, а затем содержащий его запрос. При наличии связанного подзапроса порядок выполнения запроса в целом иной. Основной признак связанного подзапроса заключается в том, что он не может быть выполнен самостоятельно, вне всякой связи с основным запросом. Формально этот признак обнаруживается в выражении сложного запроса следующим образом: подзапрос ссылается на таблицу, которая упоминается в основном запросе.

Рассмотрим некоторый абстрактный и, в то же время, типичный запрос, содержащий связанный подзапрос:

SELECT T1.A

FROM T1

WHERE T1.B = (SELECT T2.B

         FROM T2

         WHERE T2.C = T1.C);

Данный запрос на выборку данных содержит подзапрос, сформулированный в выражении, размещенном в основном запросе после ключевого слова WHERE. Запрос в целом использует две таблицы: T1 и T2, в которых есть столбцы с одинаковыми именами B и C и одинаковыми типами. Подзапрос (SELECT T2.B FROM T2 WHERE T2.C = T1.C) обращается к этим же таблицам. Поскольку одна из таблиц (T1) фигурирует как в подзапросе, так и во внешнем запросе, то подзапрос нельзя выполнить самостоятельно, вне связи с внешним запросом. Поэтому выполнение запроса в целом (т.е. внешнего запроса) происходит следующим образом:

1. Сначала выделяется первая запись из таблицы T1, указанной в операторе FROM внешнего запроса (вся запись таблицы T1, а не только значение столбца A). Эта запись называется текущей. Значения столбцов для этой записи доступны и могут быть использованы в подзапросе.

2. Затем выполняется подзапрос, который возвращает список значений столбца B таблицы T2 в тех записях, в которых значение столбца C равно значению столбца C из таблицы T1.

3. Будем считать, что в этом примере подзапрос возвращает единственное значение. Если это не так, то потребуется использование, например, предикатов вместо оператора сравнения (=). Теперь выполняется оператор WHERE основного запроса. Если значение столбца B в текущей (выделенной) записи таблицы T1 равно значению, возвращенному подзапросом, то эта запись выделяется внешним запросом.

4. Оператор SELECT внешнего запроса выполняет проверку условия своего оператора WHERE. Если оно истинно, то значение столбца A текущей записи таблицы T1 помещается в результатную таблицу, в противном случае запись игнорируется. Затем происходит переход к следующей записи таблицы T1. Теперь для нее выполняется подзапрос. Аналогичным образом все описанное происходит для каждой записи таблицы T1.

 

Получим, например, список покупателей, когда-либо делавших покупки:

SELECT last_name, first_name

FROM customers

WHERE (SELECT count(isbn)

FROM shipments

WHERE customer_id = customers.id) >= 1;

 

Как известно, запрос возвращает одну или несколько записей либо не возвращает ничего. Рассмотрим пример, в котором требуется проверка существования записей. Так, иногда требуется выборка записей из одной таблицы при условии, что в другой таблице существует хотя бы одна соответствующая запись.

Итак, получим список покупателей, когда-либо делавших покупки:

SELECT last_name, first_name

FROM customers

WHERE EXISTS (SELECT isbn

        FROM shipments

        WHERE customer_id = customers.id);

Аналогично, чтобы получить список покупателей, никогда не делавших покупки, можно воспользоваться следующим запросом:

SELECT last_name, first_name

FROM customers

WHERE NOT EXISTS (SELECT isbn

            FROM shipments

            WHERE customer_id = customers.id);

 

Предикат UNIQUE имеет такой же смысл, как и EXISTS, но при этом для его истинности требуется, чтобы все записи в результатной таблице не только существовали, но и были уникальны (т.е. не повторялись).

Предикат DISTINCT почти такой же, как и UNIQUE. Отличие этих предикатов обнаруживается применительно к значениям NULL. Так, если в результатной таблице все записи уникальны (предикат UNIQUE истинен), то и предикат DISTINCT тоже истинен. С другой стороны, если в результатной таблице имеются хотя бы две неопределенные записи, то предикат DISTINCT ложен, хотя предикат UNIQUE истинен.

 

Представления

 

При работе с SQL нередко возникают ситуации, когда один и тот же запрос приходится использовать повторно. В подобных ситуациях обычно используются представления (views). Представления могут строиться на основе как простых и стандартных запросов к одной таблице, так и чрезвычайно сложных запросов, в которых задействовано несколько таблиц.

Представление можно рассматривать как хранимый запрос, на основе которого создается объект базы данных. Этот объект очень похож на таблицу, но в его содержимом динамически отражается состояние только тех записей, которые были заданы при создании представления. Представления не являются физическими объектами хранения данных. Данные в представлениях, подобно в ответах на запрос SELECT, просто выбираются из таблиц базы данных, т.е. представляются в том или ином виде. В действительности за представлением стоит скрытый SQL-запрос. Работать с представлением можно как с обычной таблицей. Однако любой запрос к представлению в действительности инициирует скрытый запрос, который комбинируется с пользовательским.

Представления, будучи созданы, могут быть доступны многим пользователям и существуют в базе данных до тех пор, пока не будут принудительно удалены.

 

Представления создаются командой

         CREATE VIEW имяПредставления AS

         запросSELECT;

Как и обычной таблице базы данных, представлению присваивается имя, которое не должно совпадать ни с одним именем таблиц. За ключевым словом AS следует SQL-выражение запроса на выборку данных.

Пусть требуется получить для каждого наименования книги количество ее покупок и дату последней покупки:

SELECT title, count(*) AS num_shipped,

    max(ship_date) AS last_date

FROM shipments JOIN editions USING (isbn)

JOIN books ON (book_id = books.id)

GROUP BY title

ORDER BY num_shipped DESC;

Запрос получается слишком громоздким, и часто вводить его вручную нежелательно. Создадим на базе этого запроса представление:

CREATE VIEW recent_shipments AS

SELECT title, count(*) AS num_shipped,

        max(ship_date) AS last_date

FROM shipments JOIN editions USING (isbn)

    JOIN books ON (book_id = books.id)

GROUP BY title

ORDER BY num_shipped DESC;

 

Представления значительно упрощают получение нужных данных. Вместо того, чтобы вводить длинный запрос, достаточно ввести простую команду SELECT:

SELECT *

FROM recent_shipments;

Получим названия книг, которые были куплены в наибольшем количестве:

SELECT title

FROM recent_shipments

WHERE num_shipped = (SELECT max(num_shipped)

                 FROM recent_shipments)

ORDER BY title;

 

Некоторые современные СУБД поддерживают операции изменения содержимого представлений – вставку, изменение и удаление записей. Однако это возможно лишь в том достаточно редком случае, когда имеется однозначное соответствие между столбцами представления и столбцами таблицы базы данных. Для этого в операторе SELECT представления не должно использоваться более одной таблицы, вычисляемых выражений, группировки, ключевого слова DISTINCT и т.п.

В PostgreSQL при попытке вызова команд INSERT, UPDATE или DELETE для представления происходит ошибка.

 

Представления удаляются из базы данных командой

DROP VIEW имяПредставления;

При удалении представления данные сохраняются без изменения. Теряется только запрос, на котором основано представление.

 

 



Лабораторная работа 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, относящихся к одной и той же книге.

19. Все различные пары авторов, писавших на одну и ту же тему.

20. Все различные пары авторов, никогда не писавших на одну и ту же тему.



КОМАНДЫ ИЗМЕНЕНИЯ ДАННЫХ

 

При создании и дальнейшем сопровождении базы данных обычно возникает задача добавления новых и удаления ненужных записей, а также изменения содержимого ячеек таблицы. В SQL для этого предусмотрены операторы INSERT (вставить), DELETE (удалить) и  UPDATE (изменить). Запросы, начинающиеся с этих ключевых слов, не возвращают данные в виде виртуальной таблицы, а изменяют содержимое уже существующих таблиц базы данных. Запросы на модификацию данных могут содержать вложенные запросы на выборку данных из той же самой таблицы или из других таблицы, однако сами не могут быть вложены в другие запросы.

 

Добавление новых записей

 

Для добавления (вставки) записи в таблицу служит оператор INSERT, который имеет несколько форм:

· INSERT INTO имяТаблицы VALUES (списокЗначений) – вставляет пустую запись в указанную таблицу и заполняет эту запись значениями из списка, указанного за ключевым словом VALUES. При этом первое в списке значение вводится в первый столбец таблицы, второе значение – во второй столбец и т.д. Порядок столбцов задается при создании таблицы. Данная форма оператора INSERT не очень надежна, поскольку нетрудно ошибиться в порядке вводимых значений.

· INSERT INTO имяТаблицы (списокСтолбцов) VALUES (списокЗначений) – вставляет пустую запись в указанную таблицу и вводит в заданные столбцы значения из указанного списка. При этом в первый столбец из списокСтолбцов вводится первое значение из списокЗначений, во второй столбец – второе значение и т.д. Порядок имен в списке можеть отличаться от их порядка, заданного при создании таблицы. Столбцы, которые не указаны в списке, заполняются значениями NULL.

· INSERT INTO имяТаблицы (списокСтолбцов) SELECT ... – вставляет в указанную таблицу записи, возвращаемые запросом на выборку. На практике нередко требуется загрузить в одну таблицу данные из другой таблицы. Например,

INSERT INTO books

      (id, title, author_id, subject_id)

SELECT book_id, title, author_id, subject_id

FROM book_queue

WHERE subject_id = 4;

Удаление записей

 

Для удаления записей из таблицы применяется оператор DELETE (удалить):

                DELETE

                FROM имяТаблицы

                WHERE условие;

Данный оператор удаляет из указанной таблицы записи (а не отдельные значения столбцов), которые удовлетворяют указанному условию.

Следующий запрос удаляет записи из таблицы stock, в которых значение столбца stock равно нулю. Если подходящих записей несколько, все они будут удалены.

DELETE

FROM stock

WHERE stock = 0;

В операторе WHERE может находиться подзапрос на выборку данных (оператор SELECT). Подзапросы в операторе DELETE работают точно так же, как и в операторе SELECT.

Операция удаления записей из таблицы является опасной в том смысле, что связана с риском необратимых потерь данных в случае ошибок. Чтобы избежать неприятностей, перед удалением записей рекомендуется сначала выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут удалены. Так, например, перед выполнением рассмотренного ранее запроса на удаление не помешает выполнить соответствующий запрос на выборку:

SELECT *

FROM stock

WHERE stock = 0;

Для удаления всех записей из таблицы достаточно использовать оператор DELETE без ключевого слова WHERE. При этом сама таблица со всеми определенными в ней столбцами остается и готова для вставки новых записей. Например,

DELETE

FROM stock;

 

Изменение данных

 

Для изменения значений столбцов таблицы применяется оператор UPDATE (изменить, обновить). Чтобы изменить значения в одном столбце таблицы в тех записях, которые удовлетворяют некоторому условию, следует выполнить такой запрос:

         UPDATE имяТаблицы

         SET имяСтолбца = значение

         WHERE условие;

За ключевым словом SET (установить) следует выражение равенства, в левой части которого указывается имя столбца, а в правой – выражение, значение которого следует сделать значением данного столбца. Эти установки будут выполнены в тех записях, которые удовлетворяют условию в операторе WHERE.

Чтобы одним оператором UPDATE установить новые значения сразу для нескольких столбцов, вслед за ключевым словом SET записываются соответствующие выражения равенства, разделенные запятыми. Например:

UPDATE publishers

SET name = 'O\'Reilly & Associates',

address = 'O\'Reilly & Associates, Inc. '

    || '101 Morris St, Sebastopol, CA 95472'

WHERE id = 113;

Использование оператора WHERE в операторе UPDATE не обязательно. Если он отсутствует, то указанные в SET изменения будут произведены для всех записей таблицы.

Операция изменения записей, как и их удаление, связана с риском необратимых потерь данных в случае ошибок. Чтобы избежать подобных неприятностей, перед обновлением записей рекомендуется выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут изменены. Так, например, перед выполнением приведенного ранее запроса на обновление данных не помешает выполнить соответствующий запрос на выборку:

SELECT *

FROM publishers

WHERE id = 113;

Условие в операторе WHERE может содержать подзапросы, в том числе и связанные.

Некоторые СУБД (например, PostgreSQL) имеют расширение стандарта SQL, позволяющее обновлять одну таблицу данными из другой. В этом случае команда UPDATE дополняется поддержкой секции FROM. Секция FROM позволяет получать входные данные из других наборов данных (таблиц и подзапросов).

Например, обновим данные таблицы stock по данным таблицы stock_backup:

UPDATE stock

SET retail = stock_backup.retail

FROM stock_backup

WHERE stock.isbn = stock_backup.isbn;

Секция WHERE описывает связь между обновляемой таблицей и источником. Каждый раз, когда в таблицах находятся совпадающие значения isbn, поле retail в таблице stock обновляется значением из резервной таблицы stock_backup.

Секция FROM поддерживает все разновидности синтаксиса JOIN, что открывает широкие возможности обновления данных в существующих наборах.

 

 



Лабораторная работа 7

 

1. Переключиться в БД с номером вашей группы (команда монитора: \c имяБазыДанных) и создать в этой БД таблицу для хранения данных о людях, характеризуемых фамилиями, именами, возрастом (число прожитых лет), весом (в кг) и ростом (в см).

2. Внести в созданную таблицу данные о шести произвольных людях в возрасте от 16 до 50 лет, имеющих вес от 40,5 до 99,5 кг и рост 150 – 195 см.

3. Создать вторую таблицу, включив в нее из первой таблицы данные о людях старше 20 лет и выше 180 см.

4. Создать третью таблицу – копию первой таблицы, но не содержащую столбца с именами людей.  

5. Преобразовать третью таблицу таким образом, чтобы она содержала данные о росте в дюймах, а весе – в фунтах (1 фунт = 454 г, 1 дюйм = 2,54 см).

6. Из третьей таблицы удалить строки, содержащие сведения о людях моложе 20 лет.

7. Добавить в третью таблицу данные о фамилии и возрасте еще двух произвольных человек.

8. Удалить из первой таблицы сведения о людях, чьи фамилии есть во второй таблице.

9. Продемонстрировав все созданные таблицы преподавателю, уничтожить все таблицы.

 

 



ОПРЕДЕЛЕНИЕ ДАННЫХ

Создание таблиц

 

Оператор CREATE TABLE

 

Создание таблицы производится с помощью оператора CREATE TABLE с указанием необходимых параметров.

Для создания таблицы необходимо указать ее имя и определить столбцы. Определение столбца включает его имя и тип. Если указывается длина столбца, то она заключается в круглые скобки после типа. Кроме того, можно указать ограничения для столбца. Все перечисленные элементы определения столбца указываются друг за другом через пробел. Если создаваемая таблица содержит несколько столбцов, то их определения разделяются запятыми.

Далее приведен запрос на создание таблицы authors без ограничений:

CREATE TABLE authors

(id integer,

last_name text,

first_name text);

 

Ограничения для столбцов

 

NOT NULL               Столбец не может содержать значение NULL, т.е. значения этого столбца должны быть определенными.

UNIQUE                    Значение, вводимое в столбец, должно отличаться от всех остальных значений в этом столбце, т.е. быть уникальным.

PRIMARY KEY         Столбец является первичным ключом. В каждой таблице только один столбец может быть первичным ключом. Это означает, что он не может содержать значение NULL, а вводимое в него значение должно отличаться от всех остальных значений в этом столбце. Таким образом, PRIMARY KEY является комбинацией NOT NULL и UNIQUE.

DEFAULT значение Устанавливает значение по умолчанию. Так, при добавлении новой записи столбец с таким ограничением автоматически получит указанное значение.

CHECK (условие) Позволяет производить проверку условия при вводе данных. Значение будет сохранено, если условие выполняется, в противном случае – нет.

 

Создадим таблицу authors с использованием ограничений столбцов:

CREATE TABLE authors

(id integer PRIMARY KEY CHECK (id > 0),

last_name text NOT NULL,

first_name text);

 

Ограничения для таблиц

 

В ограничениях таблиц, в отличие от ограничений полей, могут участвовать сразу несколько полей таблицы. Для ограничения таблицы может быть задано имя. В будущем имя ограничения может пригодиться для удаления ограничения (например, в секции DROP CONSTRAINT команды ALTER TABLE).

Определение ограничения для таблицы указывается после определения столбцов и состоит из необязательной секции CONSTRAINT имяОграничения, за которой следует выражение, определяющее непосредственно само ограничение.

 

UNIQUE                    Ограничение означает, что комбинация значений полей, перечисленных за ключевым словом UNIQUE, принимает только уникальные значения. Допускается многократное вхождение псевдозначения NULL.

PRIMARY KEY         В ограничении могут перечисляться несколько полей, разделенных запятыми. Используется для составного первичного ключа.

CHECK (условие) Команды INSERT или UPDATE для записи завершаются успешно лишь при выполнении заданного условия. Может содержать ссылки на несколько полей.

 

Создадим таблицу authors с использованием ограничений таблицы:

CREATE TABLE authors

(id integer,

last_name text NOT NULL,

first_name text,

CONSTRAINT id_pkey PRIMARY KEY (id),

CONSTRAINT id_check CHECK (id > 0),

CONSTRAINT name_uniq UNIQUE (last_name, first_name));

 

Внешние ключи

 

Внешний ключ – это столбец или группа столбцов, соответствующих первичному ключу другой таблицы. Внешний ключ определяется как ограничение столбца с помощью выражения REFERENCES внешняяТаблица (первичныйКлюч). Если первичныйКлюч в ограничении не указан, проверка выполняется по первичному ключу внешней таблицы.

Создадим таблицу books:

CREATE TABLE books

(id integer PRIMARY KEY,

title TEXT NOT NULL,

author_id INTEGER REFERENCES authors (id),

subject_id INTEGER NOT NULL REFERENCES subjects);

Ограничение внешнего ключа может содержать дополнительные секции ON DELETE и ON UPDATE. В этих секциях указывается, какую операцию следует произвести с полем внешнего ключа, если будет удален или изменен соответствующий первичный ключ. Возможные операции:

NO ACTION     Если удаление (изменение) первичного ключа приводит к нарушению целостности ссылок, происходит ошибка. Используется по умолчанию, если операция не указана.

RESTRICT        Аналогично NO ACTION.

CASCADE          Удаление (обновление) всех записей, содержащих ссылки на удаляемую (обновляемую) запись.

SET NULL        Поля, содержащие ссылки на удаляемую (обновляемую) запись, заменяются псевдозначениями NULL.

SET DEFAULT Полям, содержащим ссылки на удаляемую (обновляемую) запись, присваивается значение по умолчанию.

Рассмотрим данные операции на примере создания таблицы books:

CREATE TABLE books

(id integer PRIMARY KEY,

title   TEXT NOT NULL,

author_id INTEGER REFERENCES authors (id)

ON DELETE NO ACTION ON UPDATE CASCADE,

subject_id INTEGER NOT NULL

REFERENCES subjects ON UPDATE CASCADE);

 

Ограничение внешнего ключа может быть и ограничением таблицы. Если внешний ключ – составной, то единственный способ его задать – это использовать ограничение таблицы. В случае ограничения таблицы определение ограничения предваряется ключевыми словами FOREIGN KEY (списокПолей).

Создадим таблицу books с использованием ограничений таблицы в качестве ограничений внешнего ключа:

CREATE TABLE books

(id integer PRIMARY KEY,

title   TEXT NOT NULL,

author_id INTEGER,

subject_id INTEGER NOT NULL,

CONSTRAINT author_fk

FOREIGN KEY (author_id) REFERENCES authors (id)

ON DELETE NO ACTION ON UPDATE CASCADE,

FOREIGN KEY (subject_id) REFERENCES subjects
ON UPDATE CASCADE);

 


Удаление таблиц

 

Удалить таблицу из базы данных можно следующим образом:

DROP TABLE имяТаблицы;

Использование команды DROP TABLE требует осторожности, поскольку удаление таблицы приводит к уничтожению всех хранящихся в ней данных.

 

Модификация таблиц

 

Модификация таблицы – это изменение ее структуры. Для модификации таблиц предназначена команда ALTER TABLE. Реализация ALTER TABLE в PostgreSQL 7.1.x поддерживает следующие типы модификации:

· создание полей;

· назначение и отмена значений по умолчанию;

· переименование таблицы;

· переименование полей;

· добавление ограничений.

 

Создание полей

 

Для создания нового поля в команду ALTER TABLE включается секция ADD COLUMN:

         ALTER TABLE имяТаблицы

         ADD COLUMN имяСтолбца типСтолбца;

Ключевое слово COLUMN не является обязательным.

Предположим, в таблицу books базы данных booktown потребовалось включить новое поле publication для хранения даты публикации:

ALTER TABLE books

ADD publication date;

 

Дата: 2019-02-19, просмотров: 302.