
- •Зык запросов баз данных Методическое рекомендации
- •Язык запросов баз данных: методические рекомендации/ Сост. Л.К. Скодорова, а.А. Ляху – Рыбница, 2013. – 54 с.
- •Введение
- •Назначение языка sql
- •Особая роль языка sql
- •Манипулирование данными
- •Выборка строк (конструкция where)
- •Сортировка результатов (конструкция order by)
- •Использование агрегирующих функций языка sql
- •Глава 5. Язык sql: манипулирование данными 189
Манипулирование данными
Операторы языка SQL DML:
• SELECT – выборка данных из базы;
• INSERT – вставка данных в таблицу;
• UPDATE – обновление данных в таблице;
• DELETE – удаление данных из таблицы.
Рассмотрим простые запросы, затем перейдем к более сложным вариантам выборки данных, использующим функции сортировки, группирования, агрегирования, а также выполнения запроса к нескольким таблицам. В базе данных имеются следующие таблицы:
Branch (branchNo, street, city, postcode)
Staff (staffNo, fName, lName, position, sex, DOB, salary, branchNo)
PropertyForRent (propertyNo, street, city, postcode, type, rooms, rent, ownerNo, staffNo, branchNo)
Client (clientNo, fName, lName, telNo, prefType, maxRent)
PrivateOwner (ownerNo, fName, lName, address, telNo)
Viewing (clientNo, propertyNo, viewDate, comment)
Литералы. Литералы представляют собой константы, которые используются в операторах SQL. Существуют различные формы литералов для каждого типа данных, которые поддерживаются SQL. Все нечисловые значения данных всегда должны заключаться в одинарные кавычки, а все числовые данные не должны заключаться в одинарные кавычки. Ниже приведен пример использования литералов для вставки данных в таблицу.
INSERT INTO PropertyForRent (propertyNo, street, city, postcode, type, rooms, rent, ownerNo, staffNo, branchNo)
VALUES ('PA14', '16 Holhead', 'Aberdeen' , 'AB7 5SU' , 'House' , 6, 650.00, 'C046', 'SA91', ' B007')
Значение столбца rooms является литералом целочисленного типа, а значение столбца rent – это десятичный числовой литерал. Ни один из них не должен заключаться в одинарные кавычки. Значения всех остальных столбцов представляют собой символьные строки и обязательно должны быть взяты в одинарные кавычки.
Простые запросы. Назначение оператора SELECT состоит в выборке и отображении данных одной или более таблиц базы данных. Это исключительно мощный оператор, способный выполнять действия, эквивалентные операторам реляционной алгебры выборки, проекции и соединения, причем в пределах единственной выполняемой команды. Оператор SELECT является чаще всего используемой командой языка SQL. Общий формат оператора SELECT имеет следующий вид:
SELECT [DISTINCT | ALL] { * | [columnExpression [AS newName]] [ , …. ] }
FROM TableName [alias] [ , ... ]
[WHERE condition]
[GROUP BY columnlist] [HAVING condition]
[QRDER BY columnList]
Здесь параметр columnExpression представляет собой имя столбца или выражение из нескольких имен. Параметр TableName является именем существующей в базе данных таблицы (или представления), к которой необходимо получить доступ. Необязательный параметр alias – это сокращение, устанавливаемое для имени таблицы TableName. Обработка элементов оператора SELECT выполняется в следующей последовательности.
FROM. Определяются имена используемой таблицы или нескольких таблиц.
WHERE. Выполняется фильтрация строк объекта в соответствии с заданными условиями.
GROUP BY. Образуются группы строк, имеющих одно и то же значение в указанном столбце.
HAVING. Фильтруются группы строк объекта в соответствии с указанным условием.
SELECT. Устанавливается, какие столбцы должны присутствовать в выходных данных.
ORDER BY. Определяется упорядоченность результатов выполнения оператора.
Порядок конструкций в операторе SELECT не может быть изменен. Только две конструкции оператора – SELECT и FROM – являются обязательными, все остальные конструкции могут быть опущены. Операция выборки с помощью оператора SELECT является замкнутой, в том смысле, что результат запроса к таблице также представляет собой таблицу. Существует множество вариантов использования данного оператора.
Реляционные схемы для той части учебного проекта DreamHome, в которой содержится и обрабатывается информация об аренде собственности, выглядят так:
Branch (branchNo, street, cizy, postcode)
Staff (staffNo, fName, IName, position, sex, DOB, salary, branchNo}
PropertyForRent (propertyNo, street, city, postcode, type, rooms,rent, ownerNo, staf fNo, branchNo)
Client (clientNo, fName, IName, telNo, prefType, maxRent)
PrivateOwner (ownerNo, fName, IName, address, telNo)
Viewing (clientNo, propertyNo, viewDate, comment)
Registration (cJlientNo, branchNo, staffNo, dateJoined)
Общепринятое обозначение реляционной схемы включает имя отношения, за которым (в скобках) располагаются имена атрибутов. При этом первичный ключ (обычно) подчеркивается.
Концептуальной моделью, или концептуальной схемой, называется множество всех реляционных схем базы данных.
В табл. 1-8 показан пример определения реляционной схемы.
Пример некоторого текущего состояния базы данных учебного проекта DreamHome.
Таблица Branch Таблица 1.
branchNo |
street |
city |
postcode |
В005 |
22 Deer Rd |
London |
SW1 4EH |
В007 |
16 Argyll St |
Aberdeen |
AB23SU |
ВООЗ |
163 Main St |
Glasgow |
Gil 9QX |
В004 |
32 Manse Rd |
Bristol |
BS99 1N2 |
В002 |
56 Clover Dr |
London |
NW10 6EU |
Таблица Staff Таблица 2.
staffNo |
fName |
[Name |
position |
sex |
DOB |
salary |
branchNo |
SL21 |
John |
White |
Manager |
M |
l-Oct-45 |
30000 |
BOOS |
SG37 |
Ann
|
Beech |
Assistant |
F |
lO-Nov-60 |
12000 |
B003 |
SG14 |
David |
Ford |
Supervisor |
M |
24-Mar-58 |
18000 |
B003 |
SA9 |
Mary |
Howe |
Assistant |
F |
19-Feb-70 |
9000 |
B007 |
SG5 |
Susan |
Brand |
Manager |
F |
3-Jun-40 |
24000 |
BOOS |
SL41 |
Julie |
Lee
|
Assistant |
F |
13-Jun-65 |
9000 |
BOOS |
Таблица PropertyForRent Таблица З.
property No |
street |
city |
postcode |
type |
rooms |
rent |
РА14 |
16Holhead |
Aberdeen |
AB7 5SU |
House |
6 |
650 |
PL94 |
6 Argyll St |
London |
NW2 |
'Flat |
4 |
400 |
PG4 |
6 Lawrence St |
Glasgow |
Gil 9QX |
Flat |
3 |
350 |
PG36 |
2 Manor Rd |
Glasgow |
G32 4QX |
Flat |
3 |
375 |
PG21 |
18 Dale Rd |
Glasgow |
G12 |
House |
5 |
600 |
PG16
|
5 Novar Dr
|
Glasgow |
G129AX |
Flat |
4 |
450 |
Продолжение таблицы 3.
Owner No |
staff No |
Branch No |
C046 |
SA9 |
B007 |
C087 |
SL41 |
BOOS |
C040 |
|
BOOS |
C093 |
G37 S |
BOOS |
COS7 |
SG37 |
вооз |
C093 |
SG14 |
вооз |
Таблица Client Таблица 4.
clientNo |
fName |
IName |
telNo |
prefType |
maxRent |
CR76 |
John |
Kfy |
0207-774-5632 |
Flat |
425 |
С056 |
Aline |
Stewart |
0141-848-1825 |
Flat |
350 |
CR74 |
Mike |
Ritchie |
01475-392178 |
House |
750 |
CR62 |
Mary |
Tregear |
01224-196720 |
Flat |
600 |
Таблица PrivateOwner Таблица 5.
ownerNo |
fName |
IName |
address |
telNo |
С046 |
Joe |
Keogh |
2 Fergus Dr, Aberdeen AB2 7SX |
01224-861212 |
С087 |
Carol |
Parrel |
6 Achray St, Glasgow G32 9DX |
0141-357-7419 |
С040 |
Tina |
Murphy |
63 Well St, Glasgow G42 |
0141-943-1728 |
С093 |
Tony |
Shaw |
12 Park PI, Glasgow G4 OQR |
0141-225-7025
|
Таблица Viewing Таблица 6.
clientNo |
propertyNo |
viewDate |
comment |
CR56 |
РА14 |
24-May-Ol |
too small |
CR76 |
PG4 |
20-Apr-Ol |
too remote |
CR56 |
PG4 |
26-May-Ol |
|
CR62 |
РА14 |
14~May-01 |
no dining room |
CR56 |
PG36 |
28-Apr-Ol |
|
блица Registration Таблица 7.
clientNo |
branchNo |
staffNo |
dateJoined |
CR76 |
В005 |
SL41 |
2-Jan-Ol |
CR56 |
вооз |
SG37 |
11-Apr-OO |
CR74 |
вооз |
SG37 |
16-Nov-99 |
CR62 |
В007 |
SA9 |
7-Mar-OO |
Пример 1. Выборка всех столбцов и всех строк. Составьте список подробных сведений о каждом из работников.
Поскольку в приведенном выше запросе не указаны никакие ограничения, в оператор не требуется помещать конструкцию WHERE. Кроме того, необходимо выбрать все существующие в таблице столбцы. Поэтому данный запрос записывается следующим образом:
SELECT staffNo, fName, lName, position, sex, DOB, salary, branchNo FROM Staff
Поскольку выборка всех имеющихся в таблице столбцов выполнятся достаточно часто, в языке SQL определен упрощенный вариант записи значения "все столбцы" – вместо имен столбцов указывается символ звездочки (*). Приведенный ниже оператор полностью эквивалентен первому и представляет собой упрощенный вариант записи того же самого запроса:
SELECT * FROM Staff
Результат выполнения этого запроса представлен в табл. 8.
Таблица 8.
Результат выполнения запроса список подробных сведений о каждом из работников
staffNo |
fName |
lName |
position |
sex |
DOB |
salary |
branchNo |
SL21 |
John |
White |
Manager |
M |
l-Oct-45 |
30000.00 |
B005 |
SG37 |
Ann |
Beech |
Assistant |
F |
10-Nov-60 |
12000.00 |
B003 |
SG14 |
David |
Ford |
Supervisor |
M |
24-Mar-58 |
18000.00 |
B003 |
SA9 |
Mary |
Howe |
Assistant |
F |
19-Feb-70 |
9000.00 |
B007 |
SG5 |
Susan |
Brand |
Manager |
F |
3-Jun-40 |
24000.00 |
B003 |
SL41 |
Julie |
Lee |
Assistant |
F |
13-Jun-65 |
9000.00 |
B005 |
Пример 2. Выборка конкретных столбцов и всех строк. Создайте отчет о заработной плате всех работников с указанием только табельного номера работника (staffNo), его имени и фамилии, а также сведений о зарплате.
SELECT staffNo, fName, lName, salary FROM Staff
В этом примере на основе таблицы Staff создается новая таблица, включающая только указанные в запросе столбцы staffNo, fName, lName и salary, причем именно в этом порядке. Результат выполнения данного запроса приведен в табл. 9. Обратите внимание, что строки в результирующей таблице могут оказаться неотсортированными, если не дано специальное указание. С другой стороны, в некоторых СУБД сортировка результирующей таблицы выполняется по умолчанию с учетом значений одного или нескольких столбцов (например, в базе данных Microsoft Access сортировка этой результирующей таблицы была бы выполнена по значению первичного ключа staffNo).
Таблица 9.
Результат выполнения запроса
staffNo |
fName |
lName |
salary |
SL21 |
John |
White |
30000.00 |
SG37 |
Ann |
Beech |
12000.00 |
SG14 |
David |
Ford |
18000.00 |
SA9 |
Mary |
Howe |
9000.00 |
SG5 |
Susan |
Brand |
24000.00 |
SL41 |
Julie |
Lee |
9000.00 |
Пример 3. Использование ключевого слова DISTINCT. Составьте список номеров всех сдаваемых в аренду объектов, осмотренных клиентами.
SELECT propertyNo FROM Viewing
Результат выполнения этого запроса представлен в табл10. Обратите внимание, что результат выполнения запроса содержит повторяющиеся значения, поскольку, в отличие от операции проекции реляционной алгебры, оператор SELECT не исключает повторяющихся значений при выполнении проекции по значениям одного или нескольких столбцов. Для удаления из результирующей таблицы повторяющихся строк используется ключевое слово DISTINCT.
Откорректированный запрос выглядит следующим образом:
SELECT DISTINCT propertyNo FROM Viewing
Результаты выполнения второго варианта запроса представлены в табл.11.
Таблица 10. Таблица 11.
propertyNo |
PA14 |
PA4 |
PA4 |
PA14 |
PG36 |
propertyNo |
PA14 |
PA4 |
PG36 |
Пример 4. Вычисляемые поля. Создайте отчет о ежемесячной зарплате всего персонала с указанием табельного номера, имени, фамилии и суммы зарплаты.
SELECT staffNo, fName, lName, salary/12
FROM Staff
Этот запрос почти идентичен запросу из примера 2, за исключением того, что здесь требуется указать сумму не годовой, а ежемесячной зарплаты. В данном случае желаемый результат, может быть достигнут простым делением суммы зарплаты за год на 12. Результаты выполнения запроса представлены в табл. 12.
Таблица 12.
Результат выполнения запроса
staffNo |
fName |
lName |
Exp_1 |
SL21 |
John |
White |
2500.00 |
SG37 |
Ann |
Beech |
1000.00 |
SG14 |
David |
Ford |
1500.00 |
SA9 |
Mary |
Howe |
750.00 |
SG5 |
Susan |
Brand |
2000.00 |
SL41 |
Julie |
Lee |
750.00 |
Это пример использования в запросе вычисляемого поля (иногда эти поля называют расчетными, или производными). В общем случае для создания вычисляемого поля в списке SELECT следует указать некоторое выражение языка SQL. В этих выражениях могут применяться операции сложения, вычитания, умножения и деления. При построении сложных выражений могут использоваться круглые скобки. Для получения значения вычисляемого поля могут использоваться значения из нескольких столбцов таблицы, однако тип данных тех столбцов, которые входят в арифметические выражения, обязательно должен быть цифровым. В таблице, полученной в результате выполнения запроса, четвертый столбец называется Exp_1. Обычно столбцам результирующей таблицы присваиваются имена соответствующих им столбцов исходных таблиц базы данных. Однако в данном случае это правило неприменимо, поскольку в стандарте SQL не определены правила именования производных столбцов. В одних диалектах языка SQL имена таким столбцам присваивают в соответствии с порядком их расположения в таблице (например, соl4), в других диалектах у подобного столбца имя может вовсе отсутствовать или вместо него может использоваться выражение, находящееся в списке SELECT. Стандарт ISO позволяет явным образом задавать другие имена столбцов результирующей таблицы, для чего применяется конструкция AS. При использовании этой конструкции приведенный выше оператор SELECT может быть переписан следующим образом:
SELECT staffNo, fName, lName, salary/12 AS monthlySalary
FROM Staff
В этом случае четвертый столбец результирующей таблицы будет называться monthlySalary, а не Exp_1.