Главная страница

Методичка. Базы данных (ПОВТ) 2009. Методические указания для студентов дневного отделения специальности "Программное обеспечение вычислительной техники" Барнаул 2009 2


Скачать 2 Mb.
НазваниеМетодические указания для студентов дневного отделения специальности "Программное обеспечение вычислительной техники" Барнаул 2009 2
АнкорМетодичка. Базы данных (ПОВТ) 2009.pdf
Дата04.10.2019
Размер2 Mb.
Формат файлаpdf
Имя файлаМетодичка. Базы данных (ПОВТ) 2009.pdf
ТипМетодические указания
#13290
страница8 из 11

Подборка по базе: Программа обучения студентов (Syllabus) по дисциплине Основы пра, методичка по цитологии 2019 для студентов.pdf, Методические указания к самостоятельной работе по дисциплине «Ме, Метод указания-19.docx, Методические указания по практике .doc, Методические указания по практике .doc, ГАОУ СПО Десмургия - Методические рекомендации для студентов по .
1   2   3   4   5   6   7   8   9   10   11
Пример главной программы:
CLEAR ALL
IF [EXE] $ VERSION()
_Screen.Hide
ENDIF
SET PATH TO PROGS, FORMS, LIBS, ;
MENUS, DATA, OTHER, ;
REPORTS, INCLUDE, HELP, ;
BITMAPS

52
SET POINT TO '.'
SET TALK OFF
SET ESCAPE OFF
SET DATE TO DMY
SET CENTURY ON
SET EXACT ON
SET SAFETY OFF
SET EXCLUSIVE OFF
SET DELETED ON
SET NULL ON
SET HOURS TO 24
IF [EXE] $ VERSION()
DO FORM MAINFORM NOSHOW NOREAD
DO FORM PASSWORD
ELSE
DO FORM MAINFORM
ENDIF
READ EVENTS
_Screen.caption=[Microsoft Visual FoxPro]
SET SYSMENU TO DEFAULT
SET SAFETY ON
_Screen.Show
RETURN
Порядоквыполнения работы
1.
Запустить VFP.
2.
В командном окне выбрать текущий каталог set default to ?
3.
Создать проект: File - New - Project
4.
Во вкладке Data (Project Manager) создать БД (new) или добавить ранее созданную
(add).
5.
Во вкладке Other создать меню.
Если меню вложенное, то в опции Result указать Submenu, иначе - Command.
Если команд несколько, то в этом случае указывается имя программы (например, do vihod).
Для верхнего уровня меню необходимо указать “горячие” клавиши.
Созданное меню необходимо сгенерировать: Menu - Generate.
6.
Во вкладке Сode создать главную программу:
Code- Programs - New
С использованием правой кнопки мыши установить опцию Set main для главной программы.
Аналогично создать другие необходимые программы.
Например:
set sysmenu to default
clear events.
7.
Во вкладке Classes создать классы форм.
В окне New Class указать:
Class name: <имя класса>

53
Based on: form
Store In: <где сохранять>
7.1. Создать класс форм для просмотра
Установить параметры класса:
Вкладка Layout: AutoCenter=.T.; Caption=<Заголовок>
Вкладка Other: Window type =1(действия выполняются только внутри окна).
Добавить объект Grid для просмотра с помощью соответствующей кнопки на панели инструментов.
Добавить управляющие кнопки (Изменить, Добавить и т.д.) с использованием
Command button на панели инструментов. Во вкладке Layout для каждой кнопки подписать название (свойство Caption). Во вкладке Method, (метод Click Event) определить действия, выполняемые при нажатии кнопки .
Например, при удалении
if messagebox(iif(deleted(), “Восстановить?”, “Удалить?”), 4+32+256, “Запрос”)#6
return .f.
else
return .t.
endif
При выходе
thisform.release
7.2.
Аналогично создать класс форм для корректировки.
На форме должно быть две кнопки, например, “Принять”, “Отказаться”.
Установить свойства и методы класса, аналогично классу форм для просмотра. Для каждой кнопки во вкладке Methods определить необходимые действия, выполняемые при нажатии кнопки.
Например, для кнопки “Принять”:
=TABLEUPDATE(.t.)
thisform.Release
Для кнопки “Отказаться”:
=TABLEREVERT()
thisform.Release
8.
На основе разработанных классов создать формы. Для этого выбрать пункт меню
VFP: Tools - Options - Forms - <выбрать нужный класс>.
8.1.
Формы для просмотра
Во вкладке Documents добавить новую форму. Для каждой формы задать название
(Layout - Caption).
Находясь в Grid, с помощью правой кнопки мыши выполнить в контекстном меню пункт Builder. Выбрать поля, необходимые для просмотра.
Во вкладке Data (Grid) установить ReadOnly=.T.
Находясь в поле просмотра, с использованием правой кнопки мыши выполнить пункт
Edit, исправить названия полей.
Примечание: если названия полей указаны при создании таблиц, то они автоматически заносятся в заголовки столбцов (в VFP8.0).
Во вкладке Layout установить Aligment=0.
На панели инструментов выбрать DataEnvironment для установки свойств таблиц, с которыми работает данная форма. Во вкладке Data (DataEnvironment) установить основную таблицу (параметр InitialSelectedAlias).
Выбрать таблицу; во вкладке Data (таблицы) установить пессимистическую буферизацию, индекс (Order).

54
Если поле для просмотра, выбрано из другой таблицы, то необходимо выполнить следующие действия:
1) на панели инструментов выбрать DataEnvironment;
2)
с использованием правой кнопки мыши добавить соответствующую таблицу;
3)
удалить существующую связь между таблицами и установить связь от поля внешнего ключа основной таблицы к первичному ключу справочной таблицы;
4)
для справочной таблицы также установить пессимистическую буферизацию;
5)
закрыть DataEnvironment;
6)
выбрать поле в Grid и во вкладке Data в опции ControlSource заменить существующее значение на соответствующее поле из справочника.
Примечание: Для того чтобы правильно отображалась первая запись необходимо во вкладке Methods (формы) переопределить метод ActivateEvent:
=SEEK(<имя внешнего ключа в основной таблице>, "<имя справочной таблицы>",
"<первичный ключ в справочной таблице>")
thisform.refresh
Во вкладке Method переопределить методы в ClickEvent для каждой кнопки:
“Удалить”:
Select <имя основной таблицы>
IF DODEFAULT()
m.tr=recno()
IF DELETED()
RECALL
ELSE
DELETE
ENDIF
ENDIF
go top
go bottom
go m.tr
thisform.Refresh
“Изменить”:
SELECT <имя основной таблицы>
DO FORM corfilm
thisform.Refresh
“Добавить”:
SELECT <имя основной таблицы, например, table1>
append blank
DO FORM corfilm
thisform.Refresh
8.2.
Формы для корректировки
Аналогично, используя соответствующий класс, создать формы для корректировки.
Названия полей размещаются на форме с использованием объекта Label(
Α
).
Для каждого объекта Label установить во вкладке Layout свойство AutoSize=.T.
Для ввода данных используется объект TextBox. Во вкладке Data (Textbox) установить ControlSource=<имя таблицы.имя поля>.
Если данные выбираются из справочной таблицы, то используется объект ComboBox.
Находясь на объекте ComboBox, с использованием правой кнопки мыши выбрать пункт Builder:

55 1) во вкладке List Items выбрать необходимую таблицу и поля (название, первичный ключ);
2) во вкладке Style указать Drop-down list;
3) во вкладке Layout у поля первичного ключа установить нулевую ширину;
4) во вкладке Value выбрать для возврата первичный ключ, а в Field Name указать имя внешнего ключа.
Во вкладке Data (ComboBox) установить свойство Bound to=.T.
Выбрать DataEnvironment и удалить основную таблицу (ту, по которой построен grid).
9.
Создайте отчет во вкладке Documents (секция Reports), используя необходимый
“Мастер”. Откорректируйте полученный отчет для русификации.
Контрольные вопросы:
1. Создание командных файлов
2. Главная программа
3. Создание меню
4. Работа с переменными
5. Команды управления
6. Организация циклов
7. Массивы переменных
8. Модульность программ
9. Запуск формы
10. Подключение данных в форме (Data Environment, Cursor, Relation,
InitialSelectedAlias, BufferModeOverride, Order, Filter )
11. Буферизация
12. Элемент Grid.
13. RecordSource
14. ControlSource
15. Построение таблиц с расшифровкой внешних ключей
16. TABLEREVERT(), TABLEUPDATE()
17. Вызов формы ( DO FORM WITH <сп. параметров> TO )
18. Передача параметров в форму, возврат значения ( INIT -> PARAMETERS , Unload ->
RETURN )
19. Модальные и немодальные окна ( WindowType)
20. Ссылка на объекты ( This, ThisForm, ThisFormSet )
21. Создание EXE-файла ( READ EVENTS )
22. Дополнительные свойства и методы:
• Refresh
• Activate
• Release
• Click Event
• AvtoSize
• Caption
• Visible
• Name
• Enabled
• AvtoCenter
• ShowWindow ( In Screen, In Top-Level Form, As Top-Level Form)
• Data Session

56 23. Классы
24. Отчеты
3.6 Лабораторная работа №6
Задание
Используя концептуальную модель из второй лабораторной работы, построить логическую модель в технологии IDEF1X. Предусмотреть поддержание ссылочной целостности. На основании логической модели разработать физическую модель для СУБД
Oracle. Сгенерировать базу данных на сервере, используя созданную модель. Заполнить базу данных. Используя программу SQL Plus продемонстрировать умение составлять различные запросы к базе данных.
Теоретический материал
Модель «сущность-связь»
Одна из наиболее сложных проблем проектирования базы данных связана с тем, что проектировщики, программисты и конечные пользователи, как правило, рассматривают данные иих назначение по-разному. Разработанный проект позволит удовлетворить все требования пользователей только при том условии, что и проектировщики, и пользователи придут к единому пониманию того, как работает данная конкретная организация. Чтобы добиться полного понимания характера данных и способов их использования в организации, необходимо применять в процессе обмена информацией между специалистами общую модель, которая не усложнена техническими подробностями и не допускает двойных толкований. Одним из примеров модели такого типа является модель "сущность-связь"
(Entity-Relationship model, или ER-модель). ER-моделирование представляет собой нисходящий подход к проектированию базы данных, который начинается с выявления наиболее важных данных, называемых сущностями (entities), и связей (relationships) между данными, которые должны быть представлены в модели. Затем в модель вносятся дополнительные сведения, например, указывается информация о сущностях и связях, называемая атрибутами (attributes), а также все ограничения, относящиеся к сущностям, связям и атрибутам. ER-модель может быть представлена различными способами. Одним из способов представления является методология IDEF1X.
Методология IDEF1X
Метод IDEF1, разработанный Т.Рэмей (T.Ramey), также основан на подходе П.Чена и позволяет построить модель данных, эквивалентную реляционной модели в третьей нормальной форме. В настоящее время на основе совершенствования методологии IDEF1 создана ее новая версия - методология IDEF1X. IDEF1X разработана с учетом таких требований, как простота изучения и возможность автоматизации. IDEF1X-диаграммы используются рядом распространенных CASE-средств (в частности, ERwin, Design/IDEF,
Toad Data Modeler Freeware
).
Объекты модели называются сущностями (Entity). Каждая сущность является множеством подобных индивидуальных объектов, называемых экземплярами. Каждый экземпляр индивидуален и должен отличаться от всех остальных экземпляров. Атрибут выражает определенное свойство объекта. С точки зрения БД сущности соответствует таблица, экземпляру сущности - строка в таблице, а атрибуту - колонка таблицы.
Построение модели предполагает определение сущностей и атрибутов,
Сущность в методологии IDEF1X является независимой от идентификаторов или просто независимой, если каждый экземпляр сущности может быть однозначно идентифицирован без определения его отношений с другими сущностями. Сущность

57
называется зависимой от идентификаторов или просто зависимой, если однозначная идентификация экземпляра сущности зависит от его отношения к другой сущности.
Рис 4 Изображение независимых и зависимых сущностей
Каждой сущности присваивается уникальное имя и номер, разделяемые косой чертой "/" и помещаемые над блоком. Связь является логическим соотношением между сущностями. Каждая связь должна именоваться глаголом или глагольной фразой.
Связь может дополнительно определяться с помощью указания степени или мощности (количества экземпляров сущности-потомка, которое может существовать для каждого экземпляра сущности-родителя). В IDEF1X могут быть выражены следующие мощности связей:
• каждый экземпляр сущности-родителя может иметь ноль, один или более связанных с ним экземпляров сущности-потомка;
• каждый экземпляр сущности-родителя должен иметь не менее одного связанного с ним экземпляра сущности-потомка;
• каждый экземпляр сущности-родителя должен иметь не более одного связанного с ним экземпляра сущности-потомка;
• каждый экземпляр сущности-родителя связан с некоторым фиксированным числом экземпляров сущности-потомка.
Если экземпляр сущности-потомка однозначно определяется своей связью с сущностью-родителем, то связь называется идентифицирующей, в противном случае -
неидентифицирующей.
Связь изображается линией, проводимой между сущностью-родителем и сущностью- потомком с точкой на конце линии у сущности-потомка.
Идентифицирующая связь между сущностью-родителем и сущностью-потомком изображается сплошной линией. Сущность-потомок в идентифицирующей связи является зависимой от идентификатора сущностью. Сущность-родитель в идентифицирующей связи может быть как независимой, так и зависимой от идентификатора сущностью (это определяется ее связями с другими сущностями).
Рис 5 Пример идентифицирующей связи

58
Пунктирная линия изображает неидентифицирующую связь. Сущность-потомок в неидентифицирующей связи будет независимой от идентификатора, если она не является также сущностью-потомком в какой-либо идентифицирующей связи.
Рис. 6 Пример неидентифицирующей связи
Отдельные свойства сущностей называются атрибутами. Например, сущность Staff
(Персонал) может быть описана с помощью атрибутов staffNo (Табельный номер работника), name (Имя), position (Должность) и salary (Зарплата). Атрибуты содержат значения, которые описывают каждый экземпляр сущности и составляют основную часть информации, сохраняемой в базе данных.
Атрибуты изображаются в виде списка имен внутри блока сущности. Атрибуты, определяющие первичный ключ, размещаются наверху списка и отделяются от других атрибутов горизонтальной чертой.
Рис 7 Пример определения атрибутов.
Сущности могут иметь также внешние ключи (Foreign Key), которые могут использоваться в качестве части или целого первичного ключа или неключевого атрибута.
Внешний ключ изображается с помощью помещения внутрь блока сущности имен атрибутов, после которых следуют буквы FK в скобках.
Рис. 8 Перенос атрибутов

59
Создание модели данных с помощью Toad Data Modeler Freeware

60
Проблемы ER-моделирования
Существуют проблемы, которые принято называть дефектами соединения (connection trap). Они обычно возникают «вследствие неправильной интерпретации смысла некоторых связей». Рассмотрим два основных типа дефектов соединения: дефект типа "разветвление"
(fan trap) и дефект типа "разрыв" (chasm trap), а также способы их выявления и устранения в создаваемых ЕR-моделях. В общем случае для выявления дефектов соединения необходимо убедиться в том, что смысл каждой связи определен четко и ясно. При недостаточном понимании сути установленных связей может быть создана модель, которая не будет являться истинным представлением реального мира.
Дефекты типа "разветвление"
Дефект типа "разветвление" имеет место в том случае, когда модель отображает
связь между типами сущностей, но путь между отдельными сущностями этого типа
определен неоднозначно.
Дефект типа "разветвление" возникает в том случае, когда две или несколько связей типа 1:* исходят из одной сущности. Потенциальный дефект типа ''разветвление" показан на рис. 9, на котором две связи типа 1:* (Has и Operates) исходят из одной и той же сущности
Division.

61
Рис. 9 Пример дефекта типа "разветвление"
На основании этой модели можно сделать вывод, что один отдел (Division) может состоять из нескольких отделений компании (Branch) и в нем может работать многочисленный штат сотрудников. Проблемы начинаются при попытках выяснить, в каком отделении компании работает каждый из сотрудников отдела.
Неспособность дать точный ответ на поставленный вопрос является результатом дефекта типа «разветвление», связанного с неправильной интерпретацией связей между сущностями Staff, Division и Branch. Устранить эту проблему можно путем перестройки ER- модели для представления правильного взаимодействия этих сущностей таким образом, как показано на рис. 10.
Рис. 10 Пример переработки ER-модели (рис.9) с целью устранения дефекта типа "разветвление"
Если проверить эту структуру на уровне отдельных связей Operates к Has, можно убедиться, что теперь легко дать однозначный ответ на поставленный выше вопрос.
Дефекты типа "разрыв"
Дефект типа «разрыв» появляется в том случае, когда в модели предполагается наличие связи между типами сущностей, но не существует пути между отдельными сущностями этих типов.
Дефект типа "разрыв" может возникать, если существует одна или несколько связей с минимальной кратностью, равной нулю (которая обозначает необязательное участие), и эти связи составляют часть пути между взаимосвязанными сущностями. На рис. 11 потенциальный дефект типа "разрыв" показан на примере связей между сущностями Branch,
Staff и PropertyForRent.
Рассмотрев эту модель, можно сделать вывод, что одно отделение компании имеет много сотрудников, которые работают со сдаваемыми в аренду объектами. Однако не все сотрудники непосредственно работают с объектами и не все сдаваемые в аренду объекты недвижимости в каждый конкретный момент находятся в ведении кого-либо из сотрудников компании. В данном случае проблема возникает, когда необходимо выяснить, какие объекты недвижимости приписаны к тому или иному отделению компании.
Рис. 11 Пример дефекта типа "разрыв"
Staff
Division
Branch
Has
1.. *
1.. 1
1.. 1
1.. *
Division
Branch
Staff
O
H
1.. 1
1.. *
1.. 1
1.. *
Устранить
дефект типа
Branch
Staff
PropertyForRent
H
O
1.. 1
1.. *
0.. 1
0.. *

62
Попробуем ответить на следующий вопрос: "Какое отделение компании отвечает за работу с объектом подномером'РА14'? К сожалению, на данный вопрос нельзя дать ответ, если этотобъект в текущий момент не связан ни с одним из сотрудников, работающих в каком-либо из отделений компании. Неспособность дать ответ на заданный вопрос рассматривается как утрата информации (поскольку известно, что любой объект недвижимости должен быть приписан к какому-то отделению компании) в результате которой и возникает дефект типа "разрыв". Кратность сущности Staff и PropertyForRent в связи Oversees имеет минимальное значение, равное нулю, а это означает, что некоторые объекты недвижимости не могут быть связаны с отделением компании с помощью информации о сотрудниках. Поэтому для разрешения этой проблемы следует ввести недостающую связь Offers между сущностями Branch и PropertyForRent. ER-модель, показанная на рис. 12, отображает истинные связи между этими сущностями. Такая структура гарантирует, что всегда будут известны объекты недвижимости, связанные с каждым отделением компании, включая объекты недвижимости которые в данный момент не поручены никому из сотрудников этой компаний.
Рис. 12 ER-модель, представленная на рис.11, после переработки с целью устранения дефекта типа "разрыв"
SQL
SQL (Structured Query Language, язык структурированных запросов) - это специальный язык, используемый для определения данных, доступа к данным и их обработки. SQL относится к непроцедурным (nonprocedural) языкам - он лишь описывает нужные компоненты (например, таблицы) и желаемые результаты, не указывая, как именно эти результаты должны быть получены. Каждая реализация SQL является надстройкой над
процессором базы данных (database engine), который интерпретирует операторы SQL и определяет порядок обращения к структурам БД для корректного и эффективного формирования желаемого результата.
SQL является «подъязыком данных», который предназначен только для использования в качестве языка взаимодействия с базой данных. Сам по себе SQL не содержит тех средств, которые необходимы для разработки законченных программ, и может использоваться в виде одной из трех прикладных реализаций:
1. Интерактивный или автономный SQL дает возможность пользователям непосредственно извлекать информацию из базы данных или записывать ее в базу.
2. Статический SQL – фиксированный (исполняемый), записанный заранее, а не генерируемый во время выполнения программы код SQL, который обычно используется в приложениях. Существуют две версии статического SQL.
Встроенный SQL – это код SQL, включенный в код исходного текста программы,
Branch
Staff
PropertyForRent
H
O
1.. 1
1.. *
0.. 1
0.. *
Offers

1.. 1
1.. *
Введение связи Offers
позволяет устранить дефект
типа «разрыв»

63
написанной на другом языке. Другое использование статического SQL – модульный язык. В этом случае модули SQL скомпонованы с с модулями кода других языков.
3. Динамический SQL – код SQL, сгенерированный приложением во время исполнения. Он заменяет статистический SQL в тех случаях, когда необходимый код
SQL еще не может быть определен во время написания приложения, так как сам код зависит от того, какой выбор сделает пользователь.
SQL отличается от языков программирования высокого уровня несколькими признаками. Во-первых, он относиться к непроцедурным языкам. На языке типа С можно записать для компьютера шаг за шагом все инструкции, необходимые для исполнения задания. SQL просто декларирует, что нужно делать, а исполнение возлагает на СУБД.
Такой подход лежит в русле философии реляционных баз данных. СУБД в данном случае рассматривается как «черный ящик»: что делается внутри него – пользователя не касается. Его интересует только получение правильного ответа из базы данных и внесение в нее необходимых изменений. Другим отличием SQL является трехзначная логика..
Данные содержаться в таблицах, таблицы сгруппированы в схемы, а схемы – в каталоги. Каталоги могут быть в дальнейшем сгруппированы в кластеры. В некоторых приложениях баз данных эти термины несколько отличаются от определений стандарта.
С точки зрения конкретного сеанса SQL кластер содержит все таблицы, к которым имеется доступ в данном сеансе.
Схемой называется именованный набор объектов базы данных, управляемых одним пользователем и в определенных случаях рассматриваемых как единое целое.
Рекомендуется использовать домены, позволяющие построить более точную классификацию данных по типам, чем та, которая достигается с помощью стандартного набора типов данных. Например, телефонные номера относятся не к тому типу данных, к которому принадлежат номера социальных страховок, даже если и те и другие выражаются числами, в то же время, информацию одного и того же типа данных иногда не имеет смысла сравнивать, так как она может принадлежать разным доменам.
Определение домена содержит тип данных, но может, кроме того, включать предложения, которые определяют значения по умолчанию, ограничения и последовательность сортировки для упорядочения наборов символов для домена ( под ограничениями понимаются правила, ограничивающие значения данных, которые разрешено размещать в определенном столбце).
Язык SQL состоит из двух специальных наборов команд. DDL (Data Definition
Language, язык определения данных) - это подмножество SQL, используемое для определения и модификации различных структур данных, a DML (Data Manipulation
Language, язык манипулирования данными) - это подмножество SQL, применяемое для полу- чения и обработки данных, хранящихся в структурах, определенных ранее с помощью DDL.
DDL состоит из большого количества команд, необходимых для создания таблиц, индексов, представлений и ограничений, а в DML входит всего четыре оператора:
INSERT
Добавляет данные в базу данных.
UPDATE
Изменяет данные в базе данных.
DELETE
Удаляет данные из базы данных.
SELECT
Извлекает данные из базы данных.
Некоторым кажется, что применение DDL является прерогативой администраторов базы данных, а операторы DML должны писать разработчики, но эти два языка не так-то

64
просто разделить. Сложно организовать эффективный доступ к данным и их обработку, не понимая, какие структуры доступны и как они связаны. Также сложно проектировать соответствующие структуры, не зная, как они будут обрабатываться. Сказав это, сосредоточимся на DML. DDL в книге будет встречаться лишь тогда, когда это необходимо для иллюстрации применения DML. Причины особого внимания к DML таковы:
• DDL хорошо описан во многих книгах по проектированию и администрированию баз данных, а также в справочниках по SQL.
Проблемы производительности обычно бывают вызваны неэффективными операторами
DML.
• Хотя операторов всего четыре, DML - большая тема.
Эффективное хранение и извлечение информации сейчас важно как никогда ранее:
Все больше компаний предлагают свои услуги через Интернет. В часы пик они вынуждены обслуживать тысячи параллельных запросов, и задержки означают прямую потерю прибыли. Для таких систем каждый оператор SQL должен быть тщательно продуман, чтобы обеспечивать требуемую производительность при увеличении объема данных.
• Сегодня есть возможность хранить гораздо больше данных, чем пять лет назад. Один дисковый массив вмещает десятки терабайт данных, и уже не за горами хранение сотен терабайт. Программное обеспечение, применяемое для загрузки и анализа данных в этих средах, должно использовать весь потенциал SQL, чтобы обрабатывать неизменно увеличивающийся объем данных за постоянные (или сокращающиеся) промежутки времени.
Оператор SELECT
Оператор SELECT используется для извлечения данных из базы. Множество данных, извлекаемое оператором SELECT, называется результирующим множеством (result set). Как и таблица, результирующее множество состоит из строк и столбцов, что позволяет заполнить таблицу данными результирующего множества. Общий вид оператора SELECT таков:
SELECT <один или несколько обьектов>
FROM <одно или несколько мест>
WHERE <ни одного, одно или несколько условий>
Инструкции SELECT и FROM необходимы, а вот инструкция WHERE необязательна
(хотя и она почти всегда используется). Начнем с простого примера, извлекающего три столбца из каждой строки таблицы CUSTOMER (заказчики):
SELECT cust_nbr, name, region.id FROM customer;
Инструкция WHERE не была использована, и никаких ограничений на данные мы не наложили, поэтому запрос возвращает все строки таблицы заказчиков. Если необходимо ограничить возвращаемый набор данных, можно добавить в оператор инструкцию WHERE с одним условием:
SELECT cust_nbr, name, region_id FROM customer
WHERE region_id = 8;
Теперь результирующее множество содержит только заказчиков, проживающих в области с идентификатором region_id, равным 8. Но что если нужно ссылаться на область по имени, а не по номеру? Можно выбрать нужное имя из таблицы REGION, а затем, зная region_id, обратиться к таблице CUSTOMER. Чтобы не писать два разных запроса, можно получить тот же результат с помощью одного запроса, использующего объединение (join):
SELECT customer.cust_nbr, customer.name, region.name FROM
customer, region WHERE region.name = 'New England' AND
region.region_id = customer.region_ld;

65
Теперь в инструкции FROM не одна таблица, а две, и инструкция WHERE содержит
условие объединения (join condition), которое указывает, что таблицы заказчиков и областей должны быть объединены по столбцу region_id, имеющемуся в каждой таблице.
Так как обе таблицы содержат столбец с названием name, необходимо как-то определить, какой именно столбец вас интересует. В предыдущем примере это делается с помощью точечной нотации - добавления через точку имени таблицы перед именем столбца.
Если же на написание полных имен таблиц у вас уходит слишком много времени, назначьте для каждого названия таблицы в инструкции FROM псевдоним (alias) и используйте его вместо имени в инструкциях SELECT и WHERE:
SELECT с.cust_nbr, с.name, r.name FROM customer
с, region r WHERE r.name = 'New England' AND
r.region_id = c.region_id;
В этом примере псевдоним «с» был присвоен таблице заказчиков, а псевдоним «г» - таблице областей. Теперь можно в инструкциях SELECT и WHERE писать «с» вместо
«customer» и «г» вместо «region».
Элементы инструкции SELECT
Рассмотренные ранее результирующие множества, порожденные нашими запросами, содержали столбцы одной или нескольких таблиц. Как правило, элементами инструкции
SELECT действительно являются ссылки на столбцы; среди них также могут встречаться:
• Константы, такие как числа (1) или строки ('abc')
• Выражения, например shape, diameter * 3.1415927
• Функции, такие как TO_DATE(01-JAN-2002', 'DD-MON-YYYY')
Псевдостолбцы, например ROWID, ROWNUM или LEVEL
Если первые три пункта в списке довольно просты, то последний нуждается в пояснении. В Oracle есть несколько столбцов-призраков, называемых псевдостолбцами
(pseudocolumns), которые не присутствуют ни в одной таблице. Их значения появляются во время выполнения запроса, и в некоторых ситуациях они бывают полезны.
Упорядочение результатов
В общем случае нет гарантии, что результирующее множество будет сформировано в каком-либо определенном порядке. Если нужно отсортировать результаты по одному или нескольким столбцам, следует добавить инструкцию ORDER BY сразу же после WHERE.
Следующий пример сортирует заказчиков из Новой Англии по фамилиям:
SELECT с.cust_nbr, с.name, r.name FROM customer с, region r WHERE r.name = 'New England'
AND r.reglon_id = c.region_id ORDER BY c.name;
Сортируемые столбцы можно определять по их положению в инструкции SELECT.
Отсортируем предыдущий запрос по столбцу CUST_NBR (номер заказчика), который в инструкции SELECT указан первым:
SELECT c.cust_nbr, с.name, r.name FROM customer c, region r WHERE r.name = 'New England' AND r.region_id
= c.reglon_id ORDER BY 1;
Указание ключей сортировки по позиции сэкономит вам немного времени, но может привести к ошибкам, если в дальнейшем порядок следования столбцов в инструкции
SELECT будет изменен.

66
Удаление дубликатов
В некоторых случаях результирующее множество может содержать одинаковые данные. Например, при формировании списка проданных за последний месяц деталей те детали, которые присутствовали в нескольких заказах, встретятся в результирующем множестве несколько раз. Чтобы исключить повторы, вставьте в инструкцию SELECT клю- чевое слово DISTINCT:
SELECT DISTINCT li.part_nbr
FROM cust_order со, line_item li
WHERE co.order_dt >= TO_DATE('01-JUL-2001•,'DD-MON-YYYY')
AND co.order_dt < TO_DATE('01-AUG-2001','DD-MON-YYYY•)
AND co.order_nbr = li.order_nbr;
Запрос возвращает множество отличающихся друг от друга записей о деталях, заказанных в течение июля 2001 года. Без ключевого слова DISTINCT вывод содержал бы по одной строке для каждой строки каждого заказа, и одна деталь могла бы встречаться несколько раз, если бы она содержалась в нескольких заказах. Принимая решение о вклю- чении DISTINCT в инструкцию SELECT, следует иметь в виду, что поиск и удаление дубликатов требует сортировки, которая будет служить дополнительной нагрузкой при выполнении запроса.
Оператор INSERT
Оператор INSERT - это механизм загрузки данных в базу данных.Заодин раз данные можно вставить только в одну таблицу, зато брать вставляемые данные можно из нескольких дополнительных таблиц. Вставляя данные в таблицу, не нужно указывать значения для каждого столбца, однако следует обратить внимание на то, допускают ли столбцы использование значений NULL
1
или же нет.
В операторе INSERT необходимо указать значения как минимум для тех столбцов, которые содержат пометку NOT NULL. Например, как показано ниже:
INSERT INTO employee (emp_id, Iname, dept_id)
VALUES (101, 'Smith', 2);
Количество элементов в инструкции VALUES должно совпадать с количеством элементов в списке столбцов, а их типы данных должны соответствовать определениям столбцов. В нашем примере emp_id и dept_id хранят численные значения, а Iname - строковое, поэтому оператор INSERT выполнится без ошибок. Oracle всегда автоматически пытается преобразовать один тип данных в другой, поэтому следующий оператор тоже выполнится без ошибок:
INSERT INTO employee (emp_id, Iname, dept_id)
VALUES ('101', 'Smith', '2');
Иногда вставляемые данные нужно предварительно извлечь из одной или нескольких таблиц. Так как оператор SELECT формирует результирующее множество, состоящее из строк и столбцов, то можно непосредственно передать его оператору INSERT:
INSERT INTO employee (emp_id, fname, Iname, dept_id, hire_date)
SELECT 101, 'Dave', 'Smith', d.dept_ld, SYSDATE
FROM department d WHERE d.name = 'Accounting';
В данном примере оператор SELECT извлекает идентификатор отдела для бухгалтерии (Accounting). Остальные четыре столбца в операторе SELECT представлены константами.

67
Оператор DELETE
Оператор DELETE обеспечивает удаление данных из базы. Как и SELECT, оператор
DELETE содержит инструкцию WHERE с условиями для идентификации удаляемых строк.
Забыв указать инструкцию WHERE в операторе DELETE, вы удалите все строки из указанной таблицы. Следующий оператор удаляет всех сотрудников с фамилией Hooper из таблицы EMPLOYEE:
DELETE FROM employee WHERE Iname = 'Hooper';
Иногда значения, необходимые для построения условия в инструкции WHERE, располагаются в других таблицах. Например, решение компании вынести вовне функции бухучета потребует удаления всего бухгалтерского персонала из таблицы EMPLOYEE:
DELETE FROM employee WHERE dept_id = (SELECT dept.id FROM department WHERE name
= 'Accounting');
Подобное использование оператора SELECT носит название подзапроса (subquery).
Оператор UPDATE
С помощью оператора UPDATE вносятся изменения в существующие данные. Как и
DELETE, оператор UPDATE включает в себя инструкцию WHERE для указания тех строк, которые будут изменены. Посмотрим, как можно предоставить 10-процентное повышение зарплаты тем, у кого годовой доход меньше 40 000 долларов:
UPDATE employee
SET salary = salary • 1.1
WHERE salary < 40000;
Если необходимо изменить несколько столбцов, вы можете выбрать один из двух вариантов: задать набор пар столбец-значение, разделенных запятыми, или указать набор столбцов и подзапрос. Два следующих оператора UPDATE изменяют столбцы inactive_dt и inactive_ind в таблице CUSTOMER для клиентов, не сделавших ни одного заказа за по- следний год:
UPDATE customer
SET lnactive_dt = SYSDATE, inactive_ind = 'Y'
WHERE last_order_dt < SYSDATE - 365;
UPDATE customer SET (inactive_dt, inactive_ind) =
(SELECT SYSDATE, Y FROM dual) WHERE last_order_dt
< SYSDATE - 365;
Подзапрос во втором примере выглядит немного неестественно, так как он обращается к таблице dual для построения результирующего множества, состоящего из двух констант; он приведен для иллюстрации использования подзапросов в операторе UPDATE.
CREATE TABLE
Создает таблицу.
Типы данных для таблиц Oracle:
Тип данных
Описание
Макс. размер эл-та
CHAR
Символьное поле фиксированной длины, дополненное хвостовыми пробелами
255 байт
VARCHAR
Символьное поле переменной длины
4 Кбайт
VARCHAR2
Символьное поле переменной длины
4 Кбайт
LONG
Символьное поле переменной длины
2 Гбайт

68
NUMBER
Числовые данные переменной длины
от 1х10
-130
до
9.99х10
125
DATE
Поле даты и времени (длина поля фиксирована)
не определен
RAW
Двоичные данные переменной длины
255 байт
LONG RAW
Двоичные данные переменной длины
2 Гбайт
ROWID
Идентификатор строки
не определен
NCHAR
Символьное поле фиксированной длины, дополненное хвостовыми пробелами; данные могут быть записаны с использованием национального алфавита
255 байт
NVARCHAR2
Символьное поле переменной длины; данные могут быть записаны с использованием национального алфавита
2 Кбайт
CLOB
Однобайтовые символьные данные переменной длины
4 Гбайт
NCLOB
Одно- или многобайтовые символьные данные
4 Гбайт
BLOB
Поле двоичных данных
4 Гбайт
BFILE
Указатель на двоичные данные, сохраняемые во внешних файлах
не определен
Пример простейшей команды по созданию таблицы.
CREATE TABLE dept
(deptno NUMBER (2) PRIMARY KEY, dname VARCHAR2(10), loc VARCHAR2(9) )
CREATE SEQUENCE
Создает sequence. Sequence - это объект базы данных необходимый для того, чтобы несколько пользователей могли генерировать уникальное целое значение. Обычно sequences используется для автоматической генерации значения первичного ключа.
Когда sequence генерирует число, его значение увеличивается. Если два пользователя пытаются одновременно получить значение одного и того же sequence, то сначала генерируется значение для первого одного пользователя, а затем для другого. Пользователь не может получить значение сгенерированное для другого пользователя
Когда sequence создан, вы можете получить доступ к его значениям в SQL - выражениях с помощью псевдоколонок CURRVAL (возвращает текущее значение sequence) или NEXTVAL (увеличивает значение sequence и возвращает это новое значение).
CREATE SEQUENCE eseq INCREMENT BY 10;
При первом обращении к ESEQ.NEXTVAL возвратит 1.При втором возвратит 11. И т.д.
CREATE SEQUENCE ADM.GURSEQ INCREMENT BY 1 START WITH 10 CYCLE;
Объединения
Часто бывает необходима информация из нескольких таблиц. Конструкция языка
SQL, комбинирующая данные двух и более таблиц, называется объединением (join). В данной главе будут рассмотрены объединения, их типы и способы использования.

69
Объединение - это SQL-запрос, который извлекает информацию из двух или более таблиц или представлений. При указании в инструкции FROM нескольких таблиц или представлений Oracle выполняет объединение, связывая вместе строки различных таблиц.
Существует несколько типов объединений:
Внутренние объединения (inner joins)
Внутренние объединения - это стандартный вариант объединения, который возвращает строки, удовлетворяющие условию объединения. Каждая строка, возвращенная внутренним объединением, содержит данные всех таблиц, включенных в объединение.
Внешние объединения (outer join)
Внешние объединения - это расширение внутренних. Внешнее объединение возвращает строки, удовлетворяющие условию объединения, а также те строки одной таблицы, для которых не найдено строк другой таблицы, отвечающих условию объединения.
Внутренние объединения
Внутреннее объединение возвращает строки, удовлетворяющие условию объединения. Давайте рассмотрим понятие «объединение» на примере. Пусть необходимо вывести фамилию и название подразделения для каждого сотрудника. Используем следующий оператор SQL:
SELECT E.LNAME, D.NAME
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_ID = D.DEPT_ID;
В этом примере запрос обращается к двум таблицам, так как фамилия служащего хранится в таблице EMPLOYEE, а название подразделения - в таблице DEPARTMENT.
Обратите внимание на то, что в инструкции FROM названия двух таблиц, EMPLOYEE и
DEPARTMENT, перечислены через запятую. Если нужно объединить три и более таблиц, укажите все таблицы в инструкции FROM, перечислив их через запятую. В списке оператора
SELECT могут упоминаться столбцы из любой таблицы, указанной в инструкции FROM.
Условие объединения
Обычно при выполнении объединения в инструкцию WHERE включается условие, которое устанавливает соответствие таблиц, указанных в инструкции FROM. Такое условие называется условием объединения. Условие объединения определяет, как следует объединять строки одной таблицы со строками другой. Как правило, условие объединения применяется к столбцам, которые являются внешними ключами таблиц.
В первом примере предыдущего раздела в инструкции WHERE было задано условие объединения, в котором указывалось равенство столбцов DEPT_ID таблицы EMPLOYEE и таблицы DEPARTMENT:
WHERE E.DEPTJD = D.DEPT.ID
Для выполнения объединения Oracle берет одну комбинацию строк из двух таблиц и проверяет истинность условия объединения. Если условие объединения истинно, Oracle включает данную комбинацию строк в результирующее множество. Процесс повторяется для всех сочетаний строк двух таблиц. Приведем несколько важных фактов, касающихся условия объединения.
• Нет необходимости включать столбцы, входящие в условие объединения, в список
SELECT. В следующем примере условие объединения содержит столбец DEPT_ID таблицы
EMPLOYEE и таблицы DEPARTMENT, но при этом столбец DEPT_ID не участвует в выборке:
SELECT E.LNAME, D.NAME
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_ID = D.DEPT.ID;
• Обычно условие объединения указывается для столбцов, являющихся внешним ключом одной таблицы и первичным или уникальным ключом другой таблицы. Однако

70
можно использовать и другие столбцы. Каждое условие объединения затрагивает столбцы, которые устанавливают связь между двумя таблицами.
• Условие объединения может включать в себя несколько столбцов. Так обычно бывает, если внешний ключ состоит из нескольких столбцов.
• Общее количество условий объединения всегда на единицу меньше общего количества таблиц.
• Условия объединения должны содержать столбцы с совместимыми типами данных.
Обратите внимание на то, что типы данных должны быть совместимыми, но не обязаны
совпадать. При необходимости Oracle выполняет автоматическое преобразование типа.
• Оператор равенства (=) не обязательно должен входить в условие объединения.
Возможно использование других операторов. В объединениях могут участвовать операторы, о которых будет рассказано далее в этом разделе.
Внешние объединения
При объединении двух таблиц может возникнуть необходимость вывести все строки одной из таблиц, даже если для них не существует соответствующих строк во второй таблице. Рассмотрим две таблицы: поставщиков (SUPPLIER) и деталей (PART):
SELECT * FROM SUPPLIER;
SUPPLIER_ID NAME
101 Pacific Disks, Inc.
102 Silicon Valley Microchips
103 Blue
River
Electronics
SELECT * FROM PART;
Если нужно вывести всех поставщиков и поставляемые ими детали, естественно использовать следующий запрос:
SELECTS.SUPPLIER.ID, S. NAME SUPPLIER.NAME, P.PARTNBR, P.NAME
1   2   3   4   5   6   7   8   9   10   11


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