Язык SQL

advertisement
Язык SQL. Основные операторы.
Язык SQL стандарта ANSI содержит около 40 операторов, которые подразделяются на 5
групп:
I ). DDL(язык определения, описания данных Data Definition Language);
II). DML(Data Manipulation Language);
III). TCL (Transaction control language);
IV). DCL (Data Control Language или Access Control Language);
V). CCL (Cursor Control Language);
Группа DDL. В нее входят следующие операторы:
Create table- оператор добавления (создания) новой таблицы;
Alter Table- оператор изменения структуры существующей таблицы;
Drop Table- команда удаления таблицы;
Create View-создание представления в базе данных;
Drop View- удаление представления из базы данных;
Create Index- команда создания индекса;
Drop Index-удаление существующего индекса;
Create Schema-создание новой схемы в базе данных;
Drop Schema-удаление схемы из базы данных;
Create Domain- создание нового домена;
Alter Domain- переопределение домена;
Drop Domain-удаление домена из базы данных;
Группа DML. Содержит операторы позволяющие выбирать, удалять, добавлять и
модифицировать данные:
Select- оператор выбора данных;
Insert- оператор добавления строк таблицы;
Delete-удаление строк из таблицы;
Update- изменение данных в таблице.
Группа TCL. Операторы этой группы применяются для управления изменениями,
выполненными группой операторов DML.
Commit-завершение транзакции и сохранение изменений в базе данных;
Roll Back- откат транзакции и отмена изменений в базе данных;
Set Transaction- установка параметров доступа к данным в текущей транзакции.
Группа DCL. Операторы этой группы применяются для осуществления
административных функций присваивающих или отменяющих привилегию использовать базу
данных, а также выполнять некоторые операторы базы данных
Grant- присваивание привилегий;
Revoke- отмена привилегий.
Группа CCL. Операторы этой группы используются в целях определения курсора,
подготовки SQL приложения для выполнения, а также для некоторых других операций:
Declare cursor- определение курсора для запроса;
Explane (используется только в Oracle)- описание плана запроса;
Open Cursor-открытие курсора при получении результатов запроса;
Fetch- получение строки из результатов запроса;
Close Cursor – закрытие курсора
Prepare- подготовка оператора SQL для выполнения;
Execute -выполнение оператора SQL;
Describe- описание подготовленного запроса.
2
Типы данных в SQL.
Первый тип- строки символов фиксировано и переменной длины:
char(n)- это строка символов фиксированной длины;
varchar(n)- обозначает строку символов длиной до «n» символов включительно.
Компонентами для атрибута данного типа является строка от 0 до «n» символов.
Второй тип- битовые строки фиксированной и переменной длины, их значениями являются
строки битов:
Bit(n)-это битовые строки фиксированной длины
Bit varying(n)- битовые строки переменной длины.
Третий тип- целочисленные значения:
Integer или int обозначает обычные значения, выраженные целыми числами
Shortint обозначают числа, количество допустимых битов которых зависит от реализации.
Четвертый тип- числа с плавающей точкой могут быть представлены несколькими
способами. Обычно используется типы float и real, а более высокая точность представления
описывается с помощью типа double precision. В SQL также есть тип реальных числе с
фиксированной десятичной точкой decimal(n,d), которое допускает значение из n десятичных
чисел с десятичной точкой стоящей после d-цифры при отсчете справа.
Пятый тип- дата представляется ключевым словом Date, за которым следует заключенная в
кавычки строка вид ‘2009-09-08 ’(год-месяц-день).
Шестой тип- время, представленное ключевым словом Time, за которым следует строка,
заключенная в кавычки ’ 15:15:30.98‘.
3
Простое описание таблицы.
Create table nameT (Atrib1 type(size), Atrib2 type(size2), …);
Пример:
Create table MovieStar (Codt int, NameStar Varchar (40), Adres Varchar(70), Gender Char(1),
Birthday date);
Удалить существующую таблицу можно с помощью команды:
Drop table MovieStar;
Для изменения структуры таблицы(реляционной схемы) используется предложение, которое
состоит из ключевых слов
двух вариантов:
Alter Table , за которыми следует имя таблицы и затем один из
1). Add Atrib_name type(size) – с помощью которого осуществляется добавление атрибута в
таблицу;
Пример
Alter table Moviestar add phone char(16)
2).Drop Atrib_name – с помощью которого осуществляется удаление атрибута.
Пример
Alter table Moviestar drop phone
4
Значение по умолчанию.
Создавая или изменяя кортежи, мы иногда не знаем значений всех их компонентов.
Например, при добавлении столбца к реляционной схеме значения существующих кортежей
неизвестны и вместо реального значения применяется NULL.
В SQL есть значение NULL. Оно применяется в любом компоненте, которому не
приписано конкретное значение, за исключением случаев, в которых его использование
запрещено. Однако иногда предпочтительнее применять другое значение по умолчанию,
которое вносится в компонент, если все другие значения неизвестны.
В общем случае в любое место описания атрибута и его типа данных можно добавить
ключевое слово DEFAULT и подходящее значение. Обычно это NULL или константа, но
допустимы и другие значения, имеющиеся в системе, напроимер, текущее время.
Пример:
Допустим мы хотим использовать символ ? в качестве значения по умолчанию для
неизвестного атрибута gender и самую раннюю из возможных дат DATE ‘0000-00-00’, вместо
неизвестного атрибута birthdate. Тогда:
Gender char(1) DEFAULT ‘?’
Birthdate DATE DEFAULT DATE ‘0000-00-00’
В качестве другого примера при добавлении атрибута phone можно установить для него
значение по умолчанию ‘unlisted’. В результате получится следующее предложение изменения:
ALTER TABLE MovieStar ADD phone CHAR(16) DEFAULT ‘unlisted’;
5
Области значений.
До сих пор для каждого атрибута мы определяли тип данных. Вместо этого можно определять
область значений. Для нее можно также описать различную информацию типа значений по
умолчанию или ограничений на значения. Тогда при описании атрибута за его именем
ставится не тип данных, а имя области. Множество атрибутов может использовать одну и ту
же область, связывающую эти атрибуты каким-нибудь полезным образом. Например, если два
атрибута имеют одну и ту же область, значение одного из них всегда может быть значением
другого.
Определение области значений состоит из ключевых слов CREATE DOMAIN, имени области,
ключевого слова AS и типа данных:
CREATE DOMAIN <имя> AS<описание типа>;
Далее могут следовать значения по умолчанию и другие ограничения области.
Пример: Определим область MovieDomain для названия фильмов. Ее можно использовать для
атрибутов title из отношения Movie и MovieTitle из отношения StarSln.
Определение области:
CREATE DOMAIN MovieDomain AS VARCHAR(50) DEFAULT ‘unknown’;
Здесь значениями области являются строка и переменной длины до 50 символов и
неизвестное название ‘unknown’.
При описании схемы отношения Movie атрибут title можно записать как
Title MovieDomain
вместо
Title VARCHAR(50) DEFAULT ‘unknown’
Аналогичным способом можно описать и атрибут movieTitle из отношения StarSln:
MovieTitle MovieDomain
Изменить значение области по умолчанию можно с помощью предложения:
ALTER DOMAIN MovieDomain SET DEFAULT ‘no such title’
6
В результате значение по умолчанию ‘unknown ‘ введенное для MovieDomain заменяется
строкой ‘no such title’. Можно внести и другие изменения, например, касающиеся ограничений
области.
Определение области удаляется с помощью предложения:
DROP DOMAIN MovieDomain
В результате эта область становится недоступной для описаний атрибутов, но атрибуты, уже
определенные с ее помощью, сохранят типы и значения по умолчанию, которые им были
приписаны до удаления области.
Индексы.
Индексы атрибута А-это структура данных, обеспечивающая эффективный поиск кортежей,
имеющих фиксированное значение для атрибута А. Индексы, как правило, полезны в запросах,
в которых атрибут А сравнивается с константой, например А=3 или даже А<=3. При очень
большом отношении накладно сканировать все его кортежи в поиске(возможно, очень малого
числа) кортежей, удовлетворяющих заданному условию.
SELECT *
FROM Movie
WHERE StudioName=’Disney’ AND year=1990;
Здесь может быть 10 тыс. кортежей Movie, из которых только 200 фильмов выпущено в 1990 г.
Примитивный способ обработки этого запроса состоит в проверке условия пункта WHERE
на каждом из 10 тыс. кортежей. Гораздо эффективнее как-нибудь найти 200 кортежей,
относящихся к 1990 г, а затем проверить, есть ли в них студия Disney. Еще лучше сразу найти
только десяток кортежей, удовлетворяющих обоим условиям пункта WHERE , но это
превышает возможности обычных структур данных.
Хотя создание индексов не предусмотрено ни одним стандартом SQL, включая SQL2, в
большинстве коммерческих систем разработчики БД имеют возможность задать системе
операцию создания индекса для конкретного атрибута из определенного отношения. Обычно
для этого применяется следующий синтаксис. Предложение:
CREATE INDEX YearIndex ON Movie(year);
Создает индекс с именем YearIndex на атрибуте year из отношения Movie. В дальнейшем
процессор запросов SQL может обрабатывать запросы относительно года так, что будут
проверяться только те кортежи отношения Movie, в которых есть указанный год. В результате
сокращаем время, необходимое для получения ответа на запрос.
7
В SQL часто допустимы многоатрибутные индексы с несколькими переменными,
позволяющие эффективно находить кортежи с заданными значениями этих переменных.
Может показаться, что многоатрибутный индекс менее полезен, чем индекс единственного
атрибута, так как последний можно применять тогда, когда первый не имеет значений для
каждого из своих. И все же тогда, когда многоатрибутные индексы можно применять, этим
надо пользоваться, поскольку они повышают эффективность поиска кортежей.
При выборе индексов нужно соблюдать определенный баланс:
1). С одной стороны существование индекса на атрибуте увеличивает скорость выполнения
запроса
2). Каждый индекс построенный на атрибуте усложняет операции вставки. Изменения,
удаления и увеличивает время выполнения.
8
Группа DML.
Оператор создания запросов.
Наиболее простая форма запросов в SQL-это запрос об удовлетворяющих некоторому условию
кортежах одного отношения. Основная форма запроса строится так:
SELECT<АТРИБУТЫ>
FROM<ОТНОШЕНИЕ>
WHERE<УСЛОВИЕ>;
Пункт SELECT показывает какие атрибуты кортежей, удовлетворяющих условию, становятся
частью ответа.
В пункте SELECT вместо имен атрибутов можно ставить *- это говорит о том, что порождается
полный кортеж.
Пункт FROM указывает на отношение, которому принадлежит запрос.
Пункт WHERE содержит условие, которому должны удовлетворять кортежи для соответствия
запросу.
Примеры:
1).Выдать информацию о фильмах, снятых в 1990 году на киностудии Disney
SELECT *
FROM Movie
WHERE year=1990 and StudioName=’Disney’
2). Вывести названия кораблей, спущенных на воду после 1940 года:
SELECT name
FROM ships
WHERE launched>1940
Некоторые компоненты, выбранных кортежей при желании можно устранить, то есть
применить проекцию, тогда результатом запроса будут не все атрибуты, а только
перечисленные в пункте SELECT
3). Вывести название и продолжительность фильмов, снятых на киностудии Disney в 1990:
SELECT title, length
FROM Movie
9
WHERE year=1990 and StudioName=’Disney’;
Часто бывает необходимым построить отношение, заголовки столбцов которого отличаются
от атрибутов отношения, упомянутого в пункте FROM. Тогда за именем атрибута становится
ключевое слово AS и псевдоним, составляющий имя. Которое появится в результирующем
отношении.
В предложении SELECT вместо атрибутов можно использовать формулу.
Предположим нам надо вывести продолжительность фильма в часах:
SELECT title AS NameofMovie, length*0.0166 AS DurationHours
FROM Movie
WHERE year=1990 and StudioName=’Disney’;
В качестве элемента предложения SELECT допускаются использовать и константу:
SELECT title AS MovieName, length*0.0166 AS Duration, ‘hrs AS InHours’
Примеры:
1)Вывести адрес киностудии Miramax:
SELECT Adres
FROM Studio
WHERE name=’Miramax’;
2) Найти дату рождения Джеки Чана
SELECT Birthday
FROM MovieStar
WHERE Name=’Jake Chan’;
3) Найти номер модели, скорость и размер жесткого диска всех ПК стоимостью более 1500$:
SELECT model, speed, hd
FROM Pc
WHERE price>1500;
4) Вывести всех производителей принтеров:
SELECT maker
FROM product
WHERE type=’printer’;
5)Вывести класс и страну для всех кораблей имеющих менее 10 орудий на борту:
10
SELECT class, country
FROM classes
WHERE numguns<=10;
6) Найти названия всех кораблей, потопленных в сражениях, и названия сражений в которых
они были потоплены:
SELECT ship, battle
FROM outcomes
WHERE result=’sunk’;
Выбор в SQL.
Выбор в SQL строится на применении 6 операторов сравнения в пункте WHERE. Сравнения
могут содержать константы, атрибуты отношения или отношений, упомянутых в пункте
FROM. Перед сравнением числовых значений к ним можно применять арифметические
операции. К строкам можно применить оператор конкатенации (сложения). Результатом
сравнения является булево значение TRUE или FALSE, а это значит, что к ним можно
применить логические операции AND, OR, NOT.
SELECT title as MovieName
FROM Movie
WHERE year>1990 AND NOT Incolor;
Вывести названия фильмов либо выпущенных в 1990 либо продолжительностью менее
90минут, выпущенных на киностудии Tristar:
SELECT title
FROM movie
WHERE ( year=1990 ORlength<90) AND studioname=’Tristar’;
Сравнение строк.
Две строки равны, если они состоят из одной и той же последовательности символов. При
сравнении строк одним из операторов, например меньше, проверяется предшествует ли одна
из них другой в лексикографическом порядке.
SQL позволяет сравнивать строки и на основании их совпадения с простым образцом:
S Like P –формула сравнения, где s-строка, а р- образец;
В образце применяются следующие символы : % и _
11
Обычные символы в образце соответствуют только самим себе в строке.
Знак «%» в образце может соответствовать любой последовательности символов, а знак «_»
соответствует одному любому символу в строке.
Примеры:
1).Вывести названия фильмов, Которые начинаются со слова Star и имеют 9 символов:
SELECT title AS MovieName
FROM Movie
WHERE title like ‘Star_ _ _ _ _’;
2)Вывести названия фильмов, содержащих Star в любом месте:
SELECT title AS MovieName
FROM Movie
WHERE title like ‘%Star%’;
3).Найти все названия фильмов, в которых используется слово «жизнь», которые были
выпущены до 2000 года:
SELECT title AS MovieName
FROM Movie
WHERE year<2002 and title like ‘%жизнь%’;
4).Вывести продюсеров с чистым годовым доходом больше 10 млн. :
SELECT name
FROM MovieExec
WHERE networth>10 000 000;
5).Найти все названия кораблей, у которых название совпадает с именем класса:
SELECT name As shipname
FROM ships
WHERE name=class;
6).Найти все названия кораблей, начинающихся с «ч» и состоящих из 3-х символов:
SELECT name as shipname
FROM ships
WHERE name like ‘ч%%%’;
12
7). Вывести всех производителей LapTop, названия которых начинаются с «А»:
SELECT maker
FROM product
WHERE type=’laptop’ AND maker like ‘a%’ ;
8).Вывести номера моделей и стоимость струйных принтеров:
SELECT model, price
FROM printer
WHERE type=’ink-jet’ and color=true
Если необходимо использовать знак процента или подчеркивания как сами знаки. А не как
специальные символы, то после образца ставится знак escape, за которым следует
заключенный в апостроф любой символ, который будет поставлен в образце перед этими
знаками и будет указывать на то, что они используются, как обычные символы Escape’x’
SELECT title AS MovieName
FROM Movie
WHERE title like ‘x%%x% ‘ escape’x’;
Пример:
Вывести адреса кинозвезд, у которых есть в адресе знак _ .
SELECT Adres
FROM MovieStar
WHERE adres LIKE ‘%x_%’ escape ‘x’;
Сравнение дат и времени в SQL.
Дата представляется ключевым словом Date, за которым следует заключенная в кавычки
строка особого вида:
Date ‘2009-09-29’
Время представляется ключевым словом Time и имеет вид:
Time ’16:30:18:55’
Даты и время можно сравнивать с помощью тех же операторов, которые применялись в
числам или строкам.
Например: знак «<» означает, что дата или время, стоящие слева будут (или были) раньше
даты и времени, указанных справа.
13
Упорядочение вывода в SQL.
Порождаемые запросом кортежи можно упорядочить на основе значения любого атрибута для
этого в запрос добавляется пункт
ORDER BY<список атрибутов>
Примеры:
1).Получить всю информацию о фильма, снятых на киностудии Disney в 2008 году в порядке
возрастания продолжительности фильмов в алфавитном порядке названия:
SELECT *
FROM Movie
WHERE studioName=’Disney’ and year>2008
ORDER BY length, title;
По умолчанию принимается восходящий порядок, но его можно изменить на нисходящий
ORDER BY<список атрибутов> DESC
Если порядок атрибутов известен, то при желании вместо имен атрибутов можно
использовать в пункте ORDER BY их порядковые номера.
Примеры:
1). Найти всех кинозвезд мужчин или кинозвезд проживающих в Малибу:
SELECT *
FROM MovieStar
WHERE Adres like ‘% Malibu%’ OR Gender= ‘m’
2).Вывести названия всех киностудий в алфавитном порядке, которые находятся в Голивуде:
SELECT Name As StudioName
FROM Studio
WHERE Adres like ‘%Hollywood%’
ORDER BY name;
3).Вывести все марки топлива. Цена закупки которых превышает 10 лей:
SELECT marka
FROM spravka
WHERE pricez>10;
14
4). Вывести номер смены, которая принимала топливо за текущую дату:
SELECT numS as NumberofSmena
FROM smena
WHERE datas=date’2009-10-01’;
5).Вывести в порядке убывания веса блюд те блюда, стоимость которых превышает 100лей:
SELECT namebl
FROM bliuda
WHERE price>100
ORDER BY gramaj DESC;
6) Вывести названия блюд, вес которых превышает 300грамм и в состав которых входит
картофель:
SELECT namebl
FROM bliuda
WHERE (gramaj>300) AND (sostav LIKE ‘%картофель%’);
Запросы, содержащие более одного отношения.
В SQL есть простой способ соединения отношений в одном запросе – это перечислить их через
запятую в пункте FROM, тогда пункты SELECT и WHERE могут ссылаться на любой атрибут
этих отношений.
Пример: Вывести продюсера фильма «Звездные войны»:
SELECT name
FROM Movie, MovieExec
WHERE title=’Star Wars’ and producer=certif;
Иногда в запрос включаются несколько отношений и некоторые из них имеют атрибуты с
одинаковыми именами. В этом случае уточняется, какой атрибут принадлежит какому
отношению указанием перед атрибутом имени отношения, за которым следует точка.
15
Пример:
Вывести пары, состоящие из актера и продюсера, проживающих по одному адресу:
SELECT moviestar.name, movieexec.name
FROM Moviestar,MovieExec
WHERE Moviestar.Adres=MovieExec.Adres;
Уточнение атрибутов путем префикса отношения эффективно, когда запрос содержит
комбинацию различных отношений. Однако, когда требуется создать запрос, содержащий
несколько кортежей из одного и того же отношения, в этом случае одно и тоже отношение R
повторяется необходимое число раз в пункте FROM и для каждого повтора определяется свой
псевдоним, который называется переменной кортежа.
Для этого после каждого повторения имени ставится ключевое слово As и переменная
кортежа.
Пример:
Вывести пары, состоящие из кинозвезд, проживающих по одному адресу:
SELECT star1.name,star2.name
FROM MovieStar As Star1, MovieStar AS Star2
WHERE star1.adres=star2.adres and star1.name<star2.name
Существует множество способов интерпретировать запросы в SQL, но все они эквивалентны в
том смысле, что приводят к одному и тому же ответу. Если использовать средства СУБД, то
несколько отношений в одном запросе можно интерпретировать с помощью вложенных
циклов, параллельного приписывания, преобразование в реляционную алгебру.
Объединение, пересечение и разность запросов.
В SQL можно применить к результатам запросов операторы объединения, пересечения и
разности при условии, что запросы порождают отношения с одним и тем же множеством
атрибутов:
V-объединение (union)
⁻ -разность(except)
Λ- пересечение(intersect)
Ключевые слова ставятся между двумя запросами, заключенные в скобки.
16
Пример:
1).найти имена и адреса всех женщин, которые являются и продюсерами и имеют доход не
менее 10 млн.
(SELECT name, adres
FROM MovieStar
WHERE gender=’f’)
INTERSECT
(SELECT movieStar.name, movieStar.adres
FROM MovieStar, MovieExec
WHERE (gender=’f)’ and (networh>10 000 000) and
(moviestar.name=movieexec. name) and (moviestar.adres=movieexec.adres));
2).Выдать имена и адреса актеров мужчин, которые не являются продюсерами:
(SELECT name, adres
FROM MovieStar
WHERE gender=’m’)
EXCEPT
(SELECT name, adres
FROM MovieExec);
3).Вывести имена и адреса актеров и продюсеров
(SELECT name, adres
FROM MovieStar)
UNION
(SELECT name, adres
FROM MovieExec);
17
Дубликаты в SQL.
Некоторые запросы порождают дубликаты значений. Для того, чтобы исключить
порождение дубликатов за ключевым словом SELECT ставится DISTINCT, которое заставляет
строить только одну копию кортежа.
Пример
Вывести названия киностудии, в которых были сняты фильмы с участием Джеки Чана.
SELECT DISTINCT studioname
FROM Movie, StarSln
WHERE Starname=’Jake Chan’ and title=movietitle;
Если возникает необходимость сохранить дубликаты кортежей в операциях объединения,
пересечения и разность, тогда за ключевыми словами Union, Intersect, Except ставится ALL.
Операторы Intersect ALL и Except ALL обозначают пересечение и разность мультимножеств.
Пусть R и S эти отношения, тогда R Intersect ALL S будет включать в себя выражение, в
котором число вхождения кортежей t равно минимальному ему вхождению в S и R.
Число вхождений кортежа t в результат отношения R Except ALL S равно разности между
числом вхождений t и R и числом его вхождений в S при условии, что эта разность
положительна.
Примеры:
1).Найти производителей PC, но не Laptop:
(SELECT maker
FROM product
WHERE type=’pc’)
EXCEPT
(SELECT maker
FROM product
Where type=’ Laptop’);
2). Найти размеры жестких дисков, совпадающих у PC и Laptop:
(SELECT hd
FROM pc)
INTERSECT
18
(SELECT hd
FROM Laptop );
3)Укажите страны, имеющие и линкоры и крейсеры:
(SELECT country
FROM classes
WHERE type=’bc’)
INTERSECT
(SELECT country
FROM classes
Where type=’ bb’);
4). Вывести названия кораблей водоизмещением более 40 тыс., потопленных в сражениях:
(SELECT ship
FROM outcomes
WHERE result=’sunk’)
INTERSECT
(SELECT name as ship
FROM ships, classes
WHERE displaceme>4000 and classes.class=ships.class);
19
Подзапросы.
Подзапрос-это выражение, приписывающее значение отношению.
Существуют
подзапросы порождающие скалярные значения- это когда результат какого-то отношения
дает единственный атрибут. В этом случае допускается использовать заключенный в скобки
простой запрос, как константу. Он может стоять в пункте WHERE на любом месте, на котором
предполагается вхождение константы или атрибута, представляющего компонент кортежа.
Примеры:
1). Вывести продюсеров богаче, чем Мэлони Грифин:
SELECT name
FROM MovieExec
Where networth>;
SELECT networth
FROM MovieExec
WHERE name like ‘%Griffin%’
2). Какие фильмы длиннее, чем Звездные Войны:
SELECT title
FROM Movie
Where length>
SELECT length
FROM Movie
WHERE name like ‘Star Wars’;
3). Вывести продюсера фильма Звездные Войны:
SELECT name
FROM MovieExeC
WHERE certif=
(SELECT producerc
FROM movie
WHERE title like ’Star Wars ’);
20
В SQL есть ряд операторов, которые можно применить к отношению R и получить булево
значение.
Обычно R-это результат запроса. Некоторые из этих операторов содержат скалярные
значения, а некоторые отношения с одним столбцом.
EXIST S R - это условие истинное, если R не пустое;
S IN R – выдает истину, если S эквивалентно одному из значений R;
S> ALL R - истина, если S больше любого значения унарного отношения R;
S NOT IN R
Пример: S<> ALL R эквивалентно S NOT IN R;
S ANY R - истина, если S больше по крайней мере одного из значений указанного
отношения R.
Примеры:
1)Найти названия кораблей с орудиями калибра 16 дюймов:
SELECT name
FROM ships
WHERE class=
(SELECT class
FROM classes
WHERE bore=16);
2). Найти сражения, в которых участвовали корабли класса Kongo.
SELECT battle
FROM outcomes
WHERE ship=
(SELECT name
FROM ships
WHERE class=’Kongo’);
21
3). Найти компьютеры, скорость которых меньше любого Laptop^
SELECT model
FROM pc
WHERE speed< any
(SELECT speed
FROM laptop);
4).Найти печатающее устройство, имеющее самую высокую цену:
SELECT model
FROM printer
WHERE price>all
(SELECT price
FROM printer);
22
5).Найти производителей принтеров с самым быстрым процессором среди всех PC, имеющих
наибольший объем RAM:
(SELECT maker
FROM product
WHERE type=’printer’)
INTERSECT
(SELECT maker
FROM product
WHERE model in
(select model
From pc
Where speed>all
((select speed
From pc)
INTERSECT
(select model
From pc
Where ram<any
(select ram
From pc))));
6). Вывести названия фильмов продолжительностью менее «Звездные войны»:
SELECT title
FROM movie
WHERE length< (SELECT length
FROM movie
WHERE title like ’Star Wars’);
23
7)Найти названия кораблей, имеющих наибольшее число орудий среди всех кораблей того же
типа:
SELECT name
FROM ships
WHERE class in
(SELECT class
FROM classes AS class_1
WHERE numguns>all
( SELECT numguns
FROM classes
WHERE classes.displaceme= class_1.displaceme));
24
Условия, содержащие кортежи. Запросы с условием, содержащим
кортеж.
В SQL кортеж представляется заключенным в скобки скалярным значением
(‘Kongo’,16)-значение;
(class, bore)-название атрибута;
(‘Kongo’, bore)-значение и имя атрибута.
Если в кортеже столько же атрибутов, что и в отношении, то их можно сравнивать с помощью
In, Any, All.
Пример:
Вывести продюсеров фильмов, в которых играет Гаррисон Форд
SELECT name
FROM MovieExec
WHERE Certif in
(SELECT producerC
FROM movie
WHERE (title,year) In
(SELECT MovieTitle,MovieYear
FROM StarSln
WHERE StarName=’Harison Ford’));
Или используя сложный запрос:
SELECT name
FROM MovieExeC, Movie, StarSln
WHERE (certif=producer) and (Title=MovieTitle) and (year=MovieYear) and
( starName=’Harison Ford’);
25
Коррелирующие подзапросы.
Простейшие подзапросы можно оценить раз и навсегда и затем использовать результаты в
запросе более высокого уровня. При более сложном применении подзапросов проводится
многократное вычисление одного и того же подзапроса по одному разу для каждого
приписывания значения терму этого подзапроса, происходящего от переменной, находящейся
вне его. Подзапрос такого типа называется коррелирующим.
Пример:
Вывести название, которое использовалось для 2-х или более фильмов.
SELECT title
FROM movie as old
WHERE year< ANY
(SELECT Year
FROM movie
WHERE title=old.title);
При записи коррелирующего запроса важно знать правило определения области действия
имен. В общем случае атрибут подзапроса принадлежит одной из переменных кортежа в
пункте R. Если этот атрибут входит в схему отношений для данной переменной, в противном
случае рассматривается запрос, в который непосредственно входит данный подзапрос, а затем
следующий окружающий его.
Агрегация в SQL.
Агрегация- это формирование единственного значения из списка значений, содержащихся в
столбце. SQL позволяет не только агрегировать столбцы, но и группировать кортежи
отношения по какому-то критерию, а затем проводить агрегацию в полученных группах. В SQL
есть операторы, которые применяются к столбцу отношения и порождают на нем некоторый
итог или агригацию.
SUM - сумма значений в столбце;
AVG - среднее арифметическое из всех значений в столбце;
MIN-минимальное из всех значений в столбце;
MAX-максимальное из всех значений в столбце;
26
COUNT - число значений, причем включая и дубликаты, если они не удаляются с помощью
DISTINCT.
Эти операторы применяются к выражению со скалярным значением обычно к имени столбца
в пункте SELECT.
Примеры:
1).Вывести средний годовой доход всех продюсеров:
SELECT AVG(networth)
FROM movieExec;
2). Подсчитать число кортежей в MovieExec:
SELECT COUNT(*)
FROM movieExec;
3). Информация о скольких продюсерах занесена в таблицу MovieExec (подсчитать кол-во)
SELECT COUNT( DISTINCT name)
FROM movieExec;
Группирование в SQL.
SQL позволяет рассматривать кортежи отношений в виде групп, соответствующих значений
одному из столбцов
GROUP BY<список групп атрибутов>
Пример:
Вывести суммы продолжительностей всех фильмов, снятых на каждой киностудии:
SELECT studioname, sum(length)
FROM movie
GROUP BY studioname;
Данный запрос в пункте SELECT содержит термы двух типов:
1). Это атрибут типа studioname, который входит в пункт GROUP BY. В предложении SELECT
содержащем агрегаты, неагрегируемыми могут быть только атрибуты, которые упомянуты в
пункте GROUP BY.
27
2). Термы-это агригаты, в которых оператор агрегации применяется к атрибуту или к
выражению, содержащему атрибут.
GROUP BY может применяться и в запросах, адресованных нескольким отношениям, такой
запрос интерпретируется согласно следующим шагам:
1). Из всех отношений, перечисленных в пункте FROM, создается одно, используя операцию
декартова произведения, к которому применяется выбор из предложения WHERE;
2). Кортежи полученного отношения группируются согласно атрибутам из GROUP BY;
3).Результат выдается в виду атрибутов и агригатов пункта SELECT так, словно он касается
только одного отношения.
Примеры:
1).Вывести сумму продолжительностей фильмов, выпущенных каждым продюсером:
SELECT name, sum(length)
FROM movie, movieExeс
WHERE prodc=certif
GROUP BY name
2). Найти печатающее устройство, имеющее самую высокую цену:
SELECT model, max(price)
FROM printer
GROUP BY model;
3)Вывести имена продюсеров с самым большим годовым доходом
SELECT name, max(networth)
FROM movieExeс
4).найти страны, корабли которых имеют наименьшее число орудий:
SELECT country, min(numguns)
FROM classes;
28
Иногда необходимо выбрать групп, основанные на некотором свойстве самой группы. Тогда
за предложением GROUP BY ставится предложение HAVING<условие>. Причем это условие
касается каждой отдельной группы.
Примеры:
1).Определите общую продолжительность фильмов только для продюсеров, выпустивших
хотя бы один свой фильм до 1980 года:
SELECT name, sum(length)
FROM movie, movieExeс
WHERE prodc=certif.
GROUP BY name
HAVING min(year)<1980
2).Найти производителей, выпускающих, по меньшей мере, три различные модели ПК:
SELECT maker
FROM product
GROUP BY maker
HAVING count(model>=3) and type=‘pc’;
3)Укажите сражения, в которых участвовало по меньшей мере 3 корабля одной и той же
страны:
SELECT battle
FROM outcomes
WHERE ship=
(SELECT name
FROM ships
WHERE class=
(SELECT class
FROM classes
WHERE country=
29
(SELECT country
FROM classes
GROUP BY country
HAVING count(country)>=3)));
Изменение отношений базы данных.
Под командами изменения в SQL понимаются команды:
1). Вставки кортежей в отношения;
2). Удаление кортежей из отношения;
3) Изменение значения определенных компонентов существующих отношений.
Операция вставки осуществляется с помощью следующего предложения
INSERT INTO R VALUES (A1,A2,....AN) R(C1,C2,…,CN)
R – имя отношения;
A1,A2- список значений;
С-имя поля.
Пример:
1).Добавить в таблицу StarSln информацию о том, что Киану Ривз играл в фильме «Матрица»
INSERT INTO StarSln(movieTitle, Starname) VALUES (‘MATRIX’, ‘Кianu Rivz’);
2).Добавить в отношение Studio все киностудии, упомянутые в Movie, но которых нет в самом
Studio:
INSERT INTO Studio (name)
SELECT DISTINCT studioname
FROM movie
WHERE studioname NOT IN
(SELECT name
FROM studio);
30
Операция удаления кортежей.
Предложение удаления кортежей состоит:
DELETE FROM R WHERE <условие>
Примеры:
1). удалить из таблицы StarSln информацию о том, что Киану Ривз играл в фильме «Матрица»:
DELETE FROM StarSln
WHERE MovieTitle=’Matrix’ and starname=’ Кianu Rivz’
2).удалить из таблицы MovieExec информацию о тех продюсерах, годовой доход которых
меньше 10 млн.
DELETE FROM MovieExec WHERE Networth<1000000
Команда изменения значений определенных компонентов.
Изменение или обновление информации происходит следующим образом:
UPDATE R SET< приписывание новых значений> WHERE <условие>
Пример:
1)Изменить отношение MovieЕxec, ставя префикс «Pres» перед именем каждого продюсера,
являющегося президентом студии:
UPDATE MovieExec SET name=’pres’II name
WHERE certif IN
(SELECT presc
FROM studio);
2).перевести продолжительность фильма в часы у тех фильмов, у которых продолжительность
больше 60 мин.
UPDATE Movie SET length=length/60
WHERE length>60;
31
Пользовательские представления в SQL.
Отношения, определенные с помощью предложения Create Table, реально существуют в
базе данных, то есть система SQL размещает таблицы в некоторой типичной структуре,
которая может неограниченно долго сохранятся в неизменном виде, если не изменяется с
помощью DELETE, INSERT, UPDATE.
В SQL есть другой класс отношений, называемый пользовательским или просто
представлением. Физически они не существуют, а определяются выражениями во многом
похожими на запросы. К представлениям можно адресовать запросы так, словно они
существуют физически. А в некоторых случаях допускается даже изменять и.
Представления описываются с помощью команды
CREATE VIEW <имя представления> AS Q
Пример: создать представление, состоящее из названий и годов выпуска фильмов, созданных
на киностудии Рaramount
CREATE VIEW paramountview AS
SELECT title, year
FROM movie
WHERE studioname=’Paramount’;
Иногда удобнее давать имена атрибутам представления по собственному усмотрению, а не
использовать имена из запросов, использующих представления.
Атрибуты представления можно перечислить в скобках в след за именем представления в
предложении Create
CREATE VIEW movieprod ( movietitle, producername) AS
SELECT title, name
FROM movie, movieexec
WHERE producer=certif;
При некоторых обстоятельствах к представлениям можно применять операции вставки,
удаления, изменения.
Изменение достаточно простых представлений, называемых обновляемыми
представлениями можно перевести в эквивалентные изменения таблиц и выполнить их на
этой таблице. При этом должны выполняться два важных технических условия:
1).Предложение подзапроса WHERE не должно содержать самого отношения.
32
2) Предложение SELECT должно содержать достаточное число атрибутов для каждого
вставляемого в предложение кортежа так, чтобы недостающие значения атрибутов можно
было заменить значениями NULL или собственными значениями по умолчанию и получить
кортеж отношения, который дает вставляемый в отношение кортеж.
Примеры:
1). Добавить в представление MovieProd информацию о том, что продюсером фильма
ый район» был Питер Джексон
«9-
INSERT INTO movieprod VALUES (‘9 район’,’Питер Джексон’);
2).Удалить из представления Movieprod информацию о фильмах, содержащих в названии
«trek»
DELETE FROM movieprod
WHERE title LIKE ‘%trek%’
3). Изменить название фильма «9-ый район» в представлении Movieprod на
’элитный 9 район’
UPDATE movieprod SET title=’элитный 9 район’
WHERE title=’9 район’;
Последний вид изменения представления это удаление его целиком с помощью команды
DELETE VIEW<имя представления>
Данная команда удаляет определение представления и после этого уже нельзя формулировать
запросы или команды изменений, содержащие это представление. Но такое удаление не
влияет на кортежи базовых отношений.
33
Пустые значения.
Пустые значения применяются для обозначения неизвестного или несуществующего
значения.
NULL используется, например, тогда, когда кортеж вставляется в отношение с помощью
команды, определяющей некоторые хотя и не все компоненты кортежа.
NULL появляется в компонентах, значения которых не определены, если для них не
установлено другое значение по умолчании. Другим источником NULL является внешнее
соединение.
При действиях со значением NULL нужно соблюдать2 важных правила:
1) Результатом применения арифметических операторов к NULL и другому значению,
содержащему NULL должно быть значение NULL;
2) Результатом сравнения NULL с другими значением, содержащим NULL с помощью
операторов сравнения должно быть значение UNKNOWN
Хотя значение NULL появляется в кортежа, оно не является константой, поэтому
сформулированные правила можно применять для операции на выражения, содержащих
NULL, но само это значение нельзя использовать явным образом в виду операнда
x
Y
X and y
X or y
Not x
F
F
F
F
T
F
T
F
T
T
T
F
F
T
F
T
T
T
T
F
F
U
F
U
T
U
F
F
U
U
T
U
U
T
F
U
T
U
T
U
U
U
U
U
U
SQL условия стоящие в предложении WHERE запросов или в операции DELETE применяются к
каждому кортежу некоторого отношения и для каждого кортежа порождается одно из
значений TRUE, FALSE, UNKNOWN.
Однако в ответ входят только те кортежи, для которых значения условия имеют значение
TRUE, а кортежи с UNKNOWN или FALSE из ответа исключаются.
34
Перекрестное соединение
Простейшая форма соединения- это перекрестное соединение, которое описывает операцию
реляционной алгебры- декартово произведение. Записывается в пнутке FROM запроса либо
через запятую, перечисляя имена отношений либо через CROSS JOIN
FROM mоvie CROSS JOIN starsln
Само по себе декартово произведение бывает не очень полезно. Чаще используется
θ-соединение, которое описывается с помощью ключевого слова ON какого-то условия,
которое ставится после соединения таблиц в пункте FROM
FROM movie JOIN starsln ON
Примеры:
1).объединить отношения Movie и StarSln при условии, что будут объединены только кортежи
относящиеся к одному и тому же фильму:
SELECT title, year, length,s tudioName, producer, starName
FROM movie JOIN starsln ON Title=movietitle and year=movieyaer
2).Вывести названия сражений, в которых участвовали корабли класса Кongo:
SELECT battle
FROM outcomes JOIN ships ON ship=name
WHERE class=’Кongo’;
3).Найти названия кораблей с орудиями калибра 16 дюймов:
SELECT name
FROM ships JOIN classes ON ships.class=classes.class
WHERE bore=16;
4).вывести продюсера StarWars:
SELECT name
FROM MovieExec JOIN movie ON certif=prodc
WHERE title=’Star Wars’;
35
Натуральное(естественное) соединение.
Натуральное объединение отношений отличается от teta-соединения двумя параметрами:
1).единственное условие натурального соединения заключается в том, что все пары атрибутов
из двух отношении, имеющих общее имя приравниваются.
2). Одна из пар равных атрибутов удаляется путем проекции.
Натуральное соединение двух отношений производится:
NATURAL JOIN
Примеры:
1).Вывести названия кораблей, калибр которых не превышает 16 дюймов:
SELECT name
FROM classes NATURAL JOIN ships
WHERE bore<16
2).вывести имена и адреса кинозвезд, которые являются и продюсерами
SELECT name, adres
FROM moviestar NATURAL JOIN movieexec
Внешнее соединение.
Внешнее соединение-это один из вариантов соединения, предусмотренный стандартом SQL2,
для решения проблемы, связанной с определенными соединениями.
Допустим необходимо вычислить соединение отношений R и S. Если кортеж t из R не
соответствует ни одному кортежу из S- он полностью исчезает из отношения R><S. Такая
ситуация вызывает немного проблем, например, если данное соединение является
представлением и запрос относится к представлению об атрибутах, принадлежащих только
схеме отношения R ,то интуитивно предполагается, что кортеж t войдет в результат этого
запроса.
Но фактически t невозможно увидеть в отношении R><S.
Поэтому запрос к R может дать результат, отличающийся от результата того же самого
запроса к R><S.
Внешнее соединение отличается от обычного тем, что оно добавляет к результату любой
кортеж любого из соединяемых отношений, который не соединяется, по крайней мере, ни с
36
одним кортежем другого отношения. Кортежи, которые не соединяются ни с одним кортежем
другого отношения, называется висящими.
Поскольку критерий одного из соединяемых отношений должны иметь все атрибуты обоих
отношений. Каждый висящий кортеж сначала пополняется значением NULL для атрибутов
принадлежащих только другому отношению,а затем вносится результат. Результатом
внешнего соединения могут быть три вида кортежей:
Первый вид кортежей-это значение NULL, которое есть в присоединении и в одной таблице
и в другой. И данное соединение называется полным внешним соединением и вносится в
пункт FROM между таблицами, с помощью ключевых слов FULL OUTER JOIN.
Пример:
Вывести всю информацию,касающуюся и кинозвёзд и продюссеров:
SELECT *
FROM moviestar FULL OUTER JOIN movieexec
Второй вид кортежей представляет собой значение NULL только по одному отношениюлевому. Оно называется левым внешним соединением и указывается как LEFT OUTER JOIN.
Третий вид кортежей, это когда значение NULL есть только в кортежах правого отношения,
тогда такое соединение называется правым внешним соединением и записывается как
RIGHT OUTER JOIN.
Примеры:
1).Вывести информацию только о продюссерах фильмов:
SELECT *
FROM moviestar LEFT OUTER JOIN movieexec
2).Вывести всю информацию о компьютерах и ноутбуках:
SELECT *
FROM pc FULL OUTER JOIN laptop
3).Вывести информацию только о кинозвездах:
SELECT *
FROM moviestar RIGHT OUTER JOIN movieexec.
37
Download