
- •1. Краткие сведения о языке sql субд Oracle
- •Выборка данных
- •Управление транзакциями
- •1.2. Создание таблиц
- •Именование таблиц и столбцов
- •Типы данных
- •Получение сведений о структуре таблицы
- •Обязательные (not null ) и необязательные (null) столбцы
- •1.3. Вычисления с использованием данных из таблицы
- •1.4. Присваивание столбцам псевдонимов
- •1.5. Обзор операторов (команд) языка sql
Типы данных
При создании таблицы для каждого столбца следует указать тип данных и длину. Таблицы Oracle могут хранить любые разновидности данных — текст, числа, даты, изображения, звуковые файлы и т. д. Каждый тип данных имеет определенный набор свойств. Самые распространенные типы данных таблицы — это текст, числа и даты.
Текстовые типы
Для начала нужно выяснить, что в базе данных считается текстом. Это не всегда очевидно, поскольку некоторые текстовые столбцы используются только для хранения чисел.
Текстовый столбец может содержать буквы, цифры, пробелы и специальные символы — все, что можно ввести с клавиатуры. Когда в текстовый столбец вводится число, оно также рассматривается как текст. Числа в текстовых столбцах невозможно складывать, усреднять или выполнять над ними какие-либо другие математические операции. Правда, есть функции, позволяющие преобразовывать числа из текстовых столбцов в числа, пригодные для вычислений.
Для чего может потребоваться помещать число в текстовый столбец, если с ним нельзя проводить вычисления? Дело в том, что в ряде случаев числа используются не только для вычислений. Пример — телефонные номера. Возьмем такой номер:
(800)555-1212
Цифры и символы, из которых он состоит, можно интерпретировать математически, но это не будет иметь никакого смысла. То же самое справедливо для почтовых индексов (zip-кодов) вида 12345-6789 и номеров социального обеспечения вида 123-45-6789. В каждом из этих случаев данные состоят из цифр и математических символов, но они никогда не будут складываться, вычитаться и т.д. Данные такого типа лучше всего хранить в текстовом столбце.
Как определить, какой столбец использовать для хранения чисел — текстовый или числовой? Если когда-нибудь над этими числами будут выполняться математические операции (например, сложение или усреднение), то следует использовать числовой столбец. В противном случае более подходящим может оказаться текстовый столбец.
Oracle предлагает несколько разных способов хранения текста, каждый из которых рассчитан на определенное применение. Самый простой текстовый тип данных называется CHAR (сокращение от "character"). Определяя столбец CHAR, одновременно можно указать максимальное количество символов, которое он может содержать. Для этого используется команда следующего вида:
CREATE TABLE имя_таблицы (имя_столбца CHAR(n));
Этот простой пример показывает, как можно создать таблицу с одним столбцом типа CHAR. Длина столбца представлена символом "n" и обозначает место, где должно стоять число.
При определении столбца типа CHAR можно не указывать его длину. В этом случае будет использована длина по умолчанию, равная 1. Однако определение столбца без явного указания длины считается проявлением небрежности. Следует указывать длину столбца во всех случаях, даже если она равна 1.
Другим типом данных для хранения текста является VARCHAR2 (сокращение от "variable-length character"). Этот тип, как и тип CHAR, позволяет хранить текст, числа и специальные символы. Однако, если столбец CHAR предназначен для хранения, скажем, десяти символов текста, он хранит ровно десять символов, даже если введенные данные имеют меньшую длину. Оставшееся место заполняется пробелами. Так, имя "George", введенное в столбец CHAR(10), будет в действительности сохранено как "George" с четырьмя пробелами на конце. Поскольку нет никакого смысла хранить дополнительные пробелы в столбцах с содержимым переменной длины, столбцы CHAR лучше всего подходят для текстовых данных, длина которых фиксирована, например, для обозначений штатов, стран или пола.
В отличие от этого столбец типа VARCHAR2 хранит ровно столько символов, сколько было введено. Столбец VARCHAR2(10), в который введено имя "George", будет содержать только шесть символов. Тип данных VARCHAR2 лучше всего подходит для столбцов, где нельзя точно предсказать длину текста в каждой записи. Это относится к большинству текстовых столбцов, хранимых в базе данных — именам, описаниям и т.д.
Почему тип назван VARCHAR2, а не VARCHAR? Тип данных с названием VARCHAR тоже существует, и в текущих версиях Oracle он полностью аналогичен VARCHAR2. Однако корпорация Oracle заявляет, что в будущем свойства столбцов VARCHAR могут быть изменены, и пока неизвестно, что будет представлять собой измененный VARCHAR. Поэтому следует всегда указывать полное название — VARCHAR2.
При записи констант типа CHAR или VARCHAR2 следует учитывать, текстовые данные в отличие от чисел всегда окружаются одиночными кавычками.
Существует еще один тип данных, предназначенный для хранения текста: LONG. Он позволяет хранить до 2 147 483 647 символов (2 гигабайта) текста. Однако за такую огромную емкость приходится платить: тип LONG имеет много ограничений на способы использования.
Числовые типы
Для определения столбцов, в которых будут храниться только числа, используется тип данных NUMBER. При определении столбца типа NUMBER также указывается, сколько цифр должен хранить столбец. Эта спецификация может состоять из двух частей: общего количества цифр в числе и количества цифр после десятичной точки.
Предположим, что нужно создать таблицу для хранения цен на товары. Все цены не превышают ста рублей. Создается такая таблица и заполняется данными о четырех товарах с помощью следующих команд:
CREATE TABLE product (
product_name VARCHAR2(25),
product_price NUMBER(4,2)
);
INSERT INTO product VALUES ('Product Name 1', 1);
INSERT INTO product VALUES ('Product Name 2', 2.5);
INSERT INTO product VALUES ('Product Name 3', 50.75);
INSERT INTO product VALUES ('Product Name 4', 99.99);
Объявление типа данных NUMBER имеет следующий синтаксис:
NUMBER(общее_число_цифр, число_цифр_после_десяттной_точки)
Тип данных NUMBER позволяет хранить поистине огромные числа: наибольшее значение составляет 999 999 999 999 999 999 999 999 999 999 999 999 990 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000. Число цифр после десятичной точки может достигать 127. Такой диапазон значений рассчитан на промышленное применение и является одной из черт, отличающих такие серьезные базы данных, как Oracle, от офисных продуктов, к которым относятся электронные таблицы.
Типы календарные даты
С датами, хранимыми в виде текста, проводить вычисления нельзя, поскольку в текстовом представлении они не имеют числовых значений. Это просто строки символов, которые люди интерпретируют как даты. Для вычислений с датами их нужно преобразовать в числа. Поскольку большинство таких вычислений включает подсчет дней, самый удобный подход — присвоить каждому дню уникальный номер так, чтобы номер завтрашнего дня был на единицу больше номера сегодняшнего дня. Если теперь вычесть более раннюю дату из более поздней, разность будет равна числу дней между ними.
Такой способ счета дней существует давно: это юлианский календарь. Когда система использует юлианский календарь, начальному дню присваивается номер 1, следующий за ним называется днем 2 и т. д. Поскольку каждый последующий день увеличивает счетчик на единицу, календарь такого типа идеально подходит для вычислений с датами. Предусмотренный в Oracle тип DATE поддерживает юлианский календарь, где начальной датой является 1 января 4712 г. до н.э. Преобразование дат между визуальным форматом (например, '08-MAY-2004') и его юлианским эквивалентом производится автоматически. Мы просто вводим даты в привычном текстовом представлении, затем Oracle преобразует их в свой внутренний, юлианский, формат, а при выборке этих дат из таблицы они снова отображаются виде дней, месяцев и лет.
Cледующие команды дают представление о том, как происходит работа с датами в Oracle:
CREATE TABLE purchase (
product_name VARCHAR2 (25) ,
product_price NUMBER(4,2),
purchase_date DATE
);
INSERT INTO purchase VALUES
('Product Name 1', 1, ' 5-NOV-00' ) ;
INSERT INTO purchase VALUES
('Product Name 2', 2.5, ' 29-JUN-01' ) ;
INSERT INTO purchase VALUES
('Product Name 3', 50.75, ' 10-DEC-02' )
INSERT INTO plsql!01_purchase VALUES
('Product Name 4', 99.99, ' 31-AUG-03');
Кроме приспособленности к вычислениям, юлианский календарь имеет и другие достоинства. Например, если кто-то попытается вставить дату 29 февраля 2002 г. в столбец с датами, Oracle не позволит это сделать, поскольку 2002 г. не является високосным, а следовательно, не содержит 29 дней в феврале. Тип DATE допускает также хранение времени. Время хранится в виде десятичной дроби, следующей за целым числом, представляющим дату (или нулем, если компонент с датой отсутствует). Например, если значение юлианской даты равно 54321, то полдень этого дня будет представлен как 54321.5 (.5 показывает, что прошла половина дня). Время 6:00 того же дня будет храниться как 54321.25, а 18:00 — как 54321.75. Другим значениям времени будут соответствовать не столь круглые числа. Например, чтобы представить время 15:16, нужно добавить .636111111 к юлианскому номеру дня.