Лабораторная работа №1. Операторы SDL и DML 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа №1. Операторы SDL и DML



Лабораторная работа №1. Операторы SDL и DML

Краткие теоретические данные.

Операторы языка SDL

Команды языка определения схемы данных (Schema Definition Language– SDL) представляют собой инструкции SQL, которые позволяют создавать и модифицировать элементы структуры базы данных. Например, используя SDL, можно создавать, удалять таблицы и изменять их структуру, создавать и удалять индексы.

1.1.1 Создание таблицы. Оператор создания таблицы имеет следующий вид:


CREATE TABLE <tbl_name>  (CREADE_DEFINITION)

<tbl_name>   – имя создаваемой таблицы

CREADE_DEFINITION включает в себя:

1) перечень столбцов, их типов, и ограничений для значений ячейки в столбце:

col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]

- для текстовых переменных NULL устанавливается автоматически

- DEFAULT – определяет значение по умолчанию

- [AUTO_INCREMENT] – автоматически увеличивающееся значение

2) набор столбцов участвующих в первичном ключе

[CONSTRAINT <pk_name>] PRIMARY KEY (index_col_name,...)

CONSTRAINT <pk_name >- создает имя для первичного ключа

3) набор столбцов участвующих во внешнем ключе, а также таблица с которой осуществляется связь

[CONSTRAINT <fk_name>]  FOREIGN KEY index_name (index_col_name,...)[reference _definition]

CONSTRAINT <fk_name >- создает имя для внешнего ключа

 

Обязательными операндами оператора являются имя создаваемой
таблицы и имя хотя бы одного столбца (поля) с указанием типа данных,
хранимых в этом столбце.

 

Пример 1.1

Create table t1 (c11 int not null AUTO_INCREMENT, c12 char(10) default 'no_text', c13 int not null, CONSTRAINT PK_t1 Primary key (c11)); CREATE TABLE t2 (c21 int not null AUTO_INCREMENT, c22 char(10) default 'no_text', c23 int not null, c24 int not null, CONSTRAINT PK_t2 Primary key (c21), CONSTRAINT FK_to_t1 foreign key (c24) references t1(c11));

 

Результат 1.1

1.1.2 Изменение таблицы. Для изменения структуры таблицы (добавление, удаление полей, изменения типов полей) используется оператор ALTER TABLE. в зависимости от необходимого  изменения, оператор ALERT может иметь один из следующих  видов:


1)  Изменение типа столбца:

 

ALTER TABLE <tab_name>  MODIFY <col_name> < type> <NOT NULL>

 

Пример 1.2

ALTER TABLE t2 modify c23 varchar(5) NOT NULL;

результат 1.2

 

2) Добавление нового столбца:

 

 ALTER TABLE <table_name> ADD <col_name> < type> [<NOT NULL> DEFAULT <val>];

 

Пример 1.3

ALTER TABLE t2 ADD c25 varchar(15) default 'no_text';

результат 1.3

 

3) Удаление столбца

 

 ALTER TABLE <tab_name> DROP <col_name>

 

Пример 1.4

ALTER TABLE t1 DROP c13 varchar(15) default 'no_text';

результат 1.4

 

4) Изменение имени столбца

 

 ALTER TABLE <tab_name> CHANGE <col_name_old> <col_name_new> < type>

// тип переименнованого столбца указать обязательно

 

Пример 1.5

ALTER TABLE t2 CHANGE c25 c27 varchar(15);;

результат 1.5

 

 

5) Переименование таблицы

 

ALTER TABLE <tab_name_old> RENAME <tab_name_new> 

 

Пример 1.6

ALTER TABLE t1 RENAME t3

результат 1.6

 

6) Удаление ключа внешнего ключа

 

ALTER TABLE <table_name> drop foreign key <key_name>

 

Пример 1.7

ALTER TABLE t2 drop foreign key FK_to_t1;

результат 1.7

 

7) назначение нового внешнего ключа:

 

ALTER TABLE <tab_name1> add [CONSTRAINT <fk_name>] foreign key (<col_name>) references <tab_name2>(<col_name3>)

 

Пример 1.8

ALTER TABLE t3 add CONSTRAINT FK_to_t1 foreign key (c24) references t1(c11);

 

 

8) Назначение нового первичного ключа (не в MySQL)

ALTER TABLE <tab_name1>  add [CONSTRAINT <key_name>] primary key(col_name1, col_nam2)

9) Удаление первичного ключа (не в MySQL)

ALTER TABLE <tab_name1>  drop primary key <key_name>

 

Удаление таблицы

 

DROP TABLE <table_name>

 

Операторы языка DML

Язык DML (Data Manipulation Language) является средством управления данными в внутри объектов схемы (БД). К запросам языка манипуляции относятся запросы на добавление, удаление и модификацию кортежей.

 

1.2.1 Добавление кортежа производится командой:


INSERT INTO имя_таблицы [(<список столбцов>)] VALUES (<список
значений>)

Пример 1.8

INSERT INTO t3 (c12) values (' Петров '), (' Иванов '), (' Сидоров ');

Результат 1.8:

C11 C12
1 Петров
2 Иванов
3 Сидоров
   

1.2.2 Операция обновления данных UPDATE требуется при изменении данных, которые надо отразить в базе данных.
Запрос на обновление может изменить одну или несколько записей.

-- обновление всех записей в столбце

UPDATE tab SET <col_name>=<val>

 

Пример 1.9

UPDATE t3 SET c12=null

Результат 1.9:

C11 C12
1 null
2 null
3 null
   

 

-- обновление одной или группы записей (по условию)

UPDATE tab SET <col_name>=<val> WHERE  <col_name1>=<val>

Пример 1.9

UPDATE t3 SET c12= null c12='Иванов' where c11=2;

Результат 1.10:

C11 C12
1 Null
2 Иванов
3 Null

 

1.2.3 Оператор удаления данных DELETE позволяет удалить одну или
несколько строк из таблицы в соответствии с условиями, которые задаются
для удаляемых строк. Синтаксис оператора DELETE следующий:

DELETE FROM <имя_таблицы> [WHERE <условия_отбора>]

 

Если условия отбора не задаются, то из таблицы удаляются все строки.

 

Задание к лабораторной работе №1

 

1) Создайте следующие таблицы

a)  таблица STUDENTS содержащая поля

- идентификатор студента

- имя

-фамилию

-отчество

-идентификатор группы

поле идентификатора студента должно быть первичным ключом в таблице

 

b) Таблица TEACHERS содержащая поля

- идентификатор преподавателя

- имя

-фамилию

-отчество

поле идентификатора преподавателя должно быть первичным ключом в таблице

 

c) Таблица GROUPS содержащая поля

- идентификатор группы

- наименование

- курс

поле идентификатора группы должно быть первичным ключом в таблице

 

d) 4 Таблица PLAN содержащая поля

- идентификатор группы

- идентификатор преподавателя

- идентификатор предмета

Все поля образуют первичный ключ

 

e) 5 Таблица SUBJECTS содержащая поля

- идентификатор предмета

- наименование предмета

- количество часов по предмету

 

2. Измените таблицы, создав связи между ними

- STUDENTS. идентификатор группы -- GROUPS. идентификатор группы

- PLAN. идентификатор преподавателя -- TEACHERS. идентификатор преподавателя

- PLAN. идентификатор предмета -- SUBJECTS. идентификатор предмета

- PLAN. идентификатор группы -- GROUPS. идентификатор группы

 

3. Заполнить таблицы согласно данным Таблицы 1.1 и Таблицы 1.2

Таблица 1.1

ФИО дата рождения Номер группы Курс
Федоренко П.Р. 25.12.1997 ПО135 1
Зингел О. 25.12.1985 ПО135 1
Михеенок П.Г. 05.02.1993 ПО134 1
Савицкаян Н. 22.09.1987 ПО235 2
Ковальчук М.Е. 17.06.1992 ПО235 2
Заболотная Н.Г. 18.06.1992 ПО335 3
КовригоТ.Р. 13.05.1992 ПО335 3
Шарапо Н. 14.08.1992 ПО335 3

 

Таблица 1.2

Фио Предмет Курс Количество часов
Сафроненко Н Физика 1 200
Зайцева Н.У. Математика 1 120
Лисопад П.Г. Основы алгоритмизации 2 70
Клюев К.Н. Проектирование БД 2 130
Рогачевский П.Н. Средства визуального программирования 3 90
Макаров Н.Г. Объектно-ориентированное программирование 3 70

 

 

4) В таблице STUDENTS внесите изменения таким образом, чтобы все студенты учащиеся в группе ПО135 числились в группе 134.

5) Из таблицы групп удалите запись о группе по 135

6) в таблице SUBJECTS увеличьте количество часов на 30 для предметов  

Средства визуального программирования, Объектно-ориентированное программирование

7) в таблицу SUBJECTS добавьте столбец, в который будут внесены данные для формы контроля по предметам (по всем предметам сдаются экзамены, кроме " Основы алгоритмизации " -зачет). обновите таблицу SUBJECTS с учетом форм контроля по предметам.

8) Из таблиц STUDENTS и TEACHERS удалите столбцы с данными отчества.

 

Таблица 2.1

Функция Результат Примечание
COUNT Количество строк или непустых значений полей, которые выбрал запрос Тип поля - не имеет значение
SUM Сумма всех выбранных значений данного поля Тип поля - числовой
AVG Среднеарифметическое значение всех выбранных значений данного поля Тип поля - числовой
MIN Наименьшее из всех выбранных значений данного поля Тип поля - числовой/символьный
MAX Наибольшее из всех выбранных значений данного поля Тип поля - числовой/символьный

Задание к лабораторной работе №2

 

1. Вывести фамилии студентов, в которых присутствуют буквы "б" и/или "о" в любых комбинациях и порядке

2. Вывести сведения о  студентах, фамилии которых начинаются с буквы К          

3. Вывести сведения о  студентах, фамилии которых содержат 8 символов и более

4. Вывести сведения о студентах, фамилии которых содержат или больше, или меньше семи символов

5. Найти всех студентов учащихся на ФПМ очном 1, 2 и 3 курса, отсортировать результаты по полю отчества

6. Найти всех студентов учащихся на ФПК очном, отсортировать результаты по полю отчества в убывающем порядке

7. Определить средний балл на заочной форме обучения каждого факультета.

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

9. Определить список факультетов, средний балл успеваемости на которых больше 7.5

10. Определить список курсов с указанием факультета, средний балл успеваемости на которых больше 7.5

11. Определить форму обучения с привязкой к факультету, для которой минимальный балл успеваемости для одного из студентов меньше 7. 

12.  Определить, какое количество часов студенты ФПК 3-го курса заочной формы обучения тратят на самостоятельную подготовку

13. Вывести список факультетов, курсов, форм обучения на которых студенты тратят более 150 часов на самостоятельную подготовку

14. определить среднее число часов, которое тратит студент факультета для каждой формы обучения за один год  на этой форме.

 

Tbl1

id f3
1 по1701
2 NULL
3 по1708

 

SELECT id FROM tbl1 WHERE f3 = NULL

-  вернет пустое множество

SELECT id FROM tbl1 WHERE f3 IS NULL

 -  вернет одну строку

SELECT id FROM tbl1 WHERE f3 IS NOT NULL

-  вернет ДВЕ строки

 

Для типа AVG(), MIN(), MAX(), SUM(), COUNT(), если значение столбца будет содержать NULL то такая строка игнорируется

Если какие либо из значений содержащихся в столбце, равны NULL, при вычислении результата функции они исключаются!

Если все значения в столбце равны NULL, то функции AVG(), SUM(), MIN(), MAX() возвращают значения NULL. Функция COUNT() возвращает ноль.

Если в столбце нет значений (т.е. столбец пуст), то функции AVG(), SUM(), MIN(), MAX() возвращают значения NULL. Функция COUNT() возвращает ноль!

Функция COUNT(*) подсчитывает количество строк и не зависит от наличия или отсутствия в столбце значений NULL. Если строк в столбце нет, то эта функция возвращает ноль

SUM(значение столбца - NULL) возвращает NULL.

4. Ограничение количества строк в результирующем запросе

 Для ограничения количества выводимых строк в операторе SELECT можно использовать ключевое слово LIMIT n, где n- целое число, количество выводимых срок

tab_1

Id Department Name Birthday
1 Продаж Иванов 06-12-1985
2 Продаж Петрова 04-23-1976
3 Кадров Сидоров 08-27-1976
4 Кадров Кунин 05-13-1983
5 Технический Мартынов 11-11-1984

SELECT * FROM tab_1 WHERE Birthday IS NOT NULL

- возвращает выборку из 5 строк

SELECT * FROM tab_1 WHERE Birthday IS NOT NULL LIMIT 3

- возвращает выборку из первых 3 строк

Ограничение LIMIT можно использовать в запросах поиска максимального или минимального значения в некоторых задачах. Например при необходимости поиска возраста самого младшего сотрудника можно использовать запрос:

SELECT MAX(Birthday) FROM tab_1

- возвращает ТОЛЬКО дату рождения

Для вывода информации об этом сотруднике возможно использовать вложенный запрос, так как использование агрегатной функции делает невозможным включить в перечень выбираемых столбцов Name и Department, однако можно использовать и запрос вида

 

SELECT *  FROM tab_1 ORDER BY Birthday DESC LIMIT 1

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

Сочетания DESC LIMIT 1 и ASC LIMIT 1 можно использовать для поиска макси мальных и минимальных значений, однако следует учитывать возможность наличия нескольких максимумов и минимумов.

При необходимости исключения дублирующих строк из результата запроса следует использовать ключевое слово DISTINCT

SELECT Department DISTINCT  FROM tab_1;

- возвращает перечень отделов компании.

 

Ключевое слово DISTINCT возможно использовать совместно с НЕКОТОРЫМИ агрегатными функциями, например с COUNT()

 

SELECT COUNT (DISTINCT Department)  FROM tab_1;

- возвращает количество отделов компании.

При этом следует помнить:

- если DISTINCT используется с агрегатной функцией, то ее аргументом может быть только имя столбца, выражение не может быть аргументом.

- в функциях MIN(), MAX() нет смысла использовать DISTINCT;

- к функции COUNT(*) не применимо DISTINCT, так как она просто подсчитывает число строк;

- в одном запросе DISTINCT можно употреблять только один раз.

Задание к лабораторной работе №3

 

1. Вывести информацию о студентах, которым на конец текущего года не исполниться 31 года

2. Вывести средний возраст студентов по факультету, курсу и форме обучения

 

3. Вывести информацию о студентах, которым на текущий момент исполнился 31 год

4. Найти количество студентов от 32 до 45 лет

5. Определить сколько студентов старше 45 лет учатся на каждом факультете на каждом курсе

6. Определит факультет,  на котором учится максимальное количество студентов до 35

7. Определить факультет с минимальным числом студентов на заочной форме обучения

8. Определить факультет, на котором учится максимальное число первокурсников очников или заочников

9. Определить факультет и курс, на которых средний возраст студентов меньше 32 лет

10. Определить факультет и курс и общую численность курса на котором учится студенты не младше 25

11. Найти факультет и курс, на которых студентов без отчества обучается больше одного

12. Вывести информацию о самом успевающем студенте университета.

13. Вывести список форм обучения в университете

14. Определить число форм обучения в университете на текущий момент

15. Определить число форм обучения на каждом факультете

16. Определить общее количество иностранцев и студентов не иностранцев фамилии которых начинаются на букву С

17. Определить процент учащихся иностранцев к  числу студентов в университете*

 

 

* для корректного вывода результатов следует использовать функцию явного преобразования типов cast(X as TYPE), в данном случае следует приводить к типу float

 


 

Пример 4.1

Пусть даны: - таблицы t 1, содержащая данные о id студента, фамилию, средний балл, id группы, в которой студент учится; - таблицы t 2, содержащая данные о id группы, названии группы, факультете, форма обучения.
t1
Id Name group_id exm
       

 

t2

Id Name faculty form
       

 

Необходимо сформировать запрос, результатом которого будет выборка номера группы с привязкой к факультету и форме обучения, в которой обучается студенты с максимальным средним баллом

 

SELECT name, faculty, form

FROM t2

WHERE t2.id= (SELECT TOP 1 t1.group_id FROM t1 ORDER BY exm DEST);

Внутренний запрос из таблицы t1 выберет все значения из столбца с id группы, и отсортирует их в убывающем порядке по столбцу exm, ограничение количества записей в выборке - T OP 1 - гарантирует наличие одного значения - первого, оно же будет соответствовать максимуму столбца exm.

Внешний запрос сформирует выборку из таблицы t2 в соответствии с id найденном внутренним запросом.

 

Пример 4.2

На основании таблиц иcпользуемых в примере 4.1. необходимо вывести список групп в которых средний средний балл студента >7 SELECT t2.name, t2.faculty, t2.form FROM t2 WHERE t2.id IN (SELECT t1.id FROM t1 GROUP BY t1.id HAVING AVG(exm)>7 ORDER BY t1.id ASC)

Пример 4.3:

На основании таблиц t1 и t2 (см. пример 4.1) необходимо вывести список студентов с указанием факультета и номера группы: SELECT t1.name, t2.name, t2.faculty, t2.form FROM t1,t2 WHERE t2.id=t1.group_id;

 

Пример 4.4:

 Вывести информацию (Факультет, группа, форма обучения, им студента) о наиболее успевающих студентах (exm >7.5) SELECT t1.name, t2.name, t2.faculty, t2.form FROM t1,t2 WHERE t2.id=t1.g roup_id AND exm>7.5;

 

Объединение возможно не только для таблиц но и для выборок. Например предыдущий запрос можно представить как:

 

SELECT t3.name, t2.name, t2.faculty, t2.form FROM t2, (SELECT t1.* FROM t1 WHERE t1.exm>7.5) WHERE t2.id=t1.group_id;

Таким образом оператор SELECT не только делает выборку их таблиц, но может использоваться:

- во FROM для определения выборки из которой выполняется дальнейшая выборка или объединение

- в WHERE в предикате условия выборки строк

- в HAVING предикате условия выборки групп

 

Задание к лабораторной работе №4

 

1. Вывести информацию о первых трех студентах (факультет, курс) заочной формы обучения младше 30 лет

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

3. Определить количество студентов на каждом факультете

4. Определить количество студентов, учащихся на каждой форме обучения

5. Определить средний возраст студентов для каждого факультета на конец года (лет)

6. Найти всех студентов-иностранцев (без отчества), вывести сведения о них (дата поступления, факультет, курс, форма обучения)

7. Определить общее количество аудиторных часов за весь период обучения для студентов очников ФПМ

8. Определить общее количество часов согласно плану для студентов заочной формы обучения ФПК заочной формы обучения

9. Определить всех сокурсников (с учетом факультета, но разных форм обучения) студента Ботяновского

10. Определить на какой факультет поступило наибольшее количество человек в 2015 году

11. Вывести список студентов, которые учатся на тех же курсах, что и студент Зингель и студентка Зайцева

12. Вывести список студентов по факультетам, средний балл которых меньше 7

13. Вывести список студентов, средний балл которых меньше чем средний по институту

14.  Вывести список студентов, средний бал которых выше чем по их факультету

 

SELECT name, faculty, form

FROM t2

WHERE 5< (SELECT COUNT(*) FROM t1 WHERE t1.id_group=t2.id);

 

 Соотнесенные или связные запросы могут быть созданы в отношении одной таблицы

 

Сформировать запрос, результатом которого будет список факультетов с числом групп меньше трех

SELECT DICTINCT name

FROM t1 T3

WHERE 3> (SELECT COUNT(*) FROM t1 WHERE t1.name=T3.name);

 

Соотнесенные запросы можно применять для проверки корректности информации внутри таблицы.

 

Оператор EXISTS.

Оператор  EXISTS принимает значение TRUE, если подзапрос содержит любое количество строк, иначе его значение равно FALSE. Для NOT EXISTS все наоборот. Этот предикат никогда не принимает значение UNKNOWN.

Обычно предикат EXISTS используется в зависимых (коррелирующих) подзапросах. Этот вид подзапроса имеет внешнюю ссылку, связанную со значением в основном запросе. Результат подзапроса может зависеть от этого значения и должен оцениваться отдельно для каждой строки запроса, в котором содержится данный подзапрос. Поэтому предикат EXISTS может иметь разные значения для разных строк основного запроса.

SELECT name, faculty, form

FROM t2

WHERE 5< (SELECT COUNT(*) FROM t1 WHERE t1.id_group=t2.id)

ADN EXIST(SELECT t1.name FROM t1 WHERE t1.id_group=t2.id and t1.exm>9);

 

Задание к лабораторной работе №5

Использовать БД UNIVER2

1. Найти фамилии студентов, которые учатся на одной факультете, курсе, форме обучения со студентами, средний балл которых >9

2. Найти фамилии студентов, которые учатся на одной факультете, курсе, форме обучения со студентами, средний бал которых >9, и число таких студентов больше 2.

3.  Найти студентов, обучающихся одновременно на разных формах обучения

4. Вывести список студентов, обучающихся одновременно на разных формах обучения, при этом одна из форм вечерняя.

 

Пример 6. 2

Пусть даны: - таблицы t 1, содержащая данные о id студента, фамилию, средний балл, id группы, в которой студент учится; - таблицы t 2, содержащая данные о id группы, названии группы, факультете
t1  
Id group_id Faculty Name exm
1 1 ФПК Ахрем  
2 2 ФПК Петров  
3 3 ФПИ Иванов  

 

Id Name_gr Faculty
1 по1701 ФПК
2 по1705 ФПК
3 по1708 ФПИ
4 по1709 ФПИ

 

Необходимо сформировать запрос, результатом которого будет выборка c информацией о студентах, факультетах, группах, оценках

SELECT * FROM tbl2

JOIN tbl1

ON tbl1.id_gr = tbl2.id

 

2) необходимо вывести информацию о студентах учащихся в группе по1701

SELECT * from tbl1

JOIN tbl1

ON tbl1.id_gr = tbl2.id

WHERE tbl2.name_gr like 'по1701'

LEFT JOIN

Внутренний SELECT может возвращать не одно а множество значений одного поля. В таких случаях необходимо использовать оператор IN.

 Выбираются все столбцы левой таблицы, столбцы удовлетворяющие условию объединения из правой таблицы. Если не найдено соответствия в правой таблице, поля итоговой таблицы заполняются NULL.

Синтаксис

SELECT <список выбираемых столбцов>

FROM <Table A>

LEFT JOIN <Table B> ON <условие объединения>

Пример 6.2

На основании таблиц примера 5.1 вывести список всех групп с указанием студентов, которые там учатся SELECT * from tbl2 LEFT JOIN tbl1 on tbl2.id = tbl1.id_gr

RIGHT JOIN

Выбираются все столбцы правой таблицы, столбцы удовлетворяющие условию объединения из левой таблицы. Если не найдено соответствия в левой таблице, поля итоговой таблицы заполняются NULL.

Синтаксис

SELECT <список выбираемых столбцов>

FROM <Table A>

RIFHT JOIN <Table B> ON <условие объединения>

 

Пример 6.3:

На основании таблиц t1 и t2 (см. пример 5.1) необходимо вывести список студентов с указанием факультета и номера группы: SELECT * from tbl2 RIGHT JOIN tbl2 on tbl2.id = tbl1.id_gr

 

FULL JOIN

Возвращает все объединение левого и правого объединения)

Синтаксис

SELECT <список выбираемых столбцов>

FROM <Table A>

full JOIN <Table B>

on tbl2.f1 = tbl1.id (условие объединения)

Пример 6. 4:

На основании таблиц t1 и t2 (см. пример 5.1) необходимо вывести список студентов с указанием факультета и номера группы: SELECT * from tbl1 (что) full JOIN tbl2 (с чем) tbl 2. f 1 = tbl 1. id (условие объединения)

 

CROSS JOIN

Возвращает объединение каждой строки одного отношения с каждой строкой второго (Декартово произведение)

Синтаксис

SELECT <список выбираемых столбцов>

FROM <Table A>

full JOIN <Table B>

Пример 6. 5:

SELECT * from tbl1 CROSS JOIN tbl2

 

Задание к лабораторной работе №6

 

1. Вывести информацию о первых трех студентах (факультет, курс) заочной формы обучения младше 30 лет

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

3. Определить количество студентов на каждом факультете

4. Определить количество студентов, учащихся на каждой форме обучения

5. Определить средний возраст студентов для каждого факультета на конец года (лет)

6. Найти всех студентов-иностранцев (без отчества), вывести сведения о них (дата поступления, факультет, курс, форма обучения)

7. Определить общее количество аудиторных часов за весь период обучения для студентов очников ФПМ

8. Определить общее количество часов согласно плану для студентов заочной формы обучения ФПК заочной формы обучения

9. Определить всех сокурсников (с учетом факультета, но разных форм обучения) студента Ботяновского

10. Определить на какой факультет поступило наибольшее количество человек в 2015 году

11. Вывести список студентов, которые учатся на тех же курсах, что и студент Зингель и студентка Зайцева

12. Вывести список студентов по факультетам, средний балл которых меньше 7

13. Вывести список студентов, средний балл которых меньше чем средний по институту

14.  Вывести список студентов, средний бал которых выше чем по их факультету

 


 

Лабораторная работа №7.
Хранимые процедуры.

Создание ХП

При создании ХП задается:

1. имя ХП и перечень параметров

2. свойства ХП

3. тело ХП

Пример 7.1

DELIMITER //       # (1)необходим для непрерывного выполнения ХП CREATE PROCEDURE pr1 () # (2) создаем ХП с именем pr1 LANGUAGE SQL                # (3) определяем свойства ХП (см. ниже) DETERMINISTIC SQL SECURITY DEFINER COMMENT 'My procedure' BEGIN                               # (4) начало тела ХП SELECT 'Hello World!'; # (5) тело ХП END //                           # (4)окончания тела ХП DELIMITER;              # (1)переопределение ограничителя (1) - Разделитель — символ или строка символов, которая используется для закрытия оператора SQL. По умолчанию в качестве разделителя используется точка с запятой(;). Но это вызывает проблемы в хранимых процедурах и триггерах MySQL, поскольку она может иметь много операторов, и каждый должен заканчиваться точкой с запятой. (2) - Имена процедур не чувствительны к регистру, поэтому pr1 = PR1. Нельзя использовать две процедуры с одним именем в одной и той же базе данных; Можно использовать имена в формате "имя-процедуры.имя-базы-данных"; Максимальная длина имени процедуры составляет 64 символа; Избегайте использования имен встроенных функций MySQL; (3) характеристики хранимой процедуры: Language: в целях обеспечения переносимости, по умолчанию указан SQL. Deterministic: если процедура все время возвращает один и тот же результат, и принимает одни и те же входящие параметры. Это для репликации и процесса регистрации. Значение по умолчанию - NOT DETERMINISTIC. SQL Security: во время вызова идет проверка прав пользователя. INVOKER - это пользователь, вызывающий хранимую процедуру. DEFINER - это “создатель” процедуры. Значение по умолчанию - DEFINER. Comment: в целях документирования, значение по умолчанию - "" (4) BEGIN........ END -контейнер, используемый для определения границ тела ХП

 

ХП кроме SQL инструкций может содержать переменные. Переменные внутри ХП могут быть локальными (видны только в пределах ХП) и пользовательские (видны за пределами ХП)

локальные переменные объявляются как

DECLARE a, b INT DEFAULT 5; # объявление переменных с инициализацией DECLARE str VARCHAR(50); # объявление переменных без инициализации SET str = 'text'; # инициализация объявленной переменной

 

Пользовательские переменные объявляются при инициализации

SET @int = 5, @txt=' text ';

Параметры хранимых процедур

2.1 Передача данных в ХП

Для передачи данных в ХП используются входные параметры. Свойства параметров - количество и тип данных, определяется при создании ХП.

CREATEPROCEDURE PR2 (IN var_id INT) BEGIN SELECT * FROM stud WHERE id = var_id; END //

где, IN - ключевое слово, определяющее что параметр является входным;

  var_id - имя параметра;

INT - тип параметра;

 

Значение параметров определяется при вызове ХП.

call PR2(1);

 

 где, call - оператор вызова ХП

  PR2 - имя вызываемой ХП

1 - значение присваемое параметру ХП - var_id

 

Входных параметров может быть несколько

CREATE PROCEDURE PR3 (IN var_id INT, IN var_name NVARCHAR(20)) BEGIN SELECT * FROM stud WHERE id = var_id and f_name = var_name; END //

 

Тогда вызов ХП должен осуществляться как

Call PR3(1,'Петров');

 

2. 2 Вывод данных из ХП

Для вывода данных из ХП используются выходные параметры. Свойства параметров - количество и тип данных, определяется при создании ХП.

DELIMITER // CREATE PROCEDURE PR4 (OUT var INT) BEGIN SELECT count(*) into var FROM stud; END // DELIMITER; SET @c=0; #объявляем и инициализируем переменную, в которую будет возвращено значение выходного параметра ХП c all PR4(@c); # передаем переменную ХП SELECT @c; # Выводим полученное значение

 

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

DELIMITER // CREATE PROCEDURE PR5 () BEGIN SET @count=0; SELECT count(*) into @count FROM stud; END //  DELIMITER; Call PR5(); SELECT @count; # Выводим полученной значение

 

2. 3 Переменные для ввода-вывода значений

INOUT: Совмещает в себе свойства параметров IN и OUT. Значение может передаваться в процедуру, изменяться внутри процедуры и быть доступным вне процедуры.

DELIMITER // CREATE PROCEDURE PR8(INOUT P INT) begin SET P=P*2; END // DELIMITER; set @a=5; CALL PR8(@a); SELECT @a;

 

Задание к лабораторной работе №7

1) Создать хранимую процедуру для подсчета количествa студентов на факультете и форме обучения (входные данные название факультета и наименование формы обучения)

2) Создать хранимую процедуру: добавления студента на указанный факультет и форму обучения (входные данные название факультета и наименование формы обучения, дата рождения, дата поступления, ФИО).

3*) Создайте таблицы представленные на рисунке, заполните их данными

Providers

Id Name
1 Продинвест
2 КрендельПродакшн
3 Родничек

 

Sets

Id_prov Date_set name price
1 01.02.18 Овсянка 1
1 01.02.18 Гречка 1
2 01.02.18 Батон 1
3 01.02.18 Шампанское 5
3 01.02.18 Коньяк 19
2 02.02.18 Батон 1
2 02.02.18 Ватрушка 1,5
1 03.02.18 Шампанское 5
1 03.02.18 Коньяк 20

 

А также таблицу Orders, содержащую информацию о поступивших партиях, такую как идентификатор поставщика (Id_prov) дата комплектации партии (Date_set), наименование товара в партии (name), его цена (price), дата заказа (Date_order)

Создать хранимую процедуру по заполнению таблицы Orders. Входными параметрами для нее должны быть:

- дата партии (Date_set),

- наименование поставщика

- размер партии.

Если наименование поставщика не введено сообщение об ошибке. (используйте оператор if)

 Если дата не указана - добавить в таблицу набор из таблицы Sets с последней датой комплектации (используйте оператор if).

В таблицу Orders внести набор столько раз, сколько указано в размере партии (используйте оператор while). Eсли размер партии не указан, то набор добавить один раз, если размер партии больше 10 - выдать сообщение о превышении максимально допустимого объема партии. (используйте оператор case)

 

 


15.

ПРИЛОЖЕНИЕ 1
Таблица для выполнения задания к лабораторным работам 2 и 3

create database UNIVER;

 

use UNIVER;

 

Create table stud

(id int not null auto_increment,

last_name nvarchar(25) not null,

f_name nvarchar(25) not null,

s_name nvarchar(25),

form nvarchar(10) not null default 'очно',

faculty nvarchar(10) not null default 'ФПМ',

year int not null default 1,

all_h int default NULL,

inclass_h int default NULL,

br_date date,

in_date date,  

exm float default NULL,

CONSTRAINT PK_stud Primary key (id)

);

insert into stud

(last_name,f_name,s_name,form,faculty,year,all_h,inclass_h,br_date,in_date,exm) values

(N'Стрынгель',N'К',null,N'заочная',N'ФПК',1,300,100,'19831212','20160901',8),

(N'Козлова',N'Д',N'Е',N'заочная',N'ФПК',2,300,100,'19831012','20150901',8.4),

(N'Федоров',N'Н',N'Н',N'заочная',N'ФПК',3,300,100,'19811207','20140901',7),

(N'Рингель',N'П',N'О',N'заочная',N'ФПК',3,300,100,'19730215','20160901',8),

(N'Бежик',N'Н',N'Н',N'вечерняя',N'ФПК',1,500,400,'19931211','2016-09-01',4.5),

(N'Осипчик',N'Н',N'Н',N'вечерняя',N'ФПК',1,500,400,'19831216','20150901',7.7),

(N'Белый',N'С',N'С',N'вечерняя',N'ФПК',2,450,370,'19870627','20150901',6.7),

(N'Ботяновский',N'А',N'С',N'вечерняя',N'ФПК',2,450,370,'19870723','20150901',7.6),

(N'Слободницкий',N'С',N'А',N'вечерняя',N'ФПК',2,450,370,'19870803','20150901',6.7),

(N'Рогатка',N'П',N'Р',N'очная',N'ФПМ',1,500,450,'19861027','20160901',7.4),

(N'Федоренко',N'П',N'Р',N'очная',N'ФПМ',1,500,450,'19950426','20160901',5.6),

(N'Зингель',N'П',N'В',N'очная',N'ФПМ',2,500,450,'19900425','20150901',3.4),

(N'Михеенок',N'Л',N'Н',N'очная',N'ФПМ',2,500,450,'19890313','20150901',5.3),

(N'Савицкая',N'Л',N'Н',N'очная',N'ФПМ',3,450,400, '19950705','20140901',7.7),

(N'Ковальчук',N'О',N'Е',N'заочная',N'ФПМ',1,350,100,'19640523','20160901',7.6),



Поделиться:


Читайте также:




Последнее изменение этой страницы: 2019-05-20; просмотров: 566; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.218.184 (0.279 с.)