Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
метод указания по ЛР БД 2008-2009.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
237.57 Кб
Скачать

6 Практическая работа

6.1 Тема: Создание запросов

6.2 Цель: научиться создавать и выполнять запросы на языке SQL-запросы.

6.3 Оборудование, инструменты, расходные материалы:

  1. Персональный компьютер

  2. Программа SQL Server 2000 (утилита Query Analizer)

6.4 Теоретическая часть

Для выполнения запросов пользователей необходимо перевести запрос с естественного языка на декларативный язык SQL.

Синтаксис оператора SELECT:

SELECT statement ::=     < query_expression >     [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }         [ ,...n ]    ]     [ COMPUTE         { { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ]         [ BY expression [ ,...n ] ]     ]     [ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }             [ , XMLDATA ]             [ , ELEMENTS ]             [ , BINARY base64 ]         } ]     [ OPTION ( < query_hint > [ ,...n ]) ]

< query expression > ::=     { < query specification > | ( < query expression > ) }     [ UNION [ ALL ] < query specification | ( < query expression > ) [...n ] ]

< query specification > ::=     SELECT [ ALL | DISTINCT ]         [ { TOP integer | TOP integer PERCENT } [ WITH TIES ] ]         < select_list >     [ INTO new_table ]     [ FROM { < table_source > } [ ,...n ] ]     [ WHERE < search_condition > ]     [ GROUP BY [ ALL ] group_by_expression [ ,...n ]         [ WITH { CUBE | ROLLUP } ]     ]     [ HAVING < search_condition > ]

6.5 Выполнение работы

1) Создайте 5 простых запросов на языке SQL с применением ключевых слов: DISTINCT, ORDER BY, GROUP BY, HAVING, BETWEEN, LIKE.

2) Создайте 5 сложных запросов на языке SQL с применением соединения таблиц.

3) Создайте 5 сложных запросов с подзапросами, использующими: агрегирующие функции, операторы сравнения во внешнем предложении WHERE. Не менее 1 запроса необходимо привести в коррелированной форме.

6.6 Пример выполнения работы

6.6.1 Простой запрос

Определить названия книг, у которых стоимость превышает 1000 руб.

Запрос на языке SQL:

select title

from book

where price > 1000;

6.6.2 Сложный запрос на соединение таблиц

Определить названия книг и их издательств, годовой объем продаж которых не менее 5 000 экземпляров.

select title, pub_name

from publisher p, book b

where (p.pub_id = b.pub_id) and (year_sale >= 5000);

6.6.3 Сложный запрос с подзапросом

Определить названия издательств, выпускающих книги по химии. Запрос представить в коррелированной форме.

select pub_name

from publisher p

where ‘химия’ in

( select book_vid

from book

where pub_id = p.pub_id

)

6.7 Вывод

7 Практическая работа

7.1 Тема: Назначение взаимосвязей в таблицах

7.2 Цель: научиться устанавливать взаимосвязи в таблицах.

7.3 Оборудование, инструменты, расходные материалы:

1) Персональный компьютер

2) Программа SQL Server 2000 (утилита Query Analizer) и Erwin 4.0

7.4 Теоретическая часть

Для установления взаимосвязей в таблицах необходимо использовать механизм жестких ограничений ссылочной целостности или механизм каскадных воздействий.

7.5 Выполнение работы

1) Установите механизмы ссылочной целостности с помощью программы Erwin 4.0.

2) Создайте триггеры в базе данных при помощи утилиты Query Analizer.

7.6 Пример выполнения работы

create trigger tD_Author on Author for DELETE as

/* ERwin Builtin Thu Dec 25 11:26:53 2008 */

/* DELETE trigger on Author */

begin

declare @errno int,

@errmsg varchar(255)

/* ERwin Builtin Thu Dec 25 11:26:53 2008 */

/* Author R/1 AuthorBook ON PARENT DELETE CASCADE */

/* ERWIN_RELATION:PARENT_OWNER="", PARENT_TABLE="Author"

CHILD_OWNER="", CHILD_TABLE="AuthorBook"

P2C_VERB_PHRASE="R/1", C2P_VERB_PHRASE="",

FK_CONSTRAINT="R_1", FK_COLUMNS="au_id" */

delete AuthorBook

from AuthorBook,deleted

where

/* %JoinFKPK(AuthorBook,deleted," = "," and") */

AuthorBook.au_id = deleted.au_id

/* ERwin Builtin Thu Dec 25 11:26:53 2008 */

return

error:

raiserror @errno @errmsg

rollback transaction

end

go

create trigger tU_Author on Author for UPDATE as

/* ERwin Builtin Thu Dec 25 11:26:53 2008 */

/* UPDATE trigger on Author */

begin

declare @numrows int,

@nullcnt int,

@validcnt int,

@insau_id int,

@errno int,

@errmsg varchar(255)

select @numrows = @@rowcount

/* ERwin Builtin Thu Dec 25 11:26:53 2008 */

/* Author R/1 AuthorBook ON PARENT UPDATE CASCADE */

/* ERWIN_RELATION:PARENT_OWNER="", PARENT_TABLE="Author"

CHILD_OWNER="", CHILD_TABLE="AuthorBook"

P2C_VERB_PHRASE="R/1", C2P_VERB_PHRASE="",

FK_CONSTRAINT="R_1", FK_COLUMNS="au_id" */

if

/* %ParentPK(" or",update) */

update(au_id)

begin

if @numrows = 1

begin

select @insau_id = inserted.au_id

from inserted

update AuthorBook

set

/* %JoinFKPK(AuthorBook,@ins," = ",",") */

AuthorBook.au_id = @insau_id

from AuthorBook,inserted,deleted

where

/* %JoinFKPK(AuthorBook,deleted," = "," and") */

AuthorBook.au_id = deleted.au_id

end

else

begin

select @errno = 30006,

@errmsg = 'Cannot cascade Author UPDATE because more than one row has been affected.'

goto error

end

end

/* ERwin Builtin Thu Dec 25 11:26:53 2008 */

return

error:

raiserror @errno @errmsg

rollback transaction

end

go

create trigger tI_AuthorBook on AuthorBook for INSERT as

/* ERwin Builtin Thu Dec 25 11:26:53 2008 */

/* INSERT trigger on AuthorBook */

begin

declare @numrows int,

@nullcnt int,

@validcnt int,

@errno int,

@errmsg varchar(255)

select @numrows = @@rowcount

/* ERwin Builtin Thu Dec 25 11:26:53 2008 */

/* fee R/8 AuthorBook ON CHILD INSERT SET NULL */

/* ERWIN_RELATION:PARENT_OWNER="", PARENT_TABLE="fee"

CHILD_OWNER="", CHILD_TABLE="AuthorBook"

P2C_VERB_PHRASE="R/8", C2P_VERB_PHRASE="",

FK_CONSTRAINT="R_8", FK_COLUMNS="pos" */

if

/* %ChildFK(" or",update) */

update(pos)

begin

update AuthorBook

set

/* %SetFK(AuthorBook,NULL) */

AuthorBook.pos = NULL

from AuthorBook,inserted

where

/* %JoinPKPK(AuthorBook,inserted," = "," and") */

AuthorBook.book_id = inserted.book_id and

AuthorBook.au_id = inserted.au_id

7.7 Вывод