Опубликован: 25.11.2008 | Доступ: свободный | Студентов: 4436 / 682 | Оценка: 4.46 / 4.18 | Длительность: 26:08:00
Лекция 5:

Язык SQL. Формирование запросов к базе данных

Типы данных

В языке SQL/89 поддерживаются следующие типы данных:

  • CHARACTER(n) или CHAR(n) — символьные строки постоянной длины в n символов. При задании данного типа под каждое значение всегда отводится n символов, и если реальное значение занимает менее, чем n символов, то СУБД автоматически дополняет недостающие символы пробелами.
  • NUMERIC[(n,m)] — точные числа, здесь n — общее количество цифр в числе, m — количество цифр слева от десятичной точки.
  • DECIMAL[(n,m)] — точные числа, здесь n — общее количество цифр в числе, m — количество цифр слева от десятичной точки.
  • DEC[(n,m)] — то же, что и DECIMAL[(n,m)].
  • INTEGER или INT — целые числа.
  • SMALLINT — целые числа меньшего диапазона.

    Несмотря на то, что в стандарте SQL1 не определяется точно, что подразумевается под типом INT и SMALLINT (это отдано на откуп реализации), указано только соотношение между этими типами данных, в большинстве реализаций тип данных INTEGER соответствует целым числам, хранимым в четырех байтах, а SMALLINT — соответствует целым числам, хранимым в двух байтах. Выбор одного из этих типов определяется размером числа.

  • FLOAT[(n)] — числа большой точности, хранимые в форме с плавающей точкой. Здесь n — число байтов, резервируемое под хранение одного числа. Диапазон чисел определяется конкретной реализацией.
  • REAL — вещественный тип чисел, который соответствует числам с плавающей точкой, меньшей точности, чем FLOAT.
  • DOUBLE PRECISION специфицирует тип данных с определенной в реализации точностью большей, чем определенная в реализации точность для REAL.

В стандарте SQL92 добавлены следующие типы данных:

  • VARCHAR(n) — строки символов переменной длины.
  • NCHAR(N) — строки локализованных символов постоянной длины.
  • NCHAR VARYING(n) — строки локализованных символов переменной длины.
  • BIT(n) — строка битов постоянной длины.
  • BIT VARYING(n) — строка битов переменной длины.
  • DATE — календарная дата.
  • TIMESTAMP(точность) — дата и время.
  • INTERVAL — временной интервал.

Большинство коммерческих СУБД поддерживают еще дополнительные типы данных, которые не специфицированы в стандарте. Так, например, практически все СУБД в том или ином виде поддерживают тип данных для представления неструктурированного текста большого объема. Этот тип аналогичен типу MEMO в настольных СУБД. Называются эти типы по-разному, например в ORACLE этот тип называется LONG, в DB2LONG VARCHAR, в SYBASE и MS SQL ServerTEXT.

Однако следует отметить, что специфика реализации отдельных типов данных серьезным образом влияет на результаты запросов к БД. Особенно это касается реализации типов данных DATE и TIMESTAMP. Поэтому при переносе приложений будьте внимательны, на разных платформах они могут работать по-разному, и одной из причин может быть различие в интерпретации типов данных.

При выполнении сравнений в операциях фильтрации могут использоваться константы заданных типов. В стандарте определены следующие константы. Для числовых типов данных определены константы в виде последовательности цифр с необязательным заданием знака числа и десятичной точкой. То есть правильными будут константы:

213.314 612.716    + 551.702

Константы с плавающей запятой задаются, как и в большинстве языков программирования, путем задания мантиссы и порядка, разделенных символом E, например:

2.9E-4  -134.235E7  0.54267E18

Строковые константы должны быть заключены в одинарные кавычки:

'Крылов Ю.Д.'      'Санкт-Петербург'

В некоторых реализациях, например MS SQL Server и Informix, допустимы двойные кавычки в строковых константах:

"Москва"    "New York"

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

Константы даты, времени и временного интервала в реляционных СУБД представляются в виде строковых констант. Форматы этих констант отличаются в различных СУБД. Кроме того, формат представления даты различен в разных странах. В большинстве СУБД реализованы способы настройки форматов представления дат или специальные функции преобразования форматов дат, как сделано, например, в CУБД ORACLE. Приведем примеры констант в MS SQL Server:

March 15, 1999 Mar 15 1999 3/15/1999 3-15-99 1999 MAR 15

В СУБД ORACLE та же константа запишется как

15-MAR-99

Кроме пользовательских констант в СУБД могут существовать и специальные системные константы. Стандарт SQL1 определяет только одну системную константу USER, которая соответствует имени пользователя, под которым вы подключились к БД.

В операторах SQL могут использоваться выражения, которые строятся по стандартным правилам применения знаков арифметических операций сложения (+), вычитания (-), умножения (*) и деления (/). Однако в ряде СУБД операция деления (/) интерпретируется как деление нацело, поэтому при построении сложных выражений вы можете получить результат, не соответствующий традиционной интерпретации выражения. В стандарт SQL2 включена возможность выполнения операций сложения и вычитания над датами. В большинстве СУБД также определена операция конкатенации над строковыми данными, обозначается она, к сожалению, по-разному. Так, например, для DB2 операция конкатенации обозначается двойной вертикальной чертой, в MS SQL Server — знаком сложения (+), поэтому два выражения, созданные в разных СУБД, эквивалентны:

'Mr./Mrs. ' || NAME || ' ' LAST_NAME
'Mr./Mrs. ' + NAME + ' ' LAST_NAME

В стандарте SQL1 не были определены встроенные функции, однако в большинстве коммерческих СУБД такие функции были реализованы, и в стандарт SQL2 уже введен ряд стандартных встроенных функций:

  • BITLENGTH(строка) — количество битов в строке;
  • CAST(значение AS тип данных) — значение, преобразованное в заданный тип данных;
  • CHARLENGTH(строка) — длина строки символов;
  • CONVERT(строка USING функция) — строка, преобразованная в соответствии с указанной функцией;
  • CURRENTDATE — текущая дата;
  • CURRENTTIME(точность) — текущее время с указанной точностью;
  • CURRENTTIMESTAMP(точность) — текущие дата и время с указанной точностью;
  • LOWER(строка) — строка, преобразованная к нижнему регистру;
  • OCTEDLENGTH(строка) — число байтов в строке символов;
  • POSITION( первая строка IN вторая строка) — позиция, с которой начинается вхождение первой строки во вторую;
  • SUBSTRING(строка FROM n FOR длина) — часть строки, начинающаяся с n-го символа и имеющая указанную длину;
  • TRANSLATE(строка USING функция) — строка, преобразованная с использованием указанной функции;
  • TRIM(BOTH символ FROM строка) — строка, у которой удалены все первые и последние символы;
  • TRIM(LEADING символ FROM строка ) — строка, в которой удалены все первые указанные символы;
  • TRIM(TRAILING символ FROM строка) — строка, в которой удалены последние указанные символы;
  • UPPER(строка) — строка, преобразованная к верхнему регистру.
Михаил Дубовик
Михаил Дубовик

В лекции как пример отношения в третьей нормальной форме приводится такая схема: (Номер зач. кн.\ ФИО \ Специальность \ Группа). Первичный ключ - Номер зач. кн. Но ведь существует следующая транзитивная зависимость: 

Номер зач. кн. -> Группа -> Специальность.

Получается, что отношение все же еще во второй нормальной форме. Или в моих рассуждениях ошибка?

Михаил Скок
Михаил Скок
Валерий Фатхриев
Валерий Фатхриев
Россия, Санкт-Петербург