Международный стандарт 1989 г .
- Во многих частях имеет чрезвычайно общий характер и допускает очень широкое толкование
- Отсутствуют важные разделы (манипулирование схемой БД, динамический SQL, многое определяется в реализации)
- Наибольшие достижения (стандартизация синтаксиса и семантики операторов выборки и манипулирования данными, фиксация средств ограничений целостности БД:определение первичного и внешнего ключей отношений, проверочные ограничения целостности)
Международный стандарт 1992 г .(SQL2)
- Расширено манипулирование таблицами (Alter table, Drop table)
- Манипулирование схемой БД (Users, Tables, Views, Columns, Domains, Table_priveleges, Table_constraints, , , )
- Возможность управления доменами (Create domain имя char(25) . . .и при определении имен столбцов эти имена определяются через имена доменов)
- Новые типы данных (Date, Time, Datetime, . . .) и новые функции
- Управление транзакциями и сессиями (сессия - последовательность транзакций, в пределах которой сохраняются временные отношения)
- Подключение к БД
- Развитие динамического SQL
Стандарт SQL3
- Механизм триггеров (стандарт синтаксиса триггеров и процедур)
- Абстрактные типы данных
- Расширение модели транзакций (контрольные точки, многозвенные транзакций)
А зачем вообще нужны эти стандарты? Зачем их изобретают и почему надо изу чать их? Текст стандарта SQL 2 занимает 600 станиц сухого формального текста, это очень много, и кажется, что это просто происки разработчиков стандартов, а не то, что необходимо, рядовым разработчикам. Однако ни один серьезный разработчик, работающий с базами данных, не должен игнорировать стандарт, и для этого существуют весьма веские причины. Разработка любой информационной системы, ориентированной на технологию баз данных (а других информационных систем на настоящий момент и не бывает), является трудоем ким процессом, занимающим несколько десятков и даже сотен человеко-месяцев. Следует отдавать себе отчет, что нельзя разработать сколько-нибудь серьезную систему за несколько дней. Кроме того, развитие вычислительной техники, систем телекоммуникаций и программного обеспечения столь стремительно, что проект может устареть еще до момента внедрения. Но развивается не только вычислительная техника, изменяются и реальные объекты, поведение которых моделируется использованием как самой БД, так и процедур обработки инфор мации в ней, то есть конкретных приложений, которые составляют реальное на полнение разрабатываемой информационной системы. Именно поэтому проект информационной системы должен быть рассчитан на расширяемость и перено симость на другие платформы. Большинство поставщиков аппаратуры и про граммного обеспечения следуют стратегии поддержки стандартов, в противном случае пользователи просто не будут их покупать. Однако каждый поставщик стремится улучшить свой продут введением дополнительных возможностей, не входящих в стандарт. Выбор разработчиков, следовательно, таков: ориентиро ваться только на экзотические особенности данного продукта либо стараться в основном придерживаться стандарта. Во втором случае весь интеллектуальный труд, вкладываемый в разработку, становится более защищенным, так как система приобретает свойства переносимости. И в случае появления более пер спективной платформы проект, ориентированный в большей степени на стан дарты, может быть легче перенесен на нее, чем тот, который в основном ориен тировался на особенности конкретной платформы. Кроме того, стандарты — это верный ориентир для разработчиков, так как все поставщики СУБД в своих перспективных разработках обязательно следуют стандарту, и можно быть уверенным, что в конце концов стандарт будет реализован практически во всех перспективных СУБД. Так произошло со стандартом SQL 1, так происходит со стандартом SQL 2 и так будет происходить со стандартом SQL 3.
Для поставщиков СУБД стандарт — это путеводная звезда, которая гарантирует правильное направление работ. А вот эффективность реализации стандарта — это гарантия успеха.
SQL нельзя в полной мере отнести к традиционным языкам программирования, он не содержит традиционные операторы, управляющие ходом выполнения программы, операторы описания типов и многое другое, он содержит только набор стандартных операторов доступа к данным, хранящимся в базе данных. Опера торы SQL встраиваются в базовый язык программирования, которым может быть любой стандартный язык типа C++, PL , COBOL и т. д. Кроме того, операторы SQL могут выполняться непосредственно в интерактивном режиме.
5.2 Достоинства и недостатки SQL
Достоинства:
- Повсеместная распространенность
- Быстрое обучение в простых случаях
- Связывание с различными языками программирования
- Поддержка ODBC и JDBC
- Фактор времени: научились хорошо реализовывать.
Недостатки:
- Несоответствие реляционной модели данных (наличие дубликатов, необязательность первичного ключа, возможность упорядочения результатов)
- Недостаточно продуманный механизм неопределенных значений
- Сложность формулировок и громоздкость.
Лекция 5.1
Структура SQL
Литература
- Базы данных: модели реализация / Т. С. Карпова. - СПб.: Питер, 2001. - 304 с.: ил.
- Хомоненко А. Д., Цыганков В. М., Мальцев М. Г. Базы данных: Учебник для высших учебных заведений /Под. ред. проф. А. Д. Хомоненко. - СПб.: КОРОНА принт, 2000. - 416 с.
- Введение в SQL
- Введение в стандарты языка баз данных SQL
- Структуризированный язык запросов (SQL)
- Реализация языка SQL в СУБД MySQL
- PL/SQL в Oracle
- Двадцать пять заповедей SQL - Сергей Кузнецов
- Лекции по SQL" Карпукова - 227 стр.
- Краткое пособие по языку SQL
5.1.1 Структура SQL
В отличие от реляционной алгебры, где были представлены только операции запросов к БД, SQL является полным языком, в нем присутствуют не только операции запросов, но и операторы, соответствующие DDL — Data Definition Language — языку описания данных. Кроме того, язык содержит операторы, пред назначенные для управления (администрирования ) БД.
SQL содержит разделы, представленные в таблице 5.1.1:
Таблица 5.1.1 Операторы определения данных DDL
Оператор | Смысл | Действие |
CREATE TABLE | Создать таблицу | Создает новую таблицу в БД |
DROP TABLE | Удалить таблицу | Удаляет таблицу из БД |
ALTER TABLE | Изменить таблицу | Изменяет структуру существующей таблицы или ограничения целостности, задаваемые для данной таблицы |
CREATE VIEW | Создать представление | Создаст виртуальную таблицу, соответствующую некоторому SQL -запросу |
ALTER VIEW | Изменить представление | Изменяет ранее созданное представление |
DROP VIEW | Удалить представление | Удаляет ранее созданное представление |
CREATE INDEX | Создать индекс | Создает индекс для некоторой таблицы для обеспечения быстрого доступа по атрибутам, входящим в индекс |
DROP INDEX | Удалить индекс | Удаляет ранее созданный индекс |
Таблица 5.1.2.Операторы манипулирования данными Data Manipulation Language ( DMP )
Оператор | Смысл | Действие |
DELETE | Удалить строки | Удаляет одну или несколько строк, соответствующих условиям фильтрации, из базовой таблицы. Применение оператора согласуется с принципами поддержки целостности, поэтому этот оператор не всегда может быть выполнен корректно, даже если синтаксически он записан правильно |
INSERT | Вставить строку | Вставляет одну строку в базовую таблицу. Допустимы модификации оператора, при которых сразу несколько строк могут быть перенесены из одной таблицы или запроса в базовую таблицу |
UPDATE | Обновить строку | Обновляет значения одного или нескольких столбцов в одной или нескольких строках, соответствующих условиям фильтрации |
Таблица 5.1.3.Язык запросов Data Query Language (DQL)
Оператор | Смысл | Действие |
SELECT | Выбрать строки | Оператор, заменяющий все операторы реляционной алгебры и позволяющий сформировать результирующее отношение, соответствующее запросу |
Таблица 5.1.4.Средства управления транзакциями
Оператор | Смысл | Действие |
COMMIT | Завершить транзакцию | Завершить комплексную взаимосвязанную обработку информации, объединенную в транзакцию |
ROLLBACK | Откатить транзакцию | Отменить изменения, проведенные в ходе выполнения транзакции |
SAVEPOINT | Сохранить промежуточную точку выполнения транзакции | Сохранить промежуточное состояние БД, пометить его для того, чтобы можно было в дальнейшем к нему вернуться |
Таблица 5.1.5.Средства администрирования данных
Оператор | Смысл | Действие |
ALTER DATABASE | Изменить БД | Изменить набор основных объектов в базе данных, ограничений, касающихся все!) базы данных |
ALTER DBAREA | Изменить область хранения БД | Изменить ранее созданную область хранения |
ALTER PASSWORD | Изменить пароль | 'Изменить пароль для всей базы данных |
CREATE DATABASE | Создать БД | Создать новую базу данных, определив основные параметры для нее |
CREATE DBAREA | Создать область хранения | Создать новую область хранения и сделать ее доступной для размещения данных |
DROP DATABASE | Удалить БД | Удалить существующую базу данных (только в том случае, когда вы имеете право выполнить это действие) |
DROP DBAREA | Удалить область хранения БД | Удалить существующую область хранения (если в ней на настоящий момент не располагаются активные данные) |
GRANT | Предоставить права | Предоставить права доступа на ряд действий над некоторым объектом БД |
REVOKE | Лишить прав | Лишить прав доступа к некоторому объекту или некоторым действиям над объектом |
Таблица 5.1.6.Программный SQL
Оператор | Смысл | Действие |
DECLARE | Определяет курсор для запроса | Задает некоторое имя и определяет связанный с ним запрос к БД, который соответствует виртуальному набору данных |
OPEN | Открыть курсор | Формирует виртуальный набор данных, соответствующий описанию указанного курсора и текущему состоянию БД |
FETCH | Считать строку из множества строк, определенных курсором | Считывает очередную строку, заданную параметром команды из виртуального набора данных, соответствующего открытому курсору |
CLOSE | Закрыть курсор | Прекращает доступ к виртуальному набору данных, соответствующему указанному курсору |
PREPARE | Подготовить оператор SQL к динамическому выполнению | Сгенерировать план выполнения запроса, соответствующего заданному оператору SQL |
EXECUTE | Выполнить оператор SQL , ранее подготовленный к динамическому выполнению | Выполняет ранее подготовленный план запроса |
В коммерческих СУБД набор основных операторов расширен. В большинство СУБД включены операторы определения и запуска хранимых процедур и операторы определения триггеров.
Лекция 5.2
Типы данных
Литература
- Базы данных: модели реализация / Т. С. Карпова. - СПб.: Питер, 2001. - 304 с.: ил.
- Хомоненко А. Д., Цыганков В. М., Мальцев М. Г. Базы данных: Учебник для высших учебных заведений /Под. ред. проф. А. Д. Хомоненко. - СПб.: КОРОНА принт, 2000. - 416 с.
- Введение в SQL
- Введение в стандарты языка баз данных SQL
- Структуризированный язык запросов (SQL)
- Реализация языка SQL в СУБД MySQL
- PL/SQL в Oracle
- Двадцать пять заповедей SQL - Сергей Кузнецов
- Лекции по SQL" Карпукова - 227 стр.
- Краткое пособие по языку SQL
В языке SQL /89 поддерживаются следующие типы данных:
- CHARACTER ( n ) или CHAR ( n ) — символьные строки постоянной длины в п символов. При задании данного типа под каждое значение всегда отво дится п символов, и если реальное значение занимает менее, чем п символов, то СУБД автоматически дополняет недостающие символы пробелами.
- NUMERIC [( n , m )] — точные числа, здесь п — общее количество цифр в числе, m — количество цифр слева от десятичной точки.
- DECIMAL [( n , m )] — точные числа, здесь п — общее количество цифр в числе, m — количество цифр слева от десятичной точки.
- DEC [( n , m )] - то же, что и DECIMAL [( n , m )].
- INTEGER или INT — целые числа.
- SMALLINT — целые числа меньшего диапазона.
Несмотря на то, что в стандарте SQL 1 не определяется точно, что подразумевается под типом INT и SMALLINT (это отдано на откуп реализации), указано только соотношение между этими типами данных, в большинстве реализаций тип данных INTEGER соответствует целым числам, хранимым в четырех байтах, a SMALLINT — соответствует целым числам, хранимым в двух байтах. Вы бор одного из этих типов определяется размером числа.
- FLOAT [( n )] — числа большой точности, хранимые в форме с плавающей точкой. Здесь п — число байтов, резервируемое под хранение одного числа. Диа пазон чисел определяется конкретной реализацией.
- REAL — вещественный тип чисел, который соответствует числам с плавающей точкой, меньшей точности, чем FLOAT.
- DOUBLE PRECISION специфицирует тип данных с определенной в реализации точностью большей, чем определенная в реализации точность для REAL.
В стандарте SQL 92 добавлены следующие типы данных:
- VARCHAR ( n ) — строки символов переменной длины.
- NCHAR ( N ) — строки локализованных символов постоянной длины.
- NCHAR VARYING ( n ) — строки локализованных символов переменной длины.
- BIT ( n ) — строка битов постоянной длины.
- BIT VARYING ( n ) — строка битов переменной длины.
- DATE — календарная дата.
- ТIМЕSТАМР(точность) — дата и время.
- INTERVAL — временной интервал.
Большинство коммерческих СУБД поддерживают еще дополнительные типы данных, которые не специфицированы в стандарте. Так, например, практически все СУБД в том или ином виде поддерживают тип данных для представления не структурированного текста большого объёма. Этот тип аналогичен типу MEMO в настольных СУБД. Называются эти типы поразному, например в ORACLE этот тип называется LONG , в DB 2 - LONG VARCHAR , в SYBASE и MS SQL Server - TEXT.
Однако следует отметить, что специфика реализации отдельных типов данных серьезным образом влияет на результаты запросов к БД. Особенно это касается реализации типов данных DATE и ТШЁЗТАМР. Поэтому при переносе прило жений будьте внимательны, на разных платформах они могут работать по разному, и одной из причин может быть различие в интерпретации типов данных.
При выполнении сравнений в операциях фильтрации могут использоваться константы заданных типов. В стандарте определены следующие константы. Для числовых типов данных определены константы в виде последовательности цифр с необязательным заданием знака числа и десятичной точкой. То есть правильными будут константы:
213-314; 612.716; + 551.702
Константы с плавающей запятой задаются, как и в большинстве языков про граммирования, путем задания мантиссы и порядка, разделенных символом Е, например:
2.9Е-4; -134.235Е7; 0.54267Е18
Строковые константы должны быть заключены в одинарные кавычки:
' Крылов Ю . Д .' ; ' Санкт - Петербург '
В некоторых реализациях, например MS SQL Server и Informix , допустимы двойные кавычки в строковых константах:
" Москва " " New York "
Однако следует отметить, что использование двойных кавычек может вызвать дополнительные проблемы при переносе приложений на другую платформу, поэтому мы рекомендуем по возможности избегать такого представления символь- ных констант.
Константы даты, времени и временного интервала в реляционных СУБД представляются в виде строковых констант. Форматы этих констант отличаются в различных СУБД. Кроме того, формат представления даты различен в разных странах. В большинстве СУБД реализованы способы настройки форматов пред ставления дат или специальные функции преобразования форматов дат, как сделано, например, в СУБД ORACLE . Приведем примеры констант в MS SQL Server :
March 15, 1999 Маг 15 1999
3/15/19993-15-99 1999 MAR 15 В СУБД ORACLE та же константа запишется как
15 - MAR - 99
Кроме пользовательских констант в СУБД могут существовать и специальные системные константы. Стандарт SQL 1 определяет только одну системную кон станту USER , которая соответствует имени пользователя, под которым вы под ключились к БД.
В операторах SQL могут использоваться выражения, которые строятся по стандартным правилам применения знаков арифметических операций сложения (+), вычитания (-), умножения (*) и деления (/). Однако в ряде СУБД операция деления (/) интерпретируется как деление нацело, поэтому при построении сложных выражений вы можете получить результат, не соответствующий тра диционной интерпретации выражения. В стандарт SQ . L 2 включена возможность выполнения операций сложения и вычитания над датами. В большинстве СУБД также определена операция конкатенации над строковыми данными, обозначается она, к сожалению, по-разному. Так, например, для DB 2 операци'я конкатенации обозначается двойной вертикальной чертой, в MS SQL Server — знаком сложения (+), поэтому два выражения, созданные в разных СУБД, эквивалентны:
'Mr./Mrs. ' || NAME || ' ' LASTNAME
'Mr./Mrs. ' + NAME + ' ' LASTNAME
В стандарте SQL 1 не были определены встроенные функции, однако в боль шинстве коммерческих СУБД такие функции были реализованы, и в стандарт SQL 2 уже введен ряд стандартных встроенных функций:
- BIT _ LENGTH ( строка ) — количество битов в .строке;
- САSТ(значение AS тип данных) — значение, преобразованное в заданный тип данных;
- CHAR _ LENGTH ( cтpoкa ) — длина строки символов;
- CONVERT ( crpoкa USING функция) — строка, преобразованная в соответствии с указанной функцией;
- CURRENT_DATE - текущая дата ;
- CURRENT _ TIME ( точность ) — текущее время с указанной точностью;
- CURRENT _ TlMESTAMP (точность ) — текущие дата и время с указанной точностью;
- LOWER (строка) — строка, преобразованная к верхнему регистру;
- OCTED _ LENGTH ( сторока ) — число байтов в строке символов;
- POSITION ( первая строка IN вторая строка).— позиция, с которой начинается вхождение первой строки во вторую;
- SUBSTRING ( строка FROM n FOR длина) — часть строки, начинающаяся с n - го символа и имеющая указанную длину;
- TRANSL АТЕ(строка USING функция) — строка, преобразованная с использованием указанной функции;
- TRIM ( BOTH символ FROM строка) — строка, у которой удалены все первые и последние символы;
- TRIM ( LEADING символ FROM строка ) — строка, в которой удалены все первые указанные символы;
- TRIM ( TRAILING символ FROM строка) — строка, в которой удалены последние указанные символы;
- UPPER ( строка ) — строка, преобразованная к верхнему регистру.
Лекция 5.3
Оператор выбора SELECT
Литература
- Базы данных: модели реализация / Т. С. Карпова. - СПб.: Питер, 2001. - 304 с.: ил.
- Хомоненко А. Д., Цыганков В. М., Мальцев М. Г. Базы данных: Учебник для высших учебных заведений /Под. ред. проф. А. Д. Хомоненко. - СПб.: КОРОНА принт, 2000. - 416 с.
Оператор выбора SELECT
Язык запросов ( Data Query Language ) в SQL состоит из единственного оператора SELECT . Этот единственный оператор поиска реализует все операции реляци онной алгебры. Как просто, всего один оператор. Однако писать запросы на языке SQL (грамотные запросы) сначала совсем не просто. Надо учиться, так же как надо учиться решать математические задачки или составлять алгоритмы для решения непростых комбинаторных задач. Один и тот же запрос может быть реализован несколькими способами, и, будучи все правильными, они, тем не ме нее, могут существенно отличаться но времени исполнения, и это особенно важ но для больших баз данных.
Синтаксис оператора SELECT имеет следующий вид:
SELECT [ALL | DISTINCT] < список полей >|*)
FROM < Слисок таблиц >
[ WHERE < Предикат - условие выборки или соединения >]
[ GROUP BY < Список полей результата >]
[ HAVING < Предикат - условие для группы >]
[ ORDER BY < Список полей , по которым упорядочить вывод >]
Здесь ключевое слово ALL означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса. Значит, в результирующий набор могут попасть одинаковые строки. И это нарушение принципов теории отношений (в отличие от реляционной алгебры, где по умолчанию предполагается отсутствие дубликатов в каждом результирующем отношении). Ключевое слово DISTINCT означает, что в результирующий набор включаются только раз личные строки, то есть дубликаты строк результата не включаются в набор.
Символ *. (звездочка) означает, что в результирующий набор включаются все столбцы из исходных таблиц запроса.
В разделе FROM задается перечень исходных отношений (таблиц) запроса. В разделе WHERE задаются условия отбора строк результата или условия соедине ния кортежей исходных таблиц, подобно операции условного соединения в реляционной алгебре.
В разделе GROUP BY задается список полей группировки.
В разделе HAVING задаются предикаты-условия, накладываемые на каждую группу.
В части ORDER BY задается список полей упорядочения результата, то есть список полей, который определяет порядок сортировки в результирующем отношении. Например, если первым полем списка будет указана Фамилия, а вторым Номер группы, то в результирующем отношении сначала будут собраны в алфавтном порядке студенты, и если найдутся однофамильцы, то они будут расположены в порядке возрастания номеров групп.
В выражении условий раздела WHERE могут быть использованы следующие предикаты:
- Предикаты сравнения {=, <>, >, <, >=, <= }, которые имеют традиционный смысл.
- Предикат Between A and В — принимает значения между А и В. Предикат истинен, когда сравниваемое значение попадает в заданный диапазон, включая границы диапазона. Одновременно в стандарте задан и противополож ный предикат Not Between A and В, который истинен тогда, когда сравниваемое значение не попадает в заданный интервал, включая его границы.
- Предикат вхождения в множество IN (множество) истинен тогда, когда сравниваемое значение входит в множество заданных значений. При этом мно жество значений может быть задано простым перечислением или встроен ным подзапросом. Одновременно существует противоположный предикат NOT IN (множество), который истинен тогда, когда сравниваемое значение не входит в заданное множество.
- Предикаты сравнения с образцом LIKE и NOT LIKE . Предикат LIKE требует задания шаблона, с которым сравнивается заданное значение, предикат истинен, если сравниваемое значение соответствует шаблону, и ложен в противном случае. Предикат NOT LIKE имеет противоположный смысл.
По стандарту в шаблон могут быть включены специальные символы:
· символ подчеркивания (_) — для обозначения любого одиночного символа;
· символ процента (%) — для обозначения любой произвольной последова тельности символов;
· остальные символы, заданные в шаблоне, обозначают самих себя.
- Предикат сравнения с неопределенным значением IS NULL Понятие неопределенного значения было внесено в концепции баз данных позднее. Неопределенное значение интерпретируется в реляционной модели как значение, неизвестное на данный момент времени. Это значение при появлении дополнительной информации в любой момент времени может быть заменено на некоторое конкретное значение. При сравнении неопределенных значений не действуют стандартные правила сравнения: одно неопределенное значение никогда не считается равным другому неопределенному значению. Для вы явления равенства значения некоторого атрибута неопределенному применяют специальные стандартные предикаты:
< имя атрибута >IS NULL и < имя атрибута > IS NOT NULL.
Если в данном кортеже (в данной строке) указанный атрибут имеет неопределенное значение, то предикат IS NULL принимает значение «Истина» ( TRUE ), а предикат IS NOT NULL — «Ложь» ( FALSE ), в противном случае предикат IS NULL принимает значение «Ложь», а предикат IS NOT NULL принимает значение «Истина».
Введение Null -значений вызвало необходимость модификации классической двузначной логики и превращения ее в трехзначную. Все логические операции, производимые с неопределенными значениями, подчиняются этой логике в соот ветствии с заданной таблицей истинности:
А | В | Not A | AAB | A V В |
TRUE | TRUE | FALSE | TRUE | TRUE |
TRUE | FALSE | FALSE | FALSE | TRUE |
TRUE | Null | FALSE | Null | TRUE |
FALSE | TRUE | TRUE | FALSE | TRUE |
FALSE | FALSE | TRUE | FALSE | FALSE |
FALSE | Null | TRUE | FALSE | Null |
Null | TRUE | Null | Null | TRUE |
Null | FALSE | Null | FALSE | Null |
Null | Null | Null | Null | Null |
Q Предикаты существования EXIST и несуществования NOT EXIST . Эти предикаты относятся к встроенным подзапросам, и подробнее мы рассмотрим их, когда коснемся вложенных подзапросов.
В условиях поиска могут быть использованы все рассмотренные ранее предикаты.
Отложив на время знакомство с группировкой, рассмотрим детально первые три строки оператора SELECT :
- SELECT — ключевое слово, которое сообщает СУБД, что эта команда — запрос. Все запросы начинаются этим словом с доследующим пробелом, За ним может следовать способ выборки — с удалением дубликатов ( DISTINCT ) или без удаления ( ALL , подразумевается по умолчанию). Затем следует список перечисленных через запятую столбцов, которые выбираются запросом из таблиц, или символ '*' (звездочка) для выбора всей строки. Любые столбцы, не перечисленные здесь, не будут включены в результирующее отношение, соответствующее выполнению команды. Это, конечно, не значит, что они будут удалены или их информация будет стерта из таблиц, потому что запрос не воздействует на информацию в, таблицах — он только показывает данные.
- FROM — ключевое слово, подобно SELECT , которое должно быть представлено в каждом запросе. Оно сопровождается пробелом и затем именами таблиц, используемых в качестве источника информации. В случае если указано более одного имени таблицы, неявно подразумевается, что над перечисленными таблицами осуществляется операция декартова произведения. Таблицам можно присвоить имена-псевдонимы, что бывает полезно для осуществления операции соединения таблицы с самой собою или для доступа из вложенного подзапроса к текущей записи внешнего запроса (вложенные подзапросы здесь не рассматриваются).
Все последующие разделы оператора SELECT являются необязательными.
Самый простой запрос SELECT без необязательных частей соответствует просто декартову произведению. Например, выражение
SELECT * FROM Rl,. R 2
соответствует декартову произведению таблиц R 1 и R 2. Выражение
SELECT Rl.A. R2.B FROM Rl. R 2
соответствует проекции декартова произведения двух таблиц на два столбца А из таблицы R 1 и В из таблицы R 2, при этом дубликаты всех строк сохранены, в отличие от операции проектирования в реляционной алгебре, где при проектиро вании по умолчанию все дубликаты кортежей уничтожаются.
- WHERE — ключевое слово, за которым следует предикат — условие, налагаемое на запись в таблице, которому она должна удовлетворять, чтобы попасть в выборку, аналогично операции селекции в реляционной алгебре.
Рассмотрим базу данных, которая моделирует сдачу сессии в некотором учебном заведении. Пусть она состоит из трех отношений R 1 , R 2 , R3- Будем считать, что они представлены таблицами R1 , R 2 и R 3 соответственно.
R1=- (ФИО, Дисциплина, Оценка); R 2 = (ФИО, Группа);
R3=(Группы, Дисциплина >
R1 | ||
ФИО | Дисциплина | Оценка |
Петров Ф. И. | Базы данных ; | |
Сидоров К. А. | Базы данных | |
Миронов А. В. | Базы данных | |
Степанова К. Е. | Базы данных | |
Крылова Т. С. | Базы данных | |
Сидоров К. А. | Теория информации | |
Степанова К. Е. | Теория информации | |
Крылова Т. С. | Теория информации | |
Миронов А. В. | Теория информации | Null |
Владимиров В. А. | Базы данных | |
Трофимов П. А. | Сети и телекоммуникации | |
Иванова Е. А. | Сети и телекоммуникации | |
Уткина Н. В. | Сети и телекоммуникации | |
Владимиров В. А. | Английский язык | |
Трофимов П. А. | Английский язык | |
Иванова Е. А. | Английский язык | |
Петров Ф. И. | Английский язык |
R2 | |
ФИО | Группа |
Петров Ф. И. | |
Сидоров К. А. | |
Миронов А. В. | |
Крылова Т. С. | |
Владимиров В. А. | |
Трофимов П. А. | |
Иванова Е. А. | |
Уткина Н. В. |
R3 | |
Группа | Дисциплина |
Базы данных | |
Теория информации | |
Английский язык | |
Английский язык | |
Сети и телекоммуникации |
Приведем несколько примеров использования оператора SELECT .
- Вывести список всех групп (без повторений), где должны пройти экзамены.
SELECT DISTINCT Группы FROM R3
Результат:
Группа |
- Вывести список студентов, которые сдали экзамен по дисциплине «Базы данных» на «отлично».
SELECT ФИО
FROM R 1
WHERE Дисциплина = " Базы данных " AND Оценка = 5
Результат:
ФИО |
Петров Ф. И. |
Крылова Т. С. |
- Вывести список всех студентов, которым надо сдавать экзамены с указанием названий дисциплин, по которым должны проводиться эти экзамены.
SELECT ФИО , Дисциплина
FROM R2.R3
WHERE R2.Группа =R 2.Группа :
Здесь часть WHERE задает условия соединения отношений R 2 и R 3, при отсутствии условий соединения в части WHERE результат будет эквивалентен расширенному декартову произведению, и в этом случае каждому студенту были бы приписаны все дисциплины из отношения R 3, а не те, которые должна сдавать его группа.
Результат:
ФИО | Дисциплина |
Петров Ф. И. | Базы данных |
Сидоров К. А. | Базы данных |
Миронов А. В. | Базы данных |
Степанова К. Е. | Базы данных |
Крылова Т. С. | Базы данных |
Владимиров В. А. | Базы данных |
Петров Ф. И. | Теория информации |
Сидоров К. А. | Теория информации |
Миронов А. В. | Теория информации |
Степанова К. Е. | Теория информации |
Крылова Т. С. | Теория информации |
Владимиров В. А. | 'Теория информации |
Петров Ф. И. | Английский язык |
Сидоров К. А. | Английский язык |
Миронов А. В. | Английский язык |
Степанова К. Е. | Английский язык |
Крылова Т. С- | Английский язык |
Владимиров В. А. | Английский язык |
Трофимов П. А. | Сети и телекоммуникации |
Иванова Е. А. | Сети и телекоммуникации |
Уткина Н. В. | Сети и телекоммуникации |
Трофимов П. А. | Английский язык |
Иванова Е. А. | Английский язык |
Уткина К. Е. | Английский язык |
- Вывести список лентяев, имеющих несколько двоек.
SELECT DISTINCT R1.ФИО
FROM R1 a. R2 b :
WHERE a. ФИО =- Ь .ФИО AND
a. Дисциплина <> b. Дисциплина AND
а.Оценка <= 2 AND b.Оценка <- 2;
Здесь мы использовали псевдонимы для именования отношения R 1 а и Ь, так как для записи условий поиска нам необходимо работать сразу с двумя экземплярами данного отношения.
Результат:
ФИО |
Степанова К. Е |
Из этих примеров хорошо видно, что логика работы оператора выбора (декартово произведение—селекция—проекция) не совпадает с порядком описания в нем данных (сначала список полей для проекции, потом список таблиц для декартова, произведения, дотрм, условие, соединения). Дело в том, что SQL изначально разрабатывался для применения конечными пользователями, и его стремились сделать возможно близке к языку естественному, а не к языку алгоритмическому. По этой причине SQL на первых порах вызывает путаницу и раздражение у начинакпцих его изучать профессиональных программистов, которые привыкли разговаривать с машиной Именно на алгоритмических языках.
Наличие неопределенных ( Null ) значений повышает гибкость обработки информации, хранящейся в БД. В наших примерах мы можем предположить ситуацию, когда студент пришел на экзамен, но не сдавал его по некоторой причине, в этом случае оценка по некоторой дисциплине для данного студента имеет неопределенное значение. В данной ситуации можно поставить вопрос: «Найти студентов, пришедших на экзамен, но не сдававших его с указанием названия дисциплины». Оператор SELECT будет выглядеть следующим образом:
SELECT ФИО . Дисциплина
FROM R 1
WHERE Оценка IS NULL
Результат :
ФИО | Дисциплина |
Миронов А. В. | Теория информации |
Лекция 5.4