Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технология проектирования и администрирования баз данных и систем данных-Конспект3

.pdf
Скачиваний:
33
Добавлен:
20.03.2016
Размер:
1.05 Mб
Скачать

- 11 -

Обычно при задании всех колонок можно использовать звездочку (*) как сокращение списка имен:

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, можно

- 12 -

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

системах программирования имеются ‘родные’

функции, по

функциональности аналогичные FETCH.

 

Кроме того, в реальной исполняющей системе каждое SQL-предписание возвращает код окончания операции (в переменной SQLCODE, для Fortran’а - SQLCOD); причем нулевое значение этой системной переменной информирует о успешности выполнения SQL-предписания, положительное -

о возникновении некоторой исключительной

ситуации,

отрицательное -

о невозможности выполнения запроса. В

стандарте

SQL/92 введена

(предпочтительная) строковая переменная SQLSTATE, для Fortran’а - SQLSTA) из 5-ти символов, причем первые 2 символа - дают общую информацию (class) об ошибке, следующие 3 символа (subclass) уточняют описание.

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

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

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

?

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

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

5.Каким образом записываются комментарии в предписаниях 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) - буквы, числа или знаки пунктуации. Наконец, следует задать максимальную длину любого значения, которое можно хранить в

- 13 -

колонках. Например, в команде 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

цифр, две из

которых находятся справа от десятичной точки.

 

 

 

- 14 -

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

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

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

DROP TABLE EMP;

DROP TABLE DEPT;

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

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

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

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

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

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

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

6.Какие предписания применяются для определения системных данных (например, типа ‘дата’) ?

7.Каков формат 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.

- 15 -

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

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

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

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

- 16 -

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

 

- 17 -

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

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

- 18 -

Предписание 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 (позволяет выбрать строку, начинающуюся с заданного набора

символов); некоторые авторы издевательски сопоставляют введение

- 19 -

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

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

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

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

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

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

4.Каковы символы сравнения по образцу в клаузе 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 ведет сортировку строк по увеличивающемуся (меньший оклад сначала) порядку. Но упорядочение не ограничивается только одной последовательностью в одной колонке. Например, несложно перечислить всех работников по порядку работы и внутри него (порядка

- 20 -

работы) по окладу:

SELECT JOB,SAL,ENAME FROM EMP

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

JOB

SAL

ENAME

ANALYST

3,000.00

SCOTT

ANALYST

3,000.00

FORD

CLERC

1,300.00

MILLER

CLERC

1,100.00

ADAMS

CLERC

960.00

JAMES

CLERC

800.00

SMITH

MANAGER

2,850.00

BLAKE

MANAGER

2,450.00

CLARK

PRESIDENT

5,000.00

KING

SALESMAN

1,600.00

ALLEN

SALESMAN

1,500.00

TURNER

SALESMAN

1,250.00

WARD

SALESMAN

1,250.00

MARTIN

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

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

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

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

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

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

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

SELECT JOB

FROM EMP;

JOB