ФОРМАТИРОВАНИЕ РЕЗУЛЬТАТОВ ЗАПРОСОВ

Таблицы являются неупорядоченными множествами, и исходящие из них данные необязательно представляются в какой-либо определенной последовательности. В SQL применяется команда ORDER BY, позволяющая внести некоторый порядок в выходные данные запроса. Она их упорядочивает в соответствии со значениями одного или нескольких выбранных столбцов. Множество столбцов упорядочиваются один внутри другого, как в случае применения GROUP BY, и можно задать возрастающую (ASC) или убывающую (DESC) последовательность сортировки для каждого из столбцов. По умолчанию принята возрастающая последовательность сортировки. Таблица заявок (ORDERS), упорядоченная по номеру заявки, можно получить с помощью запроса:

SELECT * FROM Orders ORDER BY cnum DESC;

Упорядочение по множеству столбцов Внутри уже произведенного упорядочения по полю cnum можно упорядочить таблицу и по другому столбцу, например, amt:

SELECT * FROM Orders ORDER BY cnum DESC, amt DESC;

Так можно использовать ORDER BY одновременно для любого количества столбцов. Во всех случаях столбцы, по которым выполняется сортировка, входят в число выбранных. Этому требованию стандарта ANSI удовлетворяет большинство систем. Далее команда неверна:

SELECT cname,city FROM Customers ORDER BY cnum;

Поскольку поле cnum отсутствует в списке выбранных полей, предложение ORDER BY не может его найти для упорядочения выходных данных. Даже если система позволяет это сделать, значимость такого упорядочения неочевидна, поскольку само поле, по которому выполняется сортировка, не представлено в выходных данных. Поэтому включение в них всех столбцов, используемых в предложении ORDER BY, весьма желательно. Упорядочение составных групп ORDER BY может использоваться с GROUP BY для упорядочения групп. ORDER BY всегда выполняется последней. Вот пример из предыдущего раздела с добавлением предложения ORDER BY. До этого выходные данные были сгруппированы, но порядок групп был произвольным; теперь группы выстроены в определенной последовательности:

SELECT snum, odate, MAX(amt) FROM Orders GROUP BY snum, odate ORDER BY snum;

Поскольку в команде не указан способ упорядочения, по умолчанию применяется возрастающий. Упорядочение результата по номеру столбца Вместо имен столбцов для указания полей, по которым упорядочиваются выходные данные, можно использовать номера. Но ссылаясь на них, следует иметь в виду, что это номера в определении выходных данных, а не столбцов в таблице. Т.е. первое поле, имя которого указано в SELECT, является для предложения ORDER BY полем с номером 1, независимо от его расположения в таблице. Например, можно применить следующую команду, чтобы увидеть определенные поля таблицы Salespeople, упорядоченные по убыванию поля commission (comm):

SELECT sname, comm FROM Salespeople ORDER BY 2 DESC;

Мы рассматриваем это свойство ORDER BY для того, чтобы продемонстрировать возможность его использования со столбцами выходных данных; эта процедура аналогична применению ORDER BY со столбцами таблицы. Столбцы, полученные с помощью функций агрегирования, константы или выражения в предложении запроса SELECT, можно применить и с ORDER BY, если на них ссылаются по номеру. Например, чтобы подсчитать заявки (orders) для каждого продавца (salespeople) и вывести результаты в убывающем порядке:

SELECT snum, COUNT (DISTINCT onum) FROM Orders GROUP BY snum ORDER BY 2 DESC;

В этом случае был использован номер столбца, но так как выходной столбец не имеет имени, саму функцию агрегирования применять не понадобилось. В соответствии со стандартом ANSI SQL, следующий запрос не работает, хотя в некоторых системах он воспринимается без проблем: SELECT snum, COUNT (DISTINCT onum) FROM Orders GROUP BY snum ORDER BY COUNT (DISTINCT onum) DESC;

Многими системами такая команда воспринимается как ошибочная. ORDER BY с NULL-значениями Если в поле, которое используется для упорядочения выходных данных, существуют NULL-значения, то все они следуют в конце или предшествуют всем остальным значениям этого поля. Конкретный вариант не оговаривается стандартом ANSI, вопрос решается индивидуально для каждого программного продукта, и один из этих вариантов принимается.

В начало

ОГРАНИЧЕНИЕ FOREIGN KEY.

Ограничение внешнего ключа - это основной механизм для поддержания ссылочной целостности между таблицами реляционной БД. Столбец дочерней таблицы, определенный в качестве внешнего ключа в параметре FOREIGN KEY, применяется для ссылки на столбец родительской таблицы, являющийся в ней первичным ключом. Имя родительской таблицы и столбцы ее первичного ключа указываются в предложении REFERENCES. Данные в столбцах, определенных в качестве внешнего ключа, могут принимать только такие же значения, какие находятся в связанных с ним столбцах первичного ключа родительской таблицы. Совпадение имен столбцов для связи дочерней и родительской таблиц необязательно. Единственным требованием остается соответствие столбцов по типу и размеру данных.

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

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

Столбцы внешнего ключа могут содержать значение NULL, однако проверка на ограничение FOREIGN KEY игнорируется. Внешний ключ может быть проиндексирован, тогда сервер будет быстрее отыскивать нужные данные. Внешний ключ определяется как при создании, так и при изменении таблиц.

Ограничение ссылочной целостности задает требование, согласно которому для каждой записи в дочерней таблице должна иметься запись в родительской таблице. При этом изменение значения столбца связи в записи родительской таблицы при наличии дочерней записи блокируется, равно как и удаление родительской записи (запрет каскадного изменения и удаления), что гарантируется параметрами ON DELETE NO ACTION и ON UPDATE NO ACTION, принятыми по умолчанию. Для разрешения каскадного воздействия следует использовать параметры ON DELETE CASCADE и ON UPDATE CASCADE.

В начало