Реферат: Язык SQL

<m:mathPr> <m:mathFont m:val=«Cambria Math»/> <m:brkBin m:val=«before»/> <m:brkBinSub m:val="--"/> <m:smallFrac m:val=«off»/> <m:dispDef/> <m:lMargin m:val=«0»/> <m:rMargin m:val=«0»/> <m:defJc m:val=«centerGroup»/> <m:wrapIndent m:val=«1440»/> <m:intLim m:val=«subSup»/> <m:naryLim m:val=«undOvr»/> </m:mathPr>

федеральное агентство по образованию

государственноеобразовательное учреждение высшего профессионального образования

Российский государственный гуманитарныйуниверситет

институт ИНФОРМАЦИОННЫХ  НАУКИ ТЕХНОЛОГИЙ БЕЗОПАСНОСТИ

Факультет информатики

Специальность: прикладная информатика

Математическая логикаЯзык SQL

                           Выполнил

Романов А.Н.                                                         

                                                                               

Москва 2007

Содержание

Язык запросов SQL                                                                                                                       3         

Основные инструменты                                                                                                               9

Оператор SELECT                                                                                                                         11

Использование имён и вложенныхзапросов                                                                             12

Объединения и внешние соединения                                                                                         13

Математические функции и средстваработы с датами                                                            15       

Группы и агрегатные функции                                                                                                   17

Оператор CASE                                                                                                                             18

Создание таблиц и манипуляции сданными                                                                            20

Язык запросов SQL

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

Одним из решений упомянутых проблем стали иерархические БД. В таких базах элементы строго упорядочены, причем так, что данные одного уровня подчиняются (являетсяподмножеством) данным друго­го,вышестоящего уровня. В такой модели связи могут быть отражены в виде дерева, причем допускаются только односторон­ние — от старших уровней к младшим. Подобная структура все еще напоминает древовидную файловую систему, где ди­ректорииявляются верхними уровнями, а файлы —нижними. Несмотря на то что по сравнениюс индексными файлами это был существенный шаг вперед, иерархические БДнаследовали многочисленные недостаткипредыдущих систем, заключав­шиеся всложности алгоритмов доступа к даннымнижних уровней и повышенных аппаратныхтребованиях.

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

Прогресс в области сетевых технологий поспособствовал возникновению проблеморганизации доступа к данным, располо­женным на серверах, с удаленных компью­теров— участников сети. Для оптимизации этого процесса и снижения сетевого трафи­каМеждународной организацией по стан­дартизации(ISO) был разработан и внедрен структурированныйязык запросов SQL.

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

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

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

быть одинакового типа. Вкаждой таблице, как правило, имеются специальныеполя, кото­рые позволяют однозначно идентифицировать ту или иную запись — они называются пер­вичнымиключами или первичными индекса­ми. Такиеполя помогают отличать одну запись отдругой, даже если все остальные поля не­скольких таких записей абсолютно идентичны. Например, представьте, что вы разрабатываете справочник сотрудников своей организации, и при этом каждая запись хранит данные об од­ном сотруднике, а их выборка осуществляется по полю «Фамилия». Может оказаться так, что в организации работает несколько человек с одинаковой фамилией. Чтобы отличить эти за­писи друг от друга, применяются первичные индексные поля. Чаще всего за тип данных первичного ключа берется целочисленное зна­чение счетчика — в таком случае при добав­ленииновой записи в таблицу значения этого полязаполняются автоматически. Однако не запрещается использовать в качестве первич­ногоключа поле, имеющее, к примеру, сим­вольный тип данных, хотя подобные ситуации возникают крайне редко.

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

По признаку метода доступа БД делятсяна локальные, сетевые ираспределенные.

К локальным базам доступ возможентолько с того компьютера, на котором они расположены. Сетевые базы призваны обеспечитьработу с данными с других компьюте­ровпосредством локальной сети или Интернета. Распределенные БД — это, по сути,подвид сетевых баз с той лишь разни­цей, что различные части информации на­ходятсяна множестве разных компьютеров.

Насегодняшний день основным видом являетсявторой тип БД — сетевые базы. Именно ониприменяются в Интернете для организации доступа пользователей к ин­формации сайтов, форумов, гостевых книг и каталогов товаров.

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

сервер­ная частьобрабатывает их и отправляет обратно только те данные, которые были нужны пользователю. Информация об из­менении этих данных возвращается на сер-

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

Целью любойСУБД являться предоставление пользователю простых механизмов доступа и манипулирования данными.Существует много различных методов ее достижения, одним из которых являетсяязык SQL. Расши­фрованнаяи переведенная на русский язык эта аббревиатура будет выглядеть как Струк­турированный Язык Запросов.

Стандарт языка SQL. определяется Аме­риканским национальным институтомстан­дартов (ANSI) и Международной органи­зацией постандартизации (ISO). Однако некоторые производители БД вносят в язык свои изменения идополнения. Например, компания Огас1есоздала язык PL/SQL, кото­рыйявляется процедурным расширением оригинальногоSQL.

Однако истандартный SQLможет исполь­зоваться в двух различныхвариантах — интерактивном и вложенном.Первый пред­ставляется собойотдельный программный модуль на SQL,который сам выполняет за­просы и отображаетрезультаты работы. Второй — этовнедрение элементов SQLв другойязык высокого уровня, например С или Delphi. В этом случае основная про­грамма самостоятельно формируетзапросы для сервера SQL, а потом использует ре­зультатывыборок из базы, не предъявляя их пользователю в чистом виде.

В целом же SQL— это язык, ориентиро­ванный на работу с реляционными базами    данных. Егоиспользование позволяет на по­рядок сократить объем работ, который пона­добился бы в случае созданияприложений, использующих БД на универсальном языке программирования, например на том жеС.

Действительно,чтобы сформировать ре­ляционнуюбазу данных на С, нужно было бы описать как минимум один объект (дву­мерный массив), называемый в SQL.табли­цей, который должен иметь возможность менятьразмер для вмещения любого необ­ходимогочисла строк. Затем пришлось бы создавать процедуры для помещения зна­чений в такую таблицу, а также поиска и извлечения этих значений. Это непросто даже напервый взгляд. Так, если бы вы захотели найти все строки в таблице «TAB», в которых значения некоего поля «num» равно 5, то необходимо было бывыполнить по шагам весьмасложную про­цедуру.

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

SELECT *

FROM tab

WHERE num = 5

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

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

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

Сразупредупредим, что SQLServer2000 возможно установить только на сервер­ные версии операционной системы Windows— 2000 Serverи 2003 Server. Попытки инсталляции ее на пользовательские версии ОС, такие как WindowsХР Professional, если только речь не идет о клиентскойчасти, не увенчаются успехом. Если же вы непременно хотите пользо­ваться языком запросов, работая под пользовательской ОС, существует MSDE— это урезанная версия SQLServer, которая входит в дистрибутив МSOffice2003.

После запуска инсталлятора скомпакт-диска в двух первых окнах мастера уста­новки необходимо последовательновы­брать пункты «Components» и «InstallDatabaseServer». Результатом этих дейст­вий станет появление окна спредложением указать расположение будущегосервера. Здесь возможны следующие варианты: «LocalComputer» — локальный компьютер, «Remotecomputer» — удаленный компью­тер в вашейсети, «VirtualServer» — вирту­альный серверсети. Этот выбор зависит только от конкретнойзадачи, которую вы решаете в данныймомент.

Если вывыбрали компьютер, где до этого уже существовала некая версия SQLServer, тов следующем окне будет доступен пункт «Upgrade, removeoraddcomponentstoanexistinginstanceofSQLServer» — добавле­ние, изменение и удалениесуществующих компонентовсервера. Иначе здесь можно будетвыбрать лишь «CreateanewinstanceofSQLServerorinstallClientTolls» — со­здать новый экземпляр SQL-сервера или ус­тановить клиентскую часть. Кстати, этопо-

следнее «или» способствует появлениюеще одного ветвления в дереве вариантов установки. Следующее окно «InstallationDefinition» предоставляет на выбор пункты: «ClientToolsOnly» — поставить клиентскую часть, которая используется дляорганиза­ции доступа к серверу с клиентскихмашин; «ServerandClientTools» — серверную и клиентскую части, атакже «Connectivityonly» — только драйверы для присоедине­ния к базе. Последний тип установки при­меняется исключительно на клиентскихма­шинах, которые должны работать с базами данных, то есть утилиты для работы ссер­вером, подобные EnterpriseManadger, ин­сталлироваться не будут. Поскольку мы устанавливаем именно сервер — здесь следует выбрать второй вариант.

Ввод имени («InstanceName») в следу­ющем окне недолжен вызвать затрудне­ний. Поумолчанию оно будет идентично NETBIOS-имени вашей машины. Если тре­буется его изменить, придется снять га­лочку в пункте «Default», после чего мож­но будет ввести другое название.

Из предложенныхдалее вариантов уста­новки «Typical», «Minimum» и «Custom» полезно использовать именно последний вариант. При этомвыбирать что-то из спискапредложенных компонентов не придется — пунктов, отмеченных здесь по умолчанию, более чем достаточно дляначала работы сервера.

ОднакопараметрамзапускасервисовSQL Server вследующемокнестоитуделитьбо­леепристальноевнимание: «Auto start SQL Service» — всесервисыстартуютавтомати­чески; «Customizethe setting for each Service» — каждомусервисуназначитьсвоипараметрызапуска. Если вы выберете второй вариант, то в левой части окна на панели «Services» станут доступны элемен­ты «SQLServer» и «SQLServerAgent». При выборе любого из них вправой части окна на панели «ServiceSetting» можно будет настроить параметры запуска, выбраводин из трех стандартных вариантов: отключено, автоили вручную.

На этомнастройки самого сервера факти­чески завершены, осталось только указать параметры учетных записей,авторизации и режималицензирования. Итак, «UsetheLocalSystemaccount» — использовать учетную запись локальной системы, «UseaDomainUseraccount» — использовать доменную учетную запись. Выбор целиком зависит от вашихпредпочтений.

Дляуказания метода авторизации (AuthenticationMode) необходимо вы­брать: «WindowsAuthenticationMode» — использоватьавторизацию WindowsNT или«MixedMode (Windows Authentication and SQL Server Authentication)» — использо­ватьсмешаннуюавторизациюWindowsNTи SQL-сервера). При использовании второ­го метода не забудьте указать парольучетной записиадминистратора «sа»,которая создается по умолчанию.

И, наконец, последнее окно мастера «ChooseLicensingMode» посвящено выбору режима лицензирования, который зависитот условий, на которых вы приобрели дан­ную версию SQL Server2000.

Основныеинструменты

Наиболее часто используемой утилитой для работы с SQLServerявляется EnterpriseManager. Этот инструмент создавался с це­лью облегчения выполнения наиболее сложных административных задач, сочетая простоту работы с высокой функциональ­ностью. Среди них такие какуправление системой безопасности, создание баз дан­ных и ее объектов, создание и восстановле­ние резервных копий, запуск и установка служб, атакже конфигурирование связан­ных иудаленных серверов.

Например, создание новой базыданных с помощью EnterpriseManagerсводится к нескольким кликам мыши и вводу имени БД. В левой части экрана утилиты необхо­димо выбрать тот SQLServer, на котором она будет размещена, и нажать правой кнопкой мыши на папке Database, после че­го в контекстном меню выбрать пункт «NewDatabase». В появившемся окне «DatabaseProperties» в поле «Name» необходимо впи­сатьназвание базы и нажать кнопку «ОК». Описаниеэтого процесса заняло больше времени,чем он длился бы на деле.

Созданиетаблиц происходит совершен­ноаналогично: клик сначала правой кнопкой мыши на значке «Table», затем левой — на пункте «NewTable» в контек­стном меню. Выше был приведен пример алгоритма выборки из базы данных для классического языка высокого уровня. Просто представьте, сколько времени и сил заняло бы описание на нем такойструктуры как БД с несколькими взаимо­связанными таблицами.

Как бы хорошо не была настроена база данных, всегда существует вероятность потери информации по независящим от администратора причинам. Для сведения подобных потерь к разумному минимуму EnterpriseManagerсодержит инструмент резервного копирования БД.

Чтобы выполнить резервное копирова­ниебазы вручную, нужно щелкнуть правой кнопкой мыши по названию базы и выбрать «Все задачи • > BackupDatabase». Далее в появившемся окне надо нажать кнопку «Аdd'», после чего выбрать каталог для со­хранения и в поле «Filename» ввести имя файла, в котором будет содержаться база. Имя этого файла с названием базы может быть никак не связано. После подтвержде­ния намерения остается только дожидаться конца процесса копирования.

Для того чтобы восстановитьданные из ранее сохраненного файла,необходимо иметь на SQLServerбазу данных с названи­ем,идентичным имени родительской базы. Другими словами, если вы сохранялиБД как Data_Base, то для восстановления дан­ных необходимо создать на серверебазу с таким же названием (не путать с именем файла резервной копии).

Для восстановления информации изфайла нужно нажатьправой кнопкой мыши на базу, предназначенную для приема данных и вы­брать «Все задачи – RestoreDatabase». Да­лее в

последовательно сменяющих друг дру­га окнах нужно выбрать пункты «FromDevise», «SelectDevise» и «Аdd» и указать ката­лог, в котором расположен резервныйфайл.

 Вторая по важности и частоте использо­вания утилита после EnterpriseManagerэто QueryAnalyzer. Она предназначена для выполнения, отладки и анализа запросов.Окно «QueryAnalizer» разделенона три части. Слева находится браузер объектов (ObjectBrowser), с помо­щью которого можно посмотреть списоквсех объектов, расположенных в любой базе дан­ных сервера, а также переченьвсех функций и типов данных. Правая часть разделена на верхнюю и нижнюю, при этом верхняяполо­вина является полемдля ввода запросов, а нижняяиспользуется для вывода результатов их работы и отладочной информации.

При отладкехранимых процедур весьма удобнавозможность трассировки их вы­полнения: для этого необходимо кликнуть на нужной процедуре правой кнопкой мыши и в появившимся контекстном меню выбрать пункт «Debug».

Помимовыполнения процедур и запросов в QueryAnalyzerпредусмотрена возможность оценки скорости работы. Эту функциюмож­но включить, еслиоткрыть меню «Query» и выбрать в нем, соответственно, пункты «DisplayEstimated», «ExecutionPlan» или «DisplayExecutionPlan».

Оператор SELECT

         Основной оператор языка SQL, предназначенный для выборки данных,- SELECT:

SELECT * FROM Table 1

Звёздочка означает все столбцы, а Table1 – имя таблицы, из которой мы этистолбцы хотим извлечь. Практическуюцен­ность оператору SELECTпридает ключевое слово WHERE, позволяющее выводить ис­ключительно те строки таблицы,которые соответствуютусловию. Предположим, у насесть таблица с информацией о персона­ле (Employees), где указаны имя работника (Name) и его заработная плата (Salary). Если нам нужно увидеть данные обо всех работ­никах, получающих заработную платуболее 30 000 рублей, мыформулируем запрос:

SELECT Name FROM Employees WHERE Salary > 30000

На практикесуществует необходимость за­прашивать информацию одновременно из нескольких таблиц. Предположим, что у нас есть таблица Agentsс информацией о торговых агентах: идентификационныйномер (Agent_id), имя (Name) и дата рож­дения (Birth_Date). Есть еще одна табли­ца — Contacts, где содержатся данные о контрактах, заключенных агентами: идентификационный номер клиента (Client_id),номер агента (Agent_id),да­та заключения контракта (CDate) и сум­ма сделки (Gross_Income).

Предположим, необходимо премировать агентов, заключавших с начала года кон­тракты на сумму более 500 000 рублей. Запрос к базе данных будет выглядеть так:

SELECT Name, Bitth_Date FROM Agents, Contacts WHEREAgents.Agent_id = Contracts.Agent_id AND Contracts.CDate >`31.12.2004` ANDCONTRACTS.Gross_Income > 500000

Условия WHEREсвязывает друг с другом две таблицы через номер агента,отбрасы­вает старые достижения и выбирает значи­тельные контракты. Логический оператор ANDпозволяет задавать несколько условий.Запись <Названиетаблицы>.<Название столбца> применяется для того, чтобы раз­личать столбцы с одним и тем женазвани­ем из разныхтаблиц.

Поскольку один агент может заключитьне­сколько больших контрактов, его данные могут быть несколько раз продублированы. Чтобы избежатьэтого, необходимо исполь­зоватьключевое слово DISTINCT:

SELECTDISTINCT Name, Birth_Day From …

Использованиеимен и вложенных запросов

В SQL-конструкциях назначение новых имен применяется, чтобы сохранить длядальнейших операцийрезультаты, возвра­щаемые запросами ивстроенными функ­циями, и сделать текстзапроса более ком­пактным за счетсокращений. Для демонстрации эффектов переназна­чения имен, возьмем, кпримеру, таблицу Roomsс информацией о жилых комнатах вмногоквартирном доме со следующими столбцами: идентификатор комнаты (Room_id), тип (Room_type), длина (Length) и ширина (Width). Предположим, мы хотим получить информацию о жилой площади всех спален игостиных в доме. Дляэтогоформулируемзапрос:

SELECTRoom_Type, Length * <st1:place w:st=«on»><st1:City w:st=«on»>Width</st1:City> <st1:State w:st=«on»>AS</st1:State></st1:place>

Living_Space

FROM Rooms

WHERERoom_Type = `ГостинаяOR Room_Type =`Спальня`

В результирующей таблице не будетдан­ных о длине и ширине, зато появитсястолбец с информацией о площади, ко­тораябыла вычислена непосредственно приисполнении запроса

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

SELECT DISTINCT Name, Birth_Date

FROM Agents AS A1, Contracts AS C1

WHERE A1.Agent_id = C1.Agent_id AND C1.CDate

>`31.12.2004` AND C1.Gross_Income > 500000

Дав с помощью ключевого слова АSтабли­цам Agentsи Contactsсокращенные име­на, мы сделали текст болеекомпактным. Запрос можно сделать многоступенчатым, тогда результат вложенного запроса ста­нетисходными данными. Тотже самый пример с агентами можно выполнить ввиде вложенного запроса:

SELECT Name, Birth_Day

FROM Agents

WHERE Agent_id IN(SELECT Agent_id

                        FROM Contracts

                        WHERE CDate >`31.12.2004` AND

Gross_Income >500000

В данном случае предикат INпоследова­тельно проверяет, имеется ли среди ре­зультатоввложенного запроса по базе кон­трактов идентификатор каждого из аген­тов. Если он есть, то в результирующую таблицу головногозапроса добавляются его данные (для противоположного резуль­тата можно использовать предикат NOTIN). В большинстве случаев предпочти­тельнее вместо вложенных запросов при­менять соединение таблиц по общим столбцам (...WHERE Agents.Ag_Num= Contracts.Ag_Num...), однако иногда быва­ет, что все-таки без вложений необойтись.

Объединенияи внешние соединения

Выше мы вос­пользовались оператором ORдля выборки данных о спальнях и гостиных. Можнопой­ти другим путем ииспользовать оператор UNIONдля объединения двух запросов:

(SELECT Room_Type, Length1 * Width1 AS

Living_Space FROM Rooms WHERE Room_Type =

`Гостиная`)   <st1:place w:st=«on»>UNION</st1:place>(SELECT Room_Type, Length1 *

Width1 AS Living_Space FROM Rooms WHERE

Room_Type = `Спальня`)

Оператор UNIONстроит на основе двух таблиц третью, куда попадают строки,ко­торые есть либо в первой исходной, либо во второй, либо в обеих вместе; строки-дубликаты при этом удаляются. Иногда для подобных целей удобнеепользоваться оператором OR, однако если условия объе­диняемых подзапросов сложные, UNIONдля их составления подходит больше. Суть такого инструмента как внешнеесо­единение можно пояснить на следующем примере. Допустим, нам необходимо сде­латьвыборку по контрактам, заключенным агентами в июне 2005 года. Мы можем вос­пользоваться для этого такимзапросом:

SELECT Name, CDate, Gross_Income

FROM Agents AS A1, Contracts AS C1

WHERE A1.Agent_id = C1.Agent_id ANDC1.CDate

BETWEEN `01.06.2005`AND`30.06.2005`

Он, разумеется, выдаст правильныерезуль­таты, однаконаличие имени агента после обработки запроса зависит от того, заклю­чил ли он сделку в этот период. Еслинеоб­ходимо, чтобы в результирующей таблице всегда присутствовали все агенты,необхо­димо использовать так называемое левое внешнее соединение (LEFTOUTERJOIN). Его смысл состоит в том, что все строки таб­лицы, указанной слева от оператора LEFTOUTERJOIN, попадают в таблицу-результат, а из таблицы справа берутся толькодан­ные, которыесоответствуют условию:

SELECT Name, CDate, Gross_Income

FROM Agents LEFT OUTER JOINContracts ON

Agents.Agent_id = Contracts.Agent_id

AND Contracts.CDate BETWEEN`01.06.2005` AND

`30.06.2005`

Каждый агент из таблицы Agentsзаписан­ной слева от LEFTOUTERJOIN, попадет в результат запроса, даже если емунельзя будет подобратьсоответствующих строк из правойтаблицы (поскольку не все агенты заключали контракты в июне 2005 года). Необходимо обратить внимание, что вместо ключевого слова WHEREздесь используется слово ON. Если использовать слово WHERE, результат будет тот же самый, что и с обыч­ным запросом. Следует также помнить,что синтаксис левого внешнего соединения мо­жет сильно различаться в разных системах.

Математическиефункции и средства работы с датами

Поскольку SQLориентирован на выборку данных, а нена управление вычисления­ми, егоматематический инструментарий довольноограничен. Впрочем, перечень доступныхфункций в продуктах различ­ных разработчиков может варьироваться. Как правило, в большинстве реализаций присутствуют следующие функции: POWER(возведение в степень), SQRT(квад­ратный корень), АВS(модуль), LNи LOG10 (натуральныйи десятичный логарифмы), ЕХР(экспоненциальная функция). Функ­ция ROUND(х, р) округляет число х до р десятичных знаков, TRUNCATE(х, р) — усекает. Функции FLOOR(х) и CEILING(х) возвращают ближайшие к нецелому х це­лые

еще рефераты
Еще работы по программированию, базе данных