Технология проектирования и администрирования баз данных и систем данных-Конспект3
.pdf
- 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
