Мартин Грубер - Понимание SQL (991940), страница 52
Текст из файла (страница 52)
Одна команда 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 следующим образом:COLUMN odate FORMAT dd-mon-yy;что навязывает формат типа 10-Oct-90 в поле даты, использующемся в выводе запроса на печать.Предложение COMPUTE, упомянутое ранее, вставляется в запрос следующимобразом:SELECT odate, amtFROM OrdersWHERE snum = 1001COMPUTE SUM (amt);Оно выводит все порядки продавца Peel, с датой и суммой приобретения по каждой дате, а в конце общую сумму приобретений.Другая реализация выводит промежуточные суммы приобретений, используяCOMPUTE в качестве команды. Сначала, она определяет разбивкуBREAK ON odate;вывода вышеупомянутого запроса на страницы — сгруппировав их по датам, поэтомувсе значения odate в каждой группе — одинаковые.
Затем вы можете ввести следующее предложение:COMPUTE SUM OF amt ON odate;Столбец в предложении ON предварительно должен быть использован в команде BREAK.ФУНКЦИИДля SQL в стандарте ANSI, вы можете применять агрегатные функции длястолбцов или использовать их значения в скалярных выражениях, таких например как— comm * 100. Имеется много других полезных функций, которые вы, вероятно встречали на практике.Имеется список некоторых общих функций SQL, отличающихся от стандартныхагрегатов.
Они могут использоваться в предложениях SELECT запросов, точно так жекак агрегатные функции, но эти функции выполняются для одиночных значений, а недля групповых. В следующем списке они классифицированны согласно типам данных,с которыми они выполняются. Если нет примечаний, то переменные в этом спискестандартизованы для любого выражения значений соответствующего типа, которыемогут быть использованы в предложении SELECT:МАТЕМАТИЧЕСКИЕ ФУНКЦИИЭти функции применяются для чисел.ФУНКЦИЯABX(X)ЗНАЧЕНИЕАбсолютное значение из X (преобразование отрицательного илиположительного значений в положительное)CEIL(X)X является десятичным значением, которое будет округляться сверху.FLOOR (X)X является десятичным значением, которое будет округляться снизу.GREATEST(X,Y) Возвращает большее из двух значений.LEAST(X,Y)Возвращает меньшее из двух значений.MOD(X,Y)Возвращает остаток от деления X на Y.POWER(X,Y)Возвращает значение X в степени Y.ROUND(X,Y)Цикл от X до десятичного Y.
Если Y отсутствует, цикл до целого числа.SING(X)Возвращает минус если X < 0, или плюс если X > 0.SQRT(X)Возвращает квадратный корень из X.СИМВОЛЬНЫЕ ФУНКЦИИЭти функции могут быть применены для строк текста, либо из столбцов текстовых типов данных, либо из строк литерных текстов, или же комбинация из этих двух.ФУНКЦИЯLEFT(<string>,X)RICHT(<string>,X)ASCII(<string>)CHR(<ASCIIcode>)VALUE(<string>)UPPER(<string>)ЗНАЧЕНИЕВозвращает крайние левые (старшие) символы X из строки.Возвращает символы X младшего разряда из строкиВозвращает код ASCII которым представляется строка в памяти компьютера.Возвращает принтерные символы кода ASCII.Возвращает математическое значение для строки.
Считаетсячто строка имеет тип CHAR или VARCHAR, но состоит из чисел. VALUE('3') произведет число 3 типа INTEGER.Преобразует все символы строки в символы верхнего регистра.Преобразует все символы строки в символы нижнего регистра.INlTCAP(<string>)Преобразует символы строки в заглавные буквы. В некоторыхреализациях может иметь название — PROPER.LENGTH(<string>)Возвращает число символов в строке.<string>||<string>Объединяет две строки в выводе, так чтобы после первойнемедленно следовала вторая.
(значек || называется оператором сцепления).LPAD(<string>,X,'*' )Дополняет строку слева звездочками '*', или любым другимуказанным символом, с колличестве, определяемом X.RPAD(<string>,X, ")То же самое что и LPAD, за исключением того, что дополнение делается справа.SUBSTR(<string>,X,Y) Извлекает Y символов из строки начиная с позиции X.LOWER(<string>)ФУНКЦИИ ДАТЫ И ВРЕМЕНИЭти функции выполняются только для допустимых значений даты или времени.ФУНКЦИЯDAY(<date>)WEEKDAY(<date>)ЗНАЧЕНИЕИзвлекает день месяца из даты. Подобные же функции существуют для MONTH (МЕСЯЦ), YEAR (ГОД), HOUR (ЧАСЫ),SECOND (СЕКУНДЫ) и так далее.Извлекает день недели из даты.ДРУГИЕ ФУНКЦИИЭта функция может быть применена к любому типу данных.ФУНКЦИЯЗНАЧЕНИЕNVL(<column>,<value>) NVL (NULL Значение) будет меняться на значение <value>каждое NULL значение, найденое в столбце <column>.
Еслиполученное значение <column> не =NULL, NVL ничего неделает.INTERSECT И MINUSКоманда UNION, как вы уже видели в Главе 14, может объединить два запроса,обьединив их вывод в один. Два других обычно имеющихся способа объединения отдельных запросов — это INTERSECT (Плюс) и MINUS (Минус). INTERSECT выводиттолько строки, произведенные обоими перекресными запросами, в то время какMINUS выводит строки, которые производятся одним запросом, но не другим. Следовательно, следующие два запросаSELECT *FROM SalespeopleWHERE city = 'London'INTERSECTSELECT *FROM SalespeopleWHERE 'London' IN (SELECT cityFROM CustomersWHERE Customers.snum = Salespeople.snum);выведут строки, произведенные обоими запросами, производящими всех продавцов вЛондоне, которые имели по крайней мере одного заказчика, размещенного там также.С другой стороны, запросSELECT *FROM SalespeopleWHERE city = 'London'MINUSSELECT *FROM SalespeopleWHERE 'London' IN (SELECT sityFROM CustomersWHERE Customers.snum = Salespeople.snum);удалит строки, выбранные вторым запросом из вывода первого, и таким образом, будут выводены все продавцы в Лондоне, которые не имели там заказчиков.
MINUS иногда еще называют DIFFERENCE (ОТЛИЧИЕ).АВТОМАТИЧЕСКИЕ ВНЕШНИЕ ОБЬЕДИНЕНИЯВ Главе 14 мы обсуждали внешнее обьединение и показывали вам, как выполнять его, используя команду UNION. Некоторые программы базы данных имеют болеенепосредственный способ выполнения внешних обьединений. В некоторых реализациях, вводимый знак "+" после предиката может выводить строки, которые удовлетворяют условию, также как и строки, которые ему не удовлетворяют. В условиипредиката может содержаться поле, совпадающее для обеих таблиц, и NULL значения будут вставлены там, где такого совпадения не будет найдено.Например, предположим, вы хотите видеть ваших продавцов и соответствующихим заказчиков, не исключая тех продавцов, которым не назначено ни одного заказчика(хотя такого нет в наших типовых таблицах, но в действительности это возможно):SELECT a.snum, sname, cnameFROM Salespeople a, Customers bWHEREa.snum = b.snum(+);Это является эквивалентом следующего объединения (UNION):SELECT a.snum, sname, cnameFROM Salespeople a, Customers bWHERE a.snum = b.snumUNIONSELECT snum, sname, '_ _ _ _ _ _ _ _ _ _'FROM SalespeopleWHERE snum NOT IN (SELECT snumFROM Customers);Мы считаем, что подчеркивания будут отображены NULL значениями (см.
команду FORMAT ранее в этом приложении, где описывалось отображение NULL значениями).ОТСЛЕЖИВАНИЕ ДЕЙСТВИЙВаша SQL реализация достаточна хороша, если она доступна многим пользователям, чтобы обеспечивать для них некий способ слежения за действиями, выполняемыми в базе данных. Имеются две основные формы, чтобы делать это:Journaling (Протоколирование) и Auditing (Ревизия).Эти формы отличаются по назначению.Journaling применяется с целью защиты ваших данных при разрушении вашейсистемы.