Введение в язык SQL

Интерактивная, статическая и динамическая форма SQL. Практическое использование языка запросов SQL, выборка данных из базы. Комбинированные условия поиска. Арифметические операции и функции строк символов. Создание приложений класса баз данных в Delphi.

Рубрика Программирование, компьютеры и кибернетика
Вид учебное пособие
Язык русский
Дата добавления 28.06.2009
Размер файла 427,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Кафедра `Персональные компьютеры и сети'

В.М.Баканов

Введение в язык SQL

Москва

2002

ВВЕДЕНИЕ

Язык запросов SQL был предложен корпорацией IBM в 70-х годах. Первоначально были созданы два основных продукта на основе SQL - DB2 и SQL/DS; далее на базе операционной системы 0S/2 предложена система Database Manager [1,2]. С тех пор язык SQL был принят большинством фирм, поставляющих на рынок базы данных как для персональных, так и для 'больших' (MAINFRAME) ЭВМ и стал фактическим стандартом получения информации из реляционных баз данных.

Со времени создания SQL четко обособились фактически две ветви в разработке систем для управления базами данных - на основе непроцедурного языка SQL и процедурных языков (язык dBase, Paradox, Clarion и многие другие). Фактически каждый из процедурных языков БД представляет некоторый 'надъязык' (по отношению к уровню Fortran, Pascal, С), ориентированный на обработку записей БД.

Совсем другой подход реализован в SQL - создан непроцедурный язык запросов к БД, в полной мере реализующий принцип DWIM - 'Делай то, что я имею в виду !'. При пользовании SQL пользователь на формальном языке запрашивает некоторую операцию (например, выборку из одной или более баз), а интерпретирующая SQL-система выполняет задание.

Заметим, что при пользовании процедурным языком пришлось бы (с большей или меньшей степенью детализации) описать все (возможно, очень многие) необходимые действия. Таким образом, одна фраза на SQL может быть равноценна целым страницам инструкций на языках уровня С, Pascal, Fortran и др. Однако подобные возможности языка SQL требуют значительных аппаратных ресурсов ЭВМ (соответствующей мощности процессора и многомегабайтной оперативной памяти для интерпретации и выполнения SQL-предложений); таким образом системы на основе SQL оправданы при реализации серьезных приложений (банковские системы, региональные и глобальные БД etc)

В настоящее время поддержка SQL-команд встроена в dBase, Borland Delphi / C++Builder, SQL Windows, PowerBuilder и другие системы. SQL является обычным для обеспечения работы с БД в сети InterNet - например, расширение MySQL (www.mysql.com) для языков Perl (www.perl.com, www.cpan.org) и PHP (www.php.net, www.phpclub.net), входящий в пакет Java.sql интерфейс JDBC (Java DataBase Connectivity) фирмы JavaSoft для языка Java.

Однако SQL (как и многие другие непроцедурные языки) не содержит ряда привычных программистам возможностей - таких, как использование условных выражений и организации циклов. По этим соображениям команды SQL часто встраиваются в процедурные языки программирования, например, в С/C++ и др.

Язык SQL ориентирован на операции с данными, представленными в виде логически связанной совокупности таблиц в отличие от процедурных БД-языков, ориентированных на операции с данными, представленными в виде записей.

SQL-язык естественно вошел в современную идеологию систем распределенной обработки данных типа 'клиент-сервер', где SQL-предписания генерируются приложением-клиентом и выполняются приложением-сервером (обычно использующим значительные мощности машины-сервера). При этом удается значительно уменьшить сетевой трафик (поток информации): от клиента к серверу идет небольшой поток данных в виде SQL-команд, обратный поток также невелик и состоит из логически обработанной согласно SQL-предписаниям относительно небольшой части общей БД; причем реализация хранимых процедур позволяет вообще вынести выполнение наиболее часто используемых SQL-процедур с клиента на сервер и тем самым еще более разгрузить клиент-приложение и клиент-машину.

Из реализующих подобный подход инструментальных систем следует назвать SQLBase, SQLWindows (фирма GUPTA Corp.), EasyCASE (Evergreen Tools, Inc.), PowerBuilder (PowerSoft), SyBase и InterBase, Delphi и C++Builder (Borland Int.) и другие.

Внедрение клиент-серверных технологий в бывшем СССР значительно отстало от мирового уровня еще и из-за того, что мощные современные приложения-серверы применялись в армии США, что автоматически накладывало ограничения на их использование в странах Восточного блока (это относится, например, к мощному серверу Borland InterBase).

Важной причиной использования SQL является совместимость, являющаяся следствием фактического стандарта SQL (в настоящее время существуют стандарты ANSI - Американского национального института стандартов и стандарт корпорации IBM). Конечно, не все реализации поддерживают полные возможности SQL; пожалуй, наиболее полно и последовательно стандарт SQL реализован в программном продукте корпорации ORACLE (Oracle Corporation, Belmont, California, USA) и в сервере InterBase (Borland Int).

Стандарт SQL является совместной разработкой ANSI (American National Standards Institute) и ISO (International Organization for Standardization), в 1986 году опубликовавших серию стандартов SQL/86. Первый международный стандарт языка SQL был принят в 1989 году (стандарт SQL/89) и устанавливал многие важные свойства языка как определяемые реализацией (что дало большой простор для расхождений между различными реализациями SQL, причем многие аспекты языка вообще не упоминались в SQL/89). В 1992 году принят новый стандарт языка - SQL/92, известны стандарты SQL/99 и SQL/J (расширение SQL для Java). Сказанное фактически констатирует определенное разнообразие реализации языка SQL в существующих системах.

Заметим, что язык SQL разработан для работы с реляционными базами данных (РБД) и фактически представляет собой систему управления реляционными базами данных (СУРБД).

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

Логические структуры баз данных

Логическая структура

Достоинство

Недостаток

Иерархическая модель

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

Чрезмерная громоздкость при описании данных со сложными логическими связями

Сетевая модель

Представление данных в виде произвольного графа позволяет представлять структуру данных любой сложности

Сложность реализации

Реляционная модель

Представление структур данных в виде совокупности связанных отношениями (relation) таблиц весьма наглядно и удобно для реализации обработки данных

Представление сложных структур требует большого количества связанных таблиц

Объектно-ориентирован-ная модель

Заключающийся в объединении данных и функций для их обработки в единое целое синтез особенностей сетевой и реляционной моделей и объектной технологии выгоден при создании высокоструктурированных БД

Для большинства приложений класса БД объектно-ориентированный подход неоправданно сложен

Реляционные системы берут свое начало в математической теории множеств. Они были предложены в конце 1968 года доктором Э.Ф.Коддом из фирмы IBM, который впервые осознал, что можно использовать математику для придания надежной основы и строгости в области управления базами данных.

РБД можно определить как БД, которая представляется пользователю набором связанных между собой таблиц и ничем кроме таблиц. Над таблицами определены операции - проекции, соединения и др. Говорят, что база данных представлена в первой, второй, третьей нормальной форме и нормальной форме Бойса-Кодда, если она удовлетворяет определенным требованиям [2...4]. Некоторые авторы считают, что первая нормальная форма - 1НФ (требующая, чтобы всякий столбец в любой таблице являлся 'атомным', то есть единственным, неделимым, а не списком) является предпосылкой того, что БД является реляционной. Более изощренные определения РБД можно найти, например, в книге [5].

Сам Э.Ф.Кодд в 1985 г. опубликовал 12 правил, которым должна удовлетворять любая БД, претендующая на звание реляционной. Однако можно сформулировать более простое (и тем не менее достаточно функциональное) определение РБД - 'Реляционной называется база данных, в которой все данные, доступные пользователю, организованы в виде таблиц, а все операции над данными сводятся к операциям над этими таблицами'.

С реляционной моделью данных связаны понятия ключа и индекса. Ключи предназначены для идентификации записей в таблице; простой ключ состоит из одного поля, а составной ключ - из комбинации полей (поля, по которым построен ключ, именуются ключевыми). В таблице может быть определен только один первичный ключ, который используется для ускорения выполнения запросов к БД; при выполнении запроса на поиск записи благодаря упорядочиванию значений ключа реализуется непосредственный доступ к нужной записи без (последовательного) просмотра всей таблицы.

Поле индекса строится по полям таблицы, но в отличие от ключа, индекс может допускать повторение значений составляющих его полей. Простой индекс включает одно, составной индекс - несколько полей; индексы при их создании именуются. Главное назначение индексирования - ускорение процесса поиска записей по значению одного (или нескольких) полей.

Организация связи (отношений) между таблицами (двумя или несколькими) называется связыванием или соединением таблиц; для связывания таблиц используются поля связи, которые должны быть индексированными. Связь между таблицами определяет отношение подчиненности, при котором одна таблица является главной (родительской, или мастером - Master), а вторая - подчиненной (дочерней, детальной - Detail).

Между таблицами возможны следующие виды отношений:

`один-к-одному' (записывается как `1:1');

`один-ко-многим' (записывается как `1:n');

`много-к-одному' (записывается как `n:1');

`много-ко-многим (записывается как `m:n')'.

Отношение `один-к-одному' означает, что записи главной таблицы сопоставлена одна запись в подчиненной таблице, отношение `один-ко-многим' (встречается наиболее часто) отражает факт соответствия нескольких записей подчиненной таблицы одной записи главной таблицы, отношение `много-к-одному' равносильно предыдущему при взгляде со стороны подчиненной таблицы; отношение `много-ко-многим' на практике встречается достаточно редко.

В SQL определены внешние (foreign) и родительские (parent) ключи, обеспечивающие необходимую связь между таблицами БД и поддерживающие ссылочную целостность. Вопросы использования внешних и родительских ключей для поддержания ссылочной целостности БД непросты и не рассматриваются в данном пособии, рекомендуются работы [1,2].

Принятый в настоящее время подход к проектированию БД основан на модели типа `сущность - связь' (Entity-Relationship model, ER) и был предложен в 1970-х годах Питером Ченом (Peter Chen). Существует достаточное количество программных продуктов, позволяющих (часто в графическом режиме) проектировать сложные БД (устанавливать связи между таблицами, генерировать необходимые SQL-запросы и др.); одним из известных подобных CASE-систем является, например, пакет ERwin (см. работу [7] и др.)

В последние годы появляются утверждения о недостаточной эффективности SQL при создании корпоративных распределенных информационных систем и необходимости перехода к более гибким системам типа TUXEDO System, TEKNETRON и др. [8]; однако SQL нашел свою нишу и, похоже, прижился прочно и надолго.

При практическом применении используются Windows-ориентированные системы программирования Delphi и/или C++Builder для IBM PC. Системы установлены на ПЭВМ и доступны пользователю в диалоговом режиме.

Целью работы является ознакомление на практике с возможностями применения языка SQL для реализации разнообразных запросов к БД и их (запросов) возможной оптимизации. Синтаксис SQL дан (в некоторых случаях) применительно к стандарту Oracle как наиболее полно реализующему возможности SQL; практическая работа ведется в среде систем Delphi или C++Builder.

Предполагается предварительное изучение литературы по теории и практике работы БД и знакомство с основами работы на IBM PC-совместимых ПЭВМ.

1. ИСПОЛЬЗОВАНИЕ SQL

Существуют три формы SQL: интерактивный (Interactive), статический (Static) и динамический (Dynamic). Функционируют они одинаково, но используются по-разному.

Интерактивный SQL применяется для непосредственной работы с БД - пользователь вводит SQL-оператор, он сразу же выполняется и пользователь видит результат выполнения (или код ошибки).

Статический SQL содержит SQL-операторы, жестко закодированные в теле исполняемого приложения. Наиболее распространен встроенный SQL (Embedded SQL), где SQL-код включается в исходный текст (базовой) программы, написанной на другом языке (например, С или Pascal); при использовании встроенного SQL результаты выполнения операторов SQL перенаправляются в переменные, которыми оперирует базовая программа. К настоящему времени SQL встроен в языки Ada, Cobol, Fortran, C, Pascal, PL/1, Java, Mumps (теперь M).

Динамический SQL также является частью приложения, но конкретный SQL-код генерируется во время выполнения (Run Time), а не вводится заранее.

Фактически везде ниже описывается интерактивная форма SQL - сначала приводится текст SQL-запроса, а ниже дается ответ исполняющей системы (обычно в виде таблицы).

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

SELECT - выборка строк из таблиц

CREATE - создание таблицы

INSERT - ввод строки в таблицу

1.1 Пример базы данных

Базы данных в терминологии SQL состоят из таблиц. К понятию таблицы наиболее близок аналог файла таких БД, как dBase, Clarion etc и состоит из некоторого количества строк (аналог ЗАПИСЕЙ, если пользоваться терминологией не-SQL языков); причем системы Delphi / С++Builder поддерживают множество форматов файлов таблиц, что, однако, практически никак не отражается на использование SQL. Запомним это: неважен тип СУБД - был бы реализован язык SQL.

Большинство нижеследующих примеров будет использовать DEPT - таблицу, содержащую информацию об отделах компании, и таблицу ЕМР, содержащую информацию о работниках данной компании.

Таблица DEPT

DEPTNO

(код отдела)

DNAME

(название отдела)

LOC

(место расположения)

10

ACCOUNTIG

NEW YORK

20

RESEARCH

DALLAS

30

SALES

CHICAGO

40

OPERATIONS

BOSTON

Таблица ЕМР

EMPNO

(таб.

номер)

ENAME

(имя)

JOB

(долж-ность)

MGR

HIREDATE

(дата приема на работу)

SAL

(оклад)

COMM

(комис-сион-ные)

DEPTNO

(отдел)

7369

SMITH

CLERK

7902

17-DEC-80

8,00.00

20

7499

ALLEN

SALESMAN

7698

20-FEB-81

1,600.00

300.0

30

7521

WARD

SALESMAN

7698

22-FEB-81

1,250.00

500.0

30

7566

JONES

MANAGER

7839

02-APR-81

2,975.00

20

7654

MARTIN

SALESMAN

7698

28-SEP-81

1,250.00

1,400.0

30

7698

BLAKE

MANAGER

7839

01-MAY-81

2,850.00

30

7782

CLARK

MANAGER

7839

09-JUN-81

2,450.00

10

7788

SCOTT

ANALYST

7566

09-NOV-81

3,000.00

20

7839

KING

PRESIDENT

17-NOV-81

5,000.00

10

7844

TURNER

SALESMAN

7698

08-SEP-81

1,500.00

30

7876

ADAMS

CLERK

7788

23-SEP-81

1,100.00

20

7900

JAMES

CLERK

7698

03-DEC-81

950.00

30

7902

FORD

ANALYST

7566

03-DEC-81

3,000.00

20

7934

MILLER

CLERK

7782

23-JAN-82

1,300.00

10

Каждая таблица состоит из колонок (вертикальных) и строк (горизонтальных). Таблица DEPT имеет три колонки (называемые DEPTNO, DNAME и LOC) и 4 строки (одна для каждого отдела номер 10,20,30,40).

Строка состоит из полей. Каждое поле содержит значение данных на пересечении строки и колонки. Например, в первой строке таблицы DEPT значение 10 хранится в поле DEPTNO, значение ACCOUNTING хранится в поле DNAME, значение NEW YORK - в поле LOC.

Легко заметить, что все таблицы примера (как и все таблицы любой реляционной базы данных) состоят из строки заголовков столбцов и одной или более строк значений данных под этими заголовками. Эти столбцы и строки должны обладать следующими свойствами:

всякий столбец таблицы обладает в этой таблице уникальным именем;

столбцы таблицы упорядочиваются слева направо, т.е. столбец 1, столбец 2, ... столбец n. C точки зрения пользователя порядок, в котором определены имена столбцов, становится порядком, в котором должны вводиться в них данные, если не предварять при вводе каждое значение именем соответствующего столбца;

строки таблицы не упорядочены (их последовательность определяется лишь последовательностью ввода в таблицу);

в поле на пересечении строки и столбца любой таблицы всегда имеется в точности одно значение данных и никогда не должно быть множества значений (правда, это 'атомарное' значение может быть достаточно объемным, например, таким, как рецепт некоего блюда или много мегабайтный мультимедиа-файл);

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

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

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

База данных, состоящая из таких таблиц, называется реляционной. Отношение (RELATION) - является математическим термином для обозначения неупорядоченной совокупности однотипных записей или таблиц определенного специфического вида, описанного выше. Таким образом, можно, например, сказать, что определенная база данных состоит минимум из стольких отношений, сколько отдельных таблиц она включает.

Нечеткость многих терминов, используемых в сфере обработки данных, заставила Э.Ф.Кодда отказаться от них и предложить новые или дать более точные определения существующим. Так, он не мог использовать широко распространенный термин 'ЗАПИСЬ', который в различных ситуациях может означать экземпляр записи, либо тип записей, запись в стиле Кобола (которая допускает повторяющиеся группы) или плоскую запись (которая их не допускает), логическую запись или физическую, запись, хранимую запись или виртуальную запись и т.д. Вместо этого он использовал термин 'кортеж длины N' или просто 'кортеж', которому дал точное определение.

В основополагающих работах [4,5] можно подробно познакомиться с терминологией реляционных баз данных (есть русскоязычные переводы), здесь же будем использовать неформальные их эквиваленты:

Заметим также, по определению принимается, что 'запись' означает 'экземпляр записи', а 'поле' означает 'имя и тип поля'.

Контрольные вопросы

Какие основные логические структуры БД применяются в настоящее время?

Что такое реляционная БД?

Что такое таблица реляционной БД и из чего состоит таблица?

Какие типы отношений возможны между таблицами?

В чем заключается универсальность языка SQL перед специализированными языками работы с БД?

Каковы основные свойства строк и столбцов реляционной БД?

Чем отличаются интерактивная, статическая и динамическая форма применения языка SQL?

Какие основные действия над таблицами определены в языке SQL?

1.2 Выбор данных из таблиц. Команда SELECT

Выборка данных из БД является наиболее распространенной операцией SQL. Обращение к базе данных называется запросом и для его реализации необходимо использовать команду SELECT. Базовая команда (предписание) SELECT состоит из двух частей, носящих названия клауз (clause):

SELECT некоторые данные (имя (имена) колонки)

FROM таблица или некоторые таблицы (имя (имена) таблицы) ;

Клауза SELECT всегда вводится первой, а за ней следует клауза FROM. Вывод запрошенной информации в данном случае (спецификация вывода не определена) осуществляется на экран дисплея.

Рассмотрим выборку данных в таблицах DEPT и ЕМР, используя некоторые простые запросы SQL.

Простейший пример - вывести все строки и колонки таблицы DEPT. Команды SQL, обеспечивающие этот запросы, следующие (строки после последовательности дефисов являются комментарием, не входят в исходный текст и не должны вводиться в диалоге):

SELECT DEPTNO,DNAME,LOC --- вводит пользователь !

FROM DEPT; ---то же...

DEPTNO

DNAME

LOC

10

ACCOUNTIG

NEW YORK

20

RESEARCH

DALLAS

30

SALES

CHICAGO

40

OPERATIONS

BOSTON

SELECT-запрос возвращает значение (в отличие от других, описанных ниже, SQL-предписаний). Обычно SQL-запрос возвращает множество строк (в частном случае ни одной), причем указатель (обычно реализованный в виде стрелки или цветовой подсветки определенной строки) в каждый момент указывает на одну из них.

В вышеприведенном примере запроса были перечислены имена всех колонок таблицы DEPT (а именно DEPTNO, DNAME, LOC) в клаузе SELECT. Обычно при задании всех колонок можно использовать звездочку (*) как сокращение списка имен:

SELECT *

FROM EMP; --- конец команды

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7369

SMITH

CLERK

7902

17-DEC-80

8,00.00

20

7499

ALLEN

SALESMAN

7698

20-FEB-81

1,600.00

300.00

30

7521

WARD

SALESMAN

7698

22-FEB-81

1,250.00

500.00

30

7566

JONES

MANAGER

7839

02-APR-81

2,975.00

20

7654

MARTIN

SALESMAN

7698

28-SEP-81

1,250.00

1,400.00

30

7698

BLAKE

MANAGER

7839

01-MAY-81

2,850.00

30

7782

CLARK

MANAGER

7839

09-JUN-81

2,450.00

10

7788

SCOTT

ANALYST

7566

09-NOV-81

3,000.00

20

7839

KING

PRESIDENT

17-NOV-81

5,000.00

10

7844

TURNER

SALESMAN

7698

08-SEP-81

1,500.00

30

7876

ADAMS

CLERK

7788

23-SEP-81

1,100.00

20

7900

JAMES

CLERK

7698

03-DEC-81

950.00

30

7902

FORD

ANALYST

7566

03-DEC-81

3,000.00

20

7934

MILLER

CLERK

7782

23-JAN-82

1,300.00

10

Для удобства восприятия текста часто разделяют большинство команд SQL на несколько строк и печатают их большими буквами для простоты чтения. Однако, при желании, можно набирать команды и в одной строке большими или маленькими буквами. Конец отдельной команды SQL идентифицируется точкой с запятой. Когда интерпретирующая SQL система обнаружит ее, он запустит команду на исполнение (интерпретацию). В некоторых системах (в том числе Delphi / C++Builder) точка с запятой необязательна.

SELECT-запрос возвращает некоторое множество (возможно, пустое) строк, именуемое курсором. Возникает естественный вопрос - кто 'принимает' это значение (с целью последующей обработки) в прикладной программе?

Для связи SQL с пользовательской программой (написанной на конкретном языке программирования) используется клауза INTO:

SELECT некоторые данные (имя (имена) колонки)

INTO куда копировать возвращаемые SELECT'ом данные

FROM таблица или некоторые таблицы (имя (имена) таблицы) ;

Часто используемая клауза FETCH используется для выборки первой записи курсора, присвоения значений столбцов этой записи переменным, перечисленным в клаузе INTO, и перемещения указателя на следующую строку курсора. Таким образом, последовательно применяя FETCH, можно запомнить значение любой записи из возвращенных по запросу. Во многих системах программирования имеются `родные' функции, по функциональности аналогичные FETCH.

Кроме того, в реальной исполняющей системе каждое SQL-предписание возвращает код окончания операции (в переменной SQLCODE, для Fortran'а - SQLCOD); причем нулевое значение этой системной переменной информирует о успешности выполнения SQL-предписания, положительное - о возникновении некоторой исключительной ситуации, отрицательное - о невозможности выполнения запроса. В стандарте SQL/92 введена (предпочтительная) строковая переменная SQLSTATE, для Fortran'а - SQLSTA) из 5-ти символов, причем первые 2 символа - дают общую информацию (class) об ошибке, следующие 3 символа (subclass) уточняют описание.

Контрольные вопросы

Какие клаузы используются при составлении команды SELECT выбора данных из таблицы?

Возвращает ли предписание SELECT значение в вызывающую программу?

Каким образом можно проанализировать возвращаемое SQL-предписанием значение и проверить успешность выполнения команды?

Что такое курсор в понятиях языка SQL?

Каким образом записываются комментарии в предписаниях SQL?

1.3 Создание и уничтожение таблиц

Команда CREATE TABLE

Перед тем как выбрать данные из базы данных, их нужно в нее ввести, а перед этим нужно создать таблицу, в которой эти данные будут храниться. Ниже приведен пример команды SQL для создания таблицы DEPT :

CREATE TABLE DEPT

(DEPTNO

NUMBER (2),

DNAME

CHAR (14),

LOC

CHAR (13));

В команде CREATE TABLE сначала сообщается, как назвать таблицу (DEPT). Далее задаются имена колонок (полей) таблицы (DEPTNO, DNAME, LOC) и тип данных, которые каждая колонка содержит. В создании данной таблицы, например, определяется, что колонка DEPTNO содержит только цифровые данные (NUMBER), а колонки DNAME и LOC любые символьные данные (CHAR) - буквы, числа или знаки пунктуации. Наконец, следует задать максимальную длину любого значения, которое можно хранить в колонках. Например, в команде CREATE TABLE, приведенной выше, задано, что длина имени места расположения (LOC) не должна быть длиннее 13 символов.

Для создания таблицы ЕМР требуется следующая инструкция SQL:

CREATE TABLE EMP

(EMPNO

NUMBER (4) NOT NULL,

ENAME

CHAR (10),

JOB

CHAR (9),

MGR

NUMBER(4),

HIREDATE

DATE, --- тип DATE

SAL

NUMBER(7,2),

COMM

NUMBER(7,2),

DEPTNO

NUMBER(2));

Таблица создается как файл с заданным конструкцией CREATE TABLE именем и расширением, определяемым текущей программной средой (например, файлы таблиц в формате dBase имеют расширение DBF, в формате Paradox - DB). Имя файла ключа состоит из имени ключа и фиксированного расширения (например, MDX для формата dBase). В то же время мощные СУБД хранят все таблицы в одном файле, имя которого совпадает с именем базы данных (расширение ORA для ORACLE или GDB для InterBase).

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

В данной команде CREATE TABLE определена колонка EMPNO таблицы ЕМР как непустая (квалификатор NOT NULL). Это значит, что каждая строка таблицы ЕМР должна содержать значение в поле EMPNO (исполняющая система не позволит ввести строку без этого значения). Другими словами, отсутствующие значения (называемые пустыми) НЕ допускаются в этой колонке.

Спецификация SQL-языка NOT NULL является одним из простейших примеров того, как исполняющая система проверяет значения данных при их вводе в базу данных, чтобы убедиться, что они соответствуют заданным условиям целостности. Далее будет пояснено, как потребовать уникальности значений в колонке. Спецификация UNIQUE будет автоматически запрещать ввод строки со значением, которое уже имеется в БД.

Колонка под названием HIREDATE определена для хранения дат. В некоторых системах дата (и время) хранится в длинном целом.

Колонки оклад (SAL) и комиссионные (COMM) определены как цифровые данные (NUMBER) с максимальной длиной в 7 цифр, две из которых находятся справа от десятичной точки.

Инструкция CREATE также используется для создания индексов таблиц. Несмотря на то, что ANSI-стандарт в настоящее время практически не поддерживает средства индексирования, они весьма полезны и широко используются на практике; подробнее об индексации таблиц см. работу [1].

Уничтожение таблиц

Для уничтожения таблицы служит предписание DROP, две нижеследующие команды уничтожают таблицы EMP и DEPT:

DROP TABLE EMP;

DROP TABLE DEPT;

Инструкция DROP также применяется для уничтожения индексов таблицы.

Контрольные вопросы

Какое SQL-предписание используется для создания таблиц и их индекирования?

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

Как располагаются таблицы БД в реальных файлах?

Что такое алиас и каким путем он определяется?

Каким образом определяется обязательность наличия и уникальность данных в строках таблицы?

Какие предписания применяются для определения системных данных (например, типа `дата')?

Каков формат SQL-команд для уничтожения таблиц и индексов таблиц?

1.4 Введение строк в таблицу

Для введения строк в таблицу служит SQL-предписание INSERT, именно так заполняются таблицы:

INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');

INSERT INTO DEPT VALUES (20, RESEARCH', `DALLAS');

INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');

INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');

Эти четыре инструкции SQL как раз и заполняют приведенную выше таблицу DEPT.

Контрольные вопросы

Каков формат SQL-предписания для внесения данных в таблицу?

Каким путем определяется, что внесенные в таблицу данные являются строковыми?

1.5.Выбор заданных колонок и строк из таблиц

Выбор конкретной колонки

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

SELECT DNAME, DEPTNO

FROM DEPT;

DNAME

DEPTNO

ACCOUNTIG

10

RESEARCH

20

SALES

30

OPERATIONS

40

Результат этого запроса - сама таблица, состоящая из колонок и строк. Порядок, в котором перечислены колонки в клаузе SELECT, управляет порядком колонок в полученной таблице. Если задать SELECT *, то последовательность появления колонок соответствует исходной.

Выбор заданных строк

Из последнего примера видно, как клауза SELECT позволяет выбрать из таблицы заданные колонки. Но для выбора заданных строк нужно ввести в команду SELECT клаузу WHERE:

SELECT *

FROM EMP

WHERE DEPTNO = 30; --- пример клаузы WHERE

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7499

ALLEN

SALESMAN

7698

20-FEB-81

1,600.00

300.00

30

7521

WARD

SALESMAN

7698

22-FEB-81

1,250.00

500.00

30

7654

MARTIN

SALESMAN

7698

28-SEP-81

1,250.00

1,400.00

30

7698

BLAKE

MANAGER

7839

01-MAY-81

2,850.00

30

7844

TURNER

SALESMAN

7698

08-SEP-81

1,500.00

30

7900

JAMES

CLERK

7698

03-DEC-81

950.00

30

Клауза WHERE заставляет искать данные в таблице и выводить только те строки, которые удовлетворяют условиям поиска. В примере выше будут возвращены только те строки, где номер отдела работника был равен 30 (WHERE DEPTNO = 30).

Сложные (комбинированные) условия поиска

Иногда необходимо задать несколько условий поиска в клаузе WHERE. Предположим, например, что необходимо иметь список менеджеров компании с окладом более 2800 долларов:

SELECT ENAME,JOB,SAL

FROM EMP

WHERE JOB = 'MANAGER'

AND SAL > 2800; --- логическая связка AND

ENAME

JOB

SAL

JONES

MANAGER

2,975.00

BLAKE

MANAGER

2,850.00

Несколько условий поиска объединены здесь словом ключевым AND (И) (JOB='MANAGER' AND SAL>2800). Соединитель AND означает, что данные должны удовлетворять обоим перечисленным условиям поиска. Можно соединять по AND любое число условий.

Альтернативные условия поиска

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

SELECT ENAME, JOB,SAL

FROM EMP

WHERE JOB = 'MANAGER'

OR SAL > 2800; --- логическая связка OR

ENAME

JOB

SAL

JONES

MANAGER

2,975.00

BLAKE

MANAGER

2,850.00

SCOTT

ANALYST

3,000.00

KING

PRESIDENT

5,000.00

FORD

ANALYST

3,000.00

В этом примере соединяются условия поиска словом OR (ИЛИ) (JOB='MANAGER' OR SAL > 2800). Логическая связка OR значит, что если данные удовлетворяют одному из нескольких условий, то они будут выбраны.

Отрицательные условия поиска

Можно выбирать строки, не удовлетворяющие данному условию. Например, несложно выбрать всех менеджеров, которые не работают в отделе 30:

SELECT ENAME,JOB,DEPTNO

FROM EMP

WHERE JOB = 'MANAGER'

AND DEPTNO != 30; --- пример НЕ РАВНО

ENAME

JOB

DEPTNO

JONES

MANAGER

20

CLARK

MANAGER

10

Можно комбинировать AND, OR и NOT в одном запросе, чтобы выбрать нужную информацию; для достижения нужного результата следует применять скобки.

Поиск в диапазоне

Оператор BETWEEN позволяет выбирать строки в заданном диапазоне (включая границы оного).

Например, перечислим всех работников, оклад которых находится между 1200 и 1400 долларами:

SELECT ENAME,SAL

FROM EMP

WHERE SAL BETWEEN 1200 AND 1400;

ENAME

SAL

WARD

1,250.00

MARTIN

1,250.00

MILLER

1,300.00

Поиск значений в списке

Предписание IN дает возможность выбрать строки, содержащие заданные значения. Перечислим все отделы, номера которых 10 или 30:

SELECT *

FROM DEPT

WHERE DEPTNO IN (10,30); --- только 10 или 30

DEPTNO

DNAME

LOC

10

ACCOUNTIG

NEW YORK

30

SALES

CHICAGO

Отметим, что следует заключить список значений в скобки - (10,30). Для этого запроса возможно было применить логическую связку OR для получения того же самого результата (WHERE DEPTNO=10 OR DEPTNO=30).

Последовательности сопоставления символов

Можно также выбрать строки, соответствующие образцу символов или цифр, который задается после клаузы LIKE. Например, перечислим всех работников, имеющих в имени символ `R' в третьей от начала позиции:

SELECT ENAME

FROM EMP

WHERE ENAME LIKE `__R%';

ENAME

WARD

MARTIN

TURNER

FORD

В это примере используется оператор LIKE для указания выбрать все строки из таблицы EMP, в которых третий символ в фамилии работника суть R, то есть соответствует (LIKE) образцу, который задан как (__R%). Каждый символ подчеркивания (а их два) говорит об одной позиции любого символа, а знак процента (%) задает любую строку без символов или с любым их количеством.

В некоторых вариантах SQL (например, в давно применяющемся в армии США сервере Borland InterBase) присутствует (нестандартная) клауза STARTING (позволяет выбрать строку, начинающуюся с заданного набора символов); некоторые авторы издевательски сопоставляют введение вышеописанной клаузы с 'определенной степенью тугодумия военных', трудно воспринимающих традиционный синтаксис клаузы LIKE выборки по образцу.

Операторы сравнения BETWEEN, IN и LIKE можно предварять словом NOT (HE) и соединять с AND и OR для формирования сложных клауз WHERE, предназначенных для выбора нужных строк.

Контрольные вопросы

Опишите формат SQL-предписания выбора конкретных колонок таблицы.

Каким образом SQL позволяет осуществить выбор строк таблицы, удовлетворяющим заданным условиям?

С помощью каких приемов осуществляются альтернативные условия поиска в таблице?

Каковы символы сравнения по образцу в клаузе LIKE языка SQL?

1.6Упорядочение строк по запросу

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

SELECT SAL,JOB,ENAME

FROM EMP

WHERE DEPTNO = 30

ORDER BY SAL; --- пример клаузы ORDER BY

SAL

JOB

ENAME

950.00

CLERK

JAMES

1,250.00

SALESMAN

WARD

1,250.00

SALESMAN

MARTIN

1,500.00

SALESMAN

TURNER

1,600.00

SALESMAN

ALLEN

2,850.0

MANAGER

BLAKE

Клауза ORDER BY ведет сортировку строк по увеличивающемуся (меньший оклад сначала) порядку. Но упорядочение не ограничивается только одной последовательностью в одной колонке. Например, несложно перечислить всех работников по порядку работы и внутри него (порядка работы) по окладу:

SELECT JOB,SAL,ENAME

FROM EMP

ORDER BY JOB, SAL DESC; --- в порядке уменьшения SAL

Данные в колонке JOB упорядочены в алфавитном порядке увеличения (это порядок по умолчанию для колонки CHAR) и работники в каждой группе упорядочены по окладам в порядке уменьшения (SAL DESC).

Контрольные вопросы

В каких случаях используется упорядочение выводимых строк?

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

Влияет ли порядок физического расположения строк и колонок в таблице на результат упорядочения их по запросу?

1.7 Предохранение от выбора строк-дубликатов

Предполагается, что стоит задача получения списка различных должностей в таблице EMP:

SELECT JOB

FROM EMP;

Поскольку в вышеприведенном запросе нет клаузы WHERE, будут возвращены все значения в колонке JOB таблице EMP. Как видно, имеются дублирующие строки в колонке (это значит, что много работников имеют одну должность). Эти дублирующие значения можно исключить, задавая в клаузе SELECT слово DISTINCT. Ключевое слово DISTINCT используется в следующем запросе:

SELECT DISTINCT JOB --- ключевое слово DISTINCT

FROM EMP;

Хотя в исходной таблице имеется 14 (частично повторяющихся) должностей, в распечатке их только 5 уникальных.

Контрольные вопросы

В каких случаях целесообразно применять режим предохранения от выбора строк-дубликатов?

Какая SQL-клауза задает режим запрета вывода строк-дубликатов?

1.8Запросы к нескольким таблицам

Запрос типа JOIN

До сих пор все примеры относились к работе с одной таблицей (ЕМР или DEPT). Запрос типа JOIN (соединение) позволяет выбирать данные из двух или более таблиц и объединять выбранные данные в одной общей таблице.

Предположим, что необходимо узнать, где работает работник по фамилии ALLEN. Просматривая две таблицы в БД, можно видеть, что таблица ЕМР не содержит колонку LOC (местоположение), а эта колонка находится в таблице DEPT. Однако обе таблицы имеют колонку DEPTNO - номер отдела. Именно эти номера, содержащиеся в обеих таблицах, позволят соотнести строки из таблицы ЕМР со строками таблицы DEPT.

Запрашивая таблицу ЕМР, можно найти номер отдела, где работает ALLEN:

SELECT ENAME,DEPTNO

FROM ЕМР

WHERE ENAME = 'ALLEN';

ENAME

DEPTNO

ALLEN

30

И, далее, запрашивая таблицу DEPT, можно найти расположение отдела 30:

SELECT LOC

FROM DEPT

WHERE DEPTNO = 30;

LOC

CHICAGO

В результате использования этих двух запросов выяснилось, что ALLEN работает в Чикаго.

Можно получить тот же самый результат, используя только один запрос типа JOIN. В этом запросе перечисляются названия таблиц, которые запрашиваются в клаузе FROM и имена колонок, сравниваемых в обеих таблицах (то есть общие колонки) в клаузе WHERE:

SELECT ENAME,LOC

FROM ЕМР,DEPT --- запрос к двум таблицам

WHERE ENAME = 'ALLEN'

AND EMP.DEPTNO = DEPT.DEPTNO; --- условие соединения

ENAME

LOC

ALLEN

CHICAGO

Выражения EMP.DEPTNO и DEPT.DEPTNO позволяют обратиться к заданному столбцу (имя правее точки) нужной таблицы (левее точки).

Условия соединения в клаузе WHERE определяет взаимосвязь между таблицами ЕМР и DEPT. В вышеприведенном примере, например, если DEPTNO в строке таблицы ЕМР совпадает с DEPTNO в строке таблицы DEPT (EMP.DEPTNO=DEPT.DEPTNO); в этом случае говорят, что вышеуказанные таблицы связаны по столбцу DEPTNO (на нижерасположенном рисунке показано стрелкой, подобные обозначения часто используют при логическом проектировании БД):

Соединение данных

Вдобавок к условиям соединения, клауза WHERE содержит условие поиска ENAME='ALLEN', которое требует выбора только строки с работником по имени ALLEN. Таким образом соединяется только эта строка из таблицы ЕМР (в которой содержится значение 30 в поле DEPTNO), со строкой из таблицы DEPT, в которой тоже содержится тот же номер 30.

Можно соединять отдельные строки (как в последнем примере), части таблиц или таблицы целиком. Например, для перечисления названий отделов (информация, содержащаяся только в таблице DEPT) вместе с другими данными о работниках соединим строки из таблицы ЕМР с таблицей DEPT и дополнительно упорядочим результат:

SELECT DNAME,ENAME,JOB,SAL (*)

FROM EMP,DEPT

WHERE EMP.DEPTNO = DEPT.DEPTNO

ORDER BY DNAME, SAL DESC;

DNAME

ENAME

JOB

SAL

ACCOUNTIG

KING

PRESIDENT

5,000.00

ACCOUNTIG

CLARK

MANAGER

2,460.00

ACCOUNTIG

MILLER

CLERC

1,300.00

RESEARCH

SCOTT

ANALYST

3,000.00

RESEARCH

FORD

ANALYST

3,000.00

RESEARCH

JONES

MANAGER

2,976.00

RESEARCH

ADAMS

CLERC

1,100.00

RESEARCH

SMITH

CLERC

800.00

SALES

BLAKE

MANAGER

2,850.00

SALES

ALLEN

SALESMAN

1,600.00

SALES

TURNER

SALESMAN

1,500.00

SALES

WARD

SALESMAN

1,250.00

SALES

MARTIN

CLERC

950.00

Даже этот простой пример дает понятие о мощности языка SQL. При программировании с помощью процедурных языков процедура соединения всего двух таблиц требует составления и отладки достаточно сложной программы (содержащей минимум один вложенный в другой цикл по записям таблиц), которую к тому же непросто сделать эффективной в работе. Требуемая программа становится значительно более сложной и громоздкой при увеличении количества соединяемых таблиц, время выполнения ее возрастает экспоненциально. В очередной раз подчеркнем, что при использовании SQL пользователь сообщает, ЧТО он хочет получить, а не КАК это сделать.

Иерархические и сетевые системы управления базами данных хранят некоторую информацию типа значений и другого типа - указателей. В сетевых системах, например, информация о том, что работник SMITH занимает должность CLERK, хранится как значение в некоем поле. Информация, что SMITH работает в отделе 20, будет храниться как указатель из записи SMITH на запись отдела 20. Только информация, хранимая в виде указателей, может быть использована для сопоставления одной записи другой в сетевой или иерархической базе данных. Решение, хранить ли информацию в виде указателей или значений, должно быть сделано при определении базы данных. Таким образом, сетевая или иерархическая система имеет соотношения, основанные на указателях, и предопределена как статическая; изменение связей потребует перестройки всего файла.

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

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

Контрольные вопросы

Каков формат SELECT-предписания для выполнения запроса данных из нескольких таблиц одновременно?

Каким образом запрос типа JOINT позволяет выбирать данные из нескольких таблиц и объединять их при выводе?

Каким образом при логическом проектировании БД показывают связь таблиц по заданному столбцу (столбцам)?

Постарайтесь составить (на языке уровня Pascal или C) программу, функционально аналогичную вышеприведенному SQL-запросу (*). Насколько проще сформулировать эту задачу с использование SQL?

1.9 Арифметические операции и функции строк символов

В то время как SQL фирмы IBM поддерживал всего 4 базовых арифметических операций (+, -, *, /), современный SQL поддерживает полный набор арифметических функций и функций манипулирования строками.

Арифметические выражения

Для создания арифметического выражения достаточно соединить имена колонок и численные константы арифметическими операторами.

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

SELECT ENAME,SAL,COMM,SAL+COMM --- вычисление суммы

FROM EMP

WHERE JOB = 'SALESMAN';

ENAME

SAL

COMM

SAL+COMM

ALLEN

1,600.0

300.00

1,900.00

WARD

1,250.0

500.00

1,750.00

MARTIN

1,260.00

1,400.00

2,660.00

TURNER

1,500.0

0.00

1,500.00

Отметим, что арифметическое выражение (SAL+COMM) выводится как новая колонка в результирующей таблице. Хотя такая колонка, как SAL+COMM, не присутствует в базе данных, она материализовалась как результат запроса, при этом можно работать с ней как с реальной колонкой.

Примеры дополнительных арифметических операторов перечислены ниже.

Функции символьных строк

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

SELECT ENAME

FROM EMP

WHERE SOUNDEX(ENAME) = SOUNDEX('SCHMIDT');

ENAME

SMITH

Поддерживаются следующие арифметические операции, функции и функции символьных строк:

Это только часть полного списка арифметических и строковых функций. Смотрите следующие разделы данного учебного пособия для обсуждения групповых функций AVG, SUM,COUNT, MIN, MAX и работы [1...3].

Контрольные вопросы

Каким образом осуществляется вывод (несуществующей в таблице) колонки, являющейся арифметическим выражением над колонками данной таблицы?

В каких случаях, на Ваш взгляд, оправдано применение функции SOUNDEX?

Перечислите базовые арифметические операции и функции, используемые SQL? Какими функциями Вы желали бы дополнить имеющийся набор?

1.10 Вычисление функций групп строк

Групповые функции - это еще один показатель мощности SQL. Эти функции позволяют выбирать суммарную информацию из групп строк.

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

SELECT DEPTNO,MAX(SAL)

FROM EMP

GROUP BY DEPTNO;

DEPTNO

MAX(SAL)

10

5,000.00

20

3,000.00

30

2,850.00

Клауза GROUP BY

В запросе GROUP BY каждая строка запроса представляет группу строк, хранимых в таблице. Имя колонки, которую назвали в клаузе GROUP BY (в данном примере DEPTNO) - это то, что нужно сгруппировать или выделить в категорию по строкам таблицы. В вышеприведенном примере каждая строка таблицы EMP была помещена в одну их трех групп, отличающихся номерами отделов - значениями поля DEPTNO, так что после того, как все строки в EMP обработаны, все строки в группе имеют один номер отдела. В этот момент выполняются групповые функции, которые были запрошены функцией MAX(SAL) над каждой группой строк и возвращаются вычисленные результаты.

Так же как с применением ORDER BY, возможно группировать любое количество колонок в единственном запросе.

Для примера скомбинируем использование групповых функций с запросом типа JOIN. Сгруппируем по двум колонкам (GROUP BY DNAME, JOB) и применим три новых функции: SUM - сложить значения выбранных полей, попавших в группу, заданную клаузой GROUP BY; COUNT(*) - подсчитать число строк, попавших в каждую группу и AVG - найти среднее арифметическое значение выбранных колонок в группе.

Целью при этом запросе является следующее узнать: сколько работников работает на каждой должности в каждом отделе; например, сколько клерков в исследовательской группе, какова сумма окладов и средний оклад:

SELECT DNAME,JOB,SUM(SAL), --- функция SUM (**)

COUNT(*), --- функция COUNT(*)

AVG(SAL) --- функция AVG

FROM EMP,DEPT

WHERE EMP.DEPTNO = DEPT.DEPTNO

GROUP BY DNAME, JOB;

DNAME

JOB

SUM(SАL)

COUNT(*)

АVG(SAL)

ACCOUNTING

CLERC

1,800.00

1

1,300.00

ACCOUNTING

MANAGER

2,450.00

1

2,450.00

ACCOUNTING

PRESIDENT

5,000.00

1

5,000.00

RESEARCH

ANALYST

6,000,00

2

3,000.00

RESEARCH

CLERC

1,900.00

2

950.00

RESEARCH

MANAGER

2,975.00

1

2,975.00

SALES

CLERC

950.00

1

950.00

SALES

MANAGER

2,850.00

1

2,850.00

SALES

SALESMAN

5,600.00

4

1,400.00

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

Напротив, непроцедурный подход SQL позволяет создавать такие отчеты, как предыдущий, при помощи указания исполняющей системе только того, ЧТО необходимо сделать: исполняющая система автоматически генерирует процедуру, определяя КАКИМ ОБРАЗОМ извлечь данные таблиц.

Клауза HAVING

Ранее были определены условия поиска для индивидуальных строк при помощи клаузы WHERE; теперь можно использовать клаузу HAVING для задания условий поиска групп строк. Предположим, что необходимо получить ответ на запрос, подобный предыдущему, но при условии, что каждая группа, выводимая по запросу, должна содержать не менее двух работников:

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

FROM EMP,DEPT

WHERE EMP.DEPTNO = DEPT.DEPTNO

GROUP BY DNAME,JOB

HAVING COUNT(*) >= 2; --- клауза HAVING

DNAME

JOB

SUM(SAL)

COUNT(*)

АVG(SL)

RESEARCH

ANALYST

6,000.00

2

3,000.00

RESEARCH

CLERC

1,900.00

2

950.00

SALES

SALESMAN

5,600.00

4

1,400.00

Условие поиска в клаузе HAVING исключает из результата запроса группы, содержащих менее двух работников - COUNT(*)>=2.

Контрольные вопросы

Что такое групповые запросы к БД?

Каков формат SQL-запроса с клаузами GROUP BY и HAVING?

Напишите (на языке уровня Pascal или C) программы, функционально аналогичные вышеприведенным SQL-запросам (**) и (***).

1.11Подзапросы

Одна из причин, по которым SQL столь мощен и универсален, состоит в том, что всегда можно построить сложные запросы из нескольких простых. Клауза WHERE из одного запроса может содержать другой запрос, который называется подзапросом. Можно использовать подзапросы для динамического построения условий поиска для требуемого главного запроса.

Предположим, что нужно составить список всех работников с такой же работой как у работника JONES:

SELECT ENAME,JOB --- главный запрос

FROM EMP

WHERE JOB =

(SELECT JOB --- подзапрос

FROM EMP

WHERE ENAME = `JONES');

ENAME

JOB

JONES

MАNАGER

BLAKE

MАNАGER

CLARK

MАNАGER

Исполняющая система обрабатывает подзапрос перед обработкой главного запроса, поскольку его результат нужен для определения результата главного запроса. Вторая команда SELECT в данном примере (а это именно подзапрос) возвращает значение MANAGER, как легко убедиться, если взглянуть на должность работника JONES в таблице EMP.


Подобные документы

  • Изучение основных принципов разработки приложений баз данных в среде Delphi. Создание таблиц, псевдонима и вычисляемых полей базы данных. Особенности организации поиска и фильтрации. Сортировка данных в таблицах. Построение запросов. Генерация отчетов.

    курсовая работа [1,3 M], добавлен 05.02.2017

  • Программа поиска в базе данных в среде Borland Delphi 7.0 Enterprise. Условия и блок-схемы задач. Ввод массива. Текст программ в Delphi, в Паскаль. Текст программы поиска в базе данных. Кодирование материала. Изготовление реляционной базы данных.

    практическая работа [27,6 K], добавлен 11.10.2008

  • Создание таблиц базы данных с помощью MS Access "Страны Азии". Форма базы данных и запросы к выборкам данных. Модификация структуры таблиц, создания связей между главными таблицами, редактирование данных и проектирование форм для реальной базы данных.

    контрольная работа [723,9 K], добавлен 25.11.2012

  • Создание и использование динамически загружаемых библиотек в Delphi. Преимущества использования, создание простейшей DLL. Статическая и динамическая загрузка DLL, обмен данными с ней. Создание программы, работающей с базой данных клиентов кардиоцентра.

    курсовая работа [425,2 K], добавлен 07.07.2012

  • Использование баз данных менеджерами автосалонов для повышения качества и скорости обслуживания клиентов. Создание запросов на добавление, удаление, обновление данных. Запросы перекрестный, на выборку. Кнопочная форма базы данных с практичным интерфейсом.

    курсовая работа [1,6 M], добавлен 10.02.2014

  • Построение банков данных. Инструментальные средства баз данных Borland. Принцип работы и архитектура баз данных в Delphi. Навигационный способ доступа к базам данных: операции с таблицей, сортировка и перемещение по набору данных, фильтрация записей.

    курсовая работа [642,7 K], добавлен 06.02.2014

  • Типы данных языка SQL, определенные стандартом ISO. Средства поддержки целостности данных. Введение ограничений для доменов. Разработка рабочего проекта для автосалона. Построение информационной схемы базы. Создание форм для занесения данных в таблицы.

    курсовая работа [2,5 M], добавлен 29.01.2012

  • Разработка информационной и инфологической модели базы данных на тему "Командировка". Выбор модели данных и составление ее концептуальной схемы. Получение доступа к БД средствами Delphi, разработка пользовательского интерфейса. Реализация SQL-запросов.

    реферат [1,2 M], добавлен 16.06.2009

  • Работа с хранящейся в базах данных информацией. Язык описания данных и язык манипулирования данными. Распространение стандартизованных языков. Структурированный язык запросов SQL. Язык запросов по образцу QBE. Применение основных операторов языка.

    презентация [76,2 K], добавлен 14.10.2013

  • Структура таблицы и типы данных. Ввод данных в ячейки таблицы. Создание запросов на выборку, удаление, обновление и добавление записей, на создание таблицы. Основное различие между отчетами и формами, их назначение. Создание отчетов для базы данных.

    курсовая работа [1,9 M], добавлен 17.06.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.