- •2 Вопрос
- •3 Вопрос
- •4 Вопрос
- •5 Вопрос
- •6 Вопрос
- •7 Вопрос
- •Вопрос 8
- •Вопрос 9
- •Вопрос 10
- •Вопрос 11
- •Вопрос 12
- •Вопрос 13
- •Вопрос 14
- •Вопрос 15. Разработка предварительных отношений бд на основе er-диаграммы.
- •Вопрос 16
- •Вопрос 17. Реализация связи таблиц в субд Access.
- •Что такое связи между таблицами
- •Виды связей между таблицами
- •Связи "один ко многим"
- •Связи "многие ко многим"
- •Связи "один к одному"
- •Создание связей между таблицами
- •Создание связей "один ко многим" или "один к одному"
- •Создание связей "многие ко многим"
- •Целостность данных
- •Каскадные обновления и удаления
- •Типы соединений
- •Вопрос 18
- •Вопрос 19
- •Вопрос 20
- •Вопрос 21
- •Вопрос 22
- •Вопрос 23
- •Вопрос 24
- •Вопрос 25
- •Вопрос 26
- •Вопрос 27
- •Вопрос 28
- •Вопрос 29
- •Вопрос 30
- •Вопрос 31
- •Вопрос 32
- •Вопрос 33
- •Вопрос 34
- •Вопрос 35
- •Недостатки
- •Вопрос 36
- •Вопрос 37
- •1. Создание групп (group by)
- •3. Группировка и сортировка
- •Вопрос 40.
- •Вопрос 39.
- •Вопрос 38. Использование подзапросов в запросах на выборку. Язык sql
- •Соотнесенный подзапрос
Недостатки
Несоответствие реляционной модели данных
Создатели реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности, они указывают на следующие дефекты SQL с точки зрения реляционной теории[7]:
SQL разрешает в таблицах строки-дубликаты, что в рамках реляционной модели данных невозможно и недопустимо;
SQL поддерживает неопределённые значения (NULL) и многозначную логику;
SQL использует порядок колонок и ссылки на колонки по номерам;
SQL разрешает колонки без имени и дублирующиеся имена колонок.
В опубликованном Кристофером Дейтом и Хью Дарвеном Третьем манифесте[8] они излагают принципы СУБД следующего поколения и предлагают язык Tutorial D, который является подлинно реляционным.
Сложность
Хотя SQL и задумывался как средство работы конечного пользователя, в конце концов он стал настолько сложным, что превратился в инструмент программиста.
Отступления от стандартов
Несмотря на наличие международного стандарта ANSI SQL-92, многие разработчики СУБД вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
Сложность работы с иерархическими структурами
Ранее диалекты SQL большинства СУБД не предлагали способа манипуляции древовидными структурами. Некоторые поставщики СУБД предлагали свои решения (например, в Oracle Database используется выражение CONNECT BY). В настоящее время в ANSI стандартизована рекурсивная конструкция WITH из диалекта SQL DB2. В Microsoft SQL Server рекурсивные запросы (Recursive Common Table Expressions) появились лишь в версии 2005.
Вопрос 36
Синтаксис запросов на выборку данных. Структура запроса и использование предикат выборки
Оператор SELECT состоит из нескольких предложений (разделов):
SELECT определяет список возвращаемыех столбцов (как существующих, так и вычисляемых), их имена, ограничения на уникальность строк в возвращаемом наборе, ограничения на количество строк в возвращаемом наборе;
FROM задаёт табличное выражение, которое определяет базовый набор данных для применения операция, определяемых в других предложениях оператора;
WHERE задает ограничение на строки табличного выражения из предложения FROM;
GROUP BY объединяет ряды, имеющие одинаковое свойство с применением агрегатных функций
HAVING выбирает среди групп, определенных параметром GROUP BY
ORDER BY задает критерии сортировки строк; отсортированные строки передаются в точку вызова.
Оператор SELECT имеет следующую структуру:
SELECT
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula}]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
1) Сравнения (отношения) <конструктор значений строки> [NOT] {=|>|<|>=|<=|<>}|(<подзапрос>) <конструктор значений строки>
Сравниваются два множества, одно из которых – это обычно значение столбца, а другое – чаще всего константа или подзапрос. Значения. Которые при этом сравниваются, называют скалярными.
Примечание по предикатам: • Если хотя бы одно из сравниваемых значений (слева или справа) равно NULL, то результатом сравнения будет UNKNOWN. • При сравнении строк разной длины недостающие символы дополняются пробелами. Следует также иметь в виду, что в ASCII коды заглавных букв меньше, чем коды строчных, а у цифр коды меньше, чем у букв. В EBCDIC все наоборот. • Эти предикаты существенно влияют на эффективность запроса, поскольку в этом случае при поиске строк используются индексы. Что позволяет избежать полного просмотра таблицы.
Особенности промышленных серверов: • В SQL помимо <> можно использовать != • Кроме того допустимы такие операторы отношения, как !< (не меньше), !> (не больше).
2) Попадания во множество <конструктор значений строки> [NOT] IN (<подзапрос>|<набор конструкторов значений строки>)
Определяется множество значений, которому объект сравнения, записанный до ключевого слова IN, может принадлежать или не принадлежать. Если подзапрос не возвращает строк, то предикат принимает значение FALSE.
Примеры на работу со множествами:
SELECT * FROM SalesPeople WHERE City IN (‘Barcelona’, ’London’) SELECT * FROM SalesPeople WHERE SNum NOT IN (1001, 1007, 1004) SELECT * FROM SalesPeople WHERE (SNum, SName) IN ((1001, ‘Peel’), (1002, ‘Serres’))
3) Принадлежности диапазону <конструктор значений строки> [NOT] BETWEEN <конструктор значений строки 1> AND<конструктор значений строки 2> • <конструктор значений строки 1> — определяет нижнюю границу диапазона • <конструктор значений строки 2> — определяет верхнюю границу диапазона • Предикат BETWEEN сходен с предикатом IN, но вместо элементов множества он задает включающие границы, в которые [не] должно попадать проверяемое значение.
Примеры на принадлежность диапазону:
SELECT * FROM Customer WHERE CName BETWEEN ‘A’ AND ‘G’ SELECT * FROM SalesPeople WHERE (Comm BETWEEN .10 AND .12) AND NOT Comm IN (.10, .12) //Показывает, как исключить границы из диапазона значений.
4) Подобия: <столбец> [NOT] <шаблон> [ESCAPE <символ>]
Примечания по предикату подобия: • Предикат подобия применим только к символьным данным, поскольку используется для поиска подстрок. С этой целью используются спецсимволы, которые могут обозначать все, что угодно. Так символ «_» заменяет любой одиночный символ, который может быть размещен в данной позиции, а символ «%» заменяет последовательность символов произвольной длины. • В тех случаях, когда объектом поиска являются перечисленные спецсимволы, используется ключевое слово ESCAPE оно позволяет определить любой символ своеобразным флагом, используемым непосредственно перед спецсимволом и означающим, что следующий за ним символ «%» или «_» следует воспринимать как обычный символ. Если при этом необходимо найти и ESCAPE-символ, то его следует написать дважды подряд.
Особенности промышленных серверов: В SQL Server можно шаблоны задавать с помощью маски с []: ‘[A-D]%’, ‘^[F-M]%’
Примеры на предикат подобия:
SELECT * FROM SalesPeople WHERE SName LIKE ‘P__I%’ SELECT * FROM SalesPeople WHERE SName LIKE ‘%/_//%’ ESCAPE ‘/’
5) Проверки NULL-значений: <конструктор значений строки> IS [NOT] NULL Проверяются пропущенные (отсутствующие) значения в колонке таблицы.
Примечание: если <конструктор значений строки> включает несколько значений, то в общем случае: IS NOT ? NULL NOT (IS NULL), поскольку аргумент не значение, а конструктор строки.
Примеры на предикат проверки NULL-значений:
SELECT * FROM Customer WHERE City IS NULL SELECT * FROM SalesPeople WHERE Comm IS NOT NULL
6) Булевы операторы: <предикат> {AND|OR|NOT} <предикат>
Примечания: булевы оператора связывают один или несколько предикатов, образуя единственное логическое значение TRUE|FALSE. Используя предикаты с булевыми операторами, можно значительно увеличить и избирательную способность по отбору строк в результат запроса.
При использовании булевых операторов, особенно оператора NOT, следует применять круглые скобки для правильного составления условий.
Примеры на булевы операторы:
SELECT * FROM Customer WHERE City=’San Jose’ OR Rating>200 SELECT * FROM Orders WHERE NOT ((ODate=10/03/1990 AND SNum>1002) OR Amt>2000)
7) Перекрытия <конструктор значений строки> OVERLAPS <конструктор значений строки>
Определяет, будет ли один заданный период времени перекрывать другие заданные периоды.
предикаты сравнения: =, >,<,>=,<=, <>
Предикат LIKE для сравнения текста с заданным образцом
