Для одной таблицы может быть задано несколько ограничений целостности, в том числе те, которые неявно порождаются ограничениями целостности столбцов. Стандарт SQL/89 устанавливает, что ограничения таблицы фактически проверяются при выполнении каждого оператора SQL.
Наличие правильно подобранного набора ограничений БД очень важно для надежного функционирования прикладной информационной системы. Вместе с тем, в некоторых СУБД ограничения целостности практически не поддерживаются. Поэтому при проектировании прикладной системы необходимо принять решение о том, что более существенно: рассчитывать на поддержку ограничений целостности, но ограничить набор возможных СУБД, или отказаться от их использования на уровне SQL, сохранив возможность использования не самых современных СУБД.
3) Выборка данных средствами SQL.
Ключевое слово
Перевод
SELECT<список_полей>
выбрать
FROM<имена_таблиц>
из
WHERE <Условия_поиска>
при
IN <имя_внешней_базы_данных>
в
INNER JOIN
объединяя
GROP BY <список_полей >
группируя по
HAVING <условия _поиска>
имеющие
ORDER BY <список_полей>
упорядочивая по
AS <псевдонимы>
как
ALL,DISTINCT, DISTINCTROW, TOP (предикаты)
все, различные, различные ряды, первые
При наборе запроса для перехода на другую строку следует использовать комбинацию <CTRL>+<ENTER> .
Оператор SELECT
Пример:
SELECT Клиенты.Фирма
FROM Клиенты, [Заинтересованные лица]
WHERE Клиенты.Фирма = [Заинтересованные лица].Фирма;
Выборка будет содержать все фирмы, которые присутствуют как в таблице “Заинтересованные лица”, так и в таблице “Клиенты”.
1. SELECT является первым ключевым словом в определении SQL-запроса.
2. При указании более чем одного поля их имена отделяются друг от друга запятыми. Перечислять имена полей следует в той последовательности, в которой они должны быть помещены в выборку.
3. Если используется имя поля, содержащее пробелы или другие разделители, имя следует заключать в квадратные скобки.
4. Если в запросе обрабатывается несколько таблиц, то во избежание неопределенности в списках полей рекомендуется приводить полную спецификацию поля, т.е. <имя_таблицы>.<имя_поля>.
Директива FROM
Директива FROM задает имя таблицы или запросы, которые содержат поля, перечисленные в операторе SELECT.
1. Директива FROM является обязательной.
2. При перечислении таблиц самые короткие таблицы (содержащие меньшее количество записей) рекомендуется указывать в первую очередь.
3. С помощью “*” из таблицы можно выбрать все поля:
SELECT Клиенты.* FROM Клиенты;
В выборках автоматически используются имена выбираемых полей в качестве имен полей в выборке. Если необходимо изменить имена полей в выборке, следует использовать директиву AS и задать соответствующий псевдоним.
В следующем примере поле «Фирма» должно быть представлено в выборке как поле «Название клиента»:
SELECT Фирма AS [Название клиента] FROM Клиенты;
Директива WHERE
WHERE является необязательной директивой. Если WHERE отсутствует, будут выбраны все записи данных.
Директива ORDER BY
Определяет список полей и порядок сортировки записей данных, включенных в выборку.
Синтаксис:
ORDER BY поле1 [ASC | DESC] , поле2 [ASC | DESC] [,[…]]
1. Директива ORDER BY не является обязательной. Если она не используется, данные представляются в неотсортированном виде. Однако, если используется предикат TOP, то Директива ORDER BY становится обязательной.
2. По умолчанию используется группировка по возрастанию (ACS). DECS – группировка по убыванию.
3. Порядок перечисления полей задает иерархию уровней сортировки.
4. Директива ORDER BY является последней директивой в запросе.
Директива GROUP BY
Группирует записи данных и объединяет в одну запись все записи данных, которые содержат идентичные значения в указанном поле (или полях).
Пример:
SELECT [название товара], SUM([Стоимость])
FROM Товары
GROUP BY [Название товара]
В этом примере исходные записи с одинаковыми названиями товара группируются и объединяются в одну запись в выборке.
1. Директива не является обязательной. Если условие указывается, оно должно следовать за FROM или WHERE.
2. Для фильтрации записей, которые должны группироваться, может использоваться директива WHERE, директива HAVING может использоваться для фильтрации записей, полученных в результате этой группировки.
3. В директиве GROUP BY можно использовать любые поля, упомянутые в директиве FROM; эти поля не обязательно должны быть перечислены в списке полей оператора SELECT.
4. В операторе SELECT для всех полей, включенных в выборку, но не перечисленных в директиве GROUP BY, обязательно должны присутствовать функции группирования, такие как SUM, COUNT, AVG.
Директива HAVING
Используется для фильтрации записей после группирования только в случае использования в запросе директивы GROUP BY.
1. Директива HAVING не является обязательной. Если она присутствует, то должна следовать за директивой GROUP BY.
2. Функция директивы HAVING схожа с WHERE – обе используются для фильтрации.
3. Директива WHERE определяет, какие записи должны участвовать в группировании, т.е. фильтрует записи до группирования. HAVING определяет, какие из получившихся в результате группировки записей будут включены в результирующую выборку, т.е. фильтрует записи после группирования.
Пример:
SELECT Отделение, Count ([Отделение])
FROM Сотрудники
GROUP BY Отделение
HAVING Count ([Отделение]) > 50;
В выборку будут включены отделения, в которых число сотрудников больше 50.
Директива IN
Директива IN используется для запросов к другим базам данных, с которыми Access может быть связан. В следующем примере формируется запрос, который использует данные таблицы Access «Заинтересованные лица» и файл БД в формате dBASE IV CLIENTS.DBF:
SELECT CLIENTS.DBF.Firm
FROM CLIENTS.DBF, [Заинтересованные лица]
IN C:\ dBASE\DATA\ CLIENTS «dBASE;»
WHERE CLIENTS.DBF.Firm = [Заинтересованные лица].[Фирма]
1. Можно формировать только одну связь к внешней БД (под внешней базой данных понимается любая другая база, отличная от текущей).
2. Для указания базы данных, которая имеет формат, отличный от формата Access, нужно добавить к обозначению типа базы данных точку с запятой и заключить его в кавычки, например, «dBASE;».
4) Предикаты.
Синтаксис:
[ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM <исходная таблица>
Предикат сравнения
Синтаксис предиката сравнения определяется следующими правилами:
<comparison predicate> ::=
<value expression> <comp op>
{<value expression> | <subquery>}
<comp op> ::=
= | <> | < | > | <= | >=
Через "<>" обозначается операция "неравенства". Арифметические выражения левой и правой частей предиката сравнения строятся по общим правилам построения арифметических выражений и могут включать в общем случае имена столбцов таблиц из раздела FROM и константы. Типы данных арифметических выражений должны быть сравнимыми (например, если тип столбца a таблицы A является типом символьных строк, то предикат "a = 5" недопустим).
Предикат ALL
SELECT ALL ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО FROM Клиенты
Выбираются перечисленные поля из всех записей таблицы Клиенты.
Если предикат не указывается, то предполагается наличие предиката ALL. Предикаты служат для установки дополнительных фильтров после применения критериев директивы WHERE.
Предикат DISTINCT
Используется в тех случаях, когда нужно включить в выборку только уникальные значения выбираемых полей.
SELECT DISTINCT Клиенты.Фирма
FROM Клиенты, [Заинтересованные лица]
WHERE Клиенты.Фирма = [Заинтересованные лица].Фирма;
Если в этом примере предикат DISTINCT не будет указан, в выборку будут включены названия фирм из всех записей таблицы клиентов, которые упоминаются в таблице заинтересованных лиц. В выборке могут появиться дублирующие записи. Предикат DISTINCT приведет к отбрасыванию дублирующих значений поля “Фирма”.
Предикат DISTINCTROW
Используется, когда следует пропустить данные, представляющие собой полностью дублирующие записи в выборке, но не дублирование значений отдельных полей.
Таблица «Клиенты» не содержит дублирующих кодов клиентов, в то время как таблица «Заказы» может содержать дублирующие коды клиентов, поскольку один клиент может сделать несколько заказов. В приведенном ниже примере показано, как можно использовать предикат DISTINCTROW для того, чтобы составить список фирм, которые сделали хотя бы один заказ, не вдаваясь в подробности о количестве таких заказов:
SELECT DISTINCTROW [Название фирмы]
FROM Клиенты INNER JOIN Заказы
ON Клиенты.[Код клиента] = Заказы.[Код клиента]
ОRDER BY [Название фирмы];
DISTINCTROW применяется только в запросах, использующих несколько таблиц, при этом включаемые в выборку поля принадлежат лишь некоторым, но не всем таблицам, использующимся в запросе. DISTINCTROW игнорируется, если в запросе участвует только одна таблица.
Использование DISTINCTROW эквивалентно установке значения ДА для параметра Уникальные записи в окне свойств запроса при проектировании QBE-запросов в режиме конструирования.
Предикат TOP
Используется для включения в выборку определенного числа записей, расположенных в начале или в конце группы записей, отобранных с помощью критерия отбора WHERE и упорядоченных с помощью директивы ORDER BY.
Предположим, мы хотим отобрать 25 лучших студентов выпуска 2007 года:
SELECT TOP 25 [имя],[отчество],[фамилия]
FROM Студенты
WHERE [год выпуска] = 2007
ORDER BY [средний балл] DESC
Если не будет включена директива ORDER BY, то в выборку будут включены любые 25 студентов БД “Студенты”, удовлетворяющие условиям отбора, заданным в директиве WHERE.
Предикат TOP не разделяет записи, имеющие одинаковые значения при упорядочении. В примере, если двадцать пятый студент имеет точно такой же средний балл, как двадцать шестой и двадцать седьмой, то в выборку будут включены 27, а не 25 записей.
Можно также использовать ключевое слово PERCENT для того, чтобы включить в выборку определенный процент из верхней или нижней части диапазона, отсортированного в соответствии с директивой ORDER BY. Например, вместо 25 студентов можно запросить 10% курса:
SELECT TOP 10 PERCENT [имя],[отчество],[фамилия]
FROM Студенты
WHERE [год выпуска] = 2007
ORDER BY [средний балл] DESC
Используемое число в предикате ТОР должно быть целым без знака.
Использование TOP эквивалентно использованию параметра НАБОР ЗНАЧЕНИЙ в окне свойств запроса при проектировании QBE-запроса в режиме конструирования. Использование ключевого слова PERCENT эквивалентно использованию знака процента (%) при указании свойства НАБОР ЗНАЧЕНИЙ.
Предикат between
Предикат between имеет следующий синтаксис:
<between predicate> ::=
<value expression>
[NOT] BETWEEN <value expression> AND <value expression>
Результат "x BETWEEN y AND z" тот же самый, что результат "x >= y AND x <= z". Результат "x NOT BETWEEN y AND z" тот же самый, что результат "NOT (x BETWEEN y AND z)".
Этот предикат всегда принимает значения true или false. При этом значение "x IS NULL" равно true тогда и только тогда, когда значение x не определено. Значение предиката "x NOT IS NULL" равно значению "NOT x IS NULL".
Предикат like
Предикат like имеет следующий синтаксис:
<like predicate> ::=
<column specification> [NOT] LIKE <pattern>
[ESCAPE <escape character>]
<pattern> ::= <value specification>
<escape character> ::= <value specification>
Типы данных столбца левого операнда и образца должны быть типами символьных строк. В разделе ESCAPE должен специфицироваться одиночный символ.
Значение предиката равно true, если pattern является подстрокой заданного столбца. При этом, если раздел ESCAPE отсутствует, то при сопоставлении шаблона со строкой производится специальная интерпретация двух символов шаблона: символ подчеркивания ("_") обозначает любой одиночный символ; символ процента ("%") обозначает последовательность произвольных символов произвольной длины (может быть, нулевой).
Если же раздел ESCAPE присутствует и специфицирует некоторый одиночный символ x, то пары символов "x_" и "x%" представляют одиночные символы "_" и "%" соответственно.
Значение предиката like есть unknown, если значение столбца, либо шаблона не определено.
Значение предиката "x NOT LIKE y ESCAPE z" совпадает со значением "NOT x LIKE y ESCAPE z".
Предикат exists
Предикат exists имеет следующий синтаксис:
<exists predicate> ::=
EXISTS <subquery>
Значением этого предиката всегда является true или false, и это значение равно true тогда и только тогда, когда результат вычисления подзапроса не пуст.
Операция объединения INNER JOIN
С помощью этого оператора формируется связь эквивалентности. В объединение при таком типе связи включаются данные из двух таблиц, если в поле связи, имеющемся в обеих таблицах, найдены совпадающие значения. Есть еще два типа связи – LEFT JOIN , RIGHT JOIN. В случае применения таких связей в объединение включаются также записи из левой или правой таблицы, которым не соответствует ни одна запись в связываемой с ними таблице.
Операция объединения INNER является частью условия директивы FROM. Синтаксис:
FROM таблица1 INNER JOIN таблица2 ON таблица1.поле1 = таблица2.поле2
Пример:
SELECT DISTINCTROW [Название фирмы]
FROM Клиенты INNER JOIN Заказы
ON Клиенты.[Код клиента] = Заказы.[Код клиента]
ОRDER BY [Название фирмы];
Поля, по которым производится объединение таблиц, должны быть числовыми, либо, если они не числовые, они должны иметь одинаковый тип и размер, но необязательно одинаковые имена. Поля типа МЕМО или OLE – объекты не могут использоваться для операции объединения.
5) Сложные запросы в SQL и поддержка целостности данных.
Групповые функции используются в выражениях запросов и в вычисляемых элементах управления форм или отчетов, но не в макросах или модулях, где вместо этого используются доменные групповые функции.