|
|
Книги-onlineПриложение C. Приложение CНекоторые общие нестандартные средства SQLИмеется ряд особенностей языка SQL, которые пока не определены как часть стандарта ANSI или стандарта ISO (Международная Организация По Стандартизации), и являются общими для многочисленных реализаций, так как они были получены для практического использования. Конечно, эти особенности меняются от программы к программе, и их обсуждение предназначено только для того, чтобы показать некоторые общие подходы к ним. ТИПЫ ДАННЫХТипы данных, поддерживаемые стандартом SQL, собраны в Приложении B. Это CHARACTER и разнообразные числовые типы. Реализация их может оказаться значительно сложнее, чем показано в терминах типов, которые они фактически могут использовать. Мы будем здесь обсуждать ряд таких нестандартных типов данных. ТИПЫ DATE И TIMEКак упомянуто в Главе 2, тип DATE широко поддерживается, хотя он не является частью стандарта. Мы использовали ранее в нашей таблице Заказов этот тип в формате mm/dd/yyyy. Это стандартный формат IBM в США. Разумеется, возможны и другие форматы, и программные реализации часто поддерживают несколько форматов, позволяя вам выбирать наиболее подходящий. Реализация, которая предлагает эту особенность, должна быть способна преобразовывать дату одного формата в другой автоматически. Имеются несколько основных форматов даты с которыми вы можете столкнуться:
Наличие специального типа даты даёт возможность выполнять арифметические операции с датами. Например, вы можете добавлять число дней к дате и получать другую дату в программе, самостоятельно следящей за числом дней в месяцах, високосными годами и т.д. Даты могут также сравниваться; например фраза, дата A < дата B , означает, что дата A предшествует дате B по времени. Помимо даты, большое количество программ определяют специальный тип для времени, который может также быть представлен в ряде форматов, включая следующие:
Время может добавляться или сравниваться точно так же, как дата, с автоматической коррекцией числа секунд в минутах или часах. Кроме того, специально встроенные константы, указывающие текущую дату или время (CURDATE или CURTIME), являются общими. Они похожи на константу USER (Пользователь) в которой их значение будет непрерывно меняться. Можете ли вы включать время и дату в одно поле? Некоторые реализации определяют тип DATE достаточно точно, чтобы включать туда ещё и TIME. В качестве альтернативы третий обобщающий тип, TIMESTAMP, может быть определен как комбинация этих двух. ТИПЫ ТЕКСТОВОЙ СТРОКИANSI поддерживает только один тип для представления текста. Это тип CHAR. Любое поле такого типа должно иметь определённую длину. Если строка, вставленная в поле, меньше длины поля, она дополняется пробелами; строка не может быть длиннее поля. Хотя и достаточно удобное, это определение всё же имеет некоторые ограничения
для пользователя. Например, символьные поля должны иметь одинаковую длину, чтобы
можно было выполнить команду UNION. Большинство реализаций поддерживают строки
переменной длины для типов данных VARCHAR и LONG VARCHAR (или просто LONG). В то
время как поле типа CHAR всегда может распределить память для максимального числа
символов, которое может сохраняться в поле, поле VARCHAR при любом количестве
символов может распределить только определённое количество памяти, чтобы
сохранить фактическое содержание поля, хотя SQL может установить извне некоторое
дополнительное пространство памяти, чтобы следить за текущей длиной поля. КОМАНДА FORMATКак мы подчеркивали в Главе 7, процесс вывода выполняемого в стандарте SQL, имеет ограничения. Хотя большинство реализаций включают SQL в пакеты, имеющие другие средства для управления этой функцией, некоторые реализации также используют команду типа FORMAT внутри SQL чтобы навязывать выводу запроса определённые формы структуры или ограничения. Среди возможных функций команды FORMAT существуют такие:
Команда FORMAT может вводиться сразу перед или сразу после запроса, к которому она применяется, в зависимости от реализации. Одна команда FORMAT обычно может применяться только к одному запросу, хотя любое число команд FORMAT может применяться к одному и тому же запросу. Вот некоторые примеры команды FORMAT: FORMAT NULL '_ _ _ _ _ _ _'; FORMAT BTITLE 'Orders Grouped by Salesperson'; FORMAT EXCLUDE (2, 3); Первая команда NULL представляется в виде ' _ _ _ _ _ _ _ ' при выводе на печать; вторая вставляет заголовок 'Orders Grouped by Salesperson' в нижнюю часть каждой страницы; третья исключает второй и третий столбцы из вывода предыдущего запроса. Вы могли бы использовать последнюю, если выбираете конкретные столбцы, чтобы использовать их в предложении ORDER BY в вашем выводе. Так как указанные функции команды FORMAT могут выполняться по разному, все варианты их использования не могут быть здесь показаны. Имеются другие команды, которые могут использоваться для выполнения тех же
функций. Команда SET подобна команде FORMAT; она является вариантом или
дополнением к команде, которая применяется во всех запросах текущего сеанса
пользователя, а не просто в одиночном запросе. В следующей реализации, команда
FORMAT начинается ключевым словом COLUMN следующим образом: SELECT odate, amt FROM Orders WHERE snum = 1001 COMPUTE SUM (amt); Оно выводит все заказы продавца Peel с датой и суммой приобретения по каждой дате, а в конце - общую сумму приобретений. Другая реализация выводит промежуточные суммы приобретений, используя COMPUTE в качестве команды. Сначала, она определяет разбивку BREAK ON odate; вывода вышеупомянутого запроса на страницы, сгруппировав по датам, поэтому все значения odate в каждой группе - одинаковые. Затем вы можете ввести следующее предложение: COMPUTE SUM OF amt ON odate; Столбец в предложении ON предварительно должен быть использован в команде BREAK. ФУНКЦИИДля SQL в стандарте ANSI вы можете применять агрегатные функции для столбцов или использовать их значения в скалярных выражениях, таких, например, как comm * 100. Имеется много других полезных функций, которые вы, вероятно, встречали на практике. Имеется список некоторых общих функций SQL, отличающихся от стандартных агрегатов. Они могут использоваться в предложениях SELECT-запросов точно так же, как агрегатные функции, но эти функции выполняются для одиночных значений, а не для групповых. В следующем списке они классифицированы согласно типам данных, с которыми они работают. Если нет примечаний, то переменные в этом списке стандартизированы для любого выражения значений соответствующего типа, которые могут быть использованы в предложении SELECT. МАТЕМАТИЧЕСКИЕ ФУНКЦИИЭти функции применяются для работы с числами.
СИМВОЛЬНЫЕ ФУНКЦИИЭти функции могут быть применены для строк текста из столбцов текстовых типов данных, либо из строк литерных текстов, или же из комбинации этих двух.
ФУНКЦИИ ДАТЫ И ВРЕМЕНИЭти функции выполняются только для допустимых значений даты или времени.
ДРУГИЕ ФУНКЦИИЭта функция может быть применена к любому типу данных.
INTERSECT И MINUSКоманда UNION, как вы уже видели в Главе 14, может объединить два запроса, объединив их вывод в один. Два других, обычно имеющихся способа объединения отдельных запросов, - это INTERSECT (Плюс) и MINUS (Минус). INTERSECT выводит только строки, произведённые обоими перекрестными запросами, в то время как MINUS выводит строки, которые производятся одним запросом, но не другим. Следовательно, следующие два запроса SELECT * FROM Salespeople WHERE city = 'London' INTERSECT SELECT * FROM Salespeople WHERE 'London' IN (SELECT city FROM Customers WHERE Customers.snum = Salespeople.snum); выведут строки, произведённые обоими запросами, выдающими всех продавцов в Лондоне, которые имели по крайней мере одного заказчика, размещённого там также. С другой стороны, запрос SELECT * FROM Salespeople WHERE city = 'London' MINUS SELECT * FROM Salespeople WHERE 'London' IN (SELECT sity FROM Customers WHERE Customers.snum = Salespeople.snum); удалит строки, выбранные вторым запросом, из вывода первого, и, таким образом, будут выведены все продавцы в Лондоне, которые не имели там заказчиков. MINUS иногда ещё называют DIFFERENCE (ОТЛИЧИЕ). АВТОМАТИЧЕСКИЕ ВНЕШНИЕ ОБЪЕДИНЕНИЯВ Главе 14 мы обсуждали внешнее объединение и показывали вам, как выполнять его, используя команду UNION. Некоторые программы баз данных имеют более непосредственный способ выполнения внешних объединений. В некоторых реализациях вводимый знак " + " после предиката может выводить строки, которые удовлетворяют условию, так же как и строки, которые ему не удовлетворяют. В условии предиката может содержаться поле, совпадающее для обеих таблиц, и NULL-значения будут вставлены там, где такого совпадения не будет найдено. Например, предположим, вы хотите видеть ваших продавцов и соответствующих им заказчиков, не исключая тех продавцов, которым не назначено ни одного заказчика (хотя такого нет в наших типовых таблицах, но в действительности это возможно): SELECT a.snum, sname, cname FROM Salespeople a, Customers b WHEREa.snum = b.snum(+); Это является эквивалентом следующего объединения (UNION): SELECT a.snum, sname, cname FROM Salespeople a, Customers b WHERE a.snum = b.snum UNION SELECT snum, sname, '_ _ _ _ _ _ _ _ _ _' FROM Salespeople WHERE snum NOT IN (SELECT snum FROM Customers); Предполагается, что подчёркивания будут отображены NULL-значениями (см. команду FORMAT ранее в этом приложении, где описывалось отображение NULL-значениями). ОТСЛЕЖИВАНИЕ ДЕЙСТВИЙВаша SQL-реализация достаточна хороша, если она доступна многим пользователям, чтобы обеспечивать им некий способ слежения за действиями, выполняемыми в базе данных. Имеются две основные формы, чтобы реализовать это: Journaling (Протоколирование) и Auditing (Ревизия). Эти формы отличаются по назначению. Journaling применяется с целью защиты ваших данных при разрушении вашей
системы. Сначала вы используете реализационно зависимую процедуру, чтобы архивировать текущее содержание вашей базы данных,
поэтому копия её содержания где-нибудь будет сохранена. Затем вы просматриваете
протокол изменений, сделанных в базе данных. Он сохраняется в некоторой области
памяти, но не в главной памяти базы данных, а желательно на отдельном
устройстве, и содержит список всех команд, которые произвели изменения в
структуре или в содержании базы данных. SET JOURNAL ON; Auditing используется с целью защиты. Она следит за тем, кто и какие действия выполнял в базе данных, и сохраняет эту информацию в таблице, доступной только очень немногим привилегированным пользователям. Конечно, вы редко будете прибегать к процедуре ревизии, потому что очень скоро она займет много памяти и вам будет сложно работать в вашей БД. Но вы можете устанавливать ревизию для определённых пользователей, определённых действий или определённых объектов данных. Имеется такая форма команды AUDIT: AUDIT INSERT ON Salespeople BY Diane; Или предложение ON, или предложение BY могут быть исключены, устанавливая ревизию либо всех объектов, либо всех пользователей, соответственно. Применение AUDIT ALL вместо AUDIT INSERT приведет к отслеживанию всех действий Diane в таблице Продавцов. Внимание! Если у вас не получилось найти нужную информацию, используйте рубрикатор или воспользуйтесь поиском . книги по программированию исходники компоненты шаблоны сайтов C++ PHP Delphi скачать |
|