РАБОТА С БАЗАМИ ДАННЫХ В АРХИТЕКТУРЕ КЛИЕНТ

реклама
МИНИСТЕРСТВО ОБЩЕГО
И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
РАБОТА С БАЗАМИ ДАННЫХ
В АРХИТЕКТУРЕ КЛИЕНТ-СЕРВЕР
Методические указания
к выполнению лабораторных работ
Пенза 1999
1
УДК 681.3.06
Р
Дано описание пяти лабораторных работ, связанных с доступом к
SQL-ориентированным базам данных в архитектуре клиент-сервер. Первые две работы ориентированы на изучение языка баз данных SQL, последние три – программного интерфейса ODBC для разработки клиентских приложений баз данных. Для каждой лабораторной работы приводятся необходимые теоретические сведения, порядок выполнения, методические указания и варианты заданий.
При выполнении лабораторных работ используется CУБД MS SQL
Server 6.5, хотя может использоваться любая другая SQLориентированная СУБД.
Методические указания подготовлены на кафедре “Вычислительная
техника” и предназначены для студентов специальности 22.01, изучающих дисциплину “Базы данных”.
Ил. 1, табл. 13, библиогр. 16 назв.
С о с т а в и т е л ь В.Н.Дубинин
Р е ц е н з е н т В.Д.Былкин, канд. техн. наук, доц. кафедры “Периферийные средства вычислительной техники” Пензенского технологического института
2
Введение
В настоящее время все большее распространение получают информационные системы с архитектурой клиент-сервер [6, 15-16]. Основой таких систем являются SQL-ориентированные СУБД, выполняемые
на выделенных серверах (SQL-серверах). Причинами роста популярности клиент-серверных систем являются успехи в области телекоммуникаций, высокая производительность систем данного класса, их большая
информационная емкость, высокая надежность, безопасность, возможность одновременной работы с одним и тем же источником данных нескольких пользователей, легкость реконфигурации системы, позволяющая возможность поэтапного наращивания ресурсов базы данных и
подключения новых пользователей, возможность распределенной обработки и работа с разнородными источниками данных. Последнее свойство определяется использованием в системе единого языкового стандарта для работы с базами данных – языка SQL [2,4-5,8-9]. Многие компьютерные фирмы производят программное обеспечение, “превращающее” обычный компьютер в SQL-сервер. К наиболее известным и
распространенным SQL-серверам относятся: Microsoft SQL Server [7,1014], Oracle Server, Sybase SQL Server, Informix Online, Watcom SQL
Network Server, XDB-Enterprise, Gupta SQLBase Server, DB2, Borland
InterBase Workgroup Server, Progress и другие.
Стандарт SQL определяет подъязык данных, который используется
в контексте другого языка, называемого включающим, для того, чтобы
выполнять специализированные задачи управления базами данных. Такая взаимосвязь между включающим языком и подъязыком данных SQL
называется стилем связывания. SQL-92 определяет три типа связывания: встроенный SQL, модульный язык и непосредственный вызов. В
1995 году американские и международные комитеты, ответственные за
стандарт языка SQL, завершили работу над спецификацией нового стиля связывания, названного Call Level Interface (SQL/CLI – интерфейс
уровня вызовов) [3,16]. SQL/CLI был одобрен как международный стандарт официально названный “ISO/IEC 9075-3:1995, Information
Technology – Database Languages – SQL – Part 3, Call Level Interface
(SQL/CLI)”.
Преимущества SQL/CLI: независимость клиентских приложений от
СУБД, возможность выполнения параллельных операций над базой
данных, возможность параллельной обработки множества транзакций.
SQL/CLI представляет собой множество функций, которые может использовать приложение для доступа к базам данных SQL. Оно содержит функции для запроса на выделение и на отказ от выделения ресурсов, функции для подключения к SQL-серверам и отключения от них,
3
функции для исполнения операторов языка SQL, а также функции получения диагностической информации, управления завершением транзакций и получения информации о данной реализации. Системная модель
SQL/CLI состоит из трех компонентов – приложения, реализации CLI и
SQL-сервера. Приложение производит вызовы функций, определяемых
SQL/CLI. Реализация SQL/CLI – это библиотека стадии исполнения, которая реализует функции CLI и связывается с данным приложением.
Реализация CLI обращается к SQL-серверу, который обрабатывает операторы SQL.
Компания Microsoft Corp. разработала инструментарий для разработки программного обеспечения, основанный на расширенной версии
SQL/CLI и получивший название Open DataBase Connectivity (ODBC)
[1,6,14,16]. ODBC обеспечивает общий API-интерфейс для доступа к самым разнообразным базам данных. Архитектура ODBC имеет четыре
основных компонента:приложение, менеджер драйверов, драйвер и источник или источники данных. Центральным компонентом является менеджер драйверов. Механизм ODBC может работать практически в любой операционной системе. Несмотря на наличие других, более высокоуровневых методов доступа к базам данных, таких как DAO и RDO, а
также стремительное развитие и внедрение новых методов (ADO, OLE
DB), ODBC прочно занимает свою нишу в общем ряду методов доступа к
базам данных. “Фундаментальность” ODBC заключается в том, что он
опирается на международный стандарт SQL/CLI. Программирование с
помощью ODBC значительно сложнее, но выигрыш в скорости может
быть существенным.
Методические указания включают описание пяти лабораторных работ. Первые две работы ориентированы на изучение языка баз данных
SQL, последние три – программного интерфейса ODBC для разработки
клиентских приложений баз данных. Для каждой лабораторной работы
приводятся необходимые теоретические сведения, порядок выполнения,
методические указания и варианты заданий.
Целью первой лабораторной работы является изучение спецификации запроса языка SQL, приобретение практических навыков составления и содержательной интерпретации запросов выборки данных, а также их выполнения на SQL-сервере с использованием клиентских утилит.
В данной лабораторной работе используется готовая база данных, отражающая деятельность некоторой книготорговой компании. Используемая база данных состоит из четырех таблиц, структура и семантика
которых представлена в описании работы. Содержимое таблиц приведено в приложении. Приведено 96 вариантов SQL-запросов и 96 вариантов запросов на естественном языке к данной базе данных. Запросы к
4
базе данных имеют различную степень сложности и покрывают большинство возможностей языка SQL.
Целью второй работы является изучение языков описания данных и
манипулирования данными, входящими в SQL, приобретение навыков
составления SQL-запросов для создания, удаления и модификации
объектов базы данных, включая таблицы, представления и индексы,
изучение операторов манипулирования данными, в том числе позиционных, основанных на использовании курсоров. В данной работе также
изучаются ограничения целостности таблицы, а именно ограничения
уникальности и проверочные ограничения. При выполнении первых двух
лабораторных работ рекомендуется использовать клиентские утилиты
ISQL/w и SQL Enterprise Manager (SQL-EM), входящими в состав MS SQL
Server 6.5.
Последние три лабораторные работы нацелены на изучение ODBC
API для создания клиентских приложений баз данных. Особенностью
данных работ является их тесная взаимоподчиненность: следующая работа строится на результатах предыдущей. При выполнении лабораторных работ, связанных с доступом к базе данных с использованием
ODBC, для разработки клиентских приложений рекомендуется использовать систему программирования Visual C++, хотя возможно использование и других систем, например, Visual Basic.
Лабораторная работа N 1
Выборка данных из базы данных с использованием
языка SQL
Цель работы: изучить принципы работы с базой данных в архитектуре клиент-сервер, изучить спецификации запроса языка баз данных
SQL, получить практические навыки составления и содержательной интерпретации запросов выборки данных (операторов SELECT), а также их
выполнения на SQL-сервере с использованием клиентских утилит.
Порядок выполнения работы
1. Изучить структуру и элементы SQL-запроса выборки, в том числе разделы FROM, WHERE, GROUP BY, HAVING, ORDER BY, а также
предикаты условия поиска и агрегатные функции.
5
2. Изучить операции реляционной алгебры (соединение, пересечение, объединение, разность и др.).
3. Изучить утилиту ISQL/w, входящую в набор клиентских утилит
для СУБД SQL Server.
4. Изучить состав базы данных книготорговой компании (база данных pubs), структуру и семантику ее таблиц.
5. Получить у преподавателя номер варианта задания.
6. В соответствии с вариантом задания типа А произвести содержательную интерпретацию заданных SQL-запросов, выполнить их на
SQL-сервере с использованием клиентских утилит ISQL/w или SQL Enterprise Manager (SQL-EM), проинтерпретировать результаты выполнения запросов.
7. В соответствии с вариантом задания В составить SQL-запросы
по их заданному содержательному описанию, выполнить SQL-запросы
на SQL-сервере с использованием клиентских утилит ISQL/w или SQLEM, проинтерпретировать результаты выполнения запросов.
8. Оформить отчет.
Содержание отчета
1) Титульный лист; 2) цель работы; 3) тексты SQL-запросов и их
содержательная интерпретация; 4) результаты выполнения запросов по
заданиям типа А и В и их интерпретация; 5) выводы.
Основные сведения
Язык SQL
Первый международный стандарт языка SQL был принят в 1989 г.
(SQL/89). В конце 1992 г. Был принят новый международный стандарт
SQL/92. “Родным” языком Microsoft SQL Server является язык TransactSQL (T-SQL), являющийся диалектом стандартного языка SQL. T-SQL
поддерживает большинство возможностей языков SQL/89 и SQL/92, а
также ряд расширений, увеличивающих возможность программирования
и гибкость языка. В частности, в язык T-SQL добавлены конструкции для
задания последовательности операций управления в программе (например, if и while), локальных переменных и других конструкций, позволяющих писать более сложные запросы и строить программные объекты, хранящиеся на сервере, в том числе процедуры и триггеры.
Язык SQL включает следующие языки:
6
• язык определения данных (Data Definition Language или DDL),
предназначенный для добавления, модификации и удаления данных в
таблицах;
• язык модификации данных (Data Modification Language или DML),
предназначенный для добавления, модификации и удаления данных в
таблицах.
В синтаксических конструкциях при описании языка будут использоваться следующие соглашения. Нетерминальные элементы заключаются в угловые скобки <>. Необязательная конструкция заключается в
квадратные скобки []. Запись вида {A}… означает повторение конструкции А произвольное число раз (включая нулевое). Вертикальные разделители | читаются как “ИЛИ” и служат для выбора одной из конструкций,
заключенных в скобки.
Оператор SELECT
Оператор SELECT используется для запросов к базе данных и выборки результатов. Синтаксис оператора SELECT следующий:
<оператор SELECT>::=
SELECT [ALL | DISTINCT] <список выборки>
<табличное выражение>
ORDER BY <спецификация сортировки>]
<табличное выражение>::=
FROM <имя таблицы>[{,<имя таблицы>}…]
[WHERE <условие поиска>]
[GROUP BY <имя столбца> [{,<имя столбца>}…]
[HAVING <условие поиска>]
Если задано ключевое слово DISTINCT, то из результирующей
таблицы удаляются повторяющиеся строки. Список выборки определяет, какие столбцы должны быть возвращены в результирующую таблицу. Данный список представляет список арифметических выражений над
значениями столбцов таблиц из раздела FROM и констант. В простейшем случае он может быть, например, списком имен некоторых столбцов таблиц из раздела FROM. В случае, если вместо списка выборки
стоит звездочка (*), то выбираются все столбцы таблиц из раздела
FROM.
В разделе FROM определяются таблицы, из которых будут извлекаться данные. Следует отметить, что рядом с именем таблицы можно
указывать еще одно имя - синоним имени таблицы, который можно использовать в других разделах табличного выражения.
7
Раздел WHERE служит своего рода фильтром при отборе данных.
Выполнение раздела GROUP BY оператора выборки сводится к
разбиению результирующей таблицы на множество групп строк, которое
состоит из минимального числа таких групп, в которых для каждого
столбца из списка столбцов раздела GROUP BY во всех строках каждой
группы, включающей более одной строки, значения этого столбца совпадают.
Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска является истинным. Условие поиска
раздела HAVING задает условие на целую группу, а не на индивидуальные строки, поэтому в данном случае прямо можно использовать только
столбцы, указанные в качестве столбцов группирования в разделе
GROUP BY.
Раздел ORDER BY позволяет установить желаемый порядок просмотра результирующей таблицы. Спецификация сортировки имеет
следующий синтаксис:
<спецификация сортировки>::= {<целое без знака> | <имя столбца>} [ASC | DESC]
Как видно, фактически задается список столбцов, и для каждого
столбца указывается порядок просмотра строк результирующей таблицы в зависимости от значений этого столбца (ASC - по возрастанию
(умолчание), DESC - по убыванию). Указывать сортируемый столбец
можно по имени или по порядковому номеру в результирующей таблице.
Предикаты условия поиска
В условии поиска могут использоваться следующие предикаты:
предикат сравнения, предикат BETWEEN , предикат IN, предикат LIKE,
предикат NULL, предикат с квантором и предикат EXISTS.
Предикат IN определяется следующим образом:
<предикат
IN>::=
<выражение>
[NOT]
IN
(<значение>
[,<значение>...] | .<подзапрос>)
Значение предиката является истинным, когда значение левого
операнда совпадает хотя бы с одним значением списка правого операнда. Использование ключевого слова NOT осуществляет отрицание результата.
Подзапрос- это запрос, используемый в предикате условия поиска.
Результатом выполнения подзапроса является единственный столбец.
Предикат BETWEEN определяется следующим образом:
8
<предикат BETWEEN>::= <выражение> [NOT] BETWEEN <выражение> AND <выражение>
По определению результат x BETWEEN y AND z тот же самый, что
результат логического выражения x>=y AND x<=z.
Предикат LIKE имеет следующий синтаксис:
<предикат LIKE>::= <имя столбца> [NOT] LIKE <шаблон>[ESCAPE
<escape-символ>]
Значение предиката LIKE является истинным, если шаблон является подстрокой заданного столбца. При этом, если раздел ESCAPE отсутствует, то при составлении шаблона со строкой производится специальная интерпретация символов-заместителей шаблона: символ подчеркивания (“_”) обозначает любой одиночный символ, символ процента
(“%”) обозначает последовательность произвольных символов произвольной длины (может быть нулевой), парные квадратные скобки представляют любой символ, записанный в скобках. Если же раздел ESCAPE
присутствует и специфицирует некоторый одиночный символ x, то пары
символов “x_” и “x%” представляют одиночные символы “_” и “%” соответственно.
Предикат NULL описывается синтаксическим правилом:
<предикат NULL>::= <имя столбца> IS [NOT] NULL
Значение “x IS NULL” является истинным, когда значение x неопределено.
Предикат EXISTS имеет следующий синтаксис:
<предикат EXISTS>::= EXISTS <подзапрос>
Значение предиката является истинным, когда результат вычисления подзапроса не пуст.
Агрегатные функции
Агрегатные функции (функции множества) в запросе предназначены для вычисления некоторого значения для заданного множества
строк. Таким множеством строк может быть группа строк, если агрегатная функция применяется к сгруппированной таблице, или вся таблица.
В языке SQL определены следующие агрегатные функции:
• AVG - функция определения среднего значения;
• MAX - функция определения максимального значения;
• MIN - функция определения минимального значения;
• SUM - функция суммирования значений;
• COUNT - функция для подсчета числа строк или значений.
9
Грамматика агрегатных функций следующая:
<агрегатная функция>::= COUNT(*) | <distinct-функция> | <allфункция>
<distinct-функция>::= {AVG | COUNT | MAX | MIN | SUM} (DISTINCT
<имя столбца>)
<all-функция>::= {AVG | MAX | MIN | SUM} ([ALL]<выражение>)
Вычисление функции COUNT(*) производится путем подсчета числа строк в заданном множестве. Функция типа distinct выполняет вычисления только над одним столбцом, а в вычислениях используются только уникальные значения столбца. При использовании функции типа all
список значений формируется из значений арифметического выражения, вычисляемого для каждой строки заданного множества.
Операции реляционной алгебры
Большинство SQL-запросов требует одновременного обращения к
нескольким таблицам. Часто такого рода запросы основываются на операциях реляционной алгебры, в частности, соединения, декартова произведения, объединения, пересечения и разности.
При соединении двух таблиц по некоторому условию образуется
результирующая таблица, строки которой являются конкатенацией (сцеплением) строк первой и второй таблиц и удовлетворяют этому условию. Операцию соединения можно реализовать с использованием
обычного SQL-запроса типа SELECT-FROM-WHERE. По стандарту ANSI
операция соединения таблиц может указываться явно в разделе FROM.
Синтаксис раздела FROM в этом случае следующий:
<раздел FROM>::= FROM <имя таблицы> [JOIN <имя таблицы>
ON <условие соединения> ...]
При выполнении декартова произведения двух таблиц производится таблица, строки которой являются конкатенацией строк первой и второй таблиц. Операцию декартова произведения можно реализовать с
использованием SQL-запроса типа SELECT-FROM. По стандарту ANSI
операция декартова произведения может указываться явно в разделе
FROM с использованием ключевой фразы CROSS JOIN.
При выполнении операции объединения двух таблиц производится
таблица, включающая все строки, входящие хотя бы в одну из таблицоперандов. При этом число столбцов и типы данных этих столбцов
должны быть одинаковыми для всех операндов. Для объединения результирующих таблиц операторов SELECT используется ключевое слово UNION.
10
Операция пересечения двух таблиц производит таблицу, включающую все строки, входящие в обе исходные таблицы.
Таблица, являющаяся разностью двух таблиц, включает все строки, входящие в таблицу - первый операнд, такие, что ни одна из них не
входит в таблицу, являющуюся вторым операндом.
Работа с утилитой ISQL/w
Клиентская утилита ISQL/w используется для тестирования SQLзапросов. После запуска данной утилиты необходимо подключиться к
серверу. При этом в диалоговом окне подсоединения (connect dialog box)
необходимо указать имя сервера, идентификатор пользователя и пароль. После регистрации окно ISQL/w отображает в заголовке информацию о сервере, пользователе и текущей базе данных. Окно запросов при
этом открыто.
Пункты меню File управляют сохранением, чтением и печатью запросов, а также подключениями к серверам. Меню Edit позволяет копировать и искать строки. Меню Query управляет выполнением запросов и
предлагает доступ к некоторым общим установкам подключения. Пункты
меню Help и Window работают практически так же, как и в любом приложении Windows.
Кнопки панели инструментов (toolbar) дают те же возможности, что
и пункты меню, но при однократном нажатии отдельные кнопки особенно
удобны. Первая кнопка слева (кнопка Новый запрос) позволяет создать
новое окно запросов и новое подключение к данному серверу с использованием того же идентификатора пользователя и пароля. Кроме того,
оно позволяет автоматически использовать ту же базу данных, что и текущее подсоединение. Одновременные подсоединения удобны, поскольку они позволяют работать как два отдельных пользователя, тестируя блокировку и многопользовательское поведение, или дают возможность быстро посмотреть значение, необходимое для написания
сложного запроса в другом окне.
Другие полезные кнопки находятся справа от окна запросов. Крайняя левая кнопка из трех (перечеркнутая крестиком пиктограмма запроса) закрывает текущий запрос и подсоединение. Именно таким образом
отменяется действие кнопки “Новый запрос”.
Вторая кнопка с указывающей направо стрелкой становится зеленой, когда вводится любой текст в текстовой области окна запросов. Эта
кнопка выполнения. При нажатии ее по окончании ввода запроса, текст
запроса будет передан на сервер. Кнопка будет серой, когда в окне нет
или когда запрос уже выполняется.
11
Третья кнопка - это квадрат, имеющий красный цвет, когда запрос
выполняется. Это кнопка отмены запроса.
Текстовая область может использоваться для ввода запроса, просмотра результата выполнения запроса, просмотра статистики вводавывода при выполнении запроса, а также для просмотра плана запроса
(?). Для перехода к указанным режимам использования текстовой области необходимо выбрать закладки Query, Results, Statistics I/O и
Showplan, соответственно.
Вызвать утилиту ISQL/w можно запустив загрузочный модуль
isqlw.exe. Необходимыми динамическими библиотеками при работе утилиты являются: ntdblib.dll, sqlgui32.dll, sqlsvc32.dll и sqlqry32.dll.
Кроме того, вызвать утилиту ISQL/w можно работая с интегрированной утилитой SQL Enterprise Manager. Для этого необходимо выбрать
пункт Query Tool меню Tools.
Описание задания
База данных книготорговой компании
Рассмотрим простую предметную область жизнедеятельности,
связанную с книгоизданием и маркетингом. В рамках данной предметной
области существуют издатели, которые публикуют книги, авторы, которые книги пишут, и издания (сами книги). Разработана база данных pubs,
определяющая описанную выше предметную область. Инфологическая
модель предметной области с использованием диаграмм “сущностьсвязь” (ER-диаграмм) [1]), разработанных Ченом, представлена на рис.
1.
12
На данном рисунке прямоугольниками обозначены типы сущностей
(объектов), а ромбами - типы связей между сущностями. Атрибуты сущностей указаны мелким шрифтом в том же прямоугольнике, который
отображает типы сущностей. Имя типа сущности отмечено в верхней
части прямоугольника жирным шрифтом. Атрибуты связей в данном
случае обозначены овалами. Как видно из рис. 1 у связи “Написана”
имеется два атрибута: первый атрибут определяет порядок автора в названии книги, второй атрибут - гонорар автора книги.
АВТОР
КНИГА
Идентификатор
автора
Фамилия
Имя
Телефон
Адрес
Город
Штат
Энергичность
Контракт
Идентификатор
книги
Название
Тип
Идентификатор
издательства
Цена
Аванс
Гонорар
Число продаж
Замечания
Дата
опубликования
Написана
1
2
ИЗДАТЕЛЬСТВО
Издана
Идентификатор
издательства
Название
Город
Штат
Страна
Рис. 1
База данных книготорговой компании (база данных pubs) включает
три таблицы, определяющие сущности: таблица authors определяет авторов, таблица publishers - издателей, а таблица titles - сами книги. Четвертая таблица titleauthor задает отношение между таблицами titles и
authors. Она показывает, какие авторы написали какие книги. Связь между таблицами titiles и publishers определяется столбцом pub_id в данных таблицах.
Ниже представлены структуры используемых таблиц.
Структура таблицы authors
Имя столбца
Тип данных
Размерность
Возможность зна-
13
Содержательное описание
au_id
au_lname
au_fname
phone
address
city
state
zip
contract
varchar
varchar
varchar
char
varchar
varchar
char
char
bit
11
40
20
12
40
20
2
5
1
чений null
Нет
Нет
Нет
Нет
Да
Да
Да
Да
Нет
Идентификатор автора
Фамилия автора
Имя автора
Номер телефона
Адрес (улица, дом, квартира)
Город проживания
Штат проживания
Энергичность
Наличие контракта
Структура таблицы publishers
Имя столбца
Тип данных
Размерност
ь
pub_id
char
4
pub_name
city
state
country
varchar
varchar
char
varchar
40
20
2
30
ВозСодержательное описание
можность
значений
null
Нет
Идентификатор издательства (издателя)
Да
Название издательства (имя издателя)
Да
Город
Да
Штат
Да
Страна
Структура таблицы titles
Имя столбца
Тип данных
title_id
title
type
pub_id
price
advance
varchar
varchar
char
char
money
money
Размер- Возможность
ность
значений
null
6
Нет
80
Нет
12
Нет
4
Да
8
Да
8
Да
royalty
ytd_sales
int
int
4
4
Да
Да
14
Содержательное описание
Идентификатор книги
Название книги
Тип книги
Идентификатор издательства
Цена
Аванс (стоимость предварительной продажи)
Гонорар
Число книг, проданных в теку-
notes
pubdate
varchar
datetime
200
8
Да
Нет
щем году
Замечания
Дата опубликования
Структура таблицы titleauthor
Имя столбца
Тип данных
Размерность
Возможность
значений null
Содержательное описание
au_id
title_id
au_ord
royaltyper
varchar
varchar
tinyint
int
11
6
1
4
Нет
Нет
Да
Да
Идентификатор автора книги
Идентификатор книги
Порядок автора в названии книги
Авторский гонорар
В столбце type таблицы titles используются следующие типы книг:
business - книги по бизнесу, mod_cook - книги по современной кулинарии, popular_comp - книги по компьютерной тематике, psychology - книги
по психологии, trad_cook - книги по традиционной кулинарии,
UNDECIDED - неопределенный тип книги.
В столбцах state таблиц authors и publishers используются следующие обозначения административных единиц США: CA - штат Калифорния, DC - округ Колумбия, IL - штат Иллинойс, IN - штат Индиана, KS
-штат Канзас, MD - штат Мэриленд, MA - штат Массачусетс, MI - штат
Мичиган, NY - штат Нью-Йорк, OR - штат Орегон, TN - штат Теннесси, TX
- штатТехас, UT - штат Юта.
В столбце country таблицы publishers используются следующие
обозначения стран: France - Франция, Germany - Германия, USA - США.
Домен городов, используемый в таблицах authors и publishers,
включает города Ann Arbor, Berkeley, Boston, Chicago, Corvallis, Colevo,
Dallas, Gary, Lawrence, Menlo Park, Munchen, Nashville, New York, Oakland, Palo Alto, Paris, Rockville, Salt Lake City, San Francisco, San Jose,
Vacaville, Walnul Creek, Washington.
В приложении 1 приведен полный пример базы данных pubs.
Лабораторные задания типа А
Дать содержательную интерпретацию SQL-запросам, выполнить их
на SQL-сервере с использованием клиентских утилит ISQL/w или SQL-
15
EM, дать содержательную интерпретацию результатам выполнения
SQL-запросов.
1) SELECT au_lname, au_fname
FROM authors
2) SELECT au_lname, au_fname
FROM authors
ORDER BY au_lname
3) SELECT au_lname, au_fname
FROM authors
ORDER BY au_lname, au_fname
4) SELECT title_id, price, ytd_sales,
price*ytd_sales “ytd dollar sales”
FROM titles
ORDER BY price*ytd_sales
5) SELECT title_id, price, ytd_sales,
price*ytd_sales “ytd dollar sales”
FROM titles
ORDER BY price*ytd_sales DESC
6) SELECT title_id, type, ytd_sales
FROM titles
ORDER BY type ASC, ytd_sales DESC
7) SELECT AVG(price)
FROM titles
8) SELECT DISTINCT type
FROM titles
ORDER BY type ACS
9) SELECT DISTINCT city
FROM authors
16
ORDER BY city DESC
10) SELECT DISTINCT state
FROM authors
ORDER BY state
11) SELECT DISTINCT country
FROM publishers
ORDER BY country DESC
12) SELECT AVG(price), AVG(DISTINCT price)
FROM titles
13) SELECT *
FROM titles
14) SELECT au_lname, au_fname
FROM authors
WHERE state= “CA”
15) SELECT type, title_id, price
FROM titles
WHERE price*ytd_sales < advance
16) SELECT au_id, city, state
FROM authors
WHERE state= “CA” OR city= “Palo Alto”
17) SELECT title_id, price
FROM titles
WHERE price between $5 AND $15
18) SELECT title_id, price
FROM titles
WHERE type IN (“mod_cook”, “trad_cook”, “business”)
17
19) SELECT au_lname, au_fname, city, state
FROM authors
WHERE city like “San%”
20) SELECT type, title_id, price
FROM titles
WHERE title_id like “B_2075”
21) SELECT type, title_id, price
FROM titles
WHERE title_id like “B[AUN]7832”
22) SELECT AVG(price) “AVG”
FROM titles
WHERE type= “business”
23) SELECT AVG(price) “avg” SUM(price) “sum”
FROM titles
WHERE type IN (“business”, “mod_cook”)
24) SELECT COUNT(*)
FROM authors
WHERE state= “CA”
25) SELECT COUNT(*)
FROM titles
WHERE LIKE “Co%s”
26) SELECT title
FROM titles
WHERE ytd_sales IS NULL
27) SELECT au_lname “Фамилия”, au_fname “Имя”
FROM authors
WHERE contract=1 AND phone LIKE “408____-__2_”
18
28) SELECT phone
FROM authors
WHERE address LIKE “%Broadway Av.%”
29) SELECT title, pubdate
FROM titles
WHERE pubdate>= “Jun 9 1991 12:00AM”
AND pubdate< “6/16/91”
30) SELECT type, AVG(price) “avg”, SUM(price) “sum”
FROM titles
WHERE type IN (“business”, “psychology”)
GROUP BY type
31) SELECT type, pub_id, AVG(price) “avg”, SUM(price) “sum”
FROM titles
WHERE type IN (“business”, “mod_cook”)
GROUP BY type, pub_id
32) SELECT type, AVG(price)
FROM titles
WHERE price>$11
GROUP BY type
HAVING AVG(price)>$19.7
33) SELECT au_id, COUNT(*)
FROM authors
GROUP BY au_id
HAVING COUNT(*)>1
34) SELECT type, MIN(price), MAX(price)
FROM titles
GROP BY type
ORDER BY type
35) SELECT type, MIN(price), MAX(price)
19
FROM titles
GROUP BY type
HAVING MAX(price)-MIN(price)>=3
36) SELECT state, COUNT(DISTINCT pub_id)
FROM publishers
GROUP BY state
37) SELECT pub_name, AVG(price) “ävg”,
COUNT(DISTINCT title_id) “count”
FROM titles t JOIN publishers p ON t.pub_id=p.pub_id
GROUP BY pub_name
38) SELECT type, (MIN(price)+MIN(price))/2, AVG(price)
FROM titles
GROUP BY type
HAVING type<> “UNDECIDED”
ORDER BY 2 DESC
39) SELECT type, MIN(pubdate), MAX(pubdate)
FROM titles
GROUP BY type
40) SELECT title, pub_name
FROM titles CROSS JOIN publishers
41) SELECT *
FROM titles, publishers
42) SELECT title, pub_name
FROM titles, publishers
WHERE titles.pub_id=publishers.pub_id
43) SELECT title, pub_name
FROM titles JOIN publishers
ON titles.pub_id=publishers.pub_id
20
44) SELECT *
FROM titles t, publishers p
WHERE t.pub_id=p.pub_id
45) SELECT t.*, pub_name
FROM titles t, publishers p
WHERE t.pub_id=p.pub_id
46) SELECT a.city, a.state
FROM authors a, publishers p
WHERE a.city=p.city AND a.state=p.state
47) SELECT au_lname, au_fname
FROM authors a JOIN titleauthor ON a.au_id=ta.au_id
JOIN titles t ON ta.title_id=t.title_id
WHERE au_lname LIKE “R%”
AND state IN (“CA”, “TX”, “NY”, “OR”, “UT”)
AND (title LIKE “_h_ %” OR title LIKE “% _h_ %”
OR title LIKE “% _h_”)
48) SELECT title, type
FROM authors a, titles t, titleauthor ta, publishers p
WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id
AND t.pub_id=p.pub_id AND p.city=a.city
49) SELECT au_lname, au_fname, title
FROM authors a, titles t, titleauthor ta, publishers p
WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id
AND t.pub_id=p.pub_id
AND ((p.country= ‘USA’ AND t.type=’popular_comp’)
OR (p.country=’France’ AND t.type=’psychology’))
50) SELECT au_lname, au_fname, city
FROM authors a, titles t, titleauthor ta
WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id
21
AND (city LIKE “[CPR]%” OR city LIKE “%San%”)
AND (title LIKE “% the %” OR title LIKE “The %”
OR title LIKE “% a %” OR title LIKE “A %”)
51) SELECT DISTINCT au_lname, au_fname
FROM authors a JOIN titleauthor ta ON a.au_id=ta.au_id
JOIN titles t ON ta.title_id=t.title_id
JOIN publishers p ON p.pub_id=t.pub_id
WHERE p.state= “CA”
ORDER BY au_lname, au_fname
52) SELECT pub_name
FROM publishers p JOIN titles t ON p.pub_id=t.pub_id
WHERE $15>price AND type= “psychology”
ORDER BY pub_name
53) SELECT pub_name, AVG(price)
FROM titles t, publishers p
WHERE t.pub_id=p.pub_id
GROUP BY pub_name
54) SELECT pub_name, AVG(price)
FROM titles t JOIN publishers p ON t.pub_id=p.pub_id
GROUP BY pub_name
55) SELECT au_lname, au_fname, title
FROM authors a, titles t, titleauthor ta
WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id
AND type= “popular_comp”
56) SELECT au_lname, au_fname, title
FROM authors a JOIN titleauthor ta ON a.au_id=ta.au_id
JOIN titles t ON ta.title_id=t.title_id
WHERE type= “psychology”
57) SELECT au_lname, au_fname, pub_name, COUNT(*)
FROM authors a, titles t, titleauthor ta, publishers p
22
WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id
AND t.pub_id=p.pub_id
GROUP BY au_lname, au_fname, pub_name
58) SELECT MIN(price)
FROM titles t, publishers p
WHERE t.pub_id=p.pub_id
GROUP BY country
HAVING country=’USA’
59) SELECT pub_name, COUNT(*)
FROM titles t, publishers p
WHERE t.pub_id=p.pub_id
AND (type= ‘mod_cook’ OR type=’trad_cook’)
GROUP BY pub_name
60) SELECT pub_name, COUNT(*)
FROM publishers p, titles t
WHERE p.pub_id=t.pub_id AND price>$15
GROUP BY pub_name
ORDER BY pub_name DESC
61) SELECT title, COUNT(DISTINCT a.au_id)
FROM titles t JOIN titleauthor ta ON t.title_id=ta.title_id
JOIN authors a ON ta.au_id=a.au_id
JOIN publishers p ON p.pub_id=t.pub_id
GROUP BY title
62) SELECT state, COUNT(DISTINCT p.pub_id)
FROM publishers p JOIN titles t ON p.pub_id=t.pub_id
GROUP BY state
63) SELECT title
FROM titles
WHERE pub_id=
(SELECT pub_id
23
FROM publishers
WHERE pub_name= “Binnet & Hardley”)
64) SELECT pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type= “business”)
65) SELECT pub_name
FROM publishers p
WHERE EXISTS
(SELECT *
FROM titles t
WHERE p.pub_id=t.pub_id
AND type=“popular_comp”)
66) SELECT pub_name
FROM publishers p
WHERE NOT EXISTS
(SELECT *
FROM titles t
WHERE p.pub_id=t.pub_id
AND type=“mod_cook”)
67) SELECT pub_name
FROM publishers
WHERE pub_id NOT IN
(SELECT pub_id
FROM titles
WHERE type=“psychology”)
68) SELECT type, price
FROM titles
WHERE price < (SELECT AVG(price) FROM titles)
24
69) SELECT type, AVG(price)
FROM titles
GROUP BY type
HAVING AVG(price) < (SELECT AVG(price) FROM titles)
70) SELECT DISTINCT a.city, a.state
FROM authors a
WHERE NOT EXISTS
(SELECT *
FROM publishers p
WHERE a.city=p.city AND a.state=p.state)
71) SELECT DISTINCT p.city, p.state
FROM publishers p
WHERE NOT EXISTS
(SELECT *
FROM authors a
WHERE p.city=a.city AND p.state=a.state)
72) SELECT MIN(price)
FROM titles t
WHERE t.pub_id IN
(SELECT pub_id
FROM publishers
WHERE country=’USA’)
73) SELECT title, type, price
FROM titles
WHERE price>ALL
(SELECT price
FROM titles
WHERE type= “psychology”)
74) SELECT COUNT(DISTINCT city)
FROM publishers
25
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type= “psychology”)
75) SELECT pub_name
FROM publishers p
WHERE 15>SOME
(SELECT price
FROM titles t
WHERE p.pub_id=t.pub_id
AND type= “trad_cook”)
76) SELECT pub_name, state
FROM publishers
WHERE pub_id NOT IN
(SELECT pub_id
FROM titles)
77) SELECT title
FROM titles
WHERE pub_id NOT IN
(SELECT pub_id
FROM publishers)
78) SELECT title
FROM titles t
WHERE price>=
(SELECT AVG(price)
FROM titles tt, publishers pp
GROUP BY pub_id
HAVING t.pub_id=pp.pub_id)
79) SELECT au_lname, au_fname, price
FROM authors a, titles t, titleauthor ta, publishers p
WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id
26
AND t.pub_id=p.pub_id AND country=’USA’
AND price=
(SELECT MIN(price)
FROM titles tt, publishers pp
WHERE tt.pub_id=pp.pub_id
GROUP BY country
HAVING country=’USA’)
80) SELECT DISTINCT au_lname, au_fname
FROM authors a, titles t, titleauthor ta
WHERE a.au_id=ta.au_id AND ta.title_id IN
(SELECT title_id
FROM titles
WHERE ytd_sales=
(SELECT MAX(ytd_sales)
FROM titles))
81) SELECT DISTINCT a.city, a.state
FROM authors a
WHERE NOT EXISTS
(SELECT *
FROM publishers p
WHERE a.city=p.city AND a.state=p.state)
UNION SELECT DISTINCT p.city, p.state
FROM publishers p
WHERE NOT EXISTS
(SELECT *
FROM authors a
WHERE p.city=a.city AND p.state=a.state)
82) SELECT title, price
FROM titles t JOIN publishers p ON t.pub_id=p.pub_id
WHERE p.country= “USA” AND t.price=
(SELECT MAX(price)
FROM titles tt JOIN publishers pp
ON tt.pub_id=pp.pub_id
27
WHERE country= “USA”)
83) SELECT pub_name, COUNT(*)
FROM titles t, publishers p
WHERE t.pub_id=p.pub_id
GROUP BY pub_name
HAVING COUNT(*)>=ALL
(SELECT COUNT(*)
FROM titles tt, publishers pp
WHERE tt.pub.id=pp.pub_id
GROUP BY pub_name)
84) SELECT pub_name, city, state, country
FROM publishers p
WHERE EXISTS
(SELECT *
FROM titles t
WHERE t.pub_id=p.pub_id)
AND 20>ALL
(SELECT price
FROM titles t
WHERE t.pub_id=p.pub_id
AND price IS NOT NULL)
85) SELECT state, SUM(price)
FROM titles t, publishers p
WHERE t.pub_id=p.pub_id
GROUP BY state
HAVING state NOT IN (“TN”, “MA”, “TX”)
AND SUM(price)>
(SELECT SUM(price)
FROM titles tt, publishers pp
WHERE tt.pub.id=pp.pub_id
AND pp.city= “Boston”)
86) SELECT pub_name, MIN(price)
28
FROM titles t, publishers p
WHERE t.pub_id=p.pub_id
GROUP BY pub_name
HAVING MIN(price)>=ALL
(SELECT MIN(price)
FROM titles tt JOIN publishers pp
ON tt.pub_id=pp.pub_id
GROUP BY pub_name)
87) SELECT *
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type= “psychology” AND pub_id IN
(SELECT pub_id
FROM publishers
WHERE country= “USA”
AND state<> “CA”)
88) SELECT au_lname, au_fname
FROM authors a
WHERE a.au_id IN
(SELECT au_id
FROM titleauthor ta
WHERE ta.title_id IN
(SELECT title_id
FROM titles t
WHERE “CA”=SOME
(SELECT state
FROM publishers p
WHERE p.pub_id=t.pub_id)))
ORDER BY au_lname, au_fname
89) SELECT state, COUNT(*)
FROM publishers p
29
WHERE EXISTS
(SELECT *
FROM titles t
WHERE p.pub_id=t.pub_id)
AND $22>ALL
(SELECT price
FROM titles t
WHERE p.pub_id=t.pub_id
AND price IS NOT NULL)
GROUP BY state
ORDER BY state ASC
90) SELECT state
FROM publishers p1
GROUP BY state
HAVING COUNT(DISTINCT pub_name)=
(SELECT COUNT(*)
FROM publishers p2
WHERE EXISTS
(SELECT *
FROM titles t
WHERE p2.pub_id=t.pub_id)
AND $22.5>ALL
(SELECT price
FROM titles t
WHERE p2.pub_id=t.pub_id
AND price IS NOT NULL)
GROUP BY state
HAVING p1.state=p2.state)
91) SELECT p1.pub_id
FROM titles t1, publishers p1
WHERE t1.pub_id=p1.pub_id
GROUP BY p1.pub_id
HAVING COUNT(DISTINCT title)=
(SELECT COUNT(*)
30
FROM titles t2
WHERE t2.pub_id=p1.pub_id
AND EXISTS
(SELECT *
FROM titleauthor ta3, authors a3
WHERE ta3.au_id=a3.au_id
AND ta3.title_id=t2.title_id
AND a3.state IN
(SELECT state
FROM publishers p4
WHERE “business”=SOME
(SELECT type
FROM titles t5
WHERE p4.pub_id=
t5.pub_id))))
92) SELECT city, state
FROM authors
UNION SELECT city, state
FROM publishers
ORDER BY state, sity
93) SELECT city
FROM authors
UNION SELECT city
FROM publishers
94) SELECT state
FROM authors
UNION SELECT state
FROM publishers
95) SELECT city, state
FROM authors
WHERE state IS NOT NULL
UNION SELECT city, state
31
FROM publishers
WHERE state IS NOT NULL
ORDER BY city DESC, state ASC
96) SELECT state, MIN(price), MAX(price), AVG(price)
FROM authors a, titles t, titleauthor ta
WHERE ta.title_id=t.title_id AND a.au_id=ta.au_id
GROUP BY state
HAVING state<> “CA”
Лабораторные задания типа B
Составить SQL-запросы по их заданному содержательному описанию, выполнить SQL-запросы на SQL-сервере с использованием клиентских утилит ISQL/w или SQL-EM, проинтерпретировать результаты
выполнения запросов.
1) Выбрать имена и фамилии авторов книг.
2) Выбрать имена и фамилии авторов, проживающих в Калифорнии.
3) Выбрать информацию о книгах, объеме (стоимость) продаж которых в текущем году меньше стоимости предварительной продажи.
Информация о книгах должна включать тип книги, идентификатор и цену
книги.
4) Выбрать информацию об авторах, проживающих в штате Калифорния или в городе Salt Lake City. Информация об авторах должна
включать идентификатор автора, город и штат проживания.
5) Выбрать все идентификаторы и цены книг, причем цена книги
должна лежать в диапазоне от 5 до 10 долларов. В SQL запросе использовать предикат BETWEEN.
6) Выбрать все идентификаторы и цены книг по современной и
традиционной кулинарии и по бизнесу. В запросе использовать предикат
IN.
7) Выбрать информацию об авторах, проживающих в городах, название которых начинается со строки “spring”. Информация об авторах
должна включать имя и фамилию автора, а также штат и город проживания.
32
8) Выбрать информацию о книгах, идентификаторы которых начинаются буквой “B”, а кончаются строкой “1342”. Информация о книгах
должна включать тип, идентификатор и цену книги.
9) Выбрать информацию о книгах, идентификаторы которых начинаются буквой “B”, заканчиваются строкой “1342”, а вторым символом
идентификатора являются буквы “A”, “U” или “N”. Информация о книгах
должна включать тип, идентификатор и цену книги.
10) Выбрать имена и фамилии всех авторов, упорядоченные по
возрастанию фамилий авторов.
11) Выбрать имена и фамилии всех авторов, упорядоченные в
первую очередь по возрастанию фамилий и, во вторую очередь, по возрастанию имен.
12) Выбрать информацию о книгах, упорядоченную по возрастанию
объема продаж (по стоимости). Информация о книгах должна включать
идентификатор, цену, объем продаж (по количеству) и объем продаж (по
стоимости).
13) То же, что 12, но использовать упорядочение по убыванию.
14) Выбрать информацию о всех книгах, упорядоченную по убыванию типа книги и числа проданных книг. Информация о книгах должна
включать идентификатор и тип книги, а также число проданных книг.
15) Определить среднюю цену книги.
16) Определить среднюю цену книг по бизнесу.
17) Определить среднюю цену и стоимость всех книг по бизнесу и
современной кулинарии
18) Определить число авторов, проживающих в Калифорнии.
19) Определить среднюю цену и сумму цен на книги по бизнесу и
современной кулинарии отдельно для каждого типа книги.
20) Определить среднюю цену и сумму цен на книги по бизнесу и
современной кулинарии для каждой комбинации типа книги и идентификатора издателя.
21) Выбрать те типы книг, средняя цена дорогих экземпляров
(стоимостью более 10 долларов) которых превышает 20 долларов. В
выбираемые данные помимо типа книги включить и среднюю цену дорогих экземпляров.
22) Подсчитать число строк в таблице authors, включающих одинаковые идентификаторы авторов. В выбираемые данные включить идентификатор автора и соответствующее ему число повторяющихся строк.
23) Выбрать названия книг и имена выпустивших их издателей.
24) То же, что и 23, но в разделе FROM запроса использовать операцию соединения JOIN.
33
25) Произвести проекцию на столбцы title и pub_name декартова
произведения таблиц titles и publishers.
26) Определить среднюю цену выпускаемых каждым издателем
книг. В выбираемые данные включить имя издателя и среднюю цену
книги.
27) То же, что и 26, но в разделе FROM запроса использовать операцию соединения JOIN.
28) Определить, кто из авторов написал какую книгу по психологии.
В выбираемые данные включить имя и фамилию автора, а также название книги.
29) То же, что и 28, но в разделе FROM запроса использовать операцию соединению JOIN.
30) Выбрать все столбцы результата эквисоединения таблиц titles
publishers по идентификатору издателя.
31) Выбрать все столбцы таблицы titles и столбец pub_name таблицы publishers результата эквисоединения данных таблиц по идентификатору издателя.
32) Выбрать все книги издательства Algodata Infosysytems. В запросе использовать подзапрос для определения нужного идентификатора издателя. В условии поиска использовать предикат “=”. В выбираемые данные включить название книги.
33) Выбрать всех издателей литературы по бизнесу. В запросе использовать подзапрос для выборки нужных идентификаторов издателей.
В условии поиска использовать предикат IN. В выбираемые данные
включить имя издателя.
34) Выбрать всех издателей литературы по бизнесу. В запросе использовать подзапрос, формирующий промежуточную таблицу, в которую включаются те строки из таблицы titles, которые могут “эквисоединиться” по идентификатору издателя со строками из таблицы publishers и которые представляют тип книг по бизнесу. В условии поиска
основного запроса использовать предикат EXISTS. В выбираемые данные включить имя издателя.
35) Выбрать издателей, не выпускающих книг по бизнесу. Дополнительные условия формирования запроса взять из варианта 34.
36) Выбрать издателей, не выпускающих книг по бизнесу. Дополнительные условия формирования запроса взять из варианта 33.
37) Выбрать тип и цену для всех книг, цена которых не превышает
средней. В запросе использовать подзапрос, определяющий среднюю
цену книг.
34
38) Выбрать тип и среднюю цену книг данного типа, причем эта
средняя цена должна быть меньше средней цены всех книг. В запросе
использовать подзапрос, определяющий среднюю цену всех книг.
39) Определить города и штаты проживания каждого из авторов и
издателей в виде одной результирующей таблицы.
40) Определить все типы книг. Типы книг в результирующей таблице не должны повторяться. Вывести типы книг в порядке возрастания.
41) Определить все города, в которых проживают авторы. Названия городов в результирующей таблице не должны повторяться. Вывести названия городов в порядке убывания.
42) Определить все штаты, в которых проживают авторы. Названия
штатов в результирующей таблице не должны повторяться. Вывести названия штатов в порядке возрастания.
43) Определить страны, в которых расположены издательства
книг. Названия стран в результирующей таблице не должны повторяться. Вывести названия стран в порядке убывания.
44) Определить все города, в которых проживают авторы и находятся издательства. Названия городов в результирующей таблице не
должны повторяться. Вывести названия городов в порядке возрастания.
45) Определить все штаты, в которых проживают авторы и находятся издательства. Названия штатов в результирующей таблице не
должны повторяться. Вывести названия штатов в порядке убывания.
46) Определить города и штаты совместного проживания авторов и
издателей. (В запросе неявно реализуется операцию пересечения).
47) Определить города и штаты проживания авторов, в которых
нет издательств. (В запросе неявно реализуется операция разности).
48) Определить города и штаты нахождения издательств, в которых не проживают авторы. (В запросе неявно реализуется операция
разности).
49) Определить, какой город в каком штате находится. Вывести названия городов в порядке возрастания.
50) Определить число книг, название которых начинается со строки “The” и заканчивается буквой “e”.
51) Определить авторов на букву “G”, проживающих в штатах Теннесси, Иллинойс, Канзас, Орегон или Калифорния, которые опубликовали книги, в которых есть слово из трех букв, причем средней буквой является буква “a”.
52) Определить минимальную, максимальную и среднюю цену для
каждого из типов книг. Выводимые данные должны быть упорядочены по
убыванию типа книг.
35
53) Определить минимальную и максимальную цену для каждого
из типов книг. В результирующую таблицу не включать те типы книг, для
которых разность между максимальной и средней ценой меньше 7 долларов.
54) Вычислить среднюю цену всех книг и медиану цены. Под медианой понимается среднее значение всех различных цен всех книг.
55) Определить, какие авторы в каких издательствах опубликовали
сколько книг.
56) Определить книги, авторы и издатели которых живут в одном
городе.
57) Определить для каждого штата минимальную, максимальную и
среднюю цену книг авторов, проживающих в одном штате (кроме штата
Калифорния).
58) Определить, какие авторы опубликовали какие книги в США по
традиционной кулинарии или в Германии по компьютерам.
59) Найти цену самой дешевой книги (книг), вышедшей в США. В
запросе использовать операцию группирования.
60) Найти авторов самых дорогих книг, вышедших в США. В запросе использовать подзапрос и операцию группирования.
61) Найти авторов, у которых вышли самые нераспродаваемые
книги.
62) Найти цену самой дорогой книги (книг), вышедшей в США. В
запросе использовать подзапрос.
63) Определить число книг по компьютерам, выпущенных каждым
издательством.
64) Определить авторов из городов, начинающихся с букв “A”, “B”
или “C” или имеющих в своем составе слово “Salt”, и написавших книги,
в названии которых есть определенный или неопределенный артикль
английского языка.
65) Определить города и штаты проживания авторов и издателей,
за исключением городов и штатов их совместного проживания. (В запросе неявно реализуется операция симметрической разности).
66) Определить названия и цену самых дешевых книг, вышедших в
США. (Самые дешевые книги имеют минимальную цену).
67) Определить издательство, в котором опубликовано меньше
всего книг.
68) Найти книги, цена которых меньше цены каждой из книг по традиционной кулинарии.
36
69) Определить местонахождение издательств, цена каждой книги
которых меньше 22 долларов. В запросе использовать подзапросы и
предикат с квантором.
70) Определить штаты (кроме штатов Индиана, Канзас, Юта), в которых сумма цен выпущенных в них книг больше суммы цен книг, выпущенных в городе Вашингтон.
71) Найти издательство, выпустившее свою самую дорогую книгу с
наиболее низкой ценой среди всех издательств. В запросе использовать
подзапрос, определяющий максимальные цены книг, выпущенные каждым издательством.
72) Определить полную информацию об издателях книг по компьютерам, авторы которых живут в США (за исключением штата Юта). В
запросе использовать подзапросы.
73) Определить книги, стоимости которых составляют не более
средней стоимости по издательству, где издавались эти книги.
74) Определить для каждого штата число находящихся в нем издательств.
75) Определить число городов, в которых выпускается литература
по компьютерам. В запросе использовать подзапрос.
76) Определить авторов, хотя бы одна книга которых была опубликована в штате Массачусетс. В запросе использовать подзапросы и предикат с квантором.
77) Найти издательства, среди изданных книг которых найдется
хоть одна книга по компьютерам стоимостью более двух долларов. В
запросе использовать подзапрос и предикат с квантором.
78) Определить штаты, во всех издательствах которых все изданные книги имеют цену более 10 долларов. В запросе использовать подзапросы и предикат с квантором.
79) Определить издательства, для каждой книги которых выполняется условие: “Если книга выпущена в данном издательстве, то хотя бы
один из авторов книги проживает в штате, в котором находится издательство, некоторые выпущенные книги которого посвящены компьютерам”.
80) Выбрать все столбцы таблицы titles.
81) Выбрать все столбцы декартова произведения таблиц titles и
publishers.
82) Определить книги, число продаж для которых неопределено.
83) Определить минимальную и максимальную цену книг, выпущенных издательствами.
37
84) Определить авторов, хотя бы одна книга которых была опубликована в штате Массачусетс. В запросе не использовать предикаты с
квантором.
85) Найти издательства, среди изданных книг которых найдется
хоть одна книга по традиционной кулинарии стоимостью от 12 до 16
долларов. В запросе не использовать предикаты с квантором.
86) Определить для каждого издательства число изданных им дешевых книг (ценой менее 13 долларов).
87) Определить для штатов число издательств, в которых выпускаются только книги ценой более 7 долларов. В запросе использовать
подзапросы и предикат с квантором.
88) Определить, сколько авторов имеет каждая изданная книга.
89) Определить штаты и число находящихся в них издательств,
выпустивших книги.
90) Определить издательства, не выпустившие книг.
91) Определить неопубликованные в издательствах книги.
92) Определить авторов, работающих по контракту и имеющих телефон с кодом города 415 (первые три цифры номера телефона).
93) Определить номера телефонов авторов, проживающих на
Седьмой Авеню (Seventh Av.)
94) Определить книги, выпущенные в период с 1 июля 1991 г. по 30
октября 1991 г. (По умолчанию сервер работает с датами в формате
xx/yy/zz как с последовательностями месяц/день/год).
95) Вычислить для каждого типа книг среднее арифметическое минимальной и максимальной цены. Результат упорядочить по убыванию
значений.
96) Определить временные интервалы, в рамках которых опубликованы книги разных типов.
Примечания: 1. При упорядочении фамилий и имен авторов, городов, штатов, типов книг используется лексикографический порядок.2.
“Издатель” и “издательство” являются в данном случае синонимами.
Соответственно этому синонимами являются “имя издателя” и “название
издательства”.
Варианты лабораторных заданий
Номер варианта
1
2
Задание типа A
1,13,25,32,49,73,81,96
2,14,26,38,50,62,63,86
Задание типа B
9,25,29,31,42,53,66,77
8,28,30,41,48,49,52,60
38
3
4
5
6
7
8
9
10
11
12
3,15,27,39,51,61,64,90
4,16,28,37,46,59,65,91
5,17,29,41,57,66,84,92
6,18,30,42,58,67,83,93
8,19,31,52,53,70,80,94
9,20,34,44,55,71,79,95
10,21,35,40,45,56,75,82
11,22,33,47,68,72,77,88
7,24,36,43,69,76,78,89
12,23,48,54,60,74,85,87
7,20,26,40,45,47,61,85
17,27,54,56,70,72,75,86
15,18,24,38,73,74,87,90
16,22,37,43,51,62,76,91
3,11,33,78,84,88,92,96
2,10,32,64,71,82,89,95
1,21,50,57,58,65,68,80
6,14,19,23,36,44,59,67
5,13,35,39,55,69,81,94
4,12,34,46,63,79,83,93
Лабораторная работа N 2
Создание, модификация и удаление объектов базы
данных с использованием SQL
Цель работы: изучить языки определения и манипулирования
данными SQL, получить практические навыки составления SQLзапросов для работы с таблицами, индексами, представлениями и курсорами, а также их выполнения на SQL-сервере с использованием клиентских утилит.
Порядок выполнения работы
Изучение языка баз данных
1. Изучить язык определения данных SQL, включая операторы
создания таблиц (CREATE TABLE), создания представлений (CREATE
VIEW), модификации таблиц (ALTER TABLE), удаления таблиц (DROP
TABLE), удаления представлений (DROP VIEW), а также операторы создания индексов (CREATE INDEX) и удаления индексов (DROP INDEX).
Изучить типы ограничений и способы их представления на языке SQL.
2. Изучить операторы манипулирования данными, связанные с
курсором, включая оператор объявления курсора (DECLARE CURSOR),
оператор открытия курсора (OPEN), оператор чтения очередной строки
курсора (FETCH), оператор позиционного удаления (DELETE), оператор
позиционной модификации (UPDATE), оператор закрытия курсора
(CLOSE).
39
3. Изучить одиночные операторы манипулирования данными,
включая) операторы поискового удаления (DELETE) и поисковой модификации (UPDATE), а также оператор включения (INSERT).
4. Изучить интегрированную утилиту SQL Enterprise Manager, а
также системные хранимые процедуры с точки зрения их использования
для просмотра объектов базы данных, создания и удаления таблиц. В
частности, изучить работу с системной хранимой процедурой sp_help,
используемой для получения информации о базе данных и объектах базы данных.
Работа непосредственно с таблицей
1. В соответствии с вариантом задания разработать точную структуру строк (записей) таблицы, включая выбор типов данных для каждого
поля строки.
2. Составить оператор создания таблицы с учетом приведенных в
задании ограничений, выполнить данный оператор на SQL-сервере с
использованием клиентской утилиты. Просмотреть результат выполнения данного оператора с помощью системной хранимой процедуры
sp_help или клиентской утилиты SQL-EM.
3. Заполнить созданную таблицу данными с использованием оператора включения. Просмотреть заполненную таблицу.
4. Изменить одну или несколько строк таблицы с использованием
оператора поисковой модификации. Просмотреть измененную таблицу.
5. Удалить одну или несколько строк из таблицы с использованием
оператора поискового удаления. Просмотреть измененную таблицу.
6. Добавить столбец в таблицу с использованием оператора модификации таблицы. Просмотреть измененную таблицу.
7. Удалить ограничение из таблицы с использованием оператора
модификации таблицы. Просмотреть результат выполнения оператора.
Работа с курсором
1. Объявить скроллируемый курсор в соответствии со спецификацией курсора из лабораторного задания.
2. Открыть курсор.
3. Просмотреть первую, j-ю и последнюю строки результирующей
таблицы, а также последовательно всю результирующую таблицу от начала и до конца и от конца до начала (число j задается преподавателем).
40
4. Удалить n-ю строку результирующей таблицы с использованием
оператора позиционного удаления (число n задается преподавателем).
Просмотреть базовую таблицу и сравнить ее c предыдущим вариантом.
5. Модифицировать k-ю строку результирующей таблицы, изменив
значение одного или нескольких полей, с использованием оператора позиционной модификации (число k задается преподавателем). Просмотреть базовую таблицу и сравнить ее c предыдущим вариантом.
6. Закрыть курсор.
Работа с представлением
1. В соответствии с заданием составить оператор создания представления, выполнить данный оператор на SQL-сервере с использованием клиентской утилиты. Просмотреть результат выполнения данного
оператора с помощью системной хранимой процедуры sp_help или клиентской утилиты SQL-EM. Просмотреть представляемую таблицу.
2. Включить несколько записей в представляемую таблицу с использованием оператора включения. Просмотреть представляемую и
базовую таблицы и сравнить их с предыдущими вариантами этих таблиц.
3. Изменить несколько строк представляемой таблицы с использованием оператора поисковой модификации. Просмотреть представляемую и базовую таблицы и сравнить их с предыдущими вариантами этих
таблиц.
4. Удалить несколько строк из представляемой таблицы с использованием оператора поискового удаления. Просмотреть представляемую
и базовую таблицы и сравнить их с предыдущими вариантами этих таблиц.
5. Удалить представление с использованием оператора удаления
представления.
Работа с индексами
1. Создать индекс, который бы позволял быстрый поиск по первичному ключу, содержащему столбцы уникальности.
2. Составить и выполнить какой-нибудь запрос к индексированной
таблице.
3. Удалить индекс.
41
4. Удалить базовую таблицу с использованием оператора удаления
таблицы.
Содержание отчета
1.
2.
3.
4.
5.
6.
Задание;
Операторы создания и удаления таблицы;
Операторы создания и удаления представления;
Операторы объявления и закрытия курсора;
Операторы создания и удаления индекса;
Операторы манипулирования данными, относящиеся к базовой,
представляемой и результирующей таблицам;
7. Исходная базовая таблица;
8. Исходная представляемая таблица;
9. Исходная результирующая таблица курсора;
10. Измененные таблицы (базовая, представляемая и результирующая) и ссылки на соответствующие им операторы изменения
таблиц (для каждого акта изменения).
Типы данных Transact-SQL
Символьные типы данных
• CHAR[(n)] - cтроки фиксированной длины, где n - число символов в строке;
• VARCHAR[(n)] - строки переменной длины , где n - максимальное число
символов в строке;
• TEXT - строки потенциально неограниченного размера (до 2 Гб текста в
строке).
В данном случае 1≤n≤255. Символьные столбцы, допускающие
пустые значения (NULL), хранятся как столбцы переменной длины.
Примеры определений столбцов и типов данных:
name VARCHAR(40)
state CHAR(2)
description CHAR(50) NULL
42
Двоичные типы данных
• BINARY(n) - двоичные строки фиксированной длины, где n - число двоичных символов в строке;
• VARBINARY(n) - двоичные строки переменной длины, где n - максимальное число двоичных символов в строке;
• IMAGE - большие двоичные строки (изображения до 2 Гб в строке).
В данном случае 1≤n≤255.
Пример задания двоичного столбца:
bin_column BINARY(4) NOT NULL
Типы данных даты
SQL Server поддерживает два типа обозначения даты и времени
при хранении: DATETIME и SMALLDATETIME. Последний менее точный
и охватывает меньший диапазон дат, но зато позволяет экономить место на диске.
SQL Server поддерживает различные форматы ввода даты. По
умолчанию он работает с датами в формате xx/yy/zz как с последовательностями месяц/день/год. Точность представления времени при использовании DATETIME - 3 миллисекунды, а при использовании
SMALLDATETIME - 1 минута. Пример:
Формат ввода: 4/15/99
Значение DATETIME: Apr 15 1999 12:00:00:000 AM
Значение SMALLDATETIME: Apr 15 1999 12:00 AM
Логический тип данных
SQL Server поддерживает логический тип данных BIT для столбцов
флагов, имеющих значение 1 или 0.
Числовые типы данных
43
Числовые типы данных разбиваются на четыре основные категории:
• целые, включающие INT, SMALLINT и TINYINT.
• данные с плавающей точкой, включающие FLOAT и REAL.
• данные с фиксированной точкой - NUMERIC и DECIMAL
• денежные типы данных - MONEY и SMALLMONEY.
Целые типы данных
Характеристика
INT
Минимальное значение
-2
SMALLINT
0
Максимальное значение
Объем памяти
TINYINT
255
4 байта
2 байта
1 байт
Типы данных с плавающей точкой
Характеристика
FLOAT
REAL
Минимальное значение
±2.23E-308
±1.18E-38
Максимальное значение
±1.79E308
±3.40E38
Точность
до 15 значащих цифр
до 7 значащих цифр
Объем памяти
8 байтов
4 байта
Спецификатор типа FLOAT имеет вид FLOAT[(p)], где p - точность.
Точные числовые типы данных
Эти типы данных вводится описателями DECIMAL[(p,s)]
и
NUMERIC[(p,s)], где p - точность, s - масштаб. Они являются синонимами
и взаимозаменяемы, но только NUMERIC может использоваться в комбинации со столбцами IDENTITY. Точность - это число значащих цифр,
масштаб - число цифр после десятичной точки.
Пример: NUMERIC(7,2).
44
Если опущен масштаб, то он полагается равным нулю, а если опущена точность, то ее значение по умолчанию определяется в реализации.
Денежные типы данных
Характеристика
MONEY
SMALLMONEY
Диапазон
922337203685477.5808
214748.3647
Размер памяти
8 байтов
4 байта
Создание таблицы
Оператор создания таблицы имеет следующий синтаксис:
<оператор создания таблицы>::= CREATE TABLE <имя таблицы>
(<элемент таблицы>[{,<элемент таблицы>}...])
<элемент таблицы>::=<определение столбца> | <определение
ограничения целостности>
Каждая таблица БД имеет простое и квалифицированное (уточненное) имена. В качестве квалификатора имени выступает “идентификатор полномочий”.
Квалифицированное имя таблицы имеет вид: <идентификатор
полномочий>.<простое имя>
Определение столбца
<определение столбца>::= <имя столбца><тип данных>[<раздел
умолчания>] [{<ограничение целостности столбца>}...]
<раздел умолчания>::= DEFAULT {<литерал> | USER | NULL}
<ограничение
целостности
столбца>::=
NOT
NULL[<спецификация уникальности>] | <спецификация ссылок> |
CHECK (<условие поиска>)
В разделе умолчания указывается значение, которое должно быть
помещено в строку, заносимую в данную таблицу, если значение данного столбца явно не указано. Значение по умолчанию может быть: 1) литеральная константа, соответствующая типу столбца; 2) символьная
45
строка, содержащая имя текущего пользователя (USER); 3) неопределенное значение (NULL).
Если значение столбца по умолчанию не специфицировано, и в
разделе ограничений целостности столбца указано NOT NULL (т.е. наличие неопределенных значений запрещено), то попытка занести в таблицу строку с неспецифицированным значением данного столбца приведет к ошибке.
Если ограничение NOT NULL не указано, и раздел умолчаний отсутствует, то неявно порождается раздел умолчаний DEFAULT NULL.
Ограничения целостности столбца в принципе сходны с ограничениями целостности таблицы и рассмотрены ниже.
Определение ограничений целостности таблицы
Синтаксис для определения ограничений целостности таблицы
представлен следующими правилами:
<определение ограничений целостности таблицы>::= <определение ограничения уникальности> | <определение ограничения по
ссылкам> | <определение проверочного ограничения>
<определение ограничения уникальности>::=<спецификация уникальности>(<список столбцов>)
<спецификация уникальности>::= UNIQUE | PRIMARY KEY
<список столбцов>::= <имя столбца>[{,<имя столбца>}..]
<определение ограничения по ссылкам>::= FOREIGN KEY (<ссылающиеся столбцы>)<спецификация ссылок>
<спецификация ссылок>::== REFERENCES <ссылаемая таблица и
столбцы>
<ссылаемая таблица и столбцы>::=<имя таблицы>[(<список
столбцов>)]
<определение проверочного ограничения>::= CHECK (<условие
поиска>)
Действие ограничения уникальности состоит в том, что в таблице
не допускается появление двух или более строк, значения столбцов
уникальности которых совпадают. Среди ограничений уникальности
таблицы не должно быть более одного определения первичного ключа
(ограничения уникальности с ключевым словом PRIMARY KEY).
Ограничения по ссылкам в данной работе не используются, и поэтому подробно не рассматриваются.
46
Проверочное ограничение специфицирует условие, которому должен удовлетворять в отдельности каждая строка таблицы. Это условие
не должно содержать подзапросов, спецификаций агрегатных функций,
а также ссылок на внешние переменные или параметров. В него могут
входить только имена столбцов данной таблицы и литеральные константы.
Примеры создания таблиц с ограничениями:
CREATE TABLE employee
(emp_id INTEGER CONSRAINT p1 PRIMARY KEY,
fname CHAR(20) NOT NULL,
minitial CHAR(1) NULL,
lname VARCHAR(30) NOT NULL,
job_id SMALLINT NOT NULL DEFAULT 1
REFERENCES jobs(job_id)
CREATE TABLE inventory
(code CHAR(4) NOT NULL
CONSTRAINT c1 CHECK(code LIKE”[0-9][0-9][0-9][0-9]”),
high INT NOT NULL CHECK (high>0),
low INT NOT NULL CHECK (low>0),
CONSTRAIN c4 CHECK (hign>=low AND high-low<1000)
Изменение таблиц
Для изменения таблицы, а именно: для включения новых столбцов
и ограничений, а также удаления ограничений, используется оператор
ALTER TABLE, имеющий следующий синтаксис:
<оператор изменения таблицы>::= ALTER TABLE <имя таблицы>
{ADD <элемент таблицы>[{,<элемент таблицы>}...] | DROP
CONSTRAINT <имя ограничения>[{,<имя ограничения>}...]}
Пример включения нового столбца в таблицу:
ALTER TABLE names2 ADD middle_name VARCHAR(20) NULL, fax
VARCHAR(15) NULL
Создание представлений
Механизм представлений является мощным средством языка SQL,
позволяющим скрыть реальную структуру БД от некоторых пользовате-
47
лей за счет определения представления БД. Представление реально
является некоторым хранимым в БД запросом с именованными столбцами, а для пользователя ничем не отличается от базовой таблицы БД.
Представляемая таблица является виртуальной. Обычно вычисление
представляемой таблицы производится каждый раз при использовании
представления.
Оператор определения представления имеет следующий синтаксис:
<оператор создания представления>::= CREATE VIEW <имя
таблицы>[(список столбцов)] AS <спецификация запроса> [WITH
CHECK OPTION]
<спецификация запроса>::= SELECT [ALL | DISTINCT] <список выборки><табличное выражение>
<список столбцов>::=<имя столбца>[{,<имя столбца>}...]
Требование WITH CHECK OPTION имеет смысл только в случае
определения изменяемой представляемой таблицы, которая определяется спецификацией запроса, содержащей раздел WHERE. При наличии
этого требования не допускаются изменения представляемой таблицы,
приводящие к появлению в базовых таблицах строк, не видимых в представляемой таблице.
Примеры создания представлений:
CREATE VIEW ta_limited AS
SELECT au_id, title_id, au_ord FROM titleauthor
CREATE VIEW cal_publishers AS
SELECT * FROM publishers WHERE state=”CA”
Операторы, связанные с курсором
Курсор - это механизм языка SQL, предназначенный для того, чтобы позволить прикладной программе последовательно, строка за строкой, просмотреть результат связанного с курсором запроса. Курсор можно представить как “буфер” с указателем на текущую строку. Ниже приводится синтаксис операторов, связанных с курсором и их краткая характеристика.
<оператор объявления курсора>::= DECLARE <имя курсора>
[SCROLL] CURSOR FOR <спецификация курсора>
48
<спецификация курсора>::= SELECT [ALL | DISTINCT] <список выборки> <табличное выражение>[ORDER BY <спецификация сортировки>]
Этот оператор не является выполняемым, он только связывает
имя курсора со спецификацией курсора. Если задан описатель SCROLL,
то курсор является “скроллируемым”, то есть допускает прокрутку результирующей таблицы как вниз, так и вверх на любое число строк.
<оператор открытия курсора>::= OPEN <имя курсора>
Оператор открытия курсора должен быть первым в серии выполняемых операторов, связанных с данным курсором. Можно считать, что
во время выполнения оператора открытия курсора производится построение временной таблицы, содержащей результат запроса, который
связан с этим курсором.
<оператор чтения>::= FETCH <имя курсора> INTO <список спецификаций целей>
<список
спецификаций
ли>[{,<спецификация цели>}..]
целей>::=
<спецификация
це-
Данный оператор устанавливает курсор на следующую строку таблицы и выбирает значения из этой строки.
<оператор позиционного удаления>::= DELETE FROM <имя таблицы> WHERE CURRENT OF <имя курсора>
Данный оператор удаляет строку таблицы. Изменяемая таблица,
указанная в разделе FROM оператора DELETE, должна быть таблицей,
указанной в самом внешнем разделе FROM спецификации курсора.
<оператор позиционной модификации>::= UPDATE <имя таблицы> SET <предложение установки> [{,<предложение установки>}...]
WHERE CURRENT OF <имя курсора>
<предложение установки>::= <имя столбца> = {<арифметическое выражение> | NULL}
Данный оператор изменяет значение полей строки таблицы, определенной курсором, в соответствии с предложениями установки.
<оператор закрытия курсора>::= CLOSE <имя курсора>
49
Примеры работы с курсором:
DECLARE mycursor SCROLL CURSOR FOR
SELECT au_lname FROM authors
OPEN mycursor
FETCH FIRST FROM mycursor /* первая строка */
FETCH ABSOLUTE 10 FROM mycursor
FETCH NEXT FROM mycursor /* следующая строка */
FETCH RELATIVE 2 FROM mycursor
FETCH PRIOR FROM mycursor /* предыдущая строка */
FETCH LAST FROM mycursor /* последняя строка */
CLOSE mycursor
Одиночные операторы манипулирования данными
Каждый из операторов этой группы является абсолютно независимым от другого оператора.
<оператор выборки>::= SELECT [ALL | DISTINCT] <список выборки> [INTO <список спецификаций целей>]<табличное выражение>
Результатом выполнения оператора выборки является таблица,
состоящая не более чем из одной строки. После выполнения оператора
цели содержат соответствующие поля результирующей строки.
<оператор поискового удаления>::= DELETE FROM <имя таблицы> [WHERE <условие поиска>]
При выполнении оператора последовательно просматриваются
все строки таблицы, и те строки, для которых результатом вычисления
условия поиска является “истина”, удаляются из таблицы. При отсутствии раздела WHERE удаляются все строки таблицы.
Примеры:
DELETE authors
DELETE titles WHERE type= “business”
50
<оператор поисковой модификации>::= UPDATE <имя таблицы>
SET <предложение установки >[{,<предложение установки>}…]
[WHERE <условие поиска>]
При выполнении оператора просматриваются все строки таблицы,
и каждая строка, для которой результатом вычисления условия поиска
является “истина”, изменяется в соответствии с разделом SET.
Пример:
UPDATE publishers SET pub_name= “Joe’s Press” WHERE pub_id=
“1234”
<оператор включения>::= INSERT INTO <имя таблицы>[(<список
столбцов>)] {VALUES (<список значений >) | <подзапрос>}
Оператор включения добавляет строку в таблицу. При это строка
формируется или из списка значений раздела VALUES, или вычисляется
с помощью подзапроса. Список столбцов определяет те столбцы, для
которых явно будет указано их значение. Причем i-му столбцу в списке
столбцов соответствует i-ое значение из списка значений или i-я строка
результата подзапроса. Если список столбцов опущен, то для каждого
столбца таблицы должно быть точно указаны (или вычислены) значения,
в порядке, в котором они были определены.
При вставке символьных данных или поиске значения в конструкции WHERE значение необходимо передавать в одиночных или двойных
кавычках. Для вставки в столбец двоичных данных их нужно указывать
без кавычек, начиная с 0х и задавая два шестнадцатеричных символа
для каждого байта данных.
Примеры:
INSERT INTO publishers (pub_id, pub_name, cite, state) VALUES
(‘1234’, ‘Stendahl Publishing’, ‘Paris’, ‘France’)
INSERT
INTO
binary_example(id,
bin_column)
VALUES(19,
0xa134e2ff)
Создание индекса
Индекс представляет собой объект, ускоряюший выполнение запросов. Синтаксис оператора создания индекса имеет вид:
<оператор создания индекса>::= CREATE [UNIQUE] INDEX <имя
индекса> ON <имя таблицы> (<имя столбца> [ASC | DESC] [{,<имя
столбца>[ASC | DESC]}..])
51
Описатель уникальности UNIQUE указывает, что никаким двум
строкам в индексируемой базовой таблице не позволяется принимать
одно и тоже значение для индексируемого столбца (или комбинации
столбцов) в одно и то же время. Описатели ASC и DESC определяют,
что столбец должен быть отсортирован в возрастающем или убывающем порядке в пределах индекса. В Transact-SQL описатели ASC и
DESC не используются.
Удаление объектов базы данных
Для удаления объектов базы данных используются соответствующие операторы, синтаксис которых представлен ниже.
<оператор удаления таблицы>::= DROP TABLE <имя таблицы>
<оператор удаления представления>::= DROP VIEW <имя представления>
<оператор удаления представления>::= DROP INDEX <имя индекса>
Получение справочной информации об объектах базы данных
Информацию об объектах текущей базы данных можно получить,
запустив хранимую процедуру SP_HELP, выполнив оператор
SP_HELP <имя объекта>
Для объекта-таблицы отображаются: имя собственника таблицы;
дата и время ее создания; имена столбцов таблицы и их типы данных;
имена, описания и ключи индексов, связанных с таблицей; типы, имена и
описания ограничений столбцов и таблицы в целом. Без входных параметров эта процедура возвращает список всех объектов, их собственников и типов объектов.
Для получения информации только об ограничениях таблицы можно воспользоваться хранимой процедурой SP_HELPCONSTRAINT, выполнив оператор
SP_HELPCONSTRAINT <имя таблицы>
Для получения информации только об индексах таблицы можно
воспользоваться хранимой процедурой SP_HELPINDEX, выполнив оператор
SP_HELPINDEX <имя таблицы>
52
Для того, чтобы получить список и описания объектов класса X,
определенных в базе данных, можно выполнить оператор
SELECT * FROM sysobjects WHERE type= ‘X’
Возможные значения параметра X: U - таблица, V - представление,
С - проверочное ограничение, F - ограничение по ссылкам, K - ограничение уникальности, D - раздел умолчаний.
Варианты заданий
1) Схема таблицы СТУДЕНТ:
• идентификатор зачетки
• фамилия и инициалы студента
• специальность
• группа
• дата рождения
• наличие стипендии (имеется/не имеется)
• адрес проживания
• средний балл зачетки
Ограничение уникальности: идентификатор зачетки.
Проверочные ограничения: а) Код группы должен иметь следующую структуру: <цифра><цифра><буква><буква><цифра>; б)
средний балл зачетки должен быть в интервале [2,5].
Спецификация представления: представляемая таблица содержит идентификатор зачетки, фамилию и инициалы студента, а
также средний балл зачетки для студентов, получающих стипендию.
Спецификация курсора: результирующая таблица включает
фамилию и инициалы студента, группу и адрес проживания для студентов, имеющих средний балл зачетки более 4.5.
2) Схема таблицы ЭКЗАМЕН:
• название предмета
• фамилия и инициалы студента
53
• фамилия и инициалы преподавателя
• должность преподавателя
• дата сдачи экзамена
• номер аудитории
• оценка
• сложность предмета
Ограничение уникальности: название предмета, фамилия и
инициалы студента.
Проверочные ограничения: а) должность преподавателя должна быть одной из следующего списка: ассистент, старший преподаватель, доцент, профессор; б) сложность предмета должна быть в
интервале [0,1].
Спецификация представления: представляемая таблица содержит название предмета, фамилию и инициалы студента, а также
экзаменационную оценку для тех экзаменов, которые принимают
профессора.
Спецификация курсора: результирующая таблица включает все
сведения об экзаменах, сданных на оценку “отлично”.
3) Схема таблицы ВОЕННОСЛУЖАЩИЕ:
• номер военного билета
• фамилия и инициалы
• дата рождения
• род войск
• воинское звание
• оклад
• рост
• вес
• номер противогаза
• наличие водительских прав (имеются/не имеются)
Ограничение уникальности: номер военного билета.
54
Проверочные ограничения: а) номер военного билета должен
состоять из шести цифр; б) номер противогаза должен быть цифрой
1,2 или 3.
Спецификация представления: представляемая таблица содержит номер военного билета, фамилию и инициалы, род войск
военнослужащих ростом более 180 см.
Спецификация курсора: результирующая содержит фамилию и
инициалы, воинское звание, номер противогаза военнослужащих,
имеющих водительские права.
4) Схема таблицы КОМПЬЮТЕР:
• марка компьютера
• страна сборки
• процессор
• объем оперативной памяти
• объем внешней памяти
• быстродействие
• наличие мыши (имеется/не имеется)
• марка монитора
• цена
• дата выпуска
Ограничение уникальности: марка компьютера, страна сборки.
Проверочные ограничения: а) объем оперативной памяти должен быть в интервале [2,128] Мбайт; б) Дата выпуска должна быть
не больше текущей даты.
Спецификация представления: представляемая таблица содержит марку компьютера, страну сборки и цену для компьютеров,
имеющих объем оперативной памяти более 8 Мбайт.
Спецификация курсора: результирующая таблица совпадает с
базовой.
5) Схема таблицы УЧЕБНЫЙ ПЛАН:
• код специальности
55
• название дисциплины
• семестр
• дата начала семестра
• общее количество часов
• наличие курсового проекта (имеется/не имеется)
• формы отчетности (экзамены, зачеты и т.д.)
Ограничение уникальности: код специальности, название дисциплины, семестр.
Проверочные ограничения: а) код специальности должен иметь
следующую структуру: <цифра><цифра>.<цифра><цифра>; б) семестр должен быть или осенний или весенний.
Спецификация представления: представляемая таблица содержит код специальности, семестр и название дисциплин, для которых предусмотрен курсовой проект.
Спецификация курсора: результирующая таблица содержит все
сведения о дисциплинах весеннего семестра.
6) Схема таблицы ПОСТАВКИ ТОВАРОВ:
• название фирмы-поставщика
• название фирмы-потребителя
• товарный кредит (да/нет)
• название товара
• количество единиц товара
• вес единицы товара
• цена единицы товара
• платежные реквизиты (адрес и номер расчетного счета)
• дата отгрузки
Ограничение уникальности: название фирмы-поставщика, название фирмы-потребителя.
56
Проверочные ограничения: а) поставляемыми товарами являются холодильники, пылесосы и утюги; б) количество поставляемых
единиц товара не должно превышать 100 штук.
Спецификация представления: представляемая таблица содержит сведения о товарах.
Спецификация курсора: результирующая таблица содержит название фирмы-поставщика, название фирмы-потребителя и название товара для поставок, в которых используется товарный кредит.
7) Схема таблицы АВТОТРАНСПОРТ:
• государственный номер
• тип (автобус, самосвал, тягач, джип)
• марка
• год изготовления
• грузоподъемность или вместимость
• расход горючего на 100 км
• пробег к текущему техосмотру
• дата проведения последнего техосмотра
• успешность техосмотра (положительная/отрицательная)
Ограничение уникальности: государственный номер.
Проверочные ограничения: а) государственный номер имеет
следующую
структуру:
<буква><цифра><цифра><цифра><буква><буква>; б) автотранспорт
может быть следующих типов: автобус, самосвал, тягач, джип.
Спецификация представления: представляемая таблица содержит государственный номер, тип и марку автотранспорта, успешно прошедшего техосмотр.
Спецификация курсора: результирующая таблица содержит тип
автотранспорта, грузоподъемность (вместимость) и дату проведения последнего техосмотра для автотранспорта, выпущенного за
последние пять лет.
8) Схема таблицы ФАКУЛЬТЕТ:
• название факультета
57
• фамилия и инициалы декана
• телефон деканата
• дата основания факультета
• число выпускающих кафедр
• число обучаемых студентов
• наличие иностранных студентов (имеются/не имеются)
• удельный вес преподавателей с учеными степенями
Ограничение уникальности: название факультета.
Проверочные ограничения: а) телефон деканата должен иметь
следующую структуру: 63-<цифра><цифра>-<цифра><цифра>; б)
удельный вес преподавателей с учеными степенями должен быть в
интервале [0,1].
Спецификация представления: представляемая таблица содержит название факультета, фамилию и инициалы деканата, а
также число выпускающих кафедр для факультетов, на которых
учатся иностранные студенты.
Спецификация курсора: результирующая таблица содержит
фамилию и инициалы декана, телефон и дату основания деканата.
9) Схема таблицы УСПЕВАЕМОСТЬ:
• факультет
• специальность
• дисциплина
• общее количество студентов
• количество сдававших студентов
• удельные веса отличных, хороших, удовлетворительных и неудовлетворительных оценок
• дата начала экзаменационной сессии
Ограничение уникальности: факультет, специальность, дисциплина.
Проверочные ограничения: а) количество сдававших студентов
не должно быть больше количества студентов; б) сумма удельных
58
весов отличных, хороших, удовлетворительных и неудовлетворительных оценок должна быть равной 1.
Спецификация представления: представляемая таблица содержит названия специальности и дисциплины, а также количество
сдававших студентов для факультета вычислительной техники.
Спецификация курсора: результирующая таблица содержит все
сведения об успеваемости на специальности “Вычислительные машины, комплексы, системы и сети”.
10) Схема таблицы ЖИВОТНОЕ:
• название животного
• класс животного
• максимальный вес животного
• минимальный вес животного
• средний вес животного
• окраска
• место обитания
• дата занесения в Красну книгу
• продолжительность жизни
• летательные способности (летает/не летает)
Ограничение уникальности: название животного.
Проверочные ограничения: а) средний вес животного должен
быть больше минимального веса и меньше максимального веса; б)
дата занесения в Красную Книгу не должна быть больше текущей
даты.
Спецификация представления: представляемая таблица содержит сведения о весе животных.
Спецификация курсора: результирующая таблица содержит название, класс и средний вес животных, способных летать.
11) Схема таблицы ФИРМА:
• название фирмы
• организационно-правовая форма (ООО, ОАО, ТОО и т.д.)
59
• юридический адрес
• дата учреждения
• количество работников
• число работников, имеющих водительские права
• средний оклад работников
• средний возраст работников
• направления деятельности
• задолженность по налогам (имеется/не имеется)
Ограничение уникальности: название фирмы.
Проверочные ограничения: а) число работников, имеющих водительские права не должно превышать общее количество работников; б) средний возраст работников не должен превышать 35 лет.
Спецификация представления: представляемая таблица включает название фирмы и соответствующие обобщенные сведения о
работниках этой фирмы.
Спецификация курсора: результирующая таблица содержит название фирмы, юридический адрес и количество работников, причем удельный вес работников фирмы, имеющих водительские права, превышает 60%.
12) Схема таблицы ТЕЛЕВИЗОР:
• марка телевизора
• страна сборки
• тип кинескопа
• размер по диагонали
• системы цветности
• число каналов
• наличие телетекста (имеется/не имеется)
• звук (моно/.стерео)
• выходная мощность
• вес
• потребляемая мощность
60
• дата продажи
Ограничение уникальности: марка телевизора, страна сборки.
Проверочные ограничения: а) система цветности может быть
следующих типов: PAL/SECAM, B/G, D/K, H, I, M, NTSC, VIT); б) число каналов должно быть не меньше 40.
Спецификация представления: представляемая таблица содержит марку телевизора, страну сборки и потребляемую мощность
для телевизоров, имеющих телетекст.
Спецификация курсора: результирующая таблица совпадает с
базовой.
Лабораторная работа N 3
Соединение с базой данных в ODBC
Цель работы: изучить функции ODBC для соединения с базой данных, а также функции для получения информации о драйвере и источнике данных, приобрести навыки использования данных функций при разработке клиентских приложений баз данных.
Порядок выполнения работы
1.Ознакомиться с концепцией ODBC.
2. Изучить программный интерфейс функций SQLAllocEnv,
SQLFreeEnv, SQLAllocConnect, SQLFreeConnect, SQLConnect, SQLDisconnect, а также функций SQLGetInfo и SQLGetFunctions.
3. Написать на языке программирования высокого уровня C/C++
программу, которая устанавливает соединение с источником данных,
получает определенную вариантом задания информацию о драйвере и
источнике данных, разъединяет соединение с источником данных.
4. Запустить ODBC-администратор и с его помощью выбрать ODBCдрайвер для используемого в программе источника данных.
5. Выполнить программу, разработанную в п.3.
6. Оформить отчет о проделанной работе.
Содержание отчета
61
1.Задание;
2. Краткое описание используемых функций ODBC;
3. Краткое описание программы;
4. Листинг программы;
5. Результаты выполнения программы;
Для последующих лабораторных работ содержание отчета будет
иметь такую же структуру.
Основные сведения
Функция SQLAllocEnv
Данная функция распределяет память для идентификатора среды
и инициализирует интерфейс ODBC для использования прикладной программой.
Функция SQLAllocEnv имеет следующий синтаксис:
RETCODE SQLAllocEnv(phev),
где phenv – адрес идентификатора среды (выходной параметр типа
HENV FAR *).
Поскольку в рамках одной среды можно установить произвольное
число соединений, для каждой прикладной программы достаточно выделить только один идентификатор среды.
Функция SQLFreeEnv
Данная функция освобождает идентификатор среды, а также всю
назначенную ему память. Функция SQLFreeEnv имеет следующий синтаксис:
RETCODE SQLFreeEnv(henv),
где henv – идентификатор среды (входной параметр типа HENV).
Функция SQLAllocConnect
Данная функция распределяет память для идентификатора соединения в рамках среды, определенной с помощью идентификатора henv.
Функция SQLAllocConnect имеет следующий синтаксис:
62
RETCODE SQLAllocConnect(henv, phdbc)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
henv
phdbc
Тип
HENV
HDBC FAR*
Использование
Вход
Выход
Описание
Идентификатор среды
Идентификатор соединения (адрес)
Функция SQLFreeConnect
Данная функция освобождает идентификатор соединения и всю
связанную с ним память. Функция SQLFreeConnect имеет следующий
синтаксис:
RETCODE SQLFreeConnect(hdbc),
где hdbc – идентификатор соединения (входной параметр типа HDBC).
Функция SQLConnect
Функция SQLConnect загружает драйвер базы данных и устанавливает соединение с источником данных. Функция SQLConnect имеет следующий синтаксис:
RETCODE SQLConnect(hdbc, szDSN, cbDSN, szUID, cbUID,
szAuthStr, cbAuthStr)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
hdbc
szDSN
cbDSN
szUID
cbUID
szAuthStr
cbAuthStr
Тип
HDBC
UCHAR FAR*
SWORD
UCHAR FAR*
SWORD
UCHAR FAR*
Использование
Вход
Вход
Вход
Вход
Вход
Вход
Вход
Описание
Идентификатор соединения
Имя источника данных (адрес)
Длина szDSN.
Идентификатор пользователя (адрес)
Длина szUID
Пароль (адрес)
Длина szAuthStr
Если строка имени источника данных, строка идентификатора
пользователя или строка пароля имеют нулевое окончание, то, соответ-
63
ственно, cbDSN, cbUID или cbAuthStr могут быть установлены в
SQL_NTS.
Если источник данных не требует имени пользователя (пароля), то
нулевое значение или пустая строка должны быть переданы в szUID
(szAuthStr), нулевое значение или SQL_NTS - в cbUID (cbAuthStr).
Функция SQLDisconnect
Данная функция закрывает соединение с источником данных.
Функция SQLDisconnect имеет следующий синтаксис:
RETCODE SQLDisconnect(hdbc),
где hdbc – идентификатор соединения (входной параметр типа HDBC).
Функция SQLGetInfo
Данная функция возвращает общую информацию о драйвере и источнике данных, соответствующих заданному идентификатору соединения. Функция SQLGetInfo имеет следующий синтаксис:
RETCODE SQLGetInfo(hdbc, fInfoType, rgbInfoValue, cbInfoValueMax, cbInfoValue)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
hdbc
fInfoType
rgbInfoValue
Тип
HDBC
UWORD
PTR
Использование
Вход
Вход
Выход
cbInfoValueMax
cbInfoValue
SWORD
Вход
SWORD
FAR *
Выход
Описание
Идентификатор соединения
Тип информации
Область хранения информации (адрес)
Максимальная длина области хранения (в байтах)
Длина области хранения информации
(адрес)
В зависимости от запрашиваемого fTypeInfo возвращаемая информация будет одного из нижеследующих типов: строка символов с
нуль-окончанием, 16-битное целое значение, 32-битный флаг или 32битное двоичное значение. Ниже приведены некоторые значения
fTypeInfo и их содержательная трактовка: SQL_DATABASE_NAME – имя
базы данных, SQL_DBMS_NAME – имя СУБД, SQL_DRIVER_NAME –имя
драйвера, SQL_ACTIVE_STATEMENT – число активных операторов в
64
соединении. Для определения типов выборки, связанных с курсором,
используется SQL_FETCH_DIRECTION. В качестве результата вызова
функции возвращается 32-разрядная битовая маска, в которой выделяются
следующие
битовые
маски:
SQL_FD_FETCH_NEXT,
SQL_FD_FETCH_FIRST,SQL_FD_FETCH_LAST,SQL_FD_FETCH_PRIOR,
SQL_FD_FETCH_ABSOLUTE, SQL_FD_FETCH_RELATIVE. Чтобы выяснить, поддерживает ли источник данных позиционные операторы
DELETE и UPDATE, следует использовать POSITIONED_STATEMENTS.
При этом будет возвращена 32-разрядная битовая маска, которая перечисляет, какие позиционные SQL-операторы поддерживаются. Битовыми
масками
являются
SQL_PS_POSITIONED_DELETE,
SQL_PS_POSITIONED_UPDATE и SQL_PS_SELECT_FOR_UPDATE.
Функция SQLGetFunctions
Данная функция определяет, поддерживает ли драйвер заданную
функцию ODBC. Функция SQLGetFunctions имеет следующий синтаксис:
RETCODE SQLGetFunctions(hdbc, fFunction, pfExists)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
hdbc
fFunction
pfExists
Тип
HDBC
UWORD
UWORD
FAR*
Использование
Вход
Вход
Выход
Описание
Идентификатор соединения
Функция ODBC
Логическое значение TRUE или FALSE
Значение параметра fFunction должно быть вида: SQL_API_???,
где ??? – имя ODBC-функции. Например, для функции SQLGetInfo значением fFunction будет SQL_API_SQLGETINFO.
Коды возврата функций ODBC
Код возврата
SQL_SUCCESS
SQL_SUCCESS_WITH_INFO
SQL_NO_DATA_FOUND
Описание
Функция выполнена успешно. Информация об ошибке для возврата отсутствует.
Функция выполнена успешно, однако имеется некоторая дополнительная информация о выполнении
функции
Все строки результирующего множества извлечены.
65
SQL_ERROR
SQL_INVALID_HANDLE
SQL_STIL_EXECUTING
SQL_NEED_DATA
Ошибка в процессе выполнения данной функции
Недействительный идентификатор
Функция выполняется асинхронно и все еще находится в процессе выполнения
При подготовке или выполнении какого-либо оператора драйвер установил, что прикладная программа
должна определить не менее одного значения параметра.
Функция SQLError
Для получения дополнительной информации в случае возникновения ошибки (при этом кодом завершения ODBC-функции является значение SQL_ERROR SQL_SUCCESS_WITH_INFO) следует воспользоваться функцией SQLError. Функция SQLError имеет следующий синтаксис:
RETCODE SQLError(henv, hdbc, hstmt, szSqlState, pfNativeError, szErrorMsg, cbErrorMsgMax, cbErrorMsg)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
Henv
Hdbc
Hstmt
SzSqlState
PfNativeError
SzErrorMsg
CbErrorMsgMax
PcbErrorMsg
Тип
HENV
HDBC
HSTMT
UCHAR
FAR *
SDWORD
FAR *
UCHAR
FAR *
SWORD
Использование
Вход
Вход
Вход
Выход
Описание
Идентификатор среды
Идентификатор соединения
Идентификатор оператора
Строка состояния (адрес)
Выход
Собственный код ошибки СУБД (адрес)
Строка текста ошибки (адрес)
SWORD
FAR *
Выход
Выход
Вход
Максимальная длина строки szErrorMsg
Общее число символов в строке текста ошибки (адрес)
Идентификаторы среды, соединения и оператора могут принимать
нулевые
значения
–
SQL_NULL_HENV,
SQL_NULL_HDBC
и
SQL_NULL_HSTMT, соответственно. Функция SQLError возвращает информацию об ошибке для крайнего справа ненулевого идентификатора.
Для строки состояния требуется шесть байт, из них пять – собственно
66
для состояния, последний байт – нуль-окончание. В ряде случаев информация об ошибке может состоять более чем из одной части. В таких
случаях для выборки информации функцию SQLError следует вызывать
более одного раза.
Методические указания
Обобщенный алгоритм использования ODBC в прикладных программах представлен ниже (в скобках указаны основные используемые
функции).
Фаза инициализации
Шаг 1. Назначение идентификатора среды (SQLAllocEnv)
Шаг 2. Назначение идентификатора соединения (SQLAllocConnect)
Шаг 3. Соединение с сервером (SQLConnect)
Шаг 4. Назначение идентификатора оператора (SQLAllocStmt)
Фаза обработки SQL операторов
Шаг 5. Выполнение оператора (SQLExecDirect, SQLPrepare,
SQLExecute)
Шаг 6. Выборка данных (SQLFetch, SQLBindCol, SQLGetData,
SQLExtendedFetch)
Фаза завершения
Шаг 7. Освобождение идентификатора оператора (SQLFreeStmt)
Шаг 8. Разрыв соединения с сервером (SQLDisconnect)
Шаг 9. Освобождение идентификатора соединения (SQLFreeConnect)
Шаг 10. Освобождение идентификатора окружения(SQLFreeEnv)
Вышеприведенный алгоритм является общим для лабораторных
работ NN 3-5. В данной лабораторной работе используется алгоритм,
включающий шаги 1, 2, 3, использование функций SQLGetFunctions и
SQLGetInfo, шаги 8, 9, 10 в приведенном порядке.
Для возможности работы с функциями ODBC в программу на языках
С или С++ необходимо включить заголовочный файл sql.h директивой
#include <sql.h>
Настройка ODBC производится следующим образом. В окне Control Panel щелкните мышью на пиктограмме ODBC. В появившемся окне
выберите закладку User DSN, нажмите кнопку Add. В появившемся списке выберите SQL Server. Нажмите кнопку Finish. После этого в появившемся диалоговом окне ODBC SQL Server Setup заполните определен-
67
ные поля. В поле Data Source Name впишите имя использующегося в
прикладной программе источника данных (например, my_source), а в поле Server - имя используемого SQL-сервера (например, VT30213_S). В
этом же диалоговом окне нажмите кнопку Options и в открывшемся окне
в поле Database впишите имя используемой базы данных SQL Server
(например, dbstud2). При этом имя источника данных связывается с указанной базой данных.
Варианты заданий
Задание типа А: Определить, поддерживает ли драйвер заданную
функцию.
1. SQLAllocEnv, SQLMoreResults, SQLDriverConnect, SQLRowCount;
2. SQLFreeEnv, SQLColumnPrivileges, SQLStatistics, SQLParamData;
3. SQLAllocConnect, SQLExtendedFetch, SQLDrivers, SQLPutData;
4. SQLFreeConnect, SQLSetStmtOption, SQLColumns, SQLTransact;
5. SQLConnect, SQLGetCursorName, SQLTables, SQLGetTypeInfo;
6. SQLDisconnect, SQLSetConnectOption, SQLProcedure, SQLColAttributes;
7. SQLAllocStmt, SQLDataSources, SQLGetConnectOption, SQLCancel;
8. SQLFreeStmt, SQLSpecialColumns, SQLParamOption, SQLGetInfo;
9.SQLExecDirect, SQLTablePrivileges, SQLDescribeCol, SQLNativeSql;
10. SQLExecute, SQLGetData, SQLSetCursorName, SQLGetFunctions;
11. SQLPrepare, SQLFetch, SQLProcedureColumns, SQLPrimaryKeys;
12. SQLBindCol, SQLForeignKeys, SQLNumResultCols, SQLSetPos.
Задание типа Б: Выбрать информацию об источнике данных. Тип
выбираемых данных помечается символами S, B, N, заключенными в
круглые скобки. Тип данных, отмеченный символом S, соответствует
символьной строке, а символом N – числовому значению. Тип данных,
отмеченный символом ?, является логическим. При этом надо определить, поддерживает ли источник данных указанные возможности.
1. Имя текущей базы данных (S);
2. Имя СУБД (S);
3. Имя драйвера (S);
4. Курсор с выборкой следующей строки (?);
68
5. Курсор с выборкой первой строки (?);
6. Курсор с выборкой последней строки (?);
7. Курсор с выборкой предыдущей строки (?);
8. Курсор с выборкой N-й строки (?);
9. Курсор с выборкой N-й строки по отношению к текущей позиции (?);
10. Оператор позиционного удаления (?);
11. Оператор позиционной модификации (?);
12. Число активных операторов в соединении (N).
Лабораторная работа N 4
Выполнение операторов SQL в ODBC
Цель работы: изучить функции ODBC для выполнения SQLоператоров, приобрести навыки использования данных функций при
разработке клиентских приложений баз данных.
Порядок выполнения работы и варианты заданий
1. Изучить программный интерфейс функций SQLAllocStmt,
SQLFreeStmt, SQLExecDirect, SQLPrepare, SQLExecute, SQLBindParameter.
2. Написать на языке программирования высокого уровня C/C++
программу для создания и заполнения данными таблицы в соответствии
с заданием лабораторной работы N 2. Пользовательский интерфейс
программы должен включать формы с полями ввода для занесения информации в таблицу. При нечетном номере варианта задания использовать прямое выполнение SQL-оператора, а при четном – подготавливаемое.
3. Запустить ODBC-администратор и с его помощью выбрать ODBCдрайвер для используемого в программе источника данных.
4. Выполнить программу, разработанную в п.2.
5. Оформить отчет о проделанной работе.
Основные сведения
Функция SQLAllocStmt
69
Данная функция распределяет память для идентификатора оператора в рамках определенного соединения. Функция SQLAllocStmt имеет следующий синтаксис:
RETCODE SQLAllocStmt(hdbc, phstmt)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
hdbc
phstmt
Тип
HDBC
HSTMT
FAR
Использование
Вход
Выход
Описание
Идентификатор соединения
Идентификатор оператора (адрес)
Функция SQLFreeStmt
Данная функция выполняет следующие действия:
• останавливает обрабатываемые SQL-операторы, связанные с
заданным идентификатором оператора;
• закрывает открытые курсоры, имеющие отношение к заданному
идентификатору оператора;
• отбрасывает ожидаемые результаты;
• освобождает все ресурсы, связанные с заданным идентификатором оператора.
Функция SQLFreeStmt имеет следующий синтаксис:
RETCODE SQLFreeStmt(hstmt, fOption)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
hstmt
fOption
Тип
HSTMT
UWORD
Использование
Вход
Вход
Описание
Идентификатор оператора
Опция завершения
Опция SQL_CLOSE закрывает курсор и отбрасывает все ожидаемые результаты. Опция SQL_DROP освобождает идентификатор оператора и все связанные с ним ресурсы, а также выполняет действия предыдущей опции. Опция SQL_UNBIND освобождает (“отвязывает”) все
столбцы, используемые соответствующей функцией SQLBindCol. Опция
SQL_RESET_PARAMS освобождает все параметры, используемые соответствующей функцией SQLBindParameter. Перечисленные опции используются применительно к заданному идентификатору оператора.
70
Функция SQLExecDirect
Данная функция выполняет SQL-оператор. Если в операторе существуют какие-либо параметры, то при выполнении используются их
текущие значения. Функция SQLExecDirect имеет следующий синтаксис:
RETCODE SQLExecDirect(hstmt, szSqlStr, cbSqlStr)
Описание параметров для данной функции приведено в таблице.
Аргумент
hstmt
szSqlStr
Тип
HSTMT
UCHAR FAR*
Использование
Ввод
Ввод
cbSqlStr
SDWORD
Ввод
Описание
Идентификатор оператора
Строка, содержащая SQL-оператор
(адрес)
Длина строки szSqlStr
Функция SQLExecDirect представляет самый быстрый способ запустить SQL-оператор при одноразовом выполнении.
Функция SQLPrepare
Данная функция подготавливает SQL-строку для выполнения.
Функция SQLPrepare имеет следующий синтаксис:
RETCODE SQLPrepare(hstmt, szSqlStr, cbSqlStr)
Данная функция имеет такие же параметры, что и функция
SQLExecDirect.
Функция SQLExecute
Данная функция выполняет подготовленный SQL-оператор. Если в
операторе существуют какие-либо параметры, то при выполнении используются их текущие значения. Функция SQLExecute имеет следующий синтаксис:
RETCODE SQLExecute(hstmt),
где hstmt – идентификатор оператора (входной параметр типа HSTMT).
Перед вызовом функции SQLExecute должна быть выполнена
функция SQLPrepare.
Функция SQLBindParameter
71
Данная функция связывает параметр SQL-оператора с буфером,
где хранится его значение. Функция SQLBindParameter имеет следующий синтаксис:
RETCODE SQLBindParameter(hstmt, ipar, fParamType, fCType,
fSqlType, cbColDef, ibScale, rgbValue, cbValueMax, pcbValue)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
hstmt
ipar
fParamType
fCType
fSqlType
cbColDef
ibScale
rgbValue
CbValueMax
PcbValue
Тип
HSTMT
UWORD
SWORD
SWORD
SWORD
UDWORD
SWORD
PTR
SDWORD
Использование
Ввод
Ввод
Ввод
Ввод
Ввод
Ввод
Ввод
Ввод/вывод
Ввод
Описание
Идентификатор оператора
Номер параметра
Тип параметра
С-тип данных параметра
SQL-тип данных параметра
Точность столбца источника данных
Размер столбца источника данных
Буфер значения параметра (адрес)
Максимальная длина буфера rgbValue
SDWORD
FAR*
Ввод/вывод
Буфер значения длины параметра (адрес)
Параметры в SQL-операторах отмечаются маркером ?. Пример:
INSERT INTO Emp(empid, firstname) VALUES (?,?).
Нумерация параметров начинается с 1. Тип параметра fParamType
может принимать одно из трех значений: SQL_PARAM_INPUT,
SQL_PARAM_INPUT_OUTPUT или SQL_PARAM_OUTPUT. Значение
SQL_PARAM_INPUT используется для всех параметров, которые не
включены в процедуру, а также для процедур, использующих параметры
ввода. Значение SQL_PARAM_INPUT_OUTPUT маркирует параметр
ввода/вывода в процедуре. Значение SQL_PARAM_OUTPUT маркирует
значение возврата или параметр вывода в процедуре.
С-тип данных - это тип данных, из которого конвертируются данные. C-тип данных параметра может быть одним из следующих значений: SQL_C_BINARY, SQL_C_BIT, SQL_C_CHAR, SQL_C_DATE,
SQL_C_DEFAULT, SQL_C_DOUBLE, SQL_C_FLOAT, SQL_C_SLONG,
SQL_C_SSHORT, SQL_STINYINT, SQL_C_TIME, SQL_C_TIMESTAMP,
SQL_C_ULONG, SQL_C_USHORT, SQL_C_UTINYINT, SQL_C_DEFAULT.
SQL-тип данных - это тип данных, в который конвертируются данные. Он должен совпадать с SQL-типом соответствующего столбца.
72
SQL-тип данных может быть одним из следующих значений:
SQL_BIGINT,
SQL_BINARY,
SQL_BIT,
SQL_CHAR,
SQL_DATE,
SQL_DECIMAL,
SQL_DOUBLE,
SQL_FLOAT,
SQL_INTEGER,
SQL_LONGVARBINARY,
SQL_LONGVARCHAR,
SQL_NUMERIC,
SQL_REAL,
SQL_SMALLINT,
SQL_TIME,
SQL_TIMESTAMP,
SQL_TINYINT, SQL_VARBINARY, SQL_VARCHAR.
Пример вызова функции SQLBindParameter:
rc=SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR,
SQL_CHAR, TEST_LEN, 0, szTEST, 0, &cbTEST);
Методические указания
Данная лабораторная работа основывается на результатах предыдущей лабораторной работы. При выполнении данной лабораторной
работы используются шаги 1-5, 1-10 алгоритма использования ODBC,
представленного в предыдущей работе, в приведенном порядке.
Лабораторная работа N 5
Выборка данных из результирующего множества в
ODBC
Цель работы: изучить функции ODBC для выборки данных из результирующей таблицы, изучить скроллируемые курсоры в ODBC, приобрести навыки использования данных функций при разработке клиентских приложений баз данных.
Порядок выполнения работы и варианты заданий
1. Изучить программный интерфейс функций SQLFetch, SQLBindCol, SQLGetData, SQLExtendedFetch, SQLSetStmtOption.
2. Написать на языке программирования высокого уровня С/C++:
а) программу для создания курсора в ODBC. Определение курсора
берется из вариантов заданий к лабораторной работе N 2. При нечетном
номере варианта задания следует использовать статические курсоры, а
при четном – динамические.
б) программу для просмотра результирующей таблицы с использованием функций SQLFetch и SQLBindCol (для нечетного номера вариан-
73
та задания) и функции SQLGetData (для четного номера варианта задания);
в) программу для различных типов выборки строк из результирующей таблицы с использованием функции SQLExtendedFetch. Пользовательский интерфейс программы должен включать элементы управления
(например, кнопки, диалоговые окна и т.д.) для показа первой, последней, следующей и предыдущей строк, а также строк с абсолютным и относительным номером N.
3. Запустить ODBC-администратор и с его помощью выбрать ODBCдрайвер для используемого в программе источника данных.
4. Выполнить программу, разработанную в п.2.
5. Оформить отчет о проделанной работе.
Основные сведения
Функция SQLBindCol
Данная функция назначает область хранения в памяти и тип данных для столбца результирующей таблицы. Функция SQLBindCol имеет
следующий синтаксис:
RETCODE SQLBindCol(hstmt, icol, fcType, rgbValue, cbValueMax,
pcbValue)
Описание параметров для данной функции приведено в следующей таблице.
Аргумент
Тип
hstmt
icol
fCType
rgbValue
cbValueMax
pcbValue
HSTMT
UWORD
SWORD
PTR
SDWORD
SDWORD
FAR*
Использование
Вход
Вход
Вход
Вход
Вход
Вход
Описание
Идентификатор оператора
Номер столбца
С-тип данных столбца
Область хранения данных (адрес)
Максимальная длина области хранения
Длина столбца выборки (адрес)
Столбцы результирующей таблицы нумеруются слева направо, начиная с 1.
Функция SQLFetch
74
Данная функция извлекает очередную строку данных из результирующей таблицы, причем возвращаются данные для всех столбцов, которые были связаны с помощью функции SQLBindCol. Синтаксис функции SQLFetch:
RETCODE SQLFetch(hstmt),
где hstmt – идентификатор оператора (входной аргумент типа
HSTMT).
Функция SQLGetData
Эта функция позволяет выполнить выборку данных из столбцов, которые не были связаны с помощью функции SQLBindCol. Функция
SQLGetData имеет следующий синтаксис:
RETCODE SQLGetData(hstmt, icol, fCType, rgbValue, rgbValueMax,
pcbValue)
Данная функция имеет те же параметры, что и функция SQLBiindCol. Функция SQLGetData полезна в тех случаях, когда нет нужды выполнять выборку одних и тех же столбцов для каждой строки результирующей таблицы при вызове SQLFetch.
Функция SQLExtendedFetch
Данная функция используется вместо функции SQLFetch для выборки строк результирующей таблицы. Функция SQLExtendedFetch расширяет функциональность функции SQLFetch, поскольку предусматривает блочные и скроллируемые (перемещаемые) курсоры. Функция .
SQLExtendedFetch имеет следующий синтаксис:
RETCODE SQLExtendedFetch(hstmt,fFetchType, irow, pcrow, rgfRowStatus)
Описание параметров функции приведено в следующей таблице.
Аргумент
Тип
hstmt
fFetchType
Irow
pcrow
HSTMT
UWORD
SDWORD
UDWORD
FAR *
Использование
Вход
Вход
Вход
Выход
Описание
Идентификатор оператора
Тип выборки
Число строк выборки
Число реально извлеченных строк (адрес)
75
rgfRowStatus
UWORD
FAR *
Выход
Массив значений состояния для извлеченного множества строк
ODBC поддерживает статические и динамические курсоры. Статические курсоры нечувствительны к изменениям базовых таблиц, а динамические являются полностью чувствительными.
Движение курсора устанавливается с помощью параметров
fFetchType и irow. В приведенной ниже таблице определены значения
параметра fFetchType и соответствующие им результаты выборки функции SQLExtendedFetch.
FFetchType
SQL_FETCH_NEXT
SQL_FETCH_PRIOR
SQL_FETCH_RELATIVE
SQL_FETCH_FIRST
SQL_FETCH_LAST
SQL_FETCH_ABSOLUTE
Действие SQLExtendedFetch
Следующее строковое множество
Предыдущее строковое множество
Строковое множество, начиная с N-й строки по отношению к текущей позиции курсора
Первое строковое множество
Последнее строковое множество
Строковое множество, начиная с N-й строки
В приведенной таблице значение N определяется параметром irow.
В данной лабораторной работе не используются блочные курсоры, по
умолчанию считается, что строковое множество состоит из одной строки.
Методические указания
Создание курсора в ODBC не предполагает использование SQLоператора объявления курсора. Курсор создается автоматически при
выполнении оператора выборки SELECT. При этом идентификатор
данного оператора SELECT должен использоваться для выборки данных из результирующей таблицы.
При выполнении данной лабораторной работы в полном объеме используется алгоритм использования ODBC, приведенный в описании
лабораторной работы N 3.
Для выборки всех данных из заданных столбцов результирующей
таблицы с помощью функций SQLBindCol и SQLFetch следует использовать следующий алгоритм:
1. Вызвать функцию SQLBindCol один раз для каждого столбца, который должен быть возвращен из результирующей таблицы.
76
2. Вызвать функцию SQLFetch для перемещения курсора на следующую строку и возврата данных из связанных столбцов.
3. Повторить шаг 2 до тех пор, пока функция SQLFetch не возвратит
SQL_NO_DATA_FOUND.
Для выборки всех данных из заданных столбцов результирующей
таблицы с помощью функций SQLGetData и SQLFetch следует использовать следующий алгоритм:
1. Вызывать функцию SQLFetch для перемещения курсора на следующую строку.
2. Вызвать функцию SQLGetData для каждого из заданных столбцов.
3. Повторить шаги 1 и 2 до тех пор, пока функция SQLFetch не возвратит SQL_NO_DATA_FOUND.
Прежде чем использовать перемещаемые курсоры, необходимо
проверить, поддерживает ли драйвер функцию SQLExtendedFetch.
Затем рекомендуется проверить, какие типы выборки допускает курсор
(см. лабораторную работу N 3, варианты заданий типа B NN 4-9). После
этого необходимо установить тип курсора (скроллируемый) с помощью
функции SQLSetStmtOption. Пример вызова функции SQLSetStmtOption:
Rc=SQLSetStmtOption(hstmt, SQL_CURSOR_TYPE,
SQL_CURSOR_DYNAMIC);
В данном случае выбран динамический курсор. Для выбора
статического
курсора
необходимо
использовать
опцию
SQL_CURSOR_STATIC.
Библиографический список
1) Роберт Сигнор, Михаэль О. Стегман. Использование ODBC
для доступа к базам данных. - М.: БИНОМ, 1995. - 384 с.
2) Кузнецов С.Д. Стандарты языка реляционных баз данных SQL:
краткий обзор // СУБД. - N 2, 1996. - C.6-36
3) Венкатрао М., Пиццо М. SQL/CLI - новый стиль связывания для
SQL // СУБД. - N 2, 1996. - C.37-44
4) Боуман Дж., Эмерсон С., Дарновски М. Практическое руководство по SQL. - М.: Диалектика, 1997. - 320 с.
5) Райан Стивенс, Рональд Р. Плю. SQL. - М.: БИНОМ, 1997. - 400
с.
6) Горев А., Ахаян Р., Макашарипов С. Эффективная работа с
СУБД. - СПб.: Питер, 1997. - 704 с.
77
7) Соломон Девид и др. Microsoft SQL Server 6.5. Энциклопедия
пользователя. - К.: ДиаСофт, 1998. - 784 с.
8) Джеймс Р.Грофф, Пол Н. Вайнберг. SQL: Полное руководство . К.: BHV, 1998. - 608 c.
9) Ладани Ханс. SQL. Энциклопедия пользователя. - М.: ДиаСофт,
1998. - 624 с
10) Горелов А., Макашарипов С., Владимиров Ю. Microsoft SQL
Server 6.5 для профессионалов. - СПб: Питер, 1998. - 464 с.
11) Роберт Д. Шнайдер. Microsoft SQL Server. Проектирование высокопроизводительных баз данных. - М.: ЛОРИ, 1998. - 361 с.
12) Рон Саукап. Основы Microsoft SQL Server 6.5. – М.: Издательский отдел “Русская редакция” ТОО “Channel Traiding Ltd”. – 1999. – 704
c.
13) Уанкуп Д. MS SQL Server 6.5 в подлиннике. – М.: Издательский
дом “Вильямс”, 1999. – 912 с.
14) Тихомиров Ю.В. Microsoft SQL Server 7.0: разработка приложений. - СПб.: BHV. - 1999. - 352 с.
15) Хансен Г., Хансен Дж. Базы данных: разработка и управление:
Пер. с англ. - М.: БИНОМ, 1999. - 704 с.
16) Дунаев С. Доступ к базам данных и техника работы в сети.
Практические приемы современного программирования. – М.: ДиалогМИФИ, 1999. – 416 с.
78
ПРИЛОЖЕНИЕ
База данных книготорговой компании
Таблица authors
au_id
au_lnam
e
au_fnam
e
phone
city
stat
e
con
trac
t
172-321176
White
Johnson
408 496- 10932
7223
Bigge Rd.
Menlo
Park
CA
1
213-468915
Green
Marjorie
415 986- 309 63rd Oakland
7020
St. #411
CA
1
238-957766
Carson
Cheryl
415 548- 589
7723
Darwin
Ln.
Berkeley
CA
1
267-412394
O'Leary
Michael
408 286- 22
2428
Cleveland
Av. #14
San Jose
CA
1
274-809391
Straight
Dean
415 834- 5420
2919
College
Av.
Oakland
CA
1
341-221782
Smith
Meander
913 843- 10
0462
Mississip
pi Dr.
Lawrence
KS
0
409-567008
Bennet
Abraham
415 658- 6223
9932
Bateman
St.
Berkeley
CA
1
427-172319
Dull
Ann
415 836- 3410
7128
Blonde
St.
Palo Alto
CA
1
472-272349
Gringlesb
y
Burt
707 938- PO
6445
792
CA
1
486-291786
Locksley
Charlene
415 585- 18
4620
Broadway
Av.
San
Francisco
CA
1
527-723246
Greene
Morningst
ar
615 297- 22
2723
Graybar
House
Rd.
Nashville
TN
0
648-92-
Blotchet-
Reginald
503 745- 55
Hillsdale
Corvallis
OR
1
79
address
Box Covelo
1872
Halls
6402
Bl.
672-713249
Yokomoto Akiko
415 935- 3
Silver Walnut
4228
Ct.
Creek
CA
1
712-451867
del
Castillo
Innes
615 996- 2286
Ann Arbor MI
8275
Cram Pl.
#86
1
722-515454
DeFrance
Michel
219 547- 3 Balding Gary
9982
Pl.
IN
1
724-089931
Stringer
Dirk
415 843- 5420
Oakland
2991
Telegraph
Av.
CA
0
724-809391
MacFeath
er
Stearns
415 354- 44 Upland Oakland
7128
Hts.
CA
1
756-307391
Karsen
Livia
415 534- 5720
9219
McAuley
St.
Oakland
CA
1
807-916654
Panteley
Sylvia
301 946- 1956
8853
Arlington
Pl.
Rockville
MD
1
846-927186
Hunter
Sheryl
415 836- 3410
7128
Blonde
St.
Palo Alto
CA
1
893-721158
McBadde
n
Heather
707 448- 301
4982
Putnam
Vacaville
CA
0
899-462035
Ringer
Anne
801 826- 67
0752
Seventh
Av.
Salt Lake UT
City
1
998-723567
Ringer
Albert
801 826- 67
0752
Seventh
Av.
Salt Lake UT
City
1
Таблица publishers
pub_id
pub_name
city
state
country
0736
New Moon Books
Boston
MA
USA
0877
Binnet & Hardley
Washington
DC
USA
1389
Algodata Infosystems
Berkeley
CA
USA
1622
Five Lakes Publishing
Chicago
IL
USA
1756
Ramona Publishers
Dallas
TX
USA
80
9901
GGG&G
Mмnchen
(null)
Germany
9952
Scootney Books
New York
NY
USA
9999
Lucerne Publishing
Paris
(null)
France
Таблица titles
title_id
title
BU1032
type
pub_id
price
advance
ytd_sale
s
pubdate
The Busy business
Executiv
e's
Database
Guide
1389
19.99
5,000.00
4095
Jun
12
1991
12:00AM
BU1111
Cooking
with
Compute
rs:
Surreptiti
ous
Balance
Sheets
business
1389
11.95
5,000.00
3876
Jun
9
1991
12:00AM
BU2075
You Can business
Combat
Compute
r Stress!
0736
2.99
10,125.0
0
18722
Jun
30
1991
12:00AM
BU7832
Straight
Talk
About
Compute
rs
business
1389
19.99
5,000.00
4095
Jun
22
1991
12:00AM
MC2222
Silicon
Valley
Gastrono
mic
Treats
mod_coo
k
0877
19.99
0.00
2032
Jun
9
1991
12:00AM
MC3021
The
mod_coo
Gourmet k
Microwav
e
0877
2.99
15,000.0
0
22246
Jun
18
1991
12:00AM
MC3026
The
UNDECI
Psycholo DED
gy
of
Compute
0877
(null)
(null)
(null)
Apr
3
1996
3:45AM
81
r Cooking
PC1035
But Is It popular_
User
comp
Friendly?
1389
22.95
7,000.00
8780
Jun
30
1991
12:00AM
PC8888
Secrets
popular_
of Silicon comp
Valley
1389
20.00
8,000.00
4095
Jun
12
1994
12:00AM
PC9999
Net
Etiquette
1389
(null)
(null)
(null)
Apr
3
1996
3:45AM
PS1372
Compute 0877
r Phobic
AND
NonPhobic
Individual
s:
Behavior
Variation
s
psycholo
gy
21.59
7,000.00
375
Oct
21
1991
12:00AM
PS2091
Is Anger psycholo
the
gy
Enemy?
0736
10.95
2,275.00
2045
Jun
15
1991
12:00AM
PS2106
Life
Without
Fear
psycholo
gy
0736
7.00
6,000.00
111
Oct
5
1991
12:00AM
PS3333
Prolonge psycholo
d
Data gy
Deprivati
on: Four
Case
Studies
0736
19.99
2,000.00
4072
Jun
12
1991
12:00AM
PS7777
Emotiona psycholo
l
gy
Security:
A
New
Algorithm
0736
7.99
4,000.00
3336
Jun
12
1991
12:00AM
TC3218
Onions,
trad_coo
Leeks,
k
and
Garlic:
Cooking
Secrets
of
the
0877
20.95
7,000.00
375
Oct
21
1991
12:00AM
popular_
comp
82
Mediterra
nean
TC4203
Fifty
trad_coo
Years in k
Buckingh
am
Palace
Kitchens
0877
11.95
4,000.00
15096
Jun
12
1991
12:00AM
TC7777
Sushi,
Anyone?
0877
14.99
8,000.00
4095
Jun
12
1991
12:00AM
trad_coo
k
Таблица titleauthor
au_id
title_id
172-32-1176
PS3333
213-46-8915
BU1032
213-46-8915
BU2075
238-95-7766
PC1035
267-41-2394
BU1111
267-41-2394
TC7777
274-80-9391
BU7832
409-56-7008
BU1032
427-17-2319
PC8888
472-27-2349
TC7777
486-29-1786
PC9999
486-29-1786
PS7777
648-92-1872
TC4203
672-71-3249
TC7777
712-45-1867
MC2222
722-51-5454
MC3021
724-80-9391
BU1111
724-80-9391
PS1372
756-30-7391
PS1372
807-91-6654
TC3218
846-92-7186
PC8888
83
899-46-2035
MC3021
899-46-2035
PS2091
998-72-3567
PS2091
998-72-3567
PS2106
84
СОДЕРЖАНИЕ
Введение ……………………………………………….……………… 3
Лабораторная работа N 1. Выборка данных из базы данных с использованием языка SQL…………………………………….…………….. 5
Лабораторная работа N 2. Создание, модификация и удаление
объектов базы данных с использованием SQL ……………………….. 38
Лабораторная работа N 3. Соединение с базой данных
в ODBC ………………………………………………………..……………… 60
Лабораторная работа N 4. Выполнение операторов SQL
в ODBC ……………………………………..………………………………… 68
Лабораторная работа N 5 .Выборка данных из результирующего
множества в ODBC …………………………………………………………. 73
Библиографический список ………….…………………………..… 77
Приложение ……………………………..……….…………………… 79
85
Скачать