- Тема 4. Операторы манипулирования данными языка SQL
- Оглавление
- 4.1. Оператор ввода данных INSERT
- 4.2. Оператор удаления данных DELETE
- 4.3. Оператор обновления данных UPDATE
- Урок 25 § 3.2. Организация ввода и вывода данных
- 3.2.1. Вывод данных
- 3.2.2. Первая программа на языке Паскаль
- 3.2.3. Ввод данных с клавиатуры
- САМОЕ ГЛАВНОЕ
- Вопросы и задания
- Электронное приложение к уроку
Тема 4. Операторы манипулирования данными языка SQL
Оглавление
Цель: изучить операторы изменения данных в реляционных базах данных, которые составляют подъязык манипулирования данными языка SQL (DML Data manipulation Language) в рамках существующих стандартов.
Задачи:
- изучить синтаксис операторов манипулирования данными в SQL;
- научиться писать произвольные запросы изменения данных к БД;
- изучить ограничения, которые накладываются на возможность выполнения операций модификации данных;
- получить представление о графическом языке запросов QBE (Query By Example) и сравнить его с возможностями стандартного SQL.
4.1. Оператор ввода данных INSERT
SQL является полноценным языком, предназначенным для работы с базами данных, поэтому в отличие от реляционной алгебры кроме запросов к содержимому БД на этом языке можно выполнять операции изменения содержимого таблиц БД и даже изменять схему БД, т. е. набор таблиц, их атрибутов и связей между ними. Данная глава посвящена операторам манипулирования данными: эти операторы позволяют только изменять содержимое таблиц, входящих в БД.
В операции манипулирования данными входят три операции: операция удаления записей — ей соответствует оператор DELETE, операция добавления или ввода новых записей — ей соответствует оператор INSERT и операция изменения (обновления записей) — ей соответствует оператор UPDATE. Рассмотрим каждый из операторов подробнее.
Следует отметить, что все операторы манипулирования данными позволяют изменить данные только в одной таблице.
Оператор ввода данных INSERT имеет следующий синтаксис:
INSERT INTO имя_таблицы [( ) ] VALUES ( )
Подобный синтаксис позволяет ввести только одну строку в таблицу. Список столбцов является необязательным параметром в данном операторе. Можно не задавать список столбцов в том случае, если вводимая строка содержит полный перечень значений столбцов таблицы, и они приводятся в том порядке, как они заданы при создании таблицы.
Например, рассмотрим БД «Библиотека». В данной БД есть таблица, которая хранит каталог всех книг, которые присутствуют в нашей библиотеке. Внешне таблица выглядит следующим образом:
Во второй строке таблицы приведена расшифровка значения имен атрибутов (столбцов таблицы). Почему же у нас в таблице не присутствует столбец с фамилией автора книги? Следует отметить, что авторов у книги может быть несколько, поэтому в таблицу книги они попасть не могут — это по определению реляционное отношение, которому соответствует наша таблица (см. тему 2), и, кроме того, есть книги, у которых не указываются авторы — это энциклопедии, справочники, сборники трудов.
Введем новую книгу в таблицу BOOKS:
INSERT INTO BOOKS (ISBN,TITLE, Publishing_house, Year_of_the_edition, PAGES) V ALUES (5-88782-290-2, Аппаратные средства IBM PC, Энциклопедия ,
Так как мы вводим полную строку, то мы можем не задавать список столбцов, ограничиться только заданием перечня значений, в этом случае оператор ввода будет выглядеть следующим образом:
INSERT INTO BOOKS VALUES ( 5-88782-290-2 , Аппаратные средства IBM PC. Энциклопедия, Питер,2003,816)
Результаты работы обоих операторов одинаковы.
Наконец, мы можем ввести неполный перечень значений, т. е. не вводить, например, количество страниц, если мы его не знаем. Но в этом случае мы должны задать список вводимых столбцов, тогда оператор ввода будет выглядеть следующим образом:
INSERT INTO BOOKS (ISBN,TITLE, Publishing_house, Year_of_the_edition) V ALUES (5-88782-290-2, Аппаратные средства IBM P. Энциклопедия , Питер , 2003)
Столбцу PAGES будет присвоено в этом случае значение NULL (не определено).
Какие столбцы должны быть заданы при вводе данных? Это определяется тем, как описаны эти столбцы при описании соответствующей таблицы, и будет рассмотрено более подробно при описании языка DDL (Data Definition Language) в теме 5. Здесь мы пока отметим, что если столбец или атрибут имеет признак обязательный (NOT NULL) при описании таблицы, то оператор INSERT должен обязательно содержать данные для ввода в каждую строку данного столбца. Поэтому если в таблице все столбцы обязательные, то каждая вводимая строка должна содержать полный перечень вводимых значений, а указание имен столбцов в этом случае не обязательно. В противном случае, если имеется хотя бы один необязательный столбец, и вы не вводите в него значений, задание списка имен столбцов — обязательно.
В набор значений могут быть включены специальные функции и выражения. Ограничением здесь является то, что значения этих функций должны быть определены на момент ввода данных.
Например, если мы знаем, что вводим книгу, которая издана в текущем году, то вместо числа, соответствующего году издания можем включить функцию Year (GetDate ()) — здесь мы использовали две функции из внутреннего языка TransactSQL сервера баз данных MS SQL Server. Функция Year () использует в качестве параметра календарную дату и позволяет по заданной дате определить год. Внутренняя функция GetDate () позволяет определить текущую календарную дату. В этом случае оператор ввода данных будет выглядеть следующим образом:
INSERT INTO BOOKS VALUES ( 5-94723-275-9 , Теория и практика построения баз данных, Питер, Year (GetDate ()),796)
Операция ввода данных связана с анализом взаимосвязей между таблицами БД. Нельзя ввести данные в подчиненную таблицу, если вводимая запись связана с данными из главной родительской таблицы, а в нее соответствующая строка еще не введена. При вводе данных необходимо соблюдать строгий порядок: сначала заполнять основные таблицы и только потом заполнять подчиненные таблицы, при этом если одна подчиненная таблица связана с двумя основными, то необходимо сначала заполнить обе основные таблицы и только после этого вводить данные в подчиненную таблицу.
Оператор ввода данных позволяет ввести сразу множество строк, если их можно выбрать из некоторой другой таблицы. Допустим, что у нас есть таблица со студентами и в ней указаны основные данные о студентах: их фамилии, адреса, домашние телефоны и даты рождения, а для учета читателей есть таблица READERS, которая имеет следующую схему:
Тогда мы можем сделать всех студентов читателями нашей библиотеки одним оператором:
INSERT INTO READER (NAME_READER, ADRESS, HOOM_PHONE, BIRTH_DAY)
SELECT (NAME_STUDENT, ADRESS, HOOM_PHONE, BIRTH_DAY)
При этом номер читательского билета может назначаться автоматически, с использованием инкрементного поля, поэтому мы не вводим значения этого столбца в таблицу. Инкрементные поля ведут себя как поля типа «Счетчик» в MS Access, т. е. при добавлении новой строки СУБД сама присваивает очередное значение данному полю.
4.2. Оператор удаления данных DELETE
Оператор удаления данных позволяет удалить одну или несколько строк из таблицы в соответствии с условиями, которые задаются для удаляемых строк.
Синтаксис оператора DELETE следующий:
DELETE FROM имя_таблицы [WHERE условия_отбора]
Если условия отбора не задаются, то из таблицы удаляются все строки. Однако это не означает, что удаляется вся таблица. Исходная таблица остается, но она остается пустой, незаполненной.
Например, если нам надо удалить результаты прошедшей сессии из отношения R1, то мы можем удалить все строки таблицы R1 следующей командой:
Условия отбора в части WHERE имеют тот же вид, что и условия фильтрации в операторе SELECT. Эти условия определяют, какие строки из исходного отношения будут удалены. Например, если мы исключим студента Миронова А. В., и мы помним, что списки студентов хранятся в таблице R2, то мы должны написать следующую команду:
WHERE ФИО = Миронов А. В.
В части WHERE кроме простых условий фильтрации может находиться также встроенный запрос. Например, если нам надо исключить неуспевающих студентов, то по закону о высшем образовании не успевающим считается студент, имеющий две и более задолженности по послед ней сессии. Тогда нам в условиях отбора надо найти студентов, имеющих либо две или более двоек, либо два и более несданных экзамена из числа тех, которые студент сдавал. Для поиска таких горе-студентов нам надо выбрать из отношения R1 все строки с оценкой 2 или с неопределенным значением, потом надо сгруппировать полученный результат по атрибуту ФИО и, подсчитав количество строк в каждой группе, которое соответствует количеству несданных экзаменов каждым студентом, отобрать те группы, у которых количество строк не менее двух. Теперь попробуем просто записать эту сложную конструкцию на SQL и убедимся, что этот сложный запрос записывается достаточно компактно.
WHERE R2. ФИО IN
WHERE Оценка = 2 OR Оценка IS NULL
GROUP BY R1. ФИО
HAVING COUNT(*) >= 2)
Этот запрос будет корректно работать в том случае, если в отношении R1 находятся записи о несдававших студентах, и там вместо оценки стоит неопределенное значение NULL. А как готовить запрос в том случае, если в таблице R1 зарегистрированы только все попытки сдачи экзаменов, а те студенты, которые по каким-либо причинам не пришли сдавать экзамен, вообще в данной таблице отсутствуют. Ну мы уже умеем и в этом случае вычислять количество не сданных студентом экзаменов. Снова вспомним нашу БД «Сессия», восстановим структуру таблиц:
Сформулируем следующим образом запрос: удаляем тех студентов, у которых число экзаменов, которые им требуется сдать, минус два превышает число сданных ими экзаменов.
Where FIO in (Select FIO from R2, R3
Where R2. Группа= R3. Группа
Having count (distinct Дисциплина)-2 > (Select count(*)from R1
Where Mark>2 and R1.FIO =R2.FIO)
Все операции манипулирования данными связаны с понятием целостности базы данных, которое будет рассматриваться в теме 5. В настоящий момент хотелось бы отметить только то, что операции манипулирования данными не всегда выполнимы, даже если синтаксически они написаны правильно. Действительно, если бы мы захотели удалить какую-нибудь группу из отношения R3, то СУБД не позволила бы нам это сделать, так как в отношениях R1 и R2 есть строки, связанные с удаляемой строкой в отношении R3. Почему так делается, мы узнаем позднее, а пока просто примем к сведению, что не все операторы манипулирования выполнимы.
4.3. Оператор обновления данных UPDATE
Операция обновления данных UPDATE требуется тогда, когда происходят изменения во внешнем мире и их надо адекватно отразить в базе данных, так как надо всегда помнить, что база данных отражает некоторую предметную область. Например, в нашем учебном заведении произошло счастливое событие, которое связано с тем, что госпожа Степанова К. Е. пересдала экзамен по дисциплине «Базы данных» с «двойки» сразу на «четверку». В этом случае нам надо срочно выполнить соответствующую корректировку таблицы R1. Операция обновления имеет следующий формат:
Выражение, которое находится в фигурных скобках означает, что мы за одну операцию обновления можем изменить сразу несколько столбцов, при этом ключевое слово SET не повторяется, а выражение «имя_столбца = новое_значение» может повторяться несколько раз для разных столбцов, и при этом каждая пара отделяется от следующей разделителем — запятой.
Часть WHERE является необязательной, как и в операторе DELETE. Она играет здесь ту же роль, что и в операторе DELETE, — позволяет отобрать строки, к которым будет применена операция модификации. Если условие отбора не задается, то операция модификации будет применена ко всем строкам таблицы.
Для решения ранее поставленной задачи нам необходимо выполнить следующую операцию:
SET R1. Оценка = 4
WHERE R1.ФИО = «Степанова К.Е.» AND R1.Дисциплина = «Базы данных»
В каких случаях требуется провести изменение в нескольких строках? Это не такая уж редкая задача. Например, если мы расширим нашу учебную базу данных еще одним отношением, которое содержит перечень курсов, на которых учатся наши студенты, то можно с помощью операции обновления промоделировать операцию перевода групп на следующий курс. Пусть новое отношение R4 имеет следующую схему: R 4 =
Источник
Урок 25
§ 3.2. Организация ввода и вывода данных
Ключевые слова:
• оператор вывода write
• формат вывода
• оператор ввода read
3.2.1. Вывод данных
В предыдущем параграфе мы познакомились со структурой программы на языке Паскаль, научились описывать данные, рассмотрели оператор присваивания. Этого достаточно для того, чтобы записать программу преобразования данных. Но результат этих преобразований нам виден не будет.
Для вывода данных из оперативной памяти на экран монитора используется оператор вывода write:
Здесь в круглых скобках помещается список вывода — список выражений, значения которых выводятся на экран. Это могут быть числовые, символьные и логические выражения, в том числе переменные и константы.
Произвольный набор символов, заключённый в апострофы, считается строковой константой. Строковая константа может содержать любые символы, набираемые на клавиатуре.
Пример. Оператор write (‘ s=’, s) выполняется так:
1) на экран выводятся символы, заключённые в апострофы: s=
2) на экран выводится значение переменной, хранящееся в ячейке оперативной памяти с именем s.
Если значение переменной s равно 15 и она имеет целочисленный тип, то на экране появится: s=15
Если значение переменной s равно 15, но она имеет вещественный тип, то на экране появится: s=1.5Е+01
При выполнении оператора вывода все элементы списка вывода печатаются непосредственно друг за другом. Так, в результате работы оператора write (1, 20, 300) на экран будет выведена последовательность цифр 120300, которая будет восприниматься нами как число 120300, а не как три отдельные числовые константы. Сделать выводимые данные более доступными для восприятия можно разными способами:
Формат вывода — это указываемое после двоеточия целое число, определяющее, сколько позиций на экране должна занимать выводимая величина. Если цифр в числе меньше, чем зарезервированных под него позиций на экране, то свободные позиции дополняются пробелами слева от числа. Если указанное в формате вывода после двоеточия число меньше, чем необходимо, то оно автоматически будет увеличено до минимально необходимого.
Для вывода вещественного числа в списке вывода для каждого выражения указываются два параметра: 1) общее количество позиций, отводимых под число; 2) количество позиций в дробной части числа:
При выполнении нового оператора write вывод продолжается в той же строке. Чтобы осуществить переход к новой строке, используется оператор writeln. Других различий между операторами write и writeln нет.
3.2.2. Первая программа на языке Паскаль
Пользуясь рассмотренными операторами, составим программу, вычисляющую длину окружности и площадь круга радиуса 5,4 см.
Исходным данным в этой задаче является радиус: r = 5,4 см. Результатом работы программы должны быть величины с — длина окружности и s — площадь круга, с, s и r — величины вещественного типа.
Исходные данные и результаты связаны соотношениями, известными из курса математики: с = 2 π r, s = π r 2 . Программа, реализующая вычисления по этим формулам, будет иметь вид:
Эта программа верна и решает поставленную задачу. Запустив её на выполнение, вы получите следующий результат:
И всё-таки составленная нами программа имеет существенный недостаток: она находит длину окружности и площадь круга для единственного значения радиуса (5,4 см).
Для того чтобы вычислить длину окружности и площадь круга для другого значения радиуса, потребуется вносить изменения непосредственно в текст программы, а именно изменять оператор присваивания. Внесение изменений в существующую программу, по меньшей мере, не всегда удобно (например, когда программа большая и операторов присваивания много). Ниже вы познакомитесь с оператором, позволяющим вводить исходные данные в процессе работы программы, не прибегая к изменению текста программы.
3.2.3. Ввод данных с клавиатуры
Для ввода в оперативную память значений переменных используется оператор ввода read:
При выполнении оператора read компьютер переходит в режим ожидания данных: пользователь должен ввести данные с клавиатуры и нажать клавишу Enter 1 .
1 Нажатием клавиши Enter может сопровождаться ввод каждого значения.
Несколько значений переменных числовых типов могут вводиться через пробел или через запятую. При вводе символьных переменных пробел и запятая воспринимаются как символы, поэтому ставить их нельзя.
Первое введённое пользователем значение переменной помещается в ячейку памяти, имя которой расположено первым в списке ввода, и т. д. Поэтому типы вводимых значений (входного потока) должны соответствовать типам переменных, указанных в разделе описания переменных.
Пример. ПУСТЬ .
var i, j: integer; x: real; a: char;
Присвоим переменным i, j, x, а значения 1, 0, 2,5 и ‘A’. Для этого воспользуемся оператором
read (i, j, х, а)
и организуем входной поток одним из следующих способов:
Здесь мы не только использовали различные разделители (пробел, запятая), но и представляли входной поток в виде одной, двух и четырёх строк.
Для ввода данных с клавиатуры можно также использовать оператор readln. Отличие состоит в том, что после выполнения readln осуществляется автоматический переход на новую строку входного потока, даже если в текущей строке остались невведённые символы. Таким образом, readln позволяет считать лишь начальную часть введённой пользователем строки и, проигнорировав её окончание, перейти к следующей строке.
Усовершенствуем программу n_1, организовав в ней ввод данных с помощью оператора read. А чтобы пользователь знал, для чего предназначена программа, и понимал, какое именно действие ожидает от него компьютер, выведем соответствующие текстовые сообщения с помощью оператора writeln:
Результат работы усовершенствованной программы:
Теперь наша программа может ВЫЧИСЛИТЬ длину окружности и площадь круга для любого значения г. Иначе говоря, она решает не единичную задачу, а целый класс задач. Кроме того, в программе понятно и удобно организован ввод исходных данных и вывод получаемых результатов. Это обеспечивает дружественность пользовательского интерфейса.
САМОЕ ГЛАВНОЕ
Для ввода в оперативную память значений переменных используются операторы ввода read и readln.
Для вывода данных из оперативной памяти на экран монитора используются операторы вывода write и writeln.
Ввод исходных данных и вывод результатов должны быть организованы понятно и удобно; это обеспечивает дружественность пользовательского интерфейса.
Вопросы и задания
1. Ознакомьтесь с материалами презентации к параграфу, содержащейся в электронном приложении к учебнику. Используйте эти материалы при подготовке ответов на вопросы и выполнении заданий.
2. Запишите оператор, обеспечивающий во время работы программы ввод значения переменной summa.
3. Целочисленным переменным i, j, k нужно присвоить соответственно значения 10, 20 и 30. Запишите оператор ввода, соответствующий входному потоку:
а) 20 10 30
б) 30 20 10
в) 10 30 20
4. Опишите переменные, необходимые для вычисления площади треугольника по его трём сторонам, и запишите оператор, обеспечивающий ввод необходимых исходных данных.
5. Что является результатом выполнения оператора?
а) write (а)
б) write (‘а’)
в)write (‘а=’, а)
6. Какой тип имеет переменная f, если после выполнения оператора write (f) на экран было выведено следующее число?
7. Каким образом можно вывести на экран вещественное число?
8. Запишите операторы ввода двух чисел и вывода их в обратном порядке.
9. Дан фрагмент программы:
read (a); read (b); c:=a+b; write (a, b); write (с)
Упростите его, сократив число операторов ввода и вывода.
10. Дан фрагмент программы:
а:=10; b:=a+1: a:=b-a; write (а, b)
Какие числа будут выведены на экран компьютера?
11. Напишите программу, которая вычисляет площадь и периметр прямоугольника по длинам двух его сторон.
Электронное приложение к уроку
Файлы | Материалы урока | Ресурсы ЭОР |
Cкачать материалы урока
Источник