Главная страница
Навигация по странице:

  • SQL - язык манипулирования данными в реляционной базе данных SQL и его история

  • Описание основных операторов SQL

  • Команда Описание

  • Математическая функция Описание

  • Функция Описание

  • Язык SQL. Лекция Язык SQL. В настоящей лекции мы не определяем подробно основные объекты реляционной


    Скачать 82.36 Kb.
    НазваниеВ настоящей лекции мы не определяем подробно основные объекты реляционной
    АнкорЯзык SQL
    Дата30.05.2022
    Размер82.36 Kb.
    Формат файлаdocx
    Имя файлаЛекция Язык SQL.docx
    ТипЛекции
    #558119
    страница1 из 3
      1   2   3

    Введение

    В настоящей лекции мы не определяем подробно основные объекты реляционной базы данных - базы данных, таблицы, индексы, представления, хранимые команды/процедуры, триггеры, события таймера. Это будет сделано в следующих лекциях. Данная лекция концентрирует ваше внимание на тех возможностях, которые предоставляет SQL по обработке данных.

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

    SQL - язык манипулирования данными в реляционной базе данных

    SQL и его история

    Единственным средством общения и администраторов баз данных, и проектировщиков, и разработчиков, и пользователей с реляционной базой данных является структурированный язык запрос SQL (Structured Query Language). SQL есть полнофункциональный язык манипулирования данными в реляционных базах данных. В настоящее время он является общепризнанным, стандартным интерфейсом для реляционных баз данных, таких как Oracle, InformixSybase, DB/2, MS SQL Server и ряда других (стандарты ANSI и ISO). SQL - непроцедурный язык, который предназначен для обработки множеств, состоящих из строк и колонок таблиц реляционной базы данных. Хотя существуют его расширения, допускающие процедурную обработку. Проектировщики баз данных используют SQL для создания всех физических объектов реляционной базы данных.

    Теоретические основы SQL были заложены в известной статье [Кодд], положившей начало развитию теории реляционных БД. Первая практическая реализации была выполнена в исследовательских лабораториях фирмы IBM Chamberlin D.D. и Royce R.F. Промышленное применение SQL было впервые реализовано в СУБД Ingres. Одной из первых промышленных реляционных СУБД является Oracle. По сути дела, реляционная СУБД - это программное обеспечение, которое управляет работой реляционной базы данных.

    Первый международный стандарт языка SQL был принят в 1989 г. (SQL-89). В конце 1992 г. был принят новый международный стандарт SQL-92. В настоящее время большинство производителей реляционных СУБД используют его в качестве базового. Однако работы по стандартизации языка SQL далеки от завершения и уже разработан проект стандарта SQL-99, который вводит в обиход языка понятие объекта и разрешает на него ссылаться в операторах SQL. В исходном варианте SQL не было команд управления потоком данных, они появились в недавно принятом стандарте ISO/IEC 9075-5: 1996 дополнительной части SQL.

    Каждой конкретной СУБД соответствует своя собственная реализация SQL, в целом поддерживающая определенный стандарт, но имеющая свои особенности. Эти реализации называются диалектами. Так, стандарт ISO/IEC 9075-5 предусматривает объекты, называемые постоянно хранимыми модулями или PSM-модулями (Persistent Stored Modules). В СУБД Oracle расширение PL/SQL является аналогом указанного выше расширения стандарта 1.

    Описание основных операторов SQL

    SQL состоит из набора команд манипулирования данными в реляционной базе данных, которые позволяют создавать объекты реляционной базы данных, модифицировать данные в таблицах (вставлять, удалять, исправлять), изменять схемы отношений базы данных, выполнять вычисления над данными, делать выборки из базы данных, поддерживать безопасность и целостность данных.

    Весь набор команд SQL можно разбить на следующие группы:

    • команды определения данных ( DDL - Data Defininion Language );

    • команды манипулирования данными ( DML - Data Manipulation Language );

    • команды выборки данных ( DQL - Data Query Language );

    • команды управления транзакциями;

    • команды управления данными.

    При выполнении каждая команда SQL проходит четыре фазы обработки:

    • фаза синтаксического разбора, которая включает проверку синтаксиса команды, проверку имен таблиц и колонок в базе данных, а также подготовку исходных данных для оптимизатора;

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

    • фаза генерации исполняемого кода, которая включает построение выполняемого кода команды;

    • фаза выполнения команды, которая включает выполнение кода команды.

    В настоящее время оптимизатор является составной частью любой промышленной реализации SQL. Работа оптимизатора основана на сборе статистики о выполняемых командах и выполнении эквивалентных алгебраических преобразований с отношениями базы данных. Такая статистика сохраняется в системном каталоге базы данных. Системный каталог является словарем данных для каждой базы данных и содержит информацию о таблицах, представлениях, индексах, колонках, пользователях и их привилегиях доступа. Каждая база данных имеет свой системный каталог, который представляет совокупность предопределенных таблиц базы данных.

    Таблица 8.1 содержит список команд SQL в соответствии с принятым стандартом, за исключением некоторых практически не используемых в диалектах команд.

    Таблица 8.1. Типичный список команд SQL

    Команда

    Описание

    Команды определения данных объектов

    ALTER TABLE

    Изменяет описание таблицы (схему отношения)

    CREATE EVENT

    Создает событие таймера в базе данных

    CREATE INDEX

    Создает индекс для таблицы

    CREATE SEQUENCE

    Создает последовательность

    CREATE TABLE

    Определяет таблицу

    CREATE TABLESPACE

    Создает табличное пространство

    CREATE TRIGGER

    Создает триггер в базе данных

    CREATE VIEW

    Определяет представление на таблицах

    DROP INDEX

    Физически удаляет индекс из баз данных

    DROP SEQUENCE

    Удаляет последовательность

    DROP TABLE

    Физически удаляет таблицу из базы данных

    DROP TABLESPACE

    Удаляет табличное пространство

    DROP VIEW

    Удаляет представление

    Команды манипулирвания данными

    DELETE

    Удаляет одну или более строк из таблицы базы данных

    INSERT

    Вставляет одну или более строк в таблицу базы данных

    UPDATE

    Обновляет значения колонок в таблице базы данных

    Команды выборки данных

    SELECT

    Выполняет запрос на выборку данных из таблиц и представлений

    UNION

    Объединяет в одной выборке результаты выполнения двух или более команд SELECT

    Команды управления транзакциями

    COMMIT

    Завершает транзакцию и физически актуализирует состояние базы данных

    ROLLBACK

    Завершает транзакцию и возвращает текущее состояние базы данных на момент последней завершенной транзакции и контрольной точки

    SAVEPOINT

    Назначает контрольную точку внутри транзакции

    Команды управления данными

    ALTER DATABASE

    Изменяет группы хранения или журналы транзакций

    ALTER DBAREA

    Изменяет размер областей хранения базы данных

    ALTER PASSWORD

    Изменяет пароль для доступа к базе данных

    ALTER STOGROUP

    Изменяет состав областей хранения в группе хранения

    CHECK DATABASE

    Проверяет целостность базы данных

    CHECK INDEX

    Проверяет целостность индекса

    CHECK TABLE

    Проверяет целостность таблицы и индекса

    CREATE DATABASE

    Физически создает базу данных

    CREATE DBAREA

    Создает область хранения базы данных

    CREATE STOGROUP

    Создает группу хранения

    CREATE SYSNONYM

    Создает синоним для таблицы или представления

    DEINSTALL DATABASE

    Делает базу данныхх недоступной пользователям вычислительной сети

    DROP DATABASE

    Физически удаляет базы данных

    DROP DBAREA

    Физически удаляет область хранения данных

    DROP STOGROUP

    Удаляет группу хранения

    GRANT

    Определяет привилегии пользователей и разграничение доступа к базе данных

    INSTALL DATABASE

    Делает базу данных доступной пользователям вычислительной сети

    LOCK DATABASE

    Блокирует текущую активную базу данных

    REVOKE

    Отменяет привилегии пользователей и разграничения доступа к базе данных

    SET DEFAULT STOGROUP

    Определяет группу хранения по умолчанию

    UNLOCK DATABASE

    Деблокирует текущую активную базу данных

    UPDATE STATISTIK

    Обновляет статистику для базы данных

    Другие команды

    COMMENT ON

    Размещает в системном каталоге комментарии к описанию объектов БД

    CREATE SYNONYM

    Определяет в системном каталоге альтернативные имена для таблиц и представлений БД

    DROP SYNONYM

    Удаляет из системного каталого альтернативные именя для таблиц и представлений БД

    LABEL

    Изменяет метки системных описаний

    ROWCOUNT

    Вычисляет число строк в таблице БД

    Набор команд SQL, перечисленный в таблице, не является полным. Этот список приведен, чтобы вы составили впечатление о возможностях SQL в целом. Для получения полного списка команд следует обратиться к соответствующему руководству для конкретной СУБД. Следует помнить, что SQL является единственным средством общения всех категорий пользователей с реляционными базами данных.

    Встроенные функции SQL и их использование в запросах

    Арифметические функции

    SQL поддерживает полный набор арифметических операций и математических функций для построения арифметических выражений над колонками базы данных ( +, -, *, /, ABS, LN, SQRT и т.д.). Список основных встроенных математических функций дан ниже в таблице 8.2.

    Таблица 8.2. Математические функции SQL

    Математическая функция

    Описание

    ABS(X)

    Возвращает абсолютное значение числа Х

    ACOS(X)

    Возвращает арккосинус числа Х

    ASIN(X)

    Возвращает арксинус числа Х

    ATAN(X)

    Возвращает арктангенс числа Х

    COS(X)

    Возвращает косинус числа Х

    EXP(X)

    Возвращает экспоненту числа Х

    SIGN(X)

    Возвращает -1, если Х<0,0, если Х=0, +1, если Х>0

    LN(X)

    Возвращает натуральный логарифм числа Х

    MOD(X,Y)

    Возвращает остаток от деления Х на Y

    CEIL(X)

    Возвращает наименьшее целое, большее или равное Х

    ROUND(X,n)

    Округляет число Х до числа с n знаками после десятичной точки

    SIN(X)

    Возвращает синус числа Х

    SQRT(X)

    Возвращает квадратный корень числа Х

    TAN(X)

    Возвращает тангенс числа Х

    FLOOR(X)

    Возвращает наибольшее целоеб меньшее или равное Х

    LOG(a,X)

    Возвращает логарифм числа Х по основанию А

    SINH(X)

    Возвращает гиперболический синус числа Х

    COSH(X)

    Возвращает гиперболический косинус числа Х

    TANH(X)

    Возвращает гиперболический тангенс числа Х

    TRANC(X,n)

    Усекает число Х до числа с n знаками после десятичной точки







    POWER(A,X)

    Возвращает значение А, возведенное в степень Х

    Набор встроенных функций может изменяться в зависимости от версии СУБД одного производителя и также в СУБД различных производителей. Так, например, в СУБД SQLBase, Centure Inc. есть функция @ATAN2(X,Y), которая возвращает арктангенс Y/X, но отсутствует функция SIGN(X).

    Арифметические выражения необходимы для получения данных, которые непосредственно не сохраняются в колонках таблиц базы данных, но значения которых необходимы пользователю. Допустим, что вам необходим список служащих, показывающий выплату, которую получил каждый служащий с учетом премий и штрафов.

    SELECT ENAME, SAL, COMM, FINE, SAL + COMM - FINE

    FROM EMPLOYEE

    ORDER BY DEPNO;

    Арифметическое выражение SAL + COMM - FINE выводится как новая колонка в результирующей таблице, которая вычисляется в результате выполнения запроса. Такие колонки называют еще производными (вычисляемыми) атрибутами или полями.
    Функции обработки строк

    SQL предоставляет вам широкий набор функций для манипулирования со строковыми данными (конкатенация строк, CHR, LENGTH, INSTR и другие). Список основных функций для обработки строковых данных приведен в таблице 8.3.

    Таблица 8.3. Функции SQL для обработки строк

    Функция

    Описание

    CHR(N)

    Возвращает символ ASCII кода для десятичного кода N

    ASCII(S)

    Возвращает десятичный ASCII код первого символа строки

    INSTR(S2.S1.pos[,N]

    Возвращает позицию строки S1 в строке S2 большую или равную pos.N - число вхождений

    LENGHT(S)

    Возвращает длину строки

    LOWER(S)

    Заменяет все символы строки на прописные символы

    INITCAP(S)

    Устанавливает первый символ каждого слова в строке на заглавный, а остальные символы каждого слова - на прописные

    SUBSTR(S,pos,[,len])

    Выделяет в строке S подстроку длиной len, начиная с позиции pos

    UPPER(S)

    Преобразует прописные буквы в строке на заглавные буквы

    LPAD(S,N[,A])

    Возвращает строку S, дополненную слева симолами A до числа символов N. Символ - наполнитель по умолчанию - пробел

    Rpad(S,N[,A])

    Возвращает строку S, дополненную справа симолами A до числа символов N. Символ - наполнитель по умолчанию - пробел

    LTRIM(S,[S1])

    Возвращает усеченную слева строку S. Символы удаляются до тех пор, пока удаляемый символ входит в строку - шаблон S1 (по умолчанию - пробел)

    RTRIM(S,[S1])

    Возвращает усеченную справа строку S. Символы удаляются до тех пор, пока удаляемый символ входит в строку - шаблон S1 (по умолчанию - пробел

    TRANSLATE(S,S1,S2)

    Возвращает строку S, в которой все вхождения строки S1 замещены строкой S2. Если S1 <> S2, то символы, которым нет соответствия, исключаются из результирующей строки

    REPLACE(S,S1,[,S2])

    Возвращает строку S, для которой все вхождения строки S1 замещены на подстроку S2. Если S2 не указано, то все вхождения подстроки S1 удаляются из результирующей строки

    NVL(X,Y)

    Если Х есть NULL, то возвращает в Y либо строку, либо число, либо дату в зависимости от исходного типа Y

    Названия одних и тех же функций могут отличаться в различных СУБД. Так, например, функция СУБД Oracle SUBSTR(S, pos, [, len]) в СУБД SQLBase называется @SUBSTRING(S, pos, len). В СУБД SQLBase имеются функции, которых нет в СУБД Oracle (см. таблицу ниже, где приведен список таких функций).

    Таблица 8.4. Строковые функции СУБД SQLBase, отличающиеся от строковых функций СУБД Oracle

    Функция

    Описание

    @EXACT(S1,S2)

    Возвращает результат сравнения двух строк

    @LEFT(S,len)

    Возвращает левую подстроку длиной len

    LENGTH(S)

    Возвращает длину строки

    @MID(S, pos, len)

    Возвращает подстроку указанной длины, начиная с позиции pos

    @REPEAT(S,n)

    Повторяет строку S n раз

    @REPLACE(S1,pos,len,S2)

    Замещает с позиции pos len символов в строке S2 символами строки S1

    RIGHT(S,len)

    Возвращает правую подстроку S длиной len

    @SCAN(S,pat)

    Возвращает позицию подстроки pat в строке S

    @STRING(X,scale)

    Возвращает символьное представление числа с указанным масштабом scale

    @TRIM(S)

    Удаляет пробелы в строке справа и слева

    @VALUE(S)

    Преобразует символьное представление числа в числовое значение

    Можно использовать функцию INITCAP, чтобы при получении списка имен служащих фамилии всегда начинались с заглавной буквы, а все остальные были прописными.

    SELECT INITCAP(ENAME)

    FROM EMPLOYEE

    ORDER BY DEPNO;
    Специальные функции

    SQL обеспечивает набор специальных функций для преобразований значений колонок. Список таких функций приведен в таблице 8.5.

    Таблица 8.5. Специальные функции

    Функция

    Описание

    DECODE(E,S1,R1,S2,R2,…,[def])

    Если E соответствует Si, то возвращается Ri, в противном случае - def или NULL, если умолчание не задано

    TO_NUMBER(S)

    Возвращает результат преобразования строки S в аргумент типа NUMBER

    TO_CHAR(X[,F])

    Возвращает результат преобразования строки S в аргумент типа DATE согласно заданному формату даты F

    TO_DATE(S[,F])

    Возвращает результат преобразования значения параметра S символьного типа в тип DATE

    В таблице EMPLOYEE для каждого служащего можно ввести признак пола - добавить колонку SEX типа CHAR(1) (0 - мужской, 1 - женский). Допустим, что вам нужен список служащих, в котором требуется разделение их по признаку пола с указанием его в числовом формате; тогда можно задать такую команду:

    SELECT ENAME, LNAME, AGE, 'Пол:', TO_NUMBER(SEX)

    FROM EMPLOYEE

    ORDER BY 5;

    В качестве примера использования функции DECODE приведем запрос, вычисляющий список служащих с указанием их руководителя. Если руководитель неизвестен, то выводится по умолчанию "не имеет".

    SELECT ENAME, DECODE(DEPNO, 10, 'Дрягин', 20,'Жиляева', 30,'

    Коротков', 'не имеет')

    FROM EMPLOYEE

    ORDER BY ENAME;

    Предположим, что руководитель организации имеет неопределенное значение колонки DEPNO и, следовательно, для него будет работать умолчание, предусмотренное в DECODE.
    Функции для обработки даты

    В диалекте SQL СУБД Oracle имеется небольшой набор функций для манипулирования колонками с типом date. Список основных функций обработки даты и времени приведен в таблице 8.6.

    Таблица 8.6. Функции обработки даты и времени

    Функция

    Описание

    SYSDATE

    Возвращает текущую дату и время

    ROUND(D[,F])

    Округляет значение даты D согласно заданному шаблону

    TRANC(D[,F])

    Усекает значение даты D согласно заданному шаблону

    NEXT_DAY(D,S)

    Возвращает дату дня, который является первым днем, более поздним, чем текущая дата с названием S

    Если вам потребовался список новых служащих, поступивших за последний квартал в организацию, то вы можете написать запрос в следующем виде:

    SELECT ENAME, HIREDATE, HIREDATE + 92 DAYS

    FROM EMPLOYEE

    WHERE HIREDATE + 92 DAYS > SYSDATE

    AND DEPNO=30;

    Ключевое слово SYSDATE всегда возвращает текущую дату. В этом примере также показано, как используется арифметический оператор сложения с переменными типа "дата". К переменной типа "дата" можно прибавлять и вычитать из него целое число дней, месяцев, лет, часов, минут, секунд, микросекунд. Для этого используются соответствующие ключевые слова ( DAY, MONTH и т.д.), следующие за целой константой (дробная часть игнорируется, если вы указываете число с десятичной точкой). Имеется ограничение на использование скобок в таких выражениях (так, заключение в скобки выражения 1 DAYS + 1 YEARS приведет к ошибке).
    Использование агрегатных функций в запросах

    Агрегатные функции в SQL позволяют выбирать обобщающую информацию из группы строк и проводить систематизацию данных. Список агрегатных функций приведен в таблице 8.7. Агрегатные функции почти во всех реализациях SQL носят одинаковые имена. Различие в наименование для Oracle дано через косую черту.

    Таблица 8.7. Агрегатные функции

    Функция

    Описание

    AVG(X) = AVG(ALL X) AVG(DISTINCT X)

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

    COUNT(*) COUNT(X) = COUNT(ALL X) COUNT(DISTINCT X)

    Вычисляет числа итемов. При указании * всегда возвращается число строк в таблице. Указание DISTINCT подавляет дубликаты

    MAX(X) = MAX(ALL X) MAX (DISTINCT X)

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

    MIN(X) = MIN(ALL X) MIN (DISTINCT X)

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

    SUM(X) = SUM(ALL X) SUM (DISTINCT X)

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

    STDDEV([DISTINCT|ALL]X)

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

    VARIANCE([DISTINCT|ALL])

    Вычисляет квадрат дисперсии

    Использование функций агрегирования позволяет вам находить суммарные значения колонок и разброс данных в колонке. Так, после выполнения запроса

    SELECT SUM(SAL)

    FROM EMPLOYEE;

    вы узнаете итоговую сумму зарплаты по организации, а из запроса

    SELECT AVG(SAL), STDDEV(SAL)

    FROM EMPLOYEE;

    - среднюю зарплату по организации и ее разброс (дисперсию).

    Однако наиболее часто требуется подобная итоговая информация не для таблицы в целом, а для определенных наборов (групп) строк таблицы.

    Для того чтобы группировать строки таблицы по какому-либо признаку, в команде SELECT существует специальное предложение GROUP BY, которое задает колонку (или колонки) для проведения группировки. Это предложение группирует строки таблицы по значениям колонок группировки с последующим подавлением дублирующих значений в колонках группировки, т.е. позволяет определять подмножество значений некоторой колонки в терминах другой колонки и применять к полученным подмножествам функции агрегирования.

    Предположим, что вы хотите найти минимальные и максимальные оклады служащих в подразделениях, тогда вы можете написать

    SELECT DEPNO, MIN(SAL), MAX(SAL)

    FROM EMPLOYEE

    GROUP BY DEPNO;

    Предложение GROUP BY должно следовать после предложения WHERE, если последнее присутствует в команде SELECT. Каждая строка результирующей таблицы относится к одной группе строк. Число групп определяется числом различных значений в колонке группировки (в данном случае DEPNO ). Агрегатные функции применяются к каждой группе как к отдельному множеству.

    Агрегатные функции можно использовать при соединении таблиц. Допустим, что вам нужно знать, сколько служащих работает на каждой должности в каждом подразделении, какова сумма зарплаты на подразделение и средняя зарплата. Тогда вам нужен запрос

    SELECT DNAME, JOB, SUM(SAL), COUNT(*), AVG(SAL)

    FROM EMPLOYEE, DEPARTAMENT

    WHERE EMPLOYEE.DEPNO=DEPARTAMENT.DEPNO

    GROUP BY DNAME, JOB;

    Функции SUM( ), COUNT( ), AVG( ) вычисляют суммы, число строк в группе и среднее значение в группе строк.

    В SQL можно задавать условия поиска для группы строк. Для этого в команде SELECT существует предложение HAVING, которое должно следовать за предложением GROUP BY. HAVING задает условие поиска для группы строк.

    Допустим, что вам необходимо получить ответ на тот же вопрос, что и в предыдущем примере, но при этом каждая группа должна состоять не менее чем из двух сотрудников.

    SELECT DNAME, JOB, SUM(SAL), AVG(SAL)

    FROM EMPLOYEE, DEPARTAMENT

    WHERE EMPLOYEE.DEPNO=DEPARTAMENT.DEPNO

    GROUP BY DNAME, JOB

    HAVING COUNT(*)>=2;

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

    Таким образом, вы познакомились с различными вариантами использования команды SQL SELECT.
      1   2   3


    написать администратору сайта