Чем является SQL и чем он не является
Чем является SQL и чем он не является
Первое, что надо уяснить насчет SQL , — этот язык не является процедурным, как FORTRAN , Basic , С, COBOL , Pascal и Java . Чтобы решить задачу с помощью одного из этих процедурных языков, приходится писать процедуру, которая выполняет одну за другой указанные операции, пока выполнение задачи не будет закончено. Процедура может быть линейной последовательностью или содержать ветвление, но в любом случае программист указывает порядок выполнения.
Иными словами, SQL является непроцедурным языком. Чтобы с его помощью решить задачу, сообщите SQL , что именно вам нужно, как если бы вы говорили с джином из лампы Аладдина. И при этом не надо говорить, каким образом получить для вас то, что вы хотите. Система управления базами данных (СУБД) сама решит, как лучше всего выполнить ваш запрос.
Хорошо. Только что я сказал, что SQL не является процедурным языком. В сущности, это правда. Однако миллионы программистов вокруг (и вы, возможно, один из них) привыкли решать задачи процедурным путем, поэтому в последние годы оказывалось немалое давление, чтобы дополнить SQL некоторыми процедурными возможностями. Поэтому теперь в составе новой версии спецификации SQL , SQL:2003, имеются такие средства процедурного языка, как блоки BEGIN , условные операторы IF , функции и процедуры. Благодаря этим новым средствам, можно хранить программы на сервере с тем, чтобы их могли повторно использовать многие пользователи.
Для иллюстрации того, что я имел в виду, когда говорил "сообщите системе, что именно вам нужно", предположим, что у вас имеется таблица EMPLOYEE с данными о служащих и вы хотите выбрать из нее все строки, соответствующие всем "старшим" работникам. Под "старшими" работниками можно подразумевать каждого, кто старше 40 лет или кто получает более 60000 долларов в год. Нужную вам выборку можно сделать с помощью следующего запроса:
SELECT * FROM EMPLOYEE WHERE AGE >40 OR SALARY >60000 ;
Этот оператор выбирает из таблицы EMPLOYEE все строки, в которых или значение столбца AGE (возраст) больше 40 или значение в столбце SALARY (зарплата) больше 60000. SQL сам знает, каким образом надо выбирать информацию. Ядро базы данных проверяет базу и принимает для себя решение, каким образом следует выполнять запрос. Все, что от вас требуется, — указать, какие данные вам нужны.
Помни: Запрос — это вопрос, который вы задаете базе данных. Если какие-либо ее данные удовлетворяют условиям вашего запроса, то SQL передает их вам.
В современных реализациях SQL отсутствуют многие простые программные конструкции, которые являются фундаментальными для большинства других языков. В приложениях для повседневной жизни, как правило, требуются хотя бы некоторые из этих конструкций, поэтому SQL на самом деле представляет собой подъязык данных. Даже имея дополнения, появившиеся в SQL вместе со стандартом SQL: 1999 и дополнительные расширения, добавленные в SQL:2003, все равно для создания законченного приложения необходимо использовать вместе с SQL один из программных языков, такой, например, как С.
Выбирать информацию из базы данных можно одним из следующих способов.
С помощью однократного непрограммируемого запроса с консоли компьютера, вводя команду SQL и читая на экране результаты ее выполнения. Консоль — это традиционный термин, означающий компьютерное оборудование, которое выполняет работу клавиатуры и экрана, применяемых в современных ПК. Запросы с консоли пригодны тогда, когда требуется быстрый ответ на конкретный запрос. Для удовлетворения какой-либо текущей потребности вам могут потребоваться такие данные из базы, которые до этого никогда не требовались. Возможно, они вам никогда больше не понадобятся, но сейчас они нужны. Введите с клавиатуры соответствующий SQL-запрос, и через некоторое время на вашем экране появится результат. С помощью программы, которая извлекает из базы данных информацию, а затем создает на основе этих данных отчет, выводимый или на экран, или на печать. Язык SQL можно использовать и так. Сложный запрос SQL , который, возможно, еще пригодится в будущем, можно поместить прямо в программу. Это позволяет многократно использовать его в дальнейшем. Таким образом, формулировка запроса выполняется один раз. Как вставлять код SQL в программы, написанные на другом языке, рассказывается в главе 15.Что делает клиент
Что делает клиент
Клиентская часть СУБД выводит информацию на экран и реагирует на пользовательский ввод, переданный с помощью клавиатуры, мыши или другого устройства ввода. Кроме того, клиент также может обрабатывать данные, приходящие через линию связи или из других станций сети. Весь "интеллект" приложения сосредоточен в клиентской части СУБД. Эта клиентская часть как раз и интересует разработчиков. Ведь в серверной части всего лишь монотонно, механически обрабатываются запросы, пришедшие от клиента.
Что делает сервер
Что делает сервер
Работа у сервера относительно простая и понятная. Все, что ему нужно делать, — это читать, интерпретировать и выполнять команды, приходящие по сети от клиентов. Эти команды Должны быть написаны на одном из имеющихся подъязыков данных. Подъязык нельзя считать полным языком — он выполняет только часть функций языка. Подъязык данных занят только обработкой данных. В нем имеются операции добавления, обновления, удаления и выборки данных, но нет таких управляющих структур, как циклы, локальные переменные, Функции или операции ввода-вывода на различные устройства. Из используемых сегодня подъязыков данных самым известным является SQL, и он уже стал промышленным стандартом. SQL вытеснил патентованные подъязыки данных на всех классах машин. С появлением стандарта SQL: 1999 язык SQL пополнился новыми возможностями, которые отсутствуют У традиционных подъязыков. Однако SQL:2003 все еще не является полноправным языком Программирования общего назначения. Поэтому, чтобы создать приложение, работающее с базой данных, его следует использовать вместе с языком-оболочкой.
Что такое клиент
Что такое клиент
Основная работа клиента состоит в том, чтобы поддерживать пользовательский интерфейс. С точки зрения пользователя клиентской машиной является компьютер, а приложением — пользовательский интерфейс. Пользователь даже может и не знать, что в процессе участвует сервер. Обычно сервер не виден — он может находиться в другой комнате. Но кроме пользовательского интерфейса в состав клиента входят еще и прикладная программа, а также клиентская часть СУБД. Прикладная программа выполняет нужную вам специальную задачу, такую как работа со счетами дебиторов или оформление заказов. Клиентская часть СУБД выполняет команды прикладной программы и обменивается с серверной частью данными и командами SQL.
Что такое сервер
Что такое сервер
Сервер (полное название — сервер базы данных) является той частью системы клиент/сервер, где находится база данных. Кроме того, на нем находится серверная часть системы управления базой данных. Команды, которые приходят от клиентов, интерпретируются в ней, а затем переводятся в операции, выполняемые в базе данных. Серверные программы преобразуют в определенный формат результаты, полученные при выполнении каждого запроса, и отправляют эти результаты клиенту, от которого пришел запрос.
Данные типа датывремени
Данные типа даты-времени
В SQL:2OO3 определяются пять различных типов данных, которые относятся к дате и времени. Они называются типами данных даты-времени или просто датой-временем. Некоторые из этих типов данных довольно сильно перекрывают друг друга, поэтому в отдельных реализациях, которые могут вам встретиться, все пять типов, возможно, и не поддерживаются.
Основы SQL
Глава 2. Основы SQL
Интервалы
Интервалы
Интервальные типы данных тесно связаны с типами данных даты-времени. Интервал — это разница между двумя значениями даты-времени. Во многих приложениях, имеющих дело со значениями даты, времени или с теми и другими, иногда требуется определить интервал между двумя датами или значениями времени. SQL поддерживает два различных типа интервалов: год-месяц и день-время. Интервал год-месяц — это количество лет и месяцев между двумя датами. А интервал день-время — это количество дней, часов, минут и секунд между двумя моментами в пределах одного месяца. Нельзя смешивать вычисления, где используется интервал год-месяц, с вычислениями, где используется интервал день-время, потому что в месяцах разное количество дней (28, 29, 30 или 31).
Использование SQL в Intenet/интернет
Использование SQL в Intenet/интернет
Работа с базами данных через Internet или интранет кардинально отличается от работы в традиционной системе клиент/сервер. Основное различие между ними находится в клиентской части. В традиционной системе клиент/сервер большинство функций СУБД выполняется на клиентской машине. А в базе данных, работающей через Internet, большая часть системы СУБД (если не вся) находится на сервере. В клиентской же части может не быть ничего, кроме Web-браузера. В большинстве случаев в ней находится браузер вместе со своим расширением, таким как включаемый модуль Netscape или элемент управления ActiveX. Таким образом, "интеллект" системы концентрируется на сервере. Такая концентрация имеет несколько преимуществ, перечисленных ниже.
Достигается дешевизна клиентской части системы (браузера). Используется стандартный пользовательский интерфейс. Клиентскую часть легко поддерживать. Используется стандартная связь клиент/сервер. Имеется общее средство вывода мультимедийных данных. Чтобы защищать информацию от несанкционированного доступа или повреждения, необходимо на Web-сервере и в клиентском браузере поддерживать надежную систему шифрования. В браузерах не выполняется в достаточной степени проверка вводимых данных на правильность. Между находящимися на разных серверах таблицами базы данных может нарушиться синхронизация.Впрочем, имеются клиентские и серверные расширения, предназначенные для решения этих проблем. Благодаря этим расширениям Internet вполне подходит для установки приложений, работающих с базами данных. Архитектура интранет похожа на ту, что применяется в Internet, но вопрос защиты в них не является предметом сильного беспокойства. Так как в организациях, где поддерживается интранет, физически контролируются все клиентские машины, а также серверы и сама сеть, соединяющая эти компоненты, то система интранет не так открыта для происков хакеров. Впрочем, и в интранет ошибки, допускаемые при вводе данных, и нарушение синхронизации в базах данных остаются предметом беспокойства. В число главных неудобств работы с базами данных через Internet входят проблемы защиты и целостности данных.
Клиент
Клиент
Клиентская часть системы клиент/сервер (клиент) состоит из двух компонентов: аппаратного и программного. Аппаратным компонентом является клиентский компьютер и его интерфейс, предназначенный для соединения с локальной сетью. Эта аппаратура может быть очень похожа на ту, что используется на сервере, или даже идентична ей. Клиент отличается от сервера прежде всего программным обеспечением.
Команды SQL
Команды SQL
Язык SQL состоит из ограниченного числа команд, специально предназначенных для управления данными. Одни из этих команд служат для определения данных, другие — для их обработки, а остальные — для администрирования данных. О командах определения и обработки данных рассказывается в главах 4-12, а о командах администрирования данных — в главах 13 и 14.
Чтобы соответствовать стандарту SQL: 2003, в состав реализации должны входить все основные возможности. Кроме того, в ее состав могут входить и расширения этого основного набора (которые также описаны спецификацией SQL:2003). Расширения пока оставим, вернемся к основам. Ниже приведена таблица основных команд SQL:2003.
Если вы из тех программистов, кому нравится проверять новые возможности, то возрадуйтесь.
Таблица 2.1. Основные команды SQL:2003
ALTER DOMAIN | CREATE CURSOR | FREE LOCATOR |
ALTER TABLE | DECLARE TABLE | GET DIAGNOSTICS |
CALL | DELETE | GRANT |
CLOSE | DISCONNECT | HOLD LOCATOR |
COMMIT | DROP ASSERTION | INSERT |
CONNECT | DROP CHARACTER SET | OPEN |
CREATE ASSERTION | DROP COLLATION | RELEASE SAVEPOINT |
CREATE CHARACTER SET | DROP DOMAIN | RETURN |
CREATE COLLATION | DROP ORDERING | REVOKE |
CREATE DOMAIN | DROP ROLE | ROLLBACK |
CREATE FUNCTION | DROP SCHEME | SAVEPOINT |
CREATE METHOD | DROP SPECIFIC FUNCTION | SELECT |
CREATE ORDERING | DROP SPECIFIC PROCEDURE | SET CONNECTION |
CREATE PROCEDURE | DROP SPECIFIC ROUTINE | SET CONSTRAINTS |
CREATE ROLE | DROP TABLE | SET ROLE |
CREATE SCHEMA | DROP TRANSFORM | SET SESSION AUTHORIZATION |
CREATE TABLE | DROP TRANSLATION | SET SESSION CHARACTERISTICS |
CREATE TRANSFORM | DROP TRIGGER | SET TIME ZONE |
CREATE TRANSLATION | DROP TYPE | SET TRANSACTION |
CREATE TRIGGER | DROP VIEW | START TRANSACTION |
CREATE TYPE | FETCH | UPDATE |
CREATE VIEW |
Конструкторы
Конструкторы
При создании структурного UDT-типа СУБД автоматически создает для него функцию-конструктор, давая ей имя, аналогичное имени UDT-типа.
Логические данные
Логические данные
Тип данных BOOLEAN (булев) имеет два определенных логических значения, true (истина) и false (ложь), а также неопределенное значение unknown (неизвестное). Если любое из первых двух значений сравнить с NULL или со значением unknown, то в результате получится unknown.
Мутаторы и наблюдатели
Мутаторы и наблюдатели
При создании структурированного UDT-типа СУБД также автоматически создает для него функцию-мутатор и функцию-наблюдатель. При применении функции-мутатора изменяется значение атрибута структурного типа. Функция-наблюдатель работает обратно функции-мутатора. Это позволяет отыскивать значение атрибута структурированного типа. Вы можете включить функции-наблюдатели в операторы SELECT, чтобы отыскать значения в базе данных.
Неопределенные значения
Неопределенные значения
Помни: Если в поле базы данных находятся какие-то данные, то в этом поле имеется определенное значение. А если поле не содержит никаких данных, то говорят, что у него неопределенное значение. Неопределенное значение (null) в числовом поле — это не одно и то же, что нуль. А в символьном поле неопределенное значение — это не одно и то же, что пустая строка. И нуль и пустая строка являются определенными значениями. Неопределенное же значение указывает на то, что имеющееся в поле значение неизвестно.
Встречаются случаи, когда поле может иметь неопределенное значение. В следующем списке приведены некоторые из этих случаев и даны примеры каждого из них.
Значение существует, но вам оно пока что неизвестно. До того, как была точно вычислена масса кварка, вы в самой верхней строке таблицы QUARM (кварк) установили в поле MASS (масса) неопределенное значение. Значение пока что не существует. В строке SQL For Dummies, 5th Edition таблицы BOOKS (книги) вы установили в поле TOTAL_SOLD (всего продано) неопределенное значение, так как первые данные о продажах за квартал еще не поступили. Поле для данной строки неприменимо. В строке С-ЗРО таблицы EMPLOYEE (наемный работник) вы установили в поле SEX (пол) неопределенное значение, так как С-ЗРО — это андроид, у которого пола нет. Значение выходит за пределы установленного диапазона. В строке Oprah Winfrey (Опра Уинфри) таблицы EMPLOYEE вы установили в поле SALARY (зарплата) неопределенное значение, так как для этого поля вы задали тип NUMERIC (8,2), а оклад, предусмотренный в контракте Опра, превышает 999999,99 доллара.Совет 3
Совет 3
Поле может иметь неопределенное значение по самым разным причинам. Так чад не торопитесь с выводами относительно того, что означает конкретное неопределенное значение.
Короткая история
(Очень) Короткая история
Язык SQL , как и теория реляционных баз данных, берет свое начало в одной из исследовательских лабораторий компании IBM . В начале 1970-х годов исследователи из IBM выполняли первые разработки реляционных систем СУБД (или РСУБД), и тогда они создали подъязык данных, предназначенный для работы в этих системах. Пробная версия этого подъязыка была названа SEQUEL (Structured English QUEry Language - структурированный английский язык запросов). Однако, когда пришло время официально выпускать их язык запросов в качестве продукта, разработчики захотели сделать так, чтобы люди понимали, что выпущенный продукт отличается от пробной системы СУБД и превосходит ее. Поэтому они решили дать выпускаемому продукту имя, хотя и отличающееся от SEQUEL , но явно принадлежащее к тому же семейству. Так что они назвали его SQL.
О работе, которая велась в IBM над реляционными базами данных и над языком SQL , в информационной отрасли хорошо знали, причем еще до того, как эта компания представила в 1981 году РСУБД SQL / DS . К этому времени компания Relational Software , Inc . (ныне Oracle Corporation ) уже выпустила свою первую РСУБД. Эти первоначальные продукты туг же стали стандартом для нового класса систем, предназначенных для управления базами данных. В состав этих продуктов вошел SQL , который фактически стал стандартом для подъязыков данных. Производители других систем управления базами данных выпустили свои собственные версии SQL . В этих реализациях обычно имелись все основные возможности продуктов IBM, но, впрочем, не только они. Там также имелись расширения, введенные с целью дать преимущество сильным сторонам именно "своей" РСУБД. В результате, хотя почти все поставщики и использовали варианты одного языка SQL , платформенная совместимость была слабой.
Помни: Реализация — это конкретная СУБД, работающая на конкретной аппаратной платформе.
Вскоре началось движение за создание общепризнанного стандарта SQL , которого мог бы придерживаться каждый. В 1986 году организация ANSI выпустила официальный стандарт под названием SQL -86. Этот стандарт был обновлен той же организацией в 1989 году и получил название SQL -89, а затем, в 1992 году, был назван SQL -92. Поставщики СУБД, выпуская новые версии своих продуктов, всегда старались приблизить свои реализации к стандарту. Эти усилия и привели к тому, что мечта о настоящей переносимости SQL стала намного ближе к реальности.
Самой последней версией стандарта SQL является SQL:2003 ( ISO / IEX 9075 X:2003). В этой книге описан язык SQL , который определяется стандартом SQL:2003. Конечно, любая конкретная реализация SQL в определенной степени отличается от стандарта. Так как полный стандарт SQL:2003 является слишком всеобъемлющим, то от современных реализаций, видимо, не стоит ждать полного ему соответствия. Однако поставщики систем СУБД сейчас работают над тем, чтобы эти системы все же соответствовали основной части стандартного SQL. Полные спецификации стандартов ISO / IEC доступны в Internet по адресу webstore.ansi.org.
Ограничения
Ограничения
Ограничения вы устанавливаете на данные, вводимые кем-либо в таблицу базы данных. Например, известно, что значения, вводимые в определенный числовой столбец, должны находиться в пределах определенного диапазона. А если кто-то вводит число, которое не попадает в этот диапазон, то такой ввод будет ошибочным. От таких ошибок и защищает установленное на столбец ограничение — вводить в него только значения из определенного диапазона.
Традиционно сложилось так, что если прикладная программа использует базу данных, то она и накладывает на эту базу любые ограничения. Однако в самых последних продуктах у вас есть возможность устанавливать ограничения на данные непосредственно из СУБД. Этот подход дает несколько преимуществ. Если одна и та же база данных используется множеством приложений, то вам придется устанавливать ограничения только один раз, а не столько, сколько имеется приложений. Кроме того, устанавливать ограничения на уровне базы данных обычно проще, чем на уровне приложения. Во многих случаях вам будет достаточно только добавить предложение в свой оператор CREATE (создать).
Об ограничениях и утверждениях (assertions), которые тоже являются ограничениями, но применяются к более чем одной таблице, подробно рассказывается в главе 5.
Использование SQL в системе клиент/сервер
SQL — это подъязык данных, который работает в одно- или многопользовательской системе. Особенно хорошо SQL работает в системе клиент/сервер. В такой системе пользователи работают на множестве клиентских машин, соединенных с серверным компьютером. И эти пользователи могут иметь доступ — через локальную сеть или другие каналы связи — к базе данных, расположенной на сервере, с которым соединены их машины. В прикладной программе, работающей на клиентском компьютере, создаются команды SQL. Та часть системы СУБД, которая находится на клиентском компьютере, передает эти команды на сервер по каналу связи, соединяющему сервер с клиентом. А та часть СУБД, которая находится на сервере, интерпретирует и выполняет полученную команду SQL, а затем по каналу связи отправляет результаты назад, клиенту. В виде SQL можно закодировать очень сложные операции, а затем на сервере декодировать их и выполнить. Такого рода система позволяет эффективнее всего использовать пропускную способность канала связи.
Если вы с помощью SQL получаете данные через систему клиент/сервер, то по каналу связи от сервера на клиентский компьютер попадут только нужные вам данные. И наоборот, простая система с разделением ресурсов и с минимальным "интеллектом" сервера должна гонять туда-сюда по каналу связи огромные блоки данных. И все это ради того, чтобы вы смогли получить крохотное количество нужной информации. Не приходится и говорить, что такого рода пересылки данных могут очень замедлить работу. Архитектура клиент/сервер, дополняя характеристики SQL, дает возможность в малых, средних и больших сетях получать хорошую производительность при умеренных расходах.
Определяемые пользователем типы
Определяемые пользователем типы
Определяемые пользователем типы (user-defined types, UDT) — это еще один пример новых возможностей, пришедших в SQL: 1999 из мира объектно-ориентированного программирования. Как программист на языке SQL вы больше не ограничены теми типами данных, которые определяются в спецификации SQL:2003. У вас есть возможность определять собственные типы, используя принципы абстрактных типов данных (Abstract Data Types, ADT), таких объектно-ориентированных языков программирования, как C++.
Одним из самых важных преимуществ UDT-типов является то, что их можно использовать для устранения "нестыковок" между SQL и базовым языком приложения баз данных. Застарелой проблемой SQL является то, что его заранее определенные типы данных могут не соответствовать типам, которые используются в базовом языке. Теперь же программист баз данных может создавать в SQL такие типы данных, которые не нарушают этого соответствия. UDT-типы имеют инкапсулированные атрибуты и методы. Снаружи можно видеть определение атрибутов и результаты выполнения методов, но конкретные механизмы этого выполнения скрыты от пользователя. Доступ к атрибутам и методам можно еще больше ограничить, указав, что они являются общими (public), приватными (private) или защищенными (protected). Общие атрибуты или методы доступны всем пользователям UDT, в то время как приватные — только самому UDT. Защищенные атрибуты или методы доступны только самому UDT-типу или его подтипам. Из этого можно видеть, что в SQL UDT-тип ведет себя во многом так же, как и класс из объектно-ориентированного программного языка. Существуют две формы определяемых пользователем типов: отдельный и структурный.
Отдельные типы данных
Отдельные типы данных
Отдельные типы данных — это простейшие формы определяемых пользователем типов. Отдельные типы определяются той особенностью, что они выражаются как единый тип данных. Они создаются на основе одного из ранее определенных типов данных, называющихся базовыми типами. Множество отдельных типов, которые все созданы на основе одного базового типа, отличаются друг от друга, и, таким образом, непосредственно сравнивать их между собой нельзя. Например, отдельные типы можно использовать, чтобы различать валюты разных стран. Проанализируйте следующее определение типа:
CREATE DISTINCT TYPE Usdollar AS DECIMAL (9,2) ;
В результате на основе заранее определенного типа DECIMAL создан новый тип данных предназначенный для долларов США. Аналогичным образом можно создать другой отдельный тип для евро:
CREATE DISTINCT TYPE Euro AS DECIMAL (9,2) ;
Теперь можно создать таблицы USInvoice (счет-фактура в долларах США) и Eurolnvoice (счет-фактура в евро), в которых используются эти новые типы. В столбцах обеих таблиц хранятся такие реквизиты: идентификатор счета-фактуры, идентификатор клиента, идентификатор сотрудника, общая сумма продажи, сумма налога, сумма поставки и общий итог.
CREATE TABLE USInvoice ( | ||
InvID | INTEGER | PRIMARY KEY, |
CustID | INTEGER, | |
EmpID | INTEGER, | |
TotalSale | Usdollar, | |
Tax | Usdollar, | |
Shipping | Usdollar, | |
GrandTotal | Usdollar | |
) ; |
CREATE TABLE Eurolnvoice ( | ||
InvID | INTEGER | PRIMARY KEY, |
CustID | INTEGER, | |
EmpID | INTEGER, | |
TotalSale | Euro, | |
Tax | Euro, | |
Shipping | Euro, | |
GrandTotal | Euro | |
) ; |
Оба типа, Usdollar и Euro, созданы на основе типа DECIMAL, но величины первого типа нельзя сравнивать с величинами второго, как и с величинами типа DECIMAL. Теперь в SQL, как и в обменном пункте, можно конвертировать доллары в евро, но для этого требуется специальная операция (CAST, означает "приведение"). Сравнения можно проводить, лишь выполнив конвертацию.
Подтипы и супертипы
Подтипы и супертипы
Между двумя структурированными типами могут существовать иерархические отношения. К примеру, тип MusicCDudt имеет подтипы RockCDudt и ClassicalCDudt. Для этих двух подтипов MusicCDudt является супертипом. Если для MusicCDudt нет подтипа, который является супертипом для RockCDudt, то RockCDudt является собственным подтипом MusicCDudt. Если RockCDudt имеет подтип с именем HeavyMetalCDudt, который, в свою очередь, также является подтипом для MusicCDudt, то тип HeavyMetalCDudt уже не будет являться собственным подтипом для MusicCDudt.
Структурированный тип, не имеющий супертипа, называется максимальным супертипом, а структурированный тип, не имеющий подтипа, — конечным подтипом.
Приблизительные числовые типы
Приблизительные числовые типы
У некоторых величин имеется такой большой диапазон возможных значений (большое количество порядков), что компьютер с данным размером регистра не может в точности представить все эти значения. (Размерами регистра являются, например, 32 бита, 64 бита и 128 бит.) Обычно в таких случаях точность не является необходимой, и поэтому будет достаточно иметь близкое приближение. Для работы с такими данными SQL :2003 определяет три приблизительных числовых типа.
Пример структурированного типа
Пример структурированного типа
Структурированные UDT-типы могут быть созданы следующим способом:
/* Создаем UDT-тип MusicCDudt */ | |
CREATE TYPE MusicCDudt AS | |
/* Задаем атрибуты */ | |
Title | CHAR(40), |
Cost | DECIMAL(9,2), |
SuggestedPrice | DECIMAL(9,2), |
/* Разрешаем подтипы */ | |
NOT FINAL ; | |
CREATE TYPE RockCDUdt UNDER MusicCDudt NOT FINAL ; |
Подтип RockCDudt наследует атрибуты своего супертипа MusicCDudt.
CREATE TYPE HeavyMetalCDudt UNDER RockCDUdt FINAL ;
Создадим таблицы, использующие эти типы. Например:
CREATE TABLE METALSKU ( | |
Album | HeavyMetalCDudt, |
SKU | INTEGER ) ; |
Теперь можно добавить строки в новую таблицу:
BEGIN
/* Объявляем временную переменную 'a' */
DECLARE a = HeavyMetalCDudt ;
/* Выполняем функцию-конструктор */
SET a = HeavyMetalCDudt () ;
/* Выполняем первую функцию-мутатор */
SET a = a.title('Edward the Great') ;
/* Выполняем вторую функцию-мутатор */
SET a = a.cost(7.50) ;
/* Выполняем третью функцию-мутатор */
SET a = a.suggestedprice(15/99) ;
INSERT INTO METALSKU VALUES (a, 31415926) ;
END
Сервер
Сервер
Сервер не делает ничего, пока не получит запрос от клиента. Он только стоит и ждет. Но если требуется одновременно обслужить множество клиентов, то серверам приходится реагировать довольно оперативно. Они обычно отличаются от клиентских машин тем, что имеют быстрые дисковые массивы. Серверы настроены так, чтобы обеспечивать скорейший доступ к данным и скорейшую их передачу. Но так как им приходится обрабатывать трафик, идущий одновременно со множества клиентских машин, то на сервере должен быть очень быстрый процессор.
Символьные строки
Символьные строки
Сейчас в базах данных хранятся данные многих разных типов, в том числе графические изображения звуки и анимация. Надеюсь, что вслед за ними появятся и запахи. Можете вы представить на своем экране трехмерное, размером 1600x1200 пикселей, выполненное в 24-битовом цвете изображение большого ломтя наперченной пиццы, в то время как через вашу супермультимедийную плату воспроизводится фрагмент запаха, записанный в "Ди Филиппи Пицца Гротто"? Такое мультимедиа может вызывать одно лишь разочарование — хотя бы до тех пор пока в систему нельзя будет вводить и данные вкусовых ощущений. Увы, возможно придется ждать очень долго, пока запах и вкус не станут стандартными типами данных SQL . А сейчас типами данных, которые вам придется использовать чаще всего, не считая, конечно, числовых, являются типы символьных строк.
Есть три главных типа символьных данных: фиксированных символьных данных ( CHARACTER или CHAR ), переменных символьных данных ( CHARACTER VARYING или VARCHAR ) и данных для больших символьных объектов ( CHARACTER LARGE OBJECT или CLOB ). Кроме того, есть еще три варианта этих типов данных: NATIONAL CHARACTER (строка с национальными символами), NATIONAL CHARACTER VARYING (переменная строка с национальными символами) и NATIONAL CHARACTER LARGE OBJECT (большой объект с национальными символами).
Структурированные типы
Структурированные типы
Вторая форма определяемого пользователем типа — структурированный тип. Он представляет собой перечень определений атрибутов и методов, а не базируется на отдельном предопределенном исходном типе.
Сводка типов данных
Сводка типов данных
В таблице 2.2 перечислены различные типы данных и показаны литералы, которые соответствуют каждому из этих типов.
Типы данных
Таблица 2.2. Типы данных
Тип данных | Пример значения |
CHARACTER (20) | 'Любительское радио' |
VARCHAR (20) | 'Любительское радио' |
CLOB (1000000) | 'В этой строке миллион символов..' |
SMALLINT, BIGINT ИЛИ INTEGER | 7500 |
NUMERIC или DECIMAL | 3425,432 |
REAL, FLOAT ИЛИ DOUBLE PRECISION | 6,626E-34 |
BLOB (1000000) | '1001001110101011010101010101.. . ' |
BOOLEAN | 'true' |
DATE | DATE '1957-08-14' |
TIME (2) WITHOUT TIME ZONE (аргумент указывает количество цифр в дробной части) | TIME '12:46:02,43' WITHOUT TIME ZONE |
TIME (3) WITH TIME ZONE | TIME '12:46:02,432-08:00' WITH TIME ZONE |
TIMESTAMP WITHOUT TIME ZONE (0) | TIMESTAMP '1957-08-14 12:46:02' WITHOUN TIME ZONE |
TIMESTAMP WITH TIME ZONE (0) | TIMESTAMP '1957-08-14 12:46:02-08:00' WITH TIME ZONE |
INTERVAL DAY | INTERVAL '4' DAY |
ROW | ROW (Street VARCHAR (25), City VARCHAR (20), Stat CHAR (2), PostalCode VARCHAR (9)) |
ARRAY | INTEGER ARRAY [15] |
MULTISET | Нет точного применения типа multiset |
REF | Это не тип, а указатель |
USER DEFINED TYPE | Тип валюты, созданный на основе decimal |
Помни: Имеющаяся у вас реализация SQL может не поддерживать все типы данных, перечисленные в этом разделе. Более того, в вашей реализации могут поддерживаться нестандартные типы, которые здесь не описываются. (Каждый из вас успел уже как профессионал набраться опыта, "намотать километраж" и т.д. Так что вы знаете, где искать то, чего еще не знаете.)
Тип BIGINT
Тип BIGINT
Тип данных BIGINT (большой целый) — это новый тип данных, появившийся вместе с SQL :2 OO 3. Он также предназначен для целых значений и определяется как тип, точность которого может быть не намного больше, чем точность данных типа INTEGER , или сильно превышать ее. Предел точности данных типа BIGINT зависит от реализации.
Тип CHARACTER
Тип CHARACTER
Если вы определяете для столбца тип данных CHARACTER или CHAR , количество символов, которое будет в нем находиться, можно укачать, используя синтаксис CHARACTER (х), где х и является нужным вам количеством. Если, например, тип данных столбца был определен как CHARACTER (16), то максимальная длина любых данных, которые можно будет ввести в этот столбец, равна 16 символам. Если аргумент не указан (т.е. нет значения в скобках), тогда для SQL это означает, что длина поля равна одному символу. Если вы вводите данные в поле типа CHARACTER , имеющего определенную длину, и при этом вводите символов меньше, чем может поместиться в поле, то позиции, оставшиеся свободными, будут заполнены пробелами.
Тип CHARACTER LARGE OBJECT
Тип CHARACTER LARGE OBJECT
тип данных CHARACTER LARGE OBJECT (CLOB) впервые появился в SQL: 1999. Как Указывает его имя (означает "большой символьный объект"), он используется вместе с громадными символьными строками, которые для типа CHARACTER слишком велики. Данные - LOB ведут себя во многом так же, как и обычные символьные строки, но на действия, которые можно с ними проводить, имеется ряд ограничений. Для типа CLOB нельзя использовать предикаты PRIMARY KEY (первичный ключ), FOREIGN KEY (внешний ключ), UNIQUE (уникальный). Более того, эти данные нельзя использовать для сравнения, за исключением равенства или неравенства. Из-за того, что у данных CLOB большие размеры, он как правило, всегда остаются на сервере. Вместо них на стороне клиента применяется специальный тип данных, который называется локатор LOB ( LOB locator ). Это параметр, значение которого идентифицирует большой символьный объект.
Тип CHARACTER VARYING
Тип CHARACTER VARYING
Тип данных CHARACTER VARYING полезен тогда, когда вводимые в столбец значения имеют разную длину, но вы не хотите, чтобы поле заполнялось пробелами. Этот тип данных Дает возможность сохранять то количество символов, которое ввел пользователь. Для типа CHARACTER VARYING нет значения по умолчанию. Чтобы указать этот тип данных, используйте синтаксис CHARACTER VARYING (х) или VARCHAR (х), где х — это максимальное разрешенное количество символов.
Тип DATE
Тип DATE
Тип DATE (дата) предназначен для хранения значений даты в следующем порядке: год, и день. Значение года занимает четыре цифры, а месяца и дня — по две. Значения этого могут представлять любую дату, начиная с 0001 года и заканчивая 9999 годом. Длина DAТЕ равна десяти позициям, как, например, для 1957-08-14.
Технические подробности: Так как язык SQL, используя тип DATE, представляет в явном виде все четыре цифры года, то данные SQL никогда не вызывали опасения из-за пресловутой проблемы 2000 года.
Тип DECIMAL
Тип DECIMAL
Тип данных DECIMAL (десятичный) похож на NUMERIC . В нем может быть дробная часть, и для него можно указать точность и масштаб. DECIMAL отличается от NUMERIC тем, что если точность имеющейся реализации SQL будет больше указанного значения, то в реализации будет использоваться большая точность. А если точность или масштаб не указаны, то, как и при использовании типа NUMERIC , в реализации применяются значения по умолчанию.
В столбце, тип которого NUMERIC (5,2), нельзя поместить числа, большие 999,99. Если же тип столбца DECIMAL (5,2), в него всегда можно поместить значения до 999,99. Кроме того, если точность реализации позволяет, то СУБД сможет поместить в этот столбец и значения, большие, чем 999,99.
Если в ваших данных имеются дробные части, тогда применяйте тип NUMERIC или DECIMAL , а если ваши данные всегда состоят из целых чисел, то используйте тип INTEGER или SMALLINT . Когда нужно добиться максимальной переносимости, следует использовать тип NUMERIC , потому что поле, тип которого вы определите, например, как NUMERIC (5,2), будет во всех системах иметь один и тот же диапазон значений.
Тип DOUBLE PRECISION
Тип DOUBLE PRECISION
Тип данных DOUBLE PRECISION (двойная точность) дает возможность задавать числа двойной точности с плавающей запятой, точность которых опять-таки зависит от реализации Удивительно, что само значение слова DOUBLE (двойной) также зависит от реализации Арифметика двойной точности в основном применяется в научных целях. А для разных научных дисциплин требуется разная точность. Некоторые реализации SQL обслуживают одну категорию пользователей, а другие реализации — соответственно другие категории.
В некоторых системах тип DOUBLE PRECISION имеет и для мантиссы, и для экспоненты как раз в два раза большую вместимость, чем тип REAL . (Если вы забыли то, что учили в средней школе, то вспомним, что любое число можно представить в виде мантиссы, умноженной на число десять, возведенное в степень, показатель которой является экспонентой. Например, 6626 можно написать в виде 6.626ЕЗ. Число 6,626 является мантиссой, которую вы умножаете на десять, возведенное в третью степень (в данном случае 3 является экспонентой).
Вы не получите выигрыша, если будете с помощью приблизительного числового типа данных представлять числа, достаточно близкие к единице (такие как 6626 или даже 6626000). Точные числовые типы работают точно так же и занимают в памяти меньше места. Однако для чисел, которые слишком близко находятся от нуля или слишком далеко от единицы, таких как 6.626Е-34 (очень малое число), необходимо использовать приблизительный числовой тип. Для таких величин не подходят точные числовые типы. В других системах тип DOUBLE PRECISION дает побольше, чем двойная вместимость мантиссы, и поменьше, чем двойная вместимость типа REAL для экспоненты. В системах следующего вида тип DOUBLE PRECISION дает для мантиссы вместимость в два раза больше, чем у типа REAL , а для экспоненты — ту же, что и у REAL . В этом случае точность удваивается, а диапазон — нет.
Спецификация SQL :2 OO 3 не пытается жестко определить, что означает DOUBLE PRECISION . Она только требует, чтобы точность числа типа DOUBLE PRECISION была больше, чем точность типа REAL . Хотя это ограничение очень слабое, но, возможно, оно является наилучшим из возможных, если учитывать те немалые различия, которые имеются в оборудовании.
Тип FLOAT
Тип FLOAT
Тип данных FLOAT (плавающий) является самым полезным, если вы считаете, что ваша база данных однажды должна перейти на аппаратную платформу, в которой размеры регистров отличаются от размеров регистров платформы, для которой вы первоначально спроектировали базу. Используя тип данных FLOAT , можно указывать точность— например, FLOAT (5). Если ваше оборудование поддерживает указанную точность, используя аппаратную одинарную точность, то ваша система использует арифметику с одинарной точностью. Если указанная точность требует арифметики с двойной точностью, то система использует ее.
Совет 2
Совет 2
Использование FLOAT вместо REAL или DOUBLE PRECISION облегчает перенос ваших баз данных на другие системы, так как тип данных FLOAT дает возможность указывать точность. Точность чисел типа REAL или DOUBLE PRECISION зависит от аппаратуры.
Если вы не уверены, использовать точные числовые типы данных (NUMERIC/DECIMAL) или приблизительные числовые типы ( FLOAT / REAL ), то выбирайте точные. Точным типам данных требуется меньше системных ресурсов, к тому же они дают точные, а не приблизительные результаты. Если же диапазон возможных значений ваших данных настолько большой, что требуется использовать приблизительные типы данных, то этот факт вы, скорее всего сможете определить для себя заранее.
Тип INTEGER
Тип INTEGER
В данных типа INTEGER (целый) нет дробной части, и их точность зависит от конкретной реализации SQL . Таким образом, точность не может быть установлена разработчиком базы данных.
Помни: Точностью числа является максимальное количество цифр, которое у него может быть.
Тип MULTISET
Тип MULTISET
Тип данных MULTISET (мультимножество) — это неупорядоченная коллекция. Определенные элементы мультимножества могут быть не связаны, поскольку им не назначается определенная порядковая позиция в мультимножестве.
Тип NUMERIC
Тип NUMERIC
В данных типа NUMERIC (числовой), кроме целого компонента, может быть и дробный. Для этих данных можно указать точность и масштаб. Точность, как вы помните, — это максимально возможное количество цифр.
Масштаб — это количество цифр после запятой. Масштаб не может быть отрицательным или превышать точность числа.
При определении типа NUMERIC необходимо указать требуемые значения точности и масштаба. В определении можно указать только NUMERIC и получить значения по умолчанию. А если вы укажете NUMERIC (p), то получите требуемую точность и значение масштаба по умолчанию. Выражение NUMERIC (p,s) позволяет непосредственно задать и точность, и масштаб. При определении данных вместо параметров p и s нужно ввести соответственно требуемые значения точности и масштаба.
Скажем, например, что в вашей реализации SQL точность по умолчанию для типа данных NUMERIC равна 12, а масштаб по умолчанию равен 6. Если вы укажете, что столбец базы данных имеет тип NUMERIC , то в этом столбце смогут находиться числа вплоть до 999999,999999. Если же, с другой стороны, вы для столбца указываете тип данных NUMERIC (10), то в столбце смогут находиться только числа с максимальным значением 9999,999999. Параметр (10) указывает максимально возможное для числа количество цифр. Когда для столбца будет указан тип данных NUMERIC (10,2), то в столбце могут находиться числа с максимальным значением — 99999999,99. В этом случае хотя и останется всего десять цифр, но справа от десятичной запятой будут находиться только две из них. (Имейте в виду, что синтаксис SQL требует использовать для разделения целой и дробной частей числа не запятую, а десятичную точку, как это принято в США и странах Европы.)
Тип данных NUMERIC предназначен для значений, таких как 595,72. Точность этого значения равна 5 (общее количество цифр), а масштаб — 2 (количество цифр справа от десятичной запятой). Для чисел, таких, как это, подходит тип данных NUMERIC (5,2).
Тип REAL
Тип REAL
Тип данных REAL (действительное число) дает возможность задавать числа однократно точности с плавающей запятой, точность которых зависит от реализации. Вообще-то, точность определяется используемым оборудованием. Например, 64-битовая машина дает большую точность, чем 32-битовая.
Число с плавающей запятой ( floating - point number ) — это число с десятичной запятой Десятичная запятая "плавает" или появляется в разных частях числа, в зависимости от значения этого числа. Примерами чисел с плавающей запятой являются 3,1, 3,14 и 3,14159.
Тип SMALLINT
Тип SMALLINT
Тип SMALLINT (малый целый) также предназначен для целых значений, но его точность в конкретной реализации не может быть больше точности типа INTEGER , имеющейся в данной реализации. В реализациях, работающих на компьютерах IBM System /370, типы SMALLINT и INTEGER обычно представлены соответственно 16- и 32-битовыми двоичными числами. Впрочем, во многих реализациях SMALLINT и INTEGER являются одним и тем же типом.
Если в таблице из базы данных вы определяете столбец для целых данных и известно, что значения в этом столбце никогда не превысят точность, установленную в вашей реализации для значений типа SMALLINT , то присвойте столбцу тип не INTEGER , a SMALLINT . Таким образом вы, возможно, позволите своей СУБД сэкономить место на диске.
Тип TIME WITH TIME ZONE
Тип TIME WITH TIME ZONE
Тип данных TIME WITH TIME ZONE (время вместе с часовым поясом) в точности такой же как и TIME WITHOUT TIME ZONE, за исключением того, что в нем еще имеется информация о разнице между местным и всемирным временем (UTC, Universal Time), ранее известным как среднее время по Гринвичу (Greenwich Mean Time, GMT). Значение этой разницы может находиться в диапазоне от -12:59 до +13:00. Такая дополнительная информация занимает за цифрами времени шесть позиций: дефис в качестве разделителя, знак "плюс" или "минус", а затем разница в часах (две цифры) и минутах (также две цифры) и двоеточие между часами и минутами. Значение типа TIME WITH TIME ZONE без дробной части (как установлено по умолчанию) занимает 14 позиций. Если же дробная часть указана, то длина поля равняется 15 позициям плюс количество цифр дробной части.
Тип TIME WITHOUT TIME ZONE
Тип TIME WITHOUT TIME ZONE
Тип TIME WITHOUT TIME ZONE (время без часового пояса) предназначен для хранения значений времени в следующем порядке: час, минута и секунда. Значения часа и минуты занимают в точности по две цифры. Секундное значение может занимать две цифры, но может быть и расширено, чтобы иметь необязательную дробную часть. Поэтому время 9 часов 32 минуты и 58,436 секунды утра представляется с помощью этого типа данных как 09:32:58,436.
Точность дробной части зависит от конкретной реализации, но имеет длину не менее шести символов. Значение типа TIME WITHOUT TTME ZONE без дробной части занимает восемь позиций (включая двоеточия), а с дробной частью — девять позиций (вместе с десятичной запятой) плюс число цифр дробной части. Этот тип данных задается или с помощью синтаксиса ТМЕ, в результате чего данные представляются в виде, установленном по умолчанию, т.е. без дробной части, или с помощью другого синтаксиса, TTME WITHOUT TIME ZONE (p), где вместо р должно стоять количество цифровых позиций, находящихся справа от десятичной запятой. В предыдущем абзаце представлен пример данных типа TTME WITHOUT TIME ZONE (3).
Тип TIMESTAMP WITH TIME ZONE
Тип TIMESTAMP WITH TIME ZONE
Тип данных TIMESTAMP WITH TIME ZONE (дата и время вместе с часовым поясом) работает точно так же, как и TIMESTAMP WITHOUT TIME ZONE, за исключением того, что в нем еще имеется информация о разнице между местным и всемирным временем. Дополнительная информация занимает за датой и временем шесть позиций (о формате данных часового пояса см. в предыдущем разделе). Для поля с данными часового пояса и без дробной части требуется 25 позиций, а для поля с дробной частью нужно 26 позиций плюс количество цифр дробной части (это количество по умолчанию равно шести).
Тип TIMESTAMP WITHOUT TIME ZONE
Тип TIMESTAMP WITHOUT TIME ZONE
В данных типа TIMESTAMP WITHOUT TIME ZONE (дата и время без часового пояса) хранится информация как о дате, так и о времени. У компонентов данных этого типа такие же значения длины и такие же ограничения, как и для данных типа DATE и TIME WITHOUT TIME ZONE, если не считать одного различия. Оно состоит в том, что по умолчанию в данных типа TIMESTAMP WITHOUT TIME ZONE длина дробной части равна шести цифрам, а не нулю. Если в значении типа TIMESTAMP WITHOUT TIME ZONE нет цифр дробной части, то длина этого значения равна 19 позициям, занимаемым в следующем порядке: десять позиций — датой, один пробел служит в качестве разделителя, и восемь позиций — временем. Если цифры дробной части все же имеются (по умолчанию их должно быть шесть), то Длина равна 20 позициям плюс количество этих цифр. Двадцатая позиция предназначена для Десятичной запятой. Устанавливать для поля тип TIMESTAMP WITHOUT TIME ZONE можно с помощью двух видов синтаксиса: TIMESTAMP WITHOUT TIME ZONE или IMESTAMP WITHOUT TIME ZONE (p), где вместо р должно стоять число позиций, предназначенных для цифр дробной части. Вместо р не может стоять отрицательное число, максимальное значение этого параметра зависит от конкретной реализации SQL.
Типы ARRAY
Типы ARRAY
Тип данных ARRAY (массив) нарушает первую нормальную форму (1НФ), но делает это иначе, чем тип ROW. Тип ARRAY, относящийся к типу коллекций, в действительности не является отдельным типом данных в том же смысле, что и типы CHARACTER или NUMERIC. Тип ARRAY просто дает возможность одному из других типов иметь множество значений внутри одного поля в таблице. Скажем, например, что для вашей организации важно поддерживать контакт со своими клиентами, находятся ли они на работе, дома или в дороге. Поэтому среди данных о клиенте может потребоваться и несколько телефонных номеров. Такую возможность можно реализовать, объявив атрибут Phone (телефон) массивом, как показано в следующем коде:
CREATE TABLE CUSTOMER ( | ||
CustID | INTEGER | PRIMARY KEY, |
LastName | CHARACTER | VARYING (25), |
FirstName | CHARACTER | VARYING (20), |
Address | addr_typ | |
Phone | CHARACTER | VARYING (15) ARRAY [3] |
) ; |
Это дает возможность хранить в таблице CUSTOMER (клиент) до трех телефонных номеров каждого клиента. Три телефонных номера являются примером повторяющейся группы. Если следовать классической теории реляционных баз данных, то такие группы делать нельзя, однако они — это только один из нескольких примеров нарушения правил со стороны SQL: 1999. Когда доктор И.Ф. Кодд впервые провозгласил свои правила нормализации, то ради целостности данных он пожертвовал функциональной гибкостью. SQL: 1999 вернул назад часть этой гибкости — впрочем, за счет некоторого усложнения структуры. Такое усложнение может привести к ослаблению целостности данных. Это вам напоминание на тот случай, если вы еще не полностью осознаете последствия всех действий, выполняемых с базой данных. Массивы упорядочены таким образом, что каждый элемент массива связан только с одной порядковой позицией в массиве.
Типы данных
Типы данных
В разных реализациях SQL поддерживаются различные исторически сложившиеся типы данных. В спецификации SQL:2003 признаны только пять заранее определенных общих типов:
числовой; строковый; логический; даты-времени; интервальный.Внутри каждого из этих типов может быть несколько подтипов (точный числовой; приблизительный числовой; символьный строковый; битовый строковый; строковый для больших объектов). Кроме встроенных, заранее определенных типов, в SQL:2003 также поддерживаются сконструированные и определяемые пользователем типы.
Совет 1
Совет 1
Если вы используете реализацию SQL , в которой поддерживаются типы данных, не описанные в SQL:2003, то для большей переносимости вашей базы данных старайтесь этими типами данных не пользоваться. Перед тем как вы решите создать и использовать определяемый пользователем тип, убедитесь, что в любой СУБД, на которую вам, возможно, захочется перейти в будущем, также поддерживаются определяемые пользователем типы.
Типы коллекций
Типы коллекций
После того как с выходом SQL: 1999 была разрушена реляционная строгость, стало возможным использование таких типов данных, которые нарушают первую нормальную форму. Теперь поля могут содержать не один, а целую коллекцию объектов. Тип ARRAY (массив) впервые появился уже в SQL: 1999, а вот тип MULTISET (мультимножество) — это новинка SQL:2003.
Можно сравнить две коллекции между собой только в том случае, если они содержат один и тот же тип данных, либо ARRAY, либо MULTISET, и сравниваемые типы элементов. Поскольку массивы имеют определенный порядок элементов, соответствующие элементы массивов можно сравнить. Мультимножества такого порядка не имеют, однако их также можно сравнить, но только в том случае, если для одного из двух сравниваемых мультимножеств существует нумерация, которой должна соответствовать нумерация другого мультимножества.
Типы NATIONAL CHARACTER NATIONAL
Типы NATIONAL CHARACTER , NATIONAL CHARACTER VARYING и NATIONAL CHARACTER LARGE OBJECT
В разных языках используются символы, которые отличаются от любых символов другого языка. Например, в немецком имеются символы, которых нет в наборе символов английского языка. Имеются языки, такие, например, как китайский или японский, в которых набор иероглифов очень сильно отличается от наборов символов других языков. Если вы в своей системе сделаете английский языком по умолчанию, то все равно сможете использовать и другие символьные наборы, так как типы данных NATIONAL CHARACTER , NATIONAL CHARACTER VARYING и NATIONAL CHARACTER LARGE OBJECT работают точно так же, как и CHARACTER , CHARACTER VARYING и CHARACTER LARGE OBJECT , за исключением того, что определяемый вами набор символов отличается от того, который вы используете по умолчанию. Набор символов можно указывать при определении столбца в таблице. Если нужно, то в каждом столбце можно использовать отдельный набор символов. В следующем примере инструкции, создающей таблицу, используется несколько таких наборов:
CREATE TABLE XLATE
LANGUAGE_1 CHARACTER (40),
LANGUAGE_2 CHARACTER VARYING (40) CHARACTER SET GREEK,
LANGUAGE_3 NATIONAL CHARACTER (40),
LANGUAGE_4 CHARACTER (40) CHARACTER SET KANJI
) ;
Столбец LANGUAGE_1 (1-й язык) предназначен для символов из набора, используемого в данной реализации по умолчанию. В свою очередь, столбец LANGUAGE_3 (3-й язык) предназначен для символов национального набора данной реализации. А для греческих символов предназначен столбец LANGUAGE_2 (2-й язык). И, наконец, для иероглифов предназначен столбец LANGUAGE_4 (4-й язык).
Типы REF
Типы REF
Типы REF в основную часть SQL не входят. Это значит, что какая-либо система СУБД, совсем не использующая эти типы данных, все равно может считаться соответствующей стандарту SQL:2003. Тип REF не является отдельным типом данных в том же смысле, что и типы CHARACTER и NUMERIC. На самом деле это указатель на элемент данных, на данные типа ROW или на данные абстрактного типа, размещаемого в строке таблицы. Разыменовывая указатель, можно получить требуемое значение. Не беспокойтесь, если запутались, — в этом вы не одиноки. Использование типов REF требует практического знания принципов объектно-ориентированного программирования (ООП). В книге я старался не слишком глубоко погружаться в эту муть. Поскольку типы REF не входят в основную часть SQL, вам будет лучше совсем их не использовать. Если нужна максимальная переносимость с одних платформ СУБД на другие, то не следует выходить за пределы основной части SQL.
Типы ROW
Типы ROW
Тип данных ROW (запись) впервые появился в SQL: 1999. Он не является легким для понимания, и вы на своем пути от начального до среднего уровня программирования на SQL, возможно, так никогда с этим типом данных не встретитесь. В конце концов, в 1986-1999 годах люди прекрасно без него обходились.
Кроме всего прочего, примечательно то, что тип данных ROW нарушает правила нормализации, которые доктор И.Ф. Кодд (E.F. Codd) объявил на начальной стадии теории реляционных баз данных. Об этих правилах более подробно рассказывается в главе 5. Одной из характеристик, определяющих первую нормальную форму, является то, что поле в табличной строке не может быть многозначным. В поле может находиться одно и только одно значение. Однако тип данных ROW дает возможность объявить целую строку данных находящейся в единственном поле единственной строки таблицы — другими словами, объявить строку, вложенную в строку.
Проанализируйте следующую команду SQL, которая для персональной адресной информации (улица, город, штат, почтовый код) использует тип ROW:
CREATE ROW TYPE addr_typ ( | |
Street | CHARACTER VARYING (25) |
City | CHARACTER VARYING(20) |
State | CHARACTER (2) |
PostalCode | CHARACTER VARYING (9) |
) ; |
После того как тип ROW определен, его можно использовать в определении таблицы (с идентификатором клиента, его фамилией, именем, адресом, телефоном):
CREATE TABLE CUSTOMER ( | ||
CustID | INTEGER | PRIMARY KEY, |
LastName | CHARACTER | VARYING (25), |
FirstName | CHARACTER | VARYING (20), |
Address | addr_typ | |
Phone | CHARACTER | VARYING (15) |
) ; |
Здесь преимущество состоит в том, что если в базе данных много таблиц с информацией об адресе, например отдельно для клиентов, поставщиков, персонала и акционеров, то детали адресной спецификации необходимо определить только один раз — в определении типа ROW.
Точные числовые типы
Точные числовые типы
Как вы, возможно, поняли из названия, точные числовые типы данных позволяют точно выразить значение числа. К этой категории относятся пять типов:
INTEGER SMALLINT BIGINT NUMERIC DECIMALВзгляд на разные стандарты SQL
В этой главе...
Что такое SQL Заблуждения, связанные с SQL Взгляд на разные стандарты SQL Знакомство со стандартными командами и зарезервированными словами SQL Представление чисел, символов, дат, времени и других типов данных Неопределенные значения и ограничения Использование SQL в системе клиент/сервер SQL в сети SQL — это гибкий язык, который можно использовать самыми разными способами. Он является самым распространенным инструментом, используемым для связи с реляционной базой данных. В этой главе я объясню, чем является SQL и чем он не является, в частности, чем SQL отличается от компьютерных языков других типов. Затем вы познакомитесь с командами и типами данных, которые поддерживает стандартный SQL. Кроме того, я объясню такие основные понятия, как неопределенные значения и ограничения. И, наконец, будет дан обзор того, как SQL вписывается в среду клиент/сервер, а также в Internet и интранет-сети организаций.
в которых не полностью поддерживаются
Внимание
В тех реализациях, в которых не полностью поддерживаются все пять типов данных для даты и времени, при переносе в них баз данных из других реализаций могут возникнуть проблемы. Если с переносом возникли сложности, то проверьте, какие имеются способы представления даты и времени в двух реализациях исходной и той, на которую требуется перейти.
Зарезервированные слова
Зарезервированные слова
Кроме команд, специальное значение в SQL имеют и некоторые другие слова. Вместе с командами они зарезервированы для специального использования, поэтому эти слова нельзя применять в качестве имен переменных или любым другим способом, для которого они не предназначены. Вы можете легко увидеть, почему таблицам, столбцам и переменным нельзя давать имена из списка зарезервированных слов. Представьте себе, какая путаница возникнет из-за такого оператора:
SELECT SELECT FROM SELECT WHERE SELECT = WHERE ;
Полный список зарезервированных слов стандарта SQL:2003 приводится в приложении А.