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

Удаляются все записи, удовлетворяющие указанному условию. Если ключевое слово WHERE и условие отсутствуют, из таблицы удаляются все записи. Пример:

DELETE FROM publishers

WHERE publisher = "Super Computer Publishing";

Этакомандаудаляетзаписьобиздательстве Super Computer Publishing.

31.Язык SQL . Оператор SELECT . Синтаксис оператора, простые формы оператора, условия отбора записей. Примеры написания операторов.

• Для извлечения записей из таблиц в SQL определен оператор SELECT. С помощью этой команды осуществляется не только операция реляционной алгебры "выборка" (горизонтальное подмножество), но и предварительное соединение (join) двух и более таблиц. Это наиболее сложное и мощное средство SQL, полный синтаксис оператора SELECT имеет вид:

SELECT [ALL | DISTINCT] <список _выбора >

FROM <имя_таблицы>, ...

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

[ GROUP BY <имя _столбца >,... ]

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

[ORDER BY <имя _столбца > [ASC | DESC],... ]

Порядок предложений в операторе SELECT должен строго соблюдаться (например, GROUP BY должно всегда предшествовать ORDER BY), иначе это приведет к появлению ошибок.

• Этот оператор всегда начинается с ключевого слова SELECT. В конструкции <список_выбора> определяется столбец или столбцы, включаемые в результат. Он может состоять из имен одного или нескольких столбцов, или из одного символа * (звездочка), определяющего все столбцы. Элементы списка разделяются запятыми.

• Пример: получить список всех авторов

SELECT author

FROM authors;

получить список всех полей таблицы authors:

SELECT *

FROM authors;

· В том случае, когда нас интересуют не все записи, а только те, которые удовлетворяют некому условию, это условие можно указать после ключевого слова WHERE. Например, найдем все книги, опубликованные после 1996 года:

SELECT title

FROM titles

WHERE yearpub> 1996;

Допустим теперь, что нам надо найти все публикации за интервал 1995 - 1997 гг. Этоусловиеможнозаписатьввиде:

SELECT title

FROM titles

WHERE yearpub>=1995 AND yearpub<=1997;

• Другой вариант этой команды можно получить с использованием логической операции проверки на вхождение в интервал:

SELECT title

FROM titles

WHERE yearpub BETWEEN 1995 AND 1997;

При использовании конструкции NOT BETWEEN находятся все строки, не входящие в указанный диапазон.

• Еще один вариант этой команды можно построить с помощью логической операции проверки на вхождение в список:

SELECTtitle

FROMtitles

WHEREyearpubIN (1995,1996,1997);

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

• Наиболее полно преимущества ключевого слова IN проявляются во вложенных запросах, также называемых подзапросами. Предположим, нам нужно найти все издания, выпущенные компанией "OraclePress". Наименования издательских компаний содержатся в таблице publishers, названия книг в таблице titles. Ключевое слово NOT IN позволяет объединить обе таблицы (без получения общего отношения) и извлечь при этом нужную информацию:

SELECT title

FROM titles

WHERE pub_id IN

(SELECT pub_id

FROM publishers

WHERE publisher='Oracle Press');

• Некоторые задачи нельзя решить с использованием только операторов сравнения. Например, мы хоти найти web-siteиздательтва "Wiley", но не знаем его точного наименования. Для решения этой задачи предназначено ключевое слово LIKE, его синтаксис имеет вид:

WHERE <имя_столбца> LIKE <образец>[ ESCAPE <ключевой_символ> ]

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

- % (знак процента) - заменяет любое количество символов;

- _ (подчеркивание) - заменяет одиночный символ.

• Попробуем найти искомыйweb-site:

SELECT publiser, url

FROM publishers

WHERE publisher LIKE '%Wiley%';

В соответствии с шаблоном СУБД найдет все строки включающие в себя подстроку "Wiley".

Другой пример: найти все книги, название которых начинается со слова "SQL":

SELECT title

FROM titles

WHERE title LIKE 'SQL%';

 

32.Язык SQL . Выборка из нескольких таблиц, синтаксис соединения таблиц. Примеры написания операторов.

• Очень часто возникает ситуация, когда выборку данных надо производить из отношения, которое является результатом слияния (join) двух других отношений. Например, нам нужно получить из базы данных publications информацию о всех печатных изданиях в виде следующей таблицы:

--------------------------------------------------------------------

| название_книги | год_выпуска | издательство |

--------------------------------------------------------------------

| | | |

• Для этого СУБД предварительно должна выполнить слияние таблиц titles и publishers, а только затем произвести выборку из полученного отношения.

• Для выполнения операции такого рода в операторе SELECT после ключевого слова FROM указывается список таблиц, по которым производится поиск данных. После ключевого слова WHERE указывается условие, по которому производится слияние. Для того, чтобы выполнить данный запрос, нужно дать команду:

SELECT titles.title, titles.yearpub, publishers.publisher

FROM titles, publishers

WHERE titles.pub_id=publishers.pub_id;

А вот пример, где одновременно задаются условия и слияния, и выборки (результат предыдущего запроса ограничивается изданиями после 1996 года):

SELECT titles.title, titles.yearpub, publishers.publisher

FROM titles, publishers

WHERE titles.pub_id=publishers.pub_id AND titles.yearpub>1996;

• Следует обратить внимание на то, что когда в разных таблицах присутствуют одноименные поля, то для устранения неоднозначности перед именем поля указывается имя таблицы и знак "." (точка). (Хорошее правило: имя таблицы указывать всегда!)

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

SELECT authors.author, titles.title, titles.yearpub, publishers.publisher

FROM titles, publishers, titleauthors

WHERE titleauthors.au_id=authors.au_id

AND titleauthors.title_id=titles.title_id

AND titles.pub_id=publishers.pub_id

AND titles.yearpub> 1996;

 

33. Язык SQL . Использование алиасов и псевдонимов, вложенные запросы (подзапросы). Примеры написания операторов.

 

Использование имен корреляции (алиасов, псевдонимов)

• Иногда приходится выполнять запросы, в которых таблица соединяется сама с собой, или одна таблица соединяется дважды с другой таблицей. При этом используются имена корреляции (алиасы, псевдонимы), которые позволяют различать соединяемые копии таблиц. Имена корреляции вводятся в разделе FROM и идут через пробел после имени таблицы. Имена корреляции должны использоваться в качестве префикса перед именем столбца и отделяются от имени столбца точкой. Если в запросе указываются одни и те же поля из разных экземпляров одной таблицы, они должны быть переименованы для устранения неоднозначности в именованиях колонок результирующей таблицы. Определение имени корреляции действует только во время выполнения запроса.

Пример 19. Отобрать все пары поставщиков таким образом, чтобы первый поставщик в паре имел статус, больший статуса второго поставщика:

SELECT

P1.PNAME AS PNAME1,

P1.PSTATUS AS PSTATUS1,

P2.PNAME AS PNAME2,

P2.PSTATUS AS PSTATUS2

FROM

P P1, P P2

WHERE P1.PSTATUS1 > P2.PSTATUS2;

• В результате получим следующую таблицу:

PNAME1 PSTATUS1 PNAME2 PSTATUS2
Иванов 4 Петров 1
Иванов 4 Сидоров 2
Сидоров 2 Петров 1

 

34.Язык SQL .Вычисления внутри оператора, группировка данных, сортировка данных, операция объединения. Примеры написания операторов

• SQL позволяет выполнять различные арифметические операции над столбцами результирующего отношения. В конструкции <список_выбора> можно использовать константы, функции и их комбинации с арифметическими операциями и скобками. Например, чтобы узнать сколько лет прошло с 1992 года (год принятия стандарта SQL-92) до публикации той или иной книги можно выполнить команду:

SELECT title, yearpub-1992

FROM titles

WHERE yearpub> 1992;

В арифметическихвражения допускаются операции сложения (+), вычитания (-), деления (/), умножения (*), а также различные функции (COS, SIN, ABS - абсолютное значение и т.д.). Такжевзапросможнодобавитьстроковуюконстанту:

SELECT 'the title of the book is', title, yearpub-1992

FROM titles

WHERE yearpub> 1992;

• Группировка данных в операторе SELECT осуществляется с помощью ключевого слова GROUP BY и ключевого слова HAVING, с помощью которого задаются условия разбиения записей на группы.

• GROUP BY неразрывно связано с агрегирующими функциями, без них оно практически не используется. GROUP BY разделяет таблицу на группы, а агрегирующая функция вычисляет для каждой из них итоговое значение. Определим для примера количество книг каждого издательства в нашей базе данных:

SELECT publishers.publisher, count(titles.title)

FROM titles, publishers

WHERE titles.pub_id=publishers.pub_id

GROUP BY publisher;

 

• Kлючевое слово HAVING работает следующим образом: сначала GROUP BY разбивает строки на группы, затем на полученные наборы накладываются условия HAVING. Например, устраним из предыдущего запроса те издательства, которые имеют только одну книгу:

SELECT publishers.publisher, count(titles.title)

FROM titles,publishers

WHERE titles.pub_id=publishers.pub_id

GROUP BY publisher

HAVING COUNT(*)>1;

• Другой вариант использования HAVING - включить в результат только те издательства, название которых оканчивается на подстроку "Press":

SELECT publishers.publisher, count(titles.title)

FROM titles,publishers

WHERE titles.pub_id=publishers.pub_id

GROUP BY publisher

HAVING publisher LIKE '%Press';

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

• Для сортировки данных, получаемых при помощи оператора SELECT служит ключевое слово ORDER BY. С его помощью можно сортировать результаты по любому столбцу или выражению, указанному в <списке_выбора>. Данные могут быть упорядочены как по возрастанию, так и по убыванию. Пример: сортировать список авторов по алфавиту:

SELECT author

FROM authors

ORDER BY author;

 

• В SQL предусмотрена возможность выполнения операции реляционной алгебры "ОБЪЕДИНЕНИЕ" (UNION) над отношениями, являющимися результатами оператора SELECT. Естественно, эти отношения должны быть определены по одной схеме. Пример: получить все Интеренет-ссылки, хранимые в базе данных publications. Эти ссылки хранятся в таблицах publishers и wwwsites. Для того, чтобы получить их в одной таблице, мы должны построить следующие запрос:

SELECT publisher, url

FROM publishers

UNION

SELECT site, url

FROM wwwsites;

 

35. Оператор SELECT . Формальный порядок выполнения оператора SELECT. Как на самом деле выполняется оператор SELECT.

Для того чтобы понять, как получается результат выполнения оператора SELECT, рассмотрим концептуальную схему его выполнения. Эта схема является именно концептуальной, т.к. гарантируется, что результат будет таким, как если бы он выполнялся шаг за шагом в соответствии с этой схемой. На самом деле, реально результат получается более изощренными алгоритмами, которыми "владеет" конкретная СУБД.