Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОБДЗ_часть1_текст.doc
Скачиваний:
5
Добавлен:
04.11.2018
Размер:
1.38 Mб
Скачать

1.6. Примеры написания простых sql запросов для тестовой предметной области

Для изучения возможности построения SQL-запросов выбран фрагмент предметной области (ПрО) «Вызовы скорой помощи», который содержит информацию о пациентах, а также о пунктах скорой помощи, в которых работают сотрудники различной специализации и квалификации: врачи, мед. сестры, шоферы и т. д., объединяющиеся в бригады.

Пусть логическая модель ПрО представлена в виде набора информационных отношений (ИО), рис. 5.1, представленных соответствующими реляционными таблицами в СУБД MS Access.

Рисунок 5.1 – Логическая модель данных тестовой ПрО «Вызовы скорой помощи»

Создание запросов в виде инструкций языка SQL возможно при наличии на экране запросной формы, которая появиться при активации режима конструктора запросов, рис. 5.2. Далее необходимо воспользоваться пунктом меню SQL и вручную написать запрос, используя, основные операторы языка SQL – SELECT, UPDATE, DELETE, INSERT.

Рисунок 5.2 – Диалоговое окно запросов

Для тестовой ПрО возможны следующие запросы на выборку. В самом простом варианте использования оператора SELECT из таблицы извлекаются сразу все данные.

(1) Простой запрос SELECT отбирает записи, соответствующие условиям, перечисленным в предложении WHERE. Если не задавать предложение WHERE, запрос возвращает все строки таблицы. Например, запрос следующего вида:

Вывести список всех пациентов

SELECT * FROM Pacient;

Предложение WHERE не является обязательным, однако, если оно присутствует, то должно следовать после предложения FROM. Например, необходимо выбрать всех пациентов с фамилией Самохин (WHERE FIO_pacienta = 'Самохин') или всех пациентов в возрасте от 18 до 30 лет (WHERE Vozrast Between 18 And 30). Важно отметить, что символьные (строковые) значения полей должны записываться в одинарных ковычках – ‘ ‘, а целочисленные переменные процессор БД воспринимает без дополнительных знаков.

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

При указании аргумента условиеОтбора литералы даты (символы дат) должны вводиться в американском формате, даже если используется неамериканская версия ядра базы данных Jet. Например, дата 24 мая 2007 года записывается в России как 24.05.07, а в США как 5/24/07. Обязательно заключите даты в символы «решетки» (#), как показано в следующих примерах.

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

SELECT Pacient.FIO_pacienta FROM Pacient

WHERE Pacient.pacient_id IN

(SELECT pacient_id FROM Vizov

WHERE (Vizov.Data_vremya =#12/01/2007#))

Кроме того, можно применять функцию DateValue, которая поддерживает международные стандарты, заданные в Microsoft Windows.

Например, для отбора записей всех вызовов скорой помощи, которые совершились 01.12.2007 в американском варианте представления дат в процессоре БД, текст запроса имеет следующий вид:

SELECT * FROM Vizov

WHERE Vizov.Data_vremya = DateValue('12/01/2007');

Для российского варианта процессора БД текст запроса выглядит таким образом:

SELECT * FROM Vizov

WHERE Vizov.Data_vremya = DateValue('01.12.2007');

  1. Запрос на добавление – INSERT INTO:

Добавление новой бригады стоматологов:

INSERT INTO Brigada ( Brigada_id, specializaciya )

VALUES (10, 'Стоматология')

  1. В запросе на обновление UPDATE предложение WHERE может содержать до 40 выражений, связанных логическими операторами, такими как AND, OR и т.д., рассмотрим сложные или вложенные запросы на примере тестовой ПрО.

Изменение фамилии пациента, совершившего вызов пятой бригады 08.12.2006, на Фонюхова.

UPDATE Pacient SET FIO_pacienta = 'Фонюхов ' WHERE Pacient.pacient_id

IN (SELECT pacient_id FROM Vizov WHERE

(Vizov.Data_Vremya = #12/08/2006#) AND (Vizov.Brigada_id IN

(SELECT Brigada.Brigada_id FROM Brigada WHERE Brigada_id =5)));

(5) Запрос на удаление – DELETE.

  • Удаление бригады стоматологов.

DELETE * FROM Brigada WHERE Brigada.specializaciya='Стоматология';

  • Удалить все бригады стоматологов, которые обслуживают пациентов на машинах вместимостью менее 10 мест.

DELETE * FROM Brigada WHERE (Brigada.Specializaciya='Стоматология') AND brigada_id IN

(SELECT brigada_id FROM Vizov WHERE Nomer_mashini IN

(SELECT Mashina.Nomer_mashini FROM Mashina

WHERE Kolichestvo_mest<10));

При этом условие WHERE используется для фильтрации записей, которые нужно удалить.