Аргументы DISTINCT и TOP в предложение SELECT



Тема 3. Структурированный язык запросов – SQL

 

3.1. История SQL

 

В начале 1970-х годов в одной из исследовательских лабораторий компании IBM была разработана экспериментальная реляционная СУБД IBM System R, для которой затем был создан специальный язык SEQUEL, позволявший относительно просто управлять данными в этой СУБД. Аббревиатура SEQUEL расшифровывалась как Structured English QUEry Language — «структурированный английский язык запросов». Позже по юридическим сооб-ражениям язык SEQUEL был переименован в SQL (произносится [,eskju:’el] — эс-кью-эл).

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

Первыми СУБД, поддерживающими новый язык, стали в 1979 году Oracle V2 для ма-шин VAX от компании Relational Software Inc. (впоследствии ставшей компанией Oracle) и System/38 от IBM, основанная на System/R.

Первый официальный стандарт языка SQL был принят ANSI1 в 1986 году и ISO2 в 1987 году (так называемый SQL-86) и несколько уточнён в 1989 году. Дальнейшее развитие языка поставщиками СУБД потребовало принятия в 1992 году нового расширенного стандарта (ANSI SQL-92 или просто SQL2). Следующим стандартом стал SQL:1999 (SQL3). В настоя-щее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модифика-циями, внесёнными позже. История версий стандарта приведена следующей таблице:

 

Год   Название   Изменения  

 

1986   SQL-86   Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987 году.  

 

1989   SQL-89   Немного доработанный вариант предыдущего стандарта.  

 

1992   SQL-92   Значительные изменения ISO 9075.  

 

  1999     SQL:1999   Добавлена поддержка регулярных выражений, рекурсивных запросов, поддержка триггеров, базовые процедурные расширения, нескалярные типы данных и некоторые объектно-ориентированные возможности.  

 

  2003     SQL:2003   Введены расширения для работы с XML-данными, оконные функции (применяемые для рабо-ты с OLAP-базами данных), генераторы последовательностей и основанные на них типы дан-ных.  

 

  2006     SQL:2006   Функциональность работы с XML-данными значительно расширена. Появилась возможность совместно использовать в запросах SQL и XQuery.  

 

  2008     SQL:2008   Улучшены возможности оконных функций, устранены некоторые неоднозначности стандарта SQL:2003  

 

Зачем вообще нужны эти стандарты? Текст основной части стандарта SQL3 занимает 1300 станиц сухого формального текста. Может показаться, что это просто происки разработчиков стандартов, а не то, что необхо-димо рядовым разработчикам. Однако ни один серьезный разработчик, работающий с базами данных, не дол-жен игнорировать стандарт, и для этого существуют весьма веские причины. Разработка любой информацион-ной системы, ориентированной на технологию баз данных (а других информационных систем на настоящий момент и не бывает), является трудоемким процессом, занимающим несколько десятков и даже сотен человеко-месяцев. А развитие вычислительной техники, систем телекоммуникаций и программного обеспечения столь стремительно, что проект может устареть еще до момента внедрения. Развивается не только вычислительная техника, изменяются и реальные объекты, поведение которых моделируется как самой БД, так и процедурами обработки информации в ней. Именно поэтому проект информационной системы должен быть рассчитан на расширяемость и переносимость на другие платформы. Большинство поставщиков аппаратуры и программного обеспечения следуют стратегии поддержки стандартов, в противном случае пользователи просто не будут их покупать. Однако каждый поставщик стремится улучшить свой продукт введением дополнительных возможно-

 

 

1 ANSI – American National Standards Institute. Американский национальный институт стандартов - объединение американских промышленных и деловых групп, разрабатывающее торговые и коммуникационные стандарты. Входит в ISO и Международную электротехническую комиссию, представляя там свою страну.

2 ISO – International Organization for Standardization. Международная организация, занимающаяся выпуском стандартов.


68

 

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

Надо отметить, что, несмотря на наличие международных стандартов, многие компа-нии, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL AB), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом, появляются специфичные для каждой конкретной СУБД диа-лекты языка SQL.

 

3.2. Структура в SQL

 

SQL является, прежде всего, информационно-логическим языком, предназначенным для описания, изменения и извлечения данных, хранимых в реляционных базах данных. Как уже отмечалось, изначально SQL представлял собой непроцедурный язык, предназначенный для обработки множеств, состоящих из строк и колонок таблиц реляционной базы данных. В последствии разработчики СУБД дополнили его расширениями, допускающими процедур-ную обработку. SQL усложнился — обогатился новыми конструкциями, обеспечил возмож-ность описания и управления новыми хранимыми объектами (например, индексы, представ-ления, триггеры и хранимые процедуры) — и стал приобретать черты, свойственные языкам программирования.

При всех изменениях, SQL остаётся единственным механизмом связи между приклад-ным программным обеспечением и базой данных. В тоже время, современные СУБД, а, так-же, информационные системы, использующие СУБД, предоставляют пользователю развитые средства визуального построения запросов1.

Современный SQL состоит из набора команд, которые позволяют создавать объекты реляционной базы данных, модифицировать данные в таблицах (вставлять, удалять, исправ-лять), изменять схемы отношений базы данных, выполнять вычисления над данными, делать выборки из базы данных, поддерживать безопасность и целостность данных.

Весь набор команд SQL можно разбить на следующие группы:

• операторы определения данных (Data Definition Language, DDL)

 

-  CREATEсоздает объект БД (саму базу, таблицу, представление, пользователя и т.д.);

-  ALTERизменяет объект; - DROP удаляет объект;

• операторы манипулирования данными (Data Manipulation Language, DML) -   INSERTдобавляет новые данные;

-  UPDATE изменяет существующие данные; -   DELETEудаляет данные;

• команды выборки данных (Data Query Language, DQL)

-  SELECTвыполняет запрос на выборку данных из таблиц и представлений;

-  UNIONобъединяет в одной выборке результаты выполнения двух или более команд SELECT;

• операторы управления транзакциями (Transaction Control Language, TCL) -   COMMITприменяет транзакцию;

-  ROLLBACKоткатывает все изменения, сделанные в контексте текущей транзак-ции;

-  SAVEPOINTделит транзакцию на более мелкие участки;

• операторы определения доступа к данным (Data Control Language, DCL)

 

 

1 По мнению составителя УМКД использование при изучении баз данных конструкторов запросов неправиль-но, так как не способствует пониманию SQL.


69

 

-  GRANTпредоставляет пользователю (группе) разрешения на определенные операции с объектом;

-  REVOKEотзывает ранее выданные разрешения;

-  DENYзадает запрет, имеющий приоритет над разрешением. Процедурные расширения

Поскольку SQL не является языком программирования (то есть не предоставляет средств для автоматизации операций с данными), вводимые разными производителями рас-ширения касались в первую очередь процедурных расширений. Это хранимые процедуры (stored procedures) и процедурные языки-«надстройки». Практически в каждой СУБД при-меняется свой процедурный язык. Стандарт для процедурных расширений представлен спе-цификацией SQL/PSM. Перечень процедурных расширений для самых популярных СУБД приведён в следующей таблице:

 

СУБД   Краткое название   Расшифровка  

 

InterBase/Firebird   PSQL   Procedural SQL  

 

  IBM DB2     SQL PL (англ.)   SQL Procedural Language (расширяет SQL/PSM); также в DB2 хранимые процедуры могут писаться на обычных языках про-граммирования: Си, Java и т. д.  

 

MS SQL Server/ Sybase ASE     T-SQL     Transact-SQL  

 

MySQL   SQL/PSM   SQL/Persistent Stored Module  

 

Oracle   PL/SQL   Procedural Language/SQL (основан на языке Ada)  

 

  PostgreSQL     PL/pgSQL   Procedural Language/PostgreSQL Structured Query Language (очень похож на Oracle PL/SQL)  

 

Несмотря на наличие диалектов и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL, DML и DQL, могут быть достаточно легко перенесены из одной СУБД в другую. Существуют системы, разработчики которых изначально ориентиро-вались на применение, по меньшей мере, нескольких СУБД. Например: система электронно-го документооборота Documentum может работать как с Oracle, так и с Microsoft SQL Server и IBM DB2. Естественно, что при применении некоторых специфичных для реализации воз-можностей такой переносимости добиться уже очень трудно.

С помощью SQL программист описывает только то, какие данные нужно извлечь или модифицировать. То, каким образом это сделать, решает СУБД непосредственно при обра-ботке SQL-запроса. Однако не стоит думать, что это полностью универсальный принцип -программист описывает набор данных для выборки или модификации, однако ему при этом полезно представлять, как СУБД будет разбирать текст его запроса. Чем сложнее сконструи-рован запрос, тем больше он допускает вариантов написания, различных по скорости выпол-нения, но одинаковых по итоговому набору данных.

 

3.3. Язык DDL

 

Язык DDL (data definition language, язык определения данных) применяется для опре-деления объектов баз данных (таких как базы данных, таблиц и представления) и для управ-ления этими объектами. Операторы языка DDL обычно включают в себя команды CREATE, ALTERи DROPдля каждого из объектов, с которым производится работа. Например, для пер-воначального создания таблицы, для изменения ее свойств (скажем, для создания или для удаления колонок) и для уничтожения таблицы соответственно применяются операторы CREATE TABLE, ALTER TABLEи DROP TABLE.


70

 

Оператор CREATE TABLE

В качестве примера применим DDL для создания в базе данных MyDB таблицы с име-нем Products (Продукты). Столбцы таблицы будут иметь имена ProductID, Product-Name и Price. Столбец ProductIDбудет первичным ключом таблицы. Типы данных int, varchar(25) и money. Только столбец Priceможет быть пустым при вставке или изме-нении строки.

 

CREATE TABLE Products

(ProductID int PRIMARY KEY NOT NULL, ProductName varchar(25) NOT NULL, Price money NULL)

 

Оператор CREATE TABLEсоздает здесь структуру таблицы Products. Таблица оста-нется пустой до тех пор, пока в нее не будут введены данные или она не будет заполнена при помощи массового копирования.

 

Оператор ALTER TABLE

Оператор ALTER TABLEприменяется для изменения определения или атрибутов таб-лицы. В следующем примере оператор ALTER TABLEприменяется для добавления в сущест-вующую таблицу Products колонки ProductDescription (описание продукта, тип – text, пустые значения допускаются):

 

ALTER TABLE Products

ADD ProductDescription text NULL

 

Оператор DROP TABLE

Оператор DROP TABLEприменяется для уничтожения определений таблиц и всех дан-ных, индексов, триггеров, ограничений и специальных разрешений, относящихся к удаляе-мым таблицам. Для уничтожения нашей таблицы Customer_Data применяется команда:

DROP TABLE Products

 

3.4. Язык DML

 

Язык DML (data manipulation language, язык манипулирования данными) применяется для манипулирования данными, содержащимися в объектах базы данных, для чего применя-ются такие операторы, как INSERT, UPDATEи DELETE. При помощи этих операторов можно соответственно вставлять новые строки, изменять имеющиеся строки и удалять ненужные строки. Ниже даны простые примеры применения этих операторов.

 

Оператор INSERT

Оператор INSERT применяется для вставки строки данных в таблицу или в представле-ние. Например, если вы хотите добавить новый продукт в таблицу Products, то оператор INSERTможет выглядеть так:

 

INSERT Products

(ProductID, ProductName, Price, ProductDescription) VALUES (1, 'Clamp', 12.48, 'Workbench clamp')

 

Обратите внимание, что во второй строке оператора SQL помещен список имен коло-нок. Этот список определяет, в какие именно колонки будут помещены данные (данные вво-дятся в той последовательности, как они указаны). Так, первое значение данных будет по-мещено в первую колонку из списка, ProductID; второе значение будет помещено во вто-рую колонку из списка и т.д.

 

Оператор UPDATE

Оператор UPDATEприменяется для обновления (т.е. изменения) значений в одной или нескольких строках таблицы. Например, допустим, требуется изменить название продукта с идентификатором 50 на значение Flat Head Screwdriver.


71

 

UPDATE dbo.Products

SET ProductName = 'Flat Head Screwdriver' WHERE ProductID = 50

 

 

Оператор DELETE

Оператор DELETEприменяется для удаления из таблицы одной или нескольких строк с данными. Можно удалить даже все строки таблицы. Чтобы удалить все строки из нашей таб-лицы-примера Customer_Data, можно воспользоваться оператором:

 

DELETE FROM Customer_Data

 

Для удаления из таблицы Customer_Data строк, у которых значение колонки customer_id меньше, чем 100, применяется такой оператор:

 

DELETE FROM Customer_Data WHERE customer_id < 100

 

3.5. Язык DQL

 

Язык запросов (Data Query Language) в SQL состоит из операторов SELECT и UNION. Синтаксис оператора SELECT имеет следующий вид1:

 

SELECT[ALL|DISTINCT]

[TOP выражение [PERCENT] <Список полей>|*

FROM <Список таблиц>

[WHERE <Предикат-условие выборки или соединения>] [GROUP BY <Список полей результата>]

[HAVING <Предикат-условие для группы>]

[ORDER BY <Список полей, по которым упорядочить вывод>]

 

Здесь ключевое слово ALL означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса, а ключевое слово DISTINCT - что в резуль-тирующий набор включаются только различные строки, то есть дубликаты строк результата не включаются в набор. Дело в том, что, хотя в любой таблице не может быть повторяющих-ся строк, такие строки появляются в результатах запросов, когда в запросе возвращаются значения не из всех полей таблицы, а только из некоторых из них.

 

Символ *. (звездочка) означает, что в результирующий набор включаются все столбцы из исходных таблиц запроса.

В разделе FROM задается перечень исходных отношений (таблиц) запроса.

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

В разделе GROUP BY задается список полей группировки.

В разделе HAVING задаются предикаты-условия, накладываемые на каждую группу.

В части ORDER BY задается список полей упорядочения результата, то есть список по-лей, который определяет порядок сортировки в результирующем отношении. Например, если первым полем списка будет указана Фамилия, а вторым Номер группы, то в результирую-щем отношении сначала будут собраны в алфавитном порядке студенты, и если найдутся од-нофамильцы, то они будут расположены в порядке возрастания номеров групп.

Начнем изучать различные опции оператора SELECTи рассмотрим иллюстрирующие их примеры, используя базу pubs, знакомству с которой посвящена 2-я лабораторная работа.

Синтаксически оператор SELECT состоит из нескольких предложений (clauses), большинство из которых не являются обязательными. Оператор SELECTдолжен обязательно иметь предложения SELECTи FROM. Эти два предложения задают соответственно колонку (или колонки) и таблицу (или таблицы), из которых будут извлекаться данные. Например,

 

 

1 Синтаксические обозначения Transact-SQL приведены в приложении 2


72

 

простой оператор SELECT, извлекающий имена и фамилии авторов из таблицы authors базы данных pubs, может выглядеть вот так:

 

SELECT au_fname, au_lname FROM      authors

 

Надо отметить, что ключевые слова не зависят от регистра букв (т.е. от того, какими буквами они набраны – строчными или прописными), поэтому для улучшения читаемости кода рекомендуется выделять их регистром букв в соответствии с какой-нибудь системой. В этом пособии ключевые слова выделены прописными буквами.

 

Аргументы DISTINCT и TOP в предложение SELECT

 

Предложение SELECTсодержит обязательный список выборки (select list) и, возможно, несколько необязательных аргументов. Необязательные аргументы DISTINCTи TOPприме-няются для управления выдаваемыми строками в предложении SELECT.

 

DISTINCT. При использовании этого аргумента оператор SELECT возвращает только неодинаковые (уникальные) строки выборки. Если список выборки содержит несколько ко-лонок, то строки считаются неодинаковыми, если они различаются значениями хотя бы в од-ной из колонок. Пусть, например, мы хотим узнать, какие магазины продавали книги в 1994 году. Следующий запрос к таблице sales (продажи) выдаст идентификаторы этих магазинов:

 

SELECT stor_id from sales

WHERE ord_date BETWEEN '1994-01-01' AND '1994-12-31'

 

Результат: stor_id --------6380 6380 7066 7067 7131 7131 8042 8042

 

При использовании аргумента DISTINCT

 

SELECT DISTINCT stor_id from sales

WHERE ord_date BETWEEN '1994-01-01' AND '1994-12-31'

 

результат не будет содержать повторяющихся строк: stor_id

--------6380 7066 7067 7131 8042

 

TOP n [PERCENT]. При использовании этого аргумента оператор SELECTвозвращает только первые n строк из набора результатов. Если задано ключевое слово PERCENT, то бу-дут возвращаться первые строки, составляющие n процентов от общего количества строк. При использовании ключевого слова PERCENT, число nдолжно быть в пределах от 0 до 100. Если в запросе имеется предложение ORDER BY,то строки вывода сначала сортируются, а затем из отсортированного набора результатов выдаются первые nстрок или n процентов от общего количества строк (предложении ORDER BYрассмотрено ниже)

Приведем примеры запуска оператора SELECTс аргументом TOP. В первом из них при запуске используется аргумент TOP 50 PERCENT, во втором – аргумент TOP 5:


73

 

 

SELECT TOP 50 PERCENT au_fname, au_lname FROM      authors

 

SELECT TOP 5 au_fname, au_lname FROM      authors

 

Первый запрос вернет 12 строк (приблизительно 50%, с округлением до большего чис-ла), а третий запрос вернет 5 строк.

 

Список выборки – это заданный в предложении SELECTсписок выражений или коло-нок, указывающий, какие данные должны выдаваться. Выражение может быть списком из имен колонок, из функций, и из констант. Список выборки может содержать несколько вы-ражений и имен колонок, разделенных запятыми. В предыдущих примерах список выборки был таким:

au_fname, au_lname

 

Метасимвол "*". В списках выборки можно применять звездочку (символ "*"), яв-ляющуюся метасимволом (подстановочным символом), обозначающим все колонки из всех таблиц и представлений, указанных в предложении FROMзапроса. Например, чтобы вернуть все колонки всех строк таблицы salesиз базы данных pubs, воспользуйтесь таким запро-сом:

 

SELECT * FROM sales

 

Алиасы колонок

В списках выборки можно применять алиасы колонок, благодаря чему можно поменять заголовок, выдаваемый в наборе результатов. Алиасы могут оказаться полезными в случаях, когда надо пояснить смысл колонки или чтобы дать заголовок колонке, используемой в функции, а также в качестве ссылки для предложения ORDER BY.

Когда в разных таблицах имеются колонки с одинаковыми именами, вы можете захо-теть, чтобы в выводе в заголовках выдавались не только имена колонок, но и имена таблиц; это улучшит понимание выводимой информации. Рассмотрим примеры с колонкой lname таблицы employee базы данных pubs. Можно дать такой запрос:

 

SELECT lname FROM employee

Этот запрос выдаст такие результаты: lname

-----Cruz Roulet Devon ….

(всего 43 строки)

 

Если вы хотите, чтобы в наборе результатов вместо имеющегося заголовка "lname" вы-водился бы заголовок "Фамилия сотрудника", то надо применить ключевое слово AS:

 

SELECT lname AS 'Фамилия сотрудника' FROM employee

 

Эта команда выдаст такой вывод: Фамилия сотрудника

------------------Cruz

Roulet Devon …

(всего 43 строки)


74

 

Алиасы колонок можно применять в сочетании с другими типами выражений в списке выборки, а также их можно применять в предложениях ORDER BYдля ссылок на колонки. Предположим, что в списке выборки имеется вызов функции. Выводу этой функции можно назначить алиас (т.е. имя), воспользовавшись ключевым словом AS после вызова функции. Если при вызове функции не пользоваться алиасом, то колонка ее вывода не будет вообще иметь никакого заголовка. Ниже дан пример оператора, назначающего заголовок "Maximum Job ID" выводу функции MAX:

 

SELECT MAX(job_id) AS 'Maximum Job ID' FROM      employee

 

Алиас колонки заключен в кавычки, потому что он состоит из нескольких слов, разде-ленных пробелами. Если алиас не содержит пробелов (как в следующем примере), то его не нужно заключать в кавычки.

Алиас колонки, заданный в предложении SELECT, может применяться в качестве аргу-мента предложения ORDER BY, он позволяет предложению ORDER BYссылаться на колонку из предложения SELECT. Это полезно, когда в списке выборки содержится функция, вывод ко-торой должен быть отсортирован. Ниже приведен пример команды, выдающей количество проданных книг в каждом из магазинов, причем вывод отсортирован по этому количеству. В предложении ORDER BY применяется алиас Quantity_of_Books, заданный в списке выборки:

 


SELECT FROM GROUP BY ORDER BY


SUM(qty) AS Quantity_of_Books, stor_id sales

stor_id Quantity_of_Books


 

В этом примере алиас не заключен в кавычки, потому что он не содержит пробелов. Если бы в этом запросе мы не задали бы алиас для колонки SUM(qty), то мы могли бы

поместить в предложение ORDER BYне алиас, а SUM(qty). Вывод был бы таким же, за исклю-чением того, что колонка сумм проданных книг выводилась бы без заголовка.

 

Предложение FROM

Предложение FROM содержит имена таблиц, из которых извлекаются данные. Каждый оператор SELECT обязательно должен иметь предложение FROM, за исключением случаев, когда список выборки не содержит имен колонок (а содержит лишь константы, переменные и арифметические выражения). В приведенных выше запросах уже содержатся простые при-меры предложений FROM, но предложения FROMмогут содержать также и производные таб-лицы, соединения и алиасы таблиц.

Производнаятаблица (derived table) – набор результатов оператора SELECT, вложен-ный в предложение FROM. Набор результатов вложенного оператора SELECTиспользуется как таблица, из которой извлекает данные внешний оператор SELECT. Ниже дан пример за-проса, использующего производную таблицу для того, чтобы найти имена всех магазинов (stores), предоставляющих хотя бы один вид скидок (discounts):

 

SELECT s.stor_name FROM stores AS s,

(SELECT stor_id, COUNT(DISTINCT discounttype) AS d_count FROM discounts

GROUP BY stor_id) AS d

WHERE s.stor_id = d.stor_id AND d_count >= 1

 

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

Заметьте, что в этом запросе применяются сокращения для имен таблиц (s для таблицы stores (магазины) и d для таблицы discounts (скидки)). Эти сокращения называются алиасы таблиц.

Соединениетаблиц (joined table) – это набор результатов от операции соединения (join operation), выполненной над двумя или несколькими таблицами. Над таблицами можно вы-


75

 

полнять различные типы соединений: внутренние соединения, полные внешние соединения, левые внешние соединения, правые внешние соединения, перекрестные соединения. Рас-смотрим здесь первые два типа соединений.

Внутренние соединения. Внутреннее соединение(inner join) является типом соедине-ний, принятым по умолчанию. Внутреннее соединение задает набор результатов, в который будут включены лишь те строки таблиц, которые соответствуют условию ON, а все несоот-ветствующие строки будут отброшены. Чтобы задать соединение, применяйте ключевое сло-во JOIN. Для задания условия поиска, на котором основывается соединение, применяется ключевое слово ON. Ниже приведен пример запроса, в котором соединяются таблицы stores и discounts; этот запрос показывает, в каких магазинах предоставляются скидки и типы этих скидок. (Это соединение – внутреннее, потому что по умолчанию применяется внутреннее соединение; поэтому будут возвращены лишь строки, соответствующие условию поиска ON.)

 

SELECT s.stor_id, d.discounttype FROM      stores s JOIN discounts d ON s.stor_id = d.stor_id

 

Результат будет выглядеть так:

 

stor_id discounttype

------------------------------8042      Customer Discount

 

Согласно имеющимся в базе данным скидки предоставляет лишь один магазин, причем скидки лишь одного типа. Выданная строка является единственной строкой с совпадающими значениями stor_id из таблицы stores и stor_id из таблицы discounts. Возвращаются это значе-ние stor_id и соответствующее ему значение discounttype.

 

Отметим, что такой же результат можно получить с помощью запроса

 

SELECT s.stor_id, d.discounttype FROM stores s, discounts d WHERE s.stor_id = d.stor_id

 

Полные внешние соединения. Полное внешнее соединение (full outer join) задает набор результатов, состоящий как из строк, соответствующих условию ON, так и из строк, не соот-ветствующих условию ON. Для строк, не соответствующих условию ON, значением колонки, несоответствующей условию, станет NULL. В нашем примере NULLбудет означать, что либо магазин не предоставляет никаких скидок (если некоторое значение stor_id имеется в табли-це stores, но отсутствует в таблице discounts), либо этот тип скидки не предоставляется ника-ким магазином. Запрос в следующем примере отличается от запроса с внутренним соедине-нием только тем, что вместо ключевого слова JOIN используются ключевые словам FULL OUTER JOIN:

 

SELECT s.stor_id, d.discounttype

FROM  stores s FULL OUTER JOIN discounts d ON      s.stor_id = d.stor_id

 

Результат в этом случае будет выглядеть так: stor_id discounttype

--------------------------NULL Initial Customer NULL Volume Discount 6380  NULL

7066  NULL 7067      NULL 7131      NULL 7896      NULL

8042  Customer Discount

Условию поиска будет соответствовать лишь одна строка в наборе результатов (по-следняя). Остальные строки имеют NULLв одной из колонок.


76

 


Дата добавления: 2018-04-15; просмотров: 739; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!