Язык 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