ФИО | Муж | Жена | ФИО | Сын | Дочь |
Иванов | NIL | Иванова | Сидоров | Ирина | |
Сидоров | NIL | Сидорова | Кирсанов | Михаил | |
Петрова | Петров | NIL | |||
Кирсанов | NIL | Кирсанов | ФИО | Внук | Внучка |
Петухов | NIL | Петухова | Петрова | Сергей | |
Кирсанов | Юлия |
Рис. 5.2. Реляционная база данных, состоящая из 3-х таблиц
Реляционная БД - это БД в которой:
- данные воспринимаются пользователем как таблицы и только как таблицы;
- операторы, с помощью которых пользователь манипулирует данными, служат для генерации новых таблиц на основе старых.
Например, имеется БД из одной таблицы, в которой 3 столбца и 4 строки:
Таблица "Винный погреб"
Сорт | Год | Количество_бутылок |
Каберне | 80 | 12 |
Рислинг | 89 | 14 |
Изабелла | 80 | 28 |
Мадера | 77 | 1 |
С помощью специальных операторов выделим из этой таблицы:
а) подмножество строк
SELECT Сорт, Год, Количество_бутылок FROM Винный_погреб WHERE Год = 80;
В результате получаем:
Сорт | Год | Количество_бутылок |
Каберне | 80 | 12 |
Изабелла | 80 | 28 |
б) подмножество столбцов
SELECT Сорт, Количество_бутылок FROM Винный_погреб
В результате получаем:
Сорт | Количество_бутылок |
Каберне | 12 |
Рислинг | 14 |
Изабелла | 28 |
Мадера | 1 |
Оба результата являются таблицами, а операторы SELECT - это операторы языка запросов к БД, называемого SQL (Structured Query Language – Язык структурированных запросов).
Учебная БД состоит из 3 таблиц.
1) Таблица поставщиков товаров "S".
nomer | familia | kapital | gorod |
S1 | Смит | 20 | Лондон |
S2 | Джонс | 10 | Париж |
S3 | Блейк | 30 | Париж |
S4 | Кларк | 20 | Лондон |
S5 | Адамс | 30 | Саров |
2) Таблица деталей, которые они поставляют "P".
nomer | nazvan | zvet | ves | gorod |
P1 | Гайка | Красный | 12 | Лондон |
P2 | Болт | Зеленый | 17 | Париж |
P3 | Винт | Голубой | 17 | Рим |
P4 | Винт | Красный | 14 | Лондон |
P5 | Кулачок | Голубой | 12 | Париж |
P6 | Блюм | Красный | 19 | Лондон |
3) Таблица поставок (какой поставщик, какие детали поставляет) "SP".
nomer_s | nomer_p | kol |
S1 | P1 | 300 |
S1 | P2 | 200 |
S1 | P3 | 400 |
S1 | P4 | 200 |
S1 | P5 | 100 |
S1 | P6 | 100 |
S2 | P1 | 300 |
S2 | P2 | 400 |
S3 | P2 | 200 |
S4 | P2 | 200 |
S4 | P4 | 300 |
S4 | P5 | 400 |
S - поставщики. Каждый поставщик имеет уникальный номер, фамилию (не обязательно уникальную), капитал и местонахождение.
P - детали (их виды). Каждый вид детали имеет уникальный номер, название, цвет, вес и город, где хранится этот вид детали. Каждый вид имеет только один вид и вес и хранится на складе только одного города (упрощение).
SP - поставки деталей. Связывает между собой две предыдущие таблицы.
Например, первая строка связывает поставщика S1 (Смит) с деталью P1 (гайка), т.е. означает поставку трехсот деталей вида P1 поставщиком S1.
Пусть для любого поставщика имеется только одна поставка детали некоторого вида, т.е. пара (nomer_s, nomer_p) является уникальной.
На этом примере отметим несколько важных для РБД обстоятельств:
1) Значения данных во всех клетках таблицы являются одиночными, а не множествами, поэтому в таблице SP имеем:
S2 P1
S2 P2
а не так:
S2 {P1, P2}
2) В каждом столбце хранятся данные только одного типа.
3) БД представляется только в виде явных значений данных. Не существует никаких явных связей и указателей, соединяющих одну таблицу с другой. Связь представляется не с помощью указателя, а значениями клеток в таблицах.
4) Строки в таблицах не требуют никакого упорядочивания.
5) Редко возникают ситуации, когда упорядочение столбцов является существенным. Порядок столбцов в РБД, как правило, не имеет значения.
Структура БД определяется оператором CREATE.
CREATE TABLE S (
nomer CHAR(5),
familia CHAR(20),
kapital SMALLINT,
gorod CHAR(15) );
CREATE TABLE P (
nomer CHAR(6),
nazvanie CHAR(20),
zvet CHAR(7),
ves SMALLINT,
gorod CHAR(15) );
CREATE TABLE SP (
nomer_s CHAR(5),
nomer_p CHAR(6),
kol INTEGER );
Это операторы создания таблиц языка SQL. Они создают имена таблиц, столбцов и типы данных для этих столбцов.
Оператор CREATE, как и все операторы SQL, выполняемый. Как только СУБД его исполнит, появится таблица, которая будет пустой, т.е. будет содержать лишь заголовки столбцов. Для наполнения таблиц есть другие операторы.
1. Символьный - CHAR(<длина>). Длина <= 32767.
2. Целочисленный со знаком
а) INTEGER <= | 2 147 483 647 |
б) SMALLINT <= | 32767 |
3. Действительное число - FLOAT
Содержит 7 значащих десятичных цифр (доверительные).
1.175494351E-38 - самое маленькое
3.402823446E+38 - самое большое
4. Дата – DATE. 1 янв 100 ... 29 фев 32768
Пример по учебной БД: Выбрать номера и капиталы всех поставщиков из Парижа.
Выборка данных делается с помощью оператора SELECT.
SELECT nomer, kapital FROM S WHERE gorod='Париж'
Результат:
nomer | kapital |
S2 | 10 |
S3 | 30 |
Общий, но не полный вид оператора SELECT.
SELECT [DISTINCT] <список элементов> FROM <список таблиц>
[WHERE <условия>]
[GROUPBY <список столбцов>]
[ORDERBY <список сортировки>]
Серия примеров.
1. Простая выборка. Выбрать номера всех поставляемых деталей.
SELECT nomer_p FROM SP
Результат:
nomer_p |
P1 |
P2 |
P3 |
P4 |
P5 |
P6 |
P1 |
P2 |
P2 |
P2 |
P4 |
P5 |
2. Выборка с исключением дубликатов.
SELECT DISTINCT nomer_p FROM SP.
Результат:
nomer_p |
P1 |
P2 |
P3 |
P4 |
P5 |
P6 |
3. Выборка вычисляемых значений. Выбрать номера и капиталы всех поставщиков в рублях, если в таблице S капиталы заданы в $.
SELECT nomer, kapital*30 FROM S
Результат:
nomer | COLUMN2 |
S1 | 600 |
S2 | 300 |
S3 | 900 |
S4 | 600 |
S5 | 900 |
Части SELECT и WHERE могут содержать арифметические выражения и константы.
SELECT nomer, 'Капитал в рублях =', kapital*30 FROM S
Результат:
nomer | COLUMN2 | COLUMN3 |
S1 | Капитал в рублях = | 600 |
S2 | Капитал в рублях = | 300 |
S3 | Капитал в рублях = | 900 |
S4 | Капитал в рублях = | 600 |
S5 | Капитал в рублях = | 900 |
4. Выборка всех столбцов. Выбрать все сведения обо всех поставщиках.
SELECT * FROM S
Результат: копия таблицы S.
Этот оператор эквивалентен по своему действию оператору:
SELECT nomer, familia, kapital, gorod FROM S.
Звездочка ("*") обозначает список всех столбцов в таблице(ах), указанных в части FROM в том порядке, в котором эти столбцы заданы в операторе CREATE TABLE. Звездочка может дополняться именем таблицы.
SELECT S.* FROM S
5. Ограниченная выборка. Выбрать номера поставщиков из Парижа, капитал которых больше 20.
SELECT nomer FROM S WHERE (kapital>20) AND (gorod='Париж')
Результат:
nomer |
S3 |
Условие части WHERE может включать в себя
- операции сравнения: =, <>, >, >=, <=, <;
- двоичной алгебры: AND, OR, NOT;
- операции принадлежности: IN, NOT IN;
- операции похожести: LIKE;
- скобки: ( ).
6. Выборка с упорядочением. Выбрать номера и капиталы поставщиков из Парижа в порядке убывания их состояния (размера капитала).
SELECT nomer, kapital FROM S WHERE gorod='Париж' ORDER BY kapital DESC
ASC - упорядочение по возрастанию значений (по умолчанию).
DESC - упорядочение по убыванию значений.
Каждый столбец, упомянутый в части ORDER BY должен присутствовать в результирующей таблице, поэтому, например, такой оператор недопустим:
SELECT nomer FROM S ORDER BY gorod;
Правильно будет:
SELECT nomer, gorod FROM S ORDER BY gorod;
7. Выборка с применением принадлежности (IN). Выбрать детали, вес которых равен: 12, 16, 17.
SELECT * FROM P WHERE ves IN (12, 16, 17);
Результат:
nomer | nazvan | zvet | ves | gorod |
P1 | Гайка | Красный | 12 | Лондон |
P2 | Болт | Зеленый | 17 | Париж |
P3 | Винт | Голубой | 17 | Рим |
P5 | Кулачок | Голубой | 12 | Париж |
8. Выборка с применением похожести (LIKE). Выбрать все детали, название которых начинается с буквы 'в'.
SELECT * FROM P WHERE nazvan LIKE 'в%';
Результат:
nomer | nazvan | zvet | ves | gorod |
P3 | Винт | Голубой | 17 | Рим |
P4 | Винт | Красный | 14 | Лондон |
Общий вид оператора похожести: <имя столбца> LIKE <строковая константа>