SELECT ED_LNAME, ED_FNAME
FROM EDITOR, TITLEDITOR
WHERE EDITOR. ED_ID = TITLEDITOR.ED_ID
AND TITLEDITOR.TITLE_ID = "SW97"
Поскольку две таблицы содержат столбцы с одинаковыми именами, то для того чтобы их можно было различить, помещают перед именем столбца имя исходной таблицы, отделяя его точкой.
Рассмотрим этапы обработки системой данного запроса. Сначала обрабатывается фраза FROM. Однако в этом случае, поскольку в команде заданы две таблицы, система создает декартово произведение строк этих таблиц. Если в предложении FROM указано более двух таблиц, то создается декартово произведение всех таблиц, перечисленных в команде. После создания гигантской реляционной таблицы система выполняет предложение WHERE. Каждая строка таблицы, созданной предложением FROM, проверяется на выполнение условия WHERE.
В нашем случае фраза WHERE содержит два условия:
EDITOR. ED_ID = TITLEDITOR.ED_ID
TITLEDITOR.TITLE_ID = "SW97"
Первое из этих условий – условие соединения, которое означает, что в любой выбранной строке значение ED_ID из таблицы EDITOR должно совпадать со значением ED_ID из таблицы TITLEEDITOR. Все строки, не удовлетворяющие равенству, исключаются из таблицы произведения. Далее рассматривается второе условие.
При проектировании структуры базы данных в таблицах нужно предусматривать столбцы, по которым в дальнейшем будет производиться объединение таблиц. Чаще всего для этой цели служат первичные и соответствующие им внешние ключи.
В запросе могут использоваться первичные ключи из двух разных таблиц, как в приведенном ниже примере.
SELECT ED_LNAME
FROM EDITOR, AUTORS
WHERE ED_ID = AN_ID
Нашли авторов, которые когда-либо выполняли обязанности редакторов.
Рассмотрим запрос
SELECT *
FROM EDITORS, PUBLISHERS
WHERE EDITOR.CITY=PUBLISHER.CITY
AND PUB_NAME='ACT'
В данном запросе необходимо найти редакторов живущих в городе, где расположено издательство 'ACT'. В списке выбора указана *. В этом случае будут выведены все столбцы из обеих таблиц, причем порядок следования столбцов соответствует порядку следования их в таблице, а порядок следования таблиц перечислен в предложении FROM.
Псевдонимы (алиасы) улучшают читаемость запросов. Необходимо получить информацию об авторах всех книг типа "Искусство".
SELECT AN_LNAME, AN_FNAME, TITLE
FROM AUTOR A, TITLES T, TATLEAUTORS TA
WHERE A.AU_ID = TA.AU_ID
AND TA.TITLE_ID = T.TITLE_ID
AND T.TYPE = 'ИСКУССТВО'
Можно производить самообъединение двух таблиц. В этом случае создаются две копии таблицы с разными псевдонимами. Затем копии соединяются с использованием предложения WHERE.
Например, надо найти авторов, имеющих один и тот же индекс и живущих в городе Новосибирске. Чтобы в результирующей таблице не было одинаковых строк, применим слово DISTINCT, а авторы не были объединены сами с собой, в предложение WHERE добавим условие AU1.AU_ID != AU2.AU_ID.
SELECT DISTINCT AU1.AU_FNAME, AU1.AU_LNANE, AU1.ZIP
FROM AUTORS AU1, AUTORS AU2
WHERE AU1.ZIP=AU2.ZIP AND AU1.CITY = ‘Новосибирск’
AND AU1.AU_ID != AU2.AU_ID
Были рассмотрены объединения, основывающиеся на равенстве или совпадении столбцов. Помимо равенства, могут использоваться следующие логические операторы: >, >=, <, <=, != или <>. Объединения, построенные только на операторах сравнения, называются тета-объединениями.
Внешние объединения осуществляются при помощи операторов =* и *= . Во внешнее объединение включаются строки одной из таблиц не удовлетворяющие условиям объединения.
*= - позволяет включить все строки первой таблицы;
=* - позволяет включить все строки второй таблицы.
Как и в случае обычных объединений, для ограничения результатов внешнего объединения можно использовать условные операторы.
Операторы SQL можно вкладывать друг в друга. Подзапрос -это оператор SELECT, вложенный в предложение WHERE, HAVING или SELECT другого оператора SELECT, в оператор INSERT, UPDATE или DELETE, в другой подзапрос.
Рассмотрим синтаксис подзапроса.
SELECT [DISTINCT]
FROM список таблиц
WHERE
{выражение {[NOT] in | оператор сравнения [ANY | ALL]} | [NOT] EXISTS}
(SELECT [DISTINCT] список выбора подзапроса
FROM список таблиц
WHERE условия)
[GROUP BY список группировки
[HAVING условие]]
[ORDER BY порядок ]
Подзапрос заключен в круглые скобки. Подзапросы имеют две формы: коррелированную и некоррелированную.
Найти названия издательств, выпускающих книги по бизнесу.
SELECT PUB_NAME (некоррелированный запрос)
FROM PUBLISHERS
WHERE PUB_ID IN(SELECT PUB_ID
FROM TITLE
WHERE TYPE = ‘БИЗНЕС’)
Внутренний запрос выполняется независимо, передавая результаты во внешний запрос.
SELECT PUB_NAME (коррелированный запрос)
FROM PUBLISHER PWHERE 'БИЗНЕС’ IN
(SELECT TYPE
FROM TITLE
WHERE PUB_ID = P.PUB_ID)
Внутренний запрос для своего выполнения должен получить данные из внешнего запроса.
Можно этот подзапрос сформулировать как запрос на объединение:
SELECT DISTINCT PUB_NAME
FROM PUBLISHER P, TITLES T
WHERE P.PUB_ID = T.PUB_ID
AND TYPE = ‘БИЗНЕС’
Некоррелированный подзапрос реализуется за два шага. Сначала внутренний запрос возвращает идентификационные номера издательств, которые опубликовали книги по бизнесу, затем эти сведения передаются во внешний запрос, который отыскивает названия издательств.
Принадлежность столбцов задается в предложениях FROM.
Коррелированная обработка
В коррелированном подзапросе внутренний подзапрос не может быть реализован немедленно: он ссылается на внешний запрос и выполняется поочередно для каждой строки во внешнем запросе.
Внешний запрос отыскивает первое имя в таблице publishers, затем объединяет publisher pub_id c titles.pub_id, затем запрос возвращается в предложение in и titles.type – сравнивается со строкой "бизнес".
Если удовлетворяет критерию, то происходит выбор.
Составить перечень книг с ценами, равными минимальной цене книги:
SELECT MIN(PRICE)
FROM TITLE (2.99)
Получить названия всех книг, продаваемых по этой цене.
SELECT NAME, PRICE
FROM TITLES
WHERE PRICE = 2.99.
C помощью подзапроса:
SELECT NAME, PRICE
FROM TITLES
WHERE PRICE =
(SELECT MIN (PRICE)
FROM TITLES)
Подзапрос, возвращающий единственное значение, начинается с простого оператора сравнения.
5.2. Команды манипулирования данными
После создания БД, необходимо её заполнить. Для заполнения используется оператор INSERT, который позволяет добавлять строки с помощью ключевого слова VALUES или с помощью оператора SELECT.
INSERT INTO имя_таблицы [(столбец1 [,столбец2] . . .)]
VALUES (константа1 [, константа2] . . . )
Значения нужно вводить в том порядке, в котором определялись столбцы при создании таблицы. Если данные добавляются не во все столбцы, то их нужно доопределить. Если в столбце должно быть значение, либо оно должно быть определено по умолчанию, либо допускать нулевое значение. В этом случае порядок перечисления столбцов может быть любым.
При использовании оператора SELECT в команде INSERT синтаксис несколько изменяется.
INSERT INTO имя_таблицы [(вставляемый список столбцов)]
SELECT список столбцов
FROM список таблиц
WHERE условия
Оператор SELECT позволяет взять данные из нескольких таблиц и вставить их в другую таблицу. Применяя данный оператор, необходимо помнить, что вставляемые столбцы должны иметь тип соответствующий типу столбца в который значение вставляется или же система должна уметь автоматически производить преобразование.
Последовательности столбцов в таблицах должны быть согласованными. Если они не согласованы, операция INSERT либо не выполниться, либо выполниться не полностью. И при этом данные могут быть размещены в неверных столбцах.
Изменение существующих данных производится с помощью команды UPDATE.
UPDETE имя_таблицы
SET имя_столбца = выражение
[WHERE условие]
В каждом операторе модифицируется только одна таблица. Если добавляемое значение имеет неверный тип или нарушаются другие ограничения на целостность, система обычно запрещает выполнение команды и выдает сообщение об ошибке. В предложении SET определяются столбцы и задаются их новые значения.
Предложение WHERE в операторе UPDATE определяет строки, которые будут изменяться. Предложение WHERE в операторе UPDATE аналогично предложению WHERE в операторе SELECT, и так же может включать в себя подзапросы к одной или нескольким таблицам.
Удаление данных осуществляется с помощью команды DELETE
DELETE FROM имя_таблицы
WHERE условие
В предложении WHERE определяются строки подлежащие удалению. При отсутствии предложения WHERE из таблица удаляться все строки.
Функции системы управления базой данных можно разделить на функции пользователя, системные функции и функции управления. Функции пользователя представляют собой функции, непосредственно предлагаемые пользователю. Это поиск данных, удовлетворяющих определенным условиям, обновление данных, расширение данных и т.д. Эти функции реализуются с помощью языка манипулирования данными (или вспомогательного языка данных).
К системным функциям относятся такие, как определение приоритетности, возврат и восстановление данных в связи со сбоем, обеспечение защиты, сжатие данных, интерфейс с операционной системой др.
К функциям управления относятся составление той или иной схемы, задание размещения базы данных на диске, перемещение данных для повышения эффективности использования памяти и т.д.
Архитектура СУБД - совокупность основных ее функциональных компонентов, а также средств обеспечения их взаимодействия (интерфейсов) друг с другом, с пользователями и системным персоналом.
6.1 Функции управления, обеспечение абстракции данных
Одной из наиболее важных функций СУБД, которая оказала решающее влияние на формирование подхода к архитектуре систем, является обеспечение абстракции данных. Механизм абстракции данных, предоставляемых СУБД, служит средством поддержки независимости способов видения БД различными группами пользователей, обеспечивает независимость данных.