Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архив / Пособие_SQL

.pdf
Скачиваний:
52
Добавлен:
14.05.2015
Размер:
629.59 Кб
Скачать

ПетрГУ, кафедра прикладной математики и кибернетики

Конспект лекций по дисциплине «Базы данных»

Тема: Язык SQL

составитель: Л. В. Щёголева

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

1

ПетрГУ, кафедра прикладной математики и кибернетики

§ 1 Введение

Сфера применения баз данных имеет тенденцию к постоянной интеграции. Это обстоятельство привело к необходимости создания стандартного языка, пригодного для использования на множестве вычислительных платформ. Наличие такого языка дает возможность пользователям, освоив один набор команд, успешно применять его независимо от конкретных программных систем и ЭВМ. В настоящее время таким стандартом «де-факто» стал язык SQL – наиболее мощный и популярный язык манипулирования данными, который поддерживается практически всеми существующими системами управления базами данных, в том числе такими, как Oracle, Informix, Ingress, SQL Server и др. (Стандарты: ISO/IEC 9075:1987, ISO/IEC 9075:1989, ISO/IEC 9075:1992, ISO/IEC 9075:1999, ISO/IEC 9075:2000, ISO/IEC 9075:2003, ISO/IEC 9075:2008).

SQL – Structured Query Language (структурированный язык запросов) был разработан фирмой IBM и, оказавшись удачным, впоследствии принят многими производителями программных средств, в качестве языка управления реляционными базами данных.

Помимо манипулирования данными, SQL реализует и другие возможности:

позволяет определять и модифицировать данные;

обеспечивает синхронизацию обработки БД различными приложениями;

координирует работу конкурирующих приложений, обеспечивая их одновременную работу с БД;

обеспечивает защиту данных от несанкционированного доступа;

позволяет устанавливать ограничения целостности БД

и другие.

Особенность языка SQL состоит в том, что он ориентирован не на процедуру обработки данных, а на получение конечного результата и позволяет исключить большую работу, выполняемую при использовании языков программирования общего назначения. Декларативный язык SQL описывает исключительно результат, который необходимо получить, чем принципиально отличается от процедурных языков управления данными, требующих определения всей последовательности операций, необходимых для получения конечного результата.

§ 2

Типы данных

 

 

 

 

 

 

Char[(<длина>)]

Строка текста, длина – максимальное

 

 

количество символов.

 

 

Bit[(<длина>)]

Двоичные данные, длина – размер в битах

Numeric[(<точность>[,<масштаб>])]

Вещественное число

 

 

Decimal[(<точность>[,<масштаб>])]

Вещественное число

 

 

Dec[(<точность>[,<масштаб>])]

Вещественное число

 

 

Integer

 

Целое число

 

 

 

Float[(<точность>)]

Вещественное

число

в

экспоненциальной

 

 

форме, точность – минимальное количество

 

 

знаков.

 

 

 

Real

 

Вещественное

число

в

экспоненциальной

 

 

форме, точность зависит от реализации.

Double precision

Вещественное

число

в

экспоненциальной

 

 

форме, точность зависит от реализации.

Date

 

Дата

 

 

 

<точность> – общее число значащих цифр <масштаб> – число значащих цифр после запятой <длина> – размер

Для преобразования типов данных предназначена команда:

CAST ( { <выражение> | NULL } AS { <тип данных> | <домен> } )

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

2

ПетрГУ, кафедра прикладной математики и кибернетики

§ 3 Команды определения данных

§ 3.1 Домены

§ 3.1.1 Создание домена

Create Domain <имя домена> [As] <тип данных> [ Default <значение по умолчанию> ]

[ <ограничение> ] Создает домен, определяющий альтернативный тип данных.

<ограничение> = CHECK(<предикат>)

Функция задает ограничение на значения домена – только те, которые удовлетворяют предикату. В предикате можно использовать ключевое Value слово для обозначения элемента множества.

Пример

Create Domain DomYear As Integer Check((Value>0)and(Value<8))

Команда создает домен DomYear для года обучения в университете (курс).

§3.1.2 Изменение домена

Вдомене можно добавить или удалить значение по умолчанию и добавить или удалить ограничение.

Alter Domain <имя домена>

{Set Default <значение по умолчанию> |

Drop default |

Add <ограничение> |

Drop constraint <имя ограничения> }

Команда изменяет домен.

Пример

Alter Domain DomYear Add Default 1

Команда устанавливает для домена DomYear значение по умолчанию равное единице (первый

курс).

§ 3.1.3 Удаление домена

Drop Domain <имя домена> [ { Cascade | Restrict } ]

Команда удаляет домен из базы данных.

Если указана опция «Cascade», то вместе с объектом будут удалены все объекты БД, с ним связанные.

Если указана опция «Restrict», то объект будет удален только в том случае, если он не связан ни с каким другим объектом.

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

В данном случае в качестве объекта выступает домен.

Пример

Drop Domain DomYear Restrict

Команда удаляет домен DomYear из базы данных. При этом если этот домен используется в какойлибо таблице, то он не будет удален.

§ 3.2 Таблицы

§ 3.2.1 Создание таблицы

Create Table <имя таблицы> (<описание столбца>, …,<описание ограничения таблицы>, … )

где

<описание столбца> = <имя столбца> {<тип данных>|<имя домена>} <ограничение столбца>

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

Ограничение столбца

Primary Key – первичный ключ,

Not Null – обязательность заполнения значений столбца,

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

3

ПетрГУ, кафедра прикладной математики и кибернетики

Check(<предикат>) – ограничения на значения столбца,

Unique – уникальность всех значений столбца.

Ограничение таблицы

Primary Key(<имя столбца>, …) – первичный ключ, Check(<предикат>) – ограничение на значения кортежа таблицы,

Foreign Key <имя столбца> references <имя таблицы>(<имя столбца>) – внешний ключ.

Пример

Create Table tblStudent (

intStudentNumber integer not null primary key, txtStudentName char(45) not null, intStudyYear domYear)

Create Table tblCompetition ( intStudentNumber integer not null, intAttempt integer not null, fltResult decimal(5,2),

Primary Key (intStudentNumber, intAttempt),

Foreign Key (intStudentNumber) references tblStudent(intStudentNumber))

Первая таблица содержит информацию о студентах: номер студента, ФИО, год обучения. Вторая таблица содержит информацию о результатах соревнований, в которых участвуют студенты: номер студента, номер попытки, результат попытки. Во второй таблице ключ является составным, поэтому он записывается как ограничение для таблицы, атрибут intStudentNumber является внешним ключом, который также записывается как ограничение таблицы.

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

Drop Table <имя таблицы> [ { Cascade | Restrict } ]

Команда удаляет таблицу из базы данных вместе со всеми записями таблицы.

§ 3.2.3 Изменение структуры таблицы

Можно добавить новый или удалить существующий в таблице столбец, добавить новое или удалить существующее ограничение для таблицы.

Alter Table <имя таблицы>

{ Add [column] <описание столбца> | Drop [column] {Cascade | Restrict} | Add <ограничение таблицы> |

Drop Constraint <имя ограничения> {Cascade | Restrict}}

Команда изменяет структуру таблицы.

Пример

Alter Table tblStudent Add column txtDepartment Char(25)

Команда добавляет в таблицу tblStudent новый столбец txtDepartment.

§ 4 Ограничения

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

§ 4.1 Создание ограничения

Create Assertion <имя ограничения> Check(<предикат>)

Команда создает ограничение.

Пример

Create Assertion AssStudentCount Check( 30 > Select Count(*) From tblStudent)

Команда создает ограничение на количество записей в таблице tblStudent.

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

4

ПетрГУ, кафедра прикладной математики и кибернетики

§ 4.2 Удаление ограничения

Drop Assertion <имя ограничения>

Команда удаляет ограничение из базы данных.

§ 5 Команды обновления данных

Операции обновления данных предназначены для работы с кортежами таблицы и включают добавление, удаление и изменение.

§ 5.1 Операция добавление

Insert into <имя таблицы> ( <имя столбца>, … ) values ( <значение>, … ), ( <значение>, … ) Команда добавляет один или несколько кортежей в таблицу.

Пример

Insert into tblStudent ( txtStudentName, intStudentNumber) values (‘Иванов А. А.’, 123456), (‘Петров С. Е.’, 123457)

Команда добавляет два новых кортежа в таблицу tblStudent.

Можно добавить записи, полученные в результате запроса.

Insert into <имя таблицы> ( <имя столбца>, … ) <Select - запрос>

Пример

Insert into tblStudent (txtStudentName, intStudyYear) Select txtFIO, 1 From tblAbitur Where txtStatus

= ’зачислен’

Команда добавляет в таблицу tblStudent информацию из таблицы tblAbitur. Из таблицы tblAbitur выбираются только ФИО абитуриентов, которые были зачислены в университет. Для каждого такого абитуриента устанавливается первый курс. ФИО и номер курса записываются соответственно в столбцы txtStudentName, intStudyYear таблицы tblStudent.

§ 5.2 Операция удаление

Delete from <имя таблицы> [Where <условие>]

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

Пример

Delete from tblStudent Where intStudyYear=5

Команда удаляет из таблицы информацию о пятикурсниках.

Delete from tblStudent

Команда удаляет все записи из таблицы.

Вусловии можно использовать подзапросы.

§5.3 Операция изменение

Update <имя таблицы> Set <имя столбца> = <значение>, … [Where <условие>]

Команда изменяет значения в указанных столбцах для записей, удовлетворяющих условию. Если условие отсутствует, то изменения применяются ко всем записям таблицы.

Пример

Update tblStudent Set intStudyYear = 2 Where year = 1

Команда переводит первокурсников на второй курс.

Update tblStudent Set intStudyYear = intStudyYear + 1

Команда изменяет все записи в таблице.

В условии можно использовать подзапросы.

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

5

ПетрГУ, кафедра прикладной математики и кибернетики

§6 Команда выборки данных

§6.1 Таблицы для демонстрации работы команды выборки данных

Для демонстрации выполнения

запросов

определим три таблицы: «детали», «поставщики» и

«поставки».

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d – «детали»

 

 

 

 

 

 

 

 

 

 

 

 

id_d

 

 

dname

color

weight

city

 

 

1

 

 

винт

красный

12

 

 

Москва

 

 

2

 

 

болт

зеленый

17

 

 

СПб

 

 

3

 

 

гайка

синий

17

 

 

Тула

 

 

4

 

 

гайка

красный

14

 

 

Москва

 

 

5

 

 

шайба

синий

12

 

 

СПб

 

 

6

 

 

гвоздь

красный

19

 

 

Москва

 

 

7

 

 

болт

зеленый

12

 

 

Тула

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p – «поставщики»

 

 

 

 

 

 

 

 

 

id_p

 

 

pname

 

status

 

city

 

 

 

1

 

 

 

Лосев

 

20

 

 

Москва

 

 

 

2

 

 

 

Мишин

10

 

 

СПб

 

 

 

 

3

 

 

 

Носов

 

30

 

 

СПб

 

 

 

 

4

 

 

 

Титов

 

20

 

 

Москва

 

 

 

 

5

 

 

 

Песков

 

30

 

 

Киев

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dp – «поставки»

 

 

 

 

 

 

 

 

 

 

 

 

id_p

 

id_d

n

 

 

 

 

 

 

 

 

 

 

 

1

 

 

1

 

100

 

 

 

 

 

 

 

 

 

 

 

1

 

 

5

 

200

 

 

 

 

 

 

 

 

 

 

 

2

 

 

3

 

300

 

 

 

 

 

 

 

 

 

 

 

3

 

 

2

 

200

 

 

 

 

 

 

 

 

 

 

 

3

 

 

5

 

100

 

 

 

 

 

 

 

 

 

 

 

3

 

 

1

 

200

 

 

 

 

 

 

 

 

 

 

 

4

 

 

4

 

100

 

 

 

 

 

 

 

 

 

 

 

4

 

 

5

 

300

 

 

 

 

 

Ключевые атрибуты выделены жирным шрифтом. В таблице dp атрибут id_p является внешним ключом, ссылающимся на отношение p. В таблице dp атрибут id_d является внешним ключом, ссылающимся на отношение d.

§ 6.2 Команда выборки данных

Select <выражение> From <таблицы>

[ Where <условие> ]

[ Group by <выражение> [ Having <условие> ] ]

[ Order by <выражение> ]

§ 6.3 Примеры запросов

1. Получить цвет и название города для деталей не из Санкт-Петербурга весом более 10 грамм.

Select d.color, d.city From d

Where (d.city <> ’СПб’) and (d.weight > 10)

color

city

красный

Москва

синий

Тула

красный

Москва

красный

Москва

зеленый

Тула

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

6

ПетрГУ, кафедра прикладной математики и кибернетики

Результирующая таблица содержит 2 столбца с названиями «color», «city» и 5 кортежей, два из которых – дубликаты.

Результат SQL запроса может содержать повторяющиеся кортежи!

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

Select distinct d.color, d.city From d

Where (d.city <> ’СПб’) and (d.weight > 10)

color

city

синий

Тула

красный

Москва

зеленый

Тула

Результирующая таблица будет содержать 3 кортежа, однако порядок кортежей неизвестен.

Порядок кортежей в результирующей таблице не определен.

Чтобы задать порядок необходимо добавить опцию Order by. Select distinct d.color, d.city

From d

Where (d.city <> ’СПб’) and (d.weight > 10) Order by d.color

Кортежи в результирующей таблице будут упорядочены по возрастанию названий цветов. Для того чтобы задать обратный порядок сортировки, необходимо добавить после названия столбца DESC для сортировки по убыванию или ASC – для сортировки по возрастанию (задается по умолчанию).

Можно упорядочить по нескольким столбцам:

Select distinct d.color, d.city From d

Where (d.city <> ’СПб’) and (d.weight > 10) Order by d.city asc, d.color desc

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

color

city

красный

Москва

синий

Тула

зеленый

Тула

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

Select distinct color, city From d

Where (city <> ’СПб’) and (weight >10) Order by color desc, city asc

2. Получить номер детали и вес детали в килограммах.

Select id_d, weight / 1000 From d

После Select можно указать не только названия столбцов, но и арифметические выражения, а также константы.

Название второго столбца неопределенно, можно задать его явно.

Select id_d, weight / 1000 as Kg From d

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

7

ПетрГУ, кафедра прикладной математики и кибернетики

id_d

Kg

1

0,012

2

0,017

3

0,017

4

0,014

5

0,012

6

0,019

7

0,012

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

Select id_d as First, weight / 1000 as Second, ‘вес’ as Third

From d

First

Second

Third

1

0,012

вес

2

0,017

вес

3

0,017

вес

4

0,014

вес

5

0,012

вес

6

0,019

вес

7

0,012

вес

3. Получить для каждого поставщика его номер, имя, статус и город.

Select id_p, pname, status, city From p

Перечень всех столбцов таблицы можно заменить символом «*».

Select *

From p

В результате выполнения запроса мы получим целиком таблицу p.

Это самый короткий запрос на языке SQL, но более медленный по сравнению с перечислением всех столбцов.

4. Получить номер детали, название детали и объем поставки для поставок, выполняемых поставщиками с номерами, не превосходящими значение 3.

Select d.id_d, d.dname, dp.n From d, dp

Where (d.id_d = dp.id_d) and (dp.id_p <= 3)

id_d

dname

n

1

винт

100

5

шайба

200

3

гайка

300

2

болт

200

5

шайба

100

1

винт

200

Если запрос выполняется по нескольким таблицам, то в нем обязательно должно присутствовать условие на соединение таблиц (d.id_d = dp.id_d), а потом уже все остальные условия запроса.

В данном примере соединение выполняется по внешнему ключу отношения «поставки». Операцию соединения можно записать иначе.

Select d.id_d, d.dname, dp.n

From d join dp using (d.id_d = dp.id_d) Where dp.id_p <= 3

5. Получить номер, название, город для детали и номер, имя и город для поставщика для поставщиков и деталей, находящихся в одном городе.

Select d.id_d, d.city, p.id_p, p.city From d, p

Where p.city = d.city

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

8

ПетрГУ, кафедра прикладной математики и кибернетики

id_d

dname

d.city

id_p

pname

p.city

1

винт

Москва

1

Лосев

Москва

1

винт

Москва

4

Титов

Москва

2

болт

СПб

2

Мишин

СПб

2

болт

СПб

3

Носов

СПб

4

гайка

Москва

1

Лосев

Москва

4

гайка

Москва

4

Титов

Москва

5

шайба

СПб

2

Мишин

СПб

5

шайба

СПб

3

Носов

СПб

6

гвоздь

Москва

1

Лосев

Москва

6

гвоздь

Москва

4

Титов

Москва

Можно записать этот запрос иначе:

Select *

From d join p using (p.city = d.city)

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

left join – левое соединение содержит все кортежи из левой таблицы, если для кого-то кортежа нет пары в правой таблице, то соответствующие столбцы заполняются значением «Null»;

right join – правое соединение содержит все кортежи из правой таблицы, если для кого-то кортежа нет пары в левой таблице, то соответствующие столбцы заполняются значением «Null»;

union join – внешнее соединение содержит кортежи из левой таблицы, для которых отсутствуют пары в правой таблице, и кортежи из правой таблицы, для которых отсутствуют пары в левой таблице, отсутствующие данные заполняются значением «Null»;

full join – полное соединение содержит все кортежи из левой таблицы и все кортежи из правой таблицы, отсутствующие данные заполняются значением «Null»;

cross join – декартово произведение содержит все возможные комбинации кортежей из двух таблиц.

Примеры

Левое соединение:

Select id_d, dname, id_p, pname

From d left join p using (p.city = d.city)

id_d

dname

id_p

pname

1

винт

1

Лосев

1

винт

4

Титов

2

болт

2

Мишин

2

болт

3

Носов

3

гайка

Null

Null

4

гайка

1

Лосев

4

гайка

4

Титов

5

шайба

2

Мишин

5

шайба

3

Носов

6

гвоздь

1

Лосев

6

гвоздь

4

Титов

7

болт

Null

Null

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

9

ПетрГУ, кафедра прикладной математики и кибернетики

Полное соединение:

Select id_d, dname, id_p, pname

From d full join p using (p.city = d.city)

id_d

dname

id_p

pname

1

винт

1

Лосев

1

винт

4

Титов

2

болт

2

Мишин

2

болт

3

Носов

3

гайка

Null

Null

4

гайка

1

Лосев

4

гайка

4

Титов

5

шайба

2

Мишин

5

шайба

3

Носов

6

гвоздь

1

Лосев

6

гвоздь

4

Титов

Null

Null

5

Песков

7

болт

Null

Null

Внешнее соединение:

Select id_d, dname, id_p, pname

From d union join p using (p.city = d.city)

id_d

dname

id_p

pname

3

гайка

Null

Null

Null

Null

5

Песков

7

болт

Null

Null

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

Select distinct p.city as first, d.city as second From p, d, dp

Where (p.id_p = dp.id_p) and (dp.id_d = d.id_d) Order by first, second desc

first

second

Москва

СПб

Москва

Москва

СПб

Тула

СПб

СПб

СПб

Москва

Соединение двух таблиц требует одного условия для соединения. Соединение трех таблиц требует двух условий для соединения. Таким образом, при выборке из n таблиц необходимо (n–1) условий для соединения.

7. Получить пары номеров поставщиков, таких, что оба поставщика в каждой паре проживают в одном и том же городе.

Select first.id_p, second.id_p From p as first, p as second

Where (first.city = second.city) and (first.id_p < second.id_p)

first.id_p

second.id_p

1

4

2

3

8. Получить общее количество поставщиков.

Select count(*) From p

Конспект лекций по дисциплине «Базы данных» (Язык SQL)

10