Понимание SQL
Шрифт:
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) | Возвращает крайние левые(старшие) символы X из строки. |
RICHT(<string>,X) | Возвращает символы X младшего разряда из строки |
ASCII(<string>) | Возвращает код ASCII которым представляется строка в памяти компьютера. |
CHR(<ASCIIcode>) | Возвращает принтерные символы кода ASCII. |
VALUE(<string>) | Возвращает математическое значение для строки. Считается что строка имеет тип CHAR или VARCHAR, но состоит из чисел. VALUE('3') произведет число 3 типа INTEGER. |
UPPER(<string>) | Преобразует все символы строки в символы верхнего регистра. |
LOWER(<string>) | Преобразует все символы строки в символы нижнего регистра. |
INlTCAP(<string>) | Преобразует символы строки в заглавные буквы. В некоторых реализациях может иметь название - PROPER. |
LENGTH(<string>) | Возвращает число символов в строке. |
<string>||<string> | Объединяет две строки в выводе, так чтобы после первой немедленно следовала вторая. (значек || называется оператором сцепления). |
LPAD(<string >,X,'*') | Дополняет строку слева звездочками '*', или любым другим указанным символом, с колличестве, определяемом X. |
RPAD(<string>,X, ") | То же самое что и LPAD, за исключением того, что дополнение делается справа. |
SUBSTR(<string >,X,Y) | Извлекает Y символов из строки начиная с позиции X. |
Эти функции выполняются только для допустимых значений даты или времени.
ФУНКЦИЯ | ЗНАЧЕНИЕ |
DAY(<date>) | Извлекает |
WEEKDAY(<date>) | Извлекает день недели из даты. |
Эта функция может быть применена к любому типу данных.
ФУНКЦИЯ | ЗНАЧЕНИЕ |
NVL(<column>,<value>) | NVL (NULL Значение) будет меняться на значение <value> каждое NULL значение найденое в столбце <column>. Если полученное значение <column > не=NULL, NVL ничего не делает. |
Команда 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, пименяется с целью защиты ваших данных, при разрушении вашей системы. Сначала Вы используете реализационно-зависимую процедуру чтобы архивировать текущее содержание вашей базы данных, поэтому копия ее содержания где-нибудь будет сохранена. Затем вы просматриваете протокол изменений сделанных в базе данных. Он сохраняется в некоторой области памяти, но не в главной памяти базы данных а желательно на отдельном устройстве, и содержит список всех команд которые произвели изменения в структуре или в содержании базы данных. Если у вас вдруг появились проблемы и текущее содержание вашей базы данных оказалось нарушенным, вы можете повторно выполнить все изменения зарегистрированные в протоколе на резервной копии вашей базы данных, и снова привести вашу базу данных в состояние которое было до момента последней записи в протокол. Типичной командой чтобы начать протоколирование, будет следующяя: