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

         

ALTER



ALTER

Таблица не обязательно навсегда останется такой, какой ее создали. Как только ее начинают использовать, то вдруг обнаруживается, что в ней нет чего-то такого, что обязательно должно было быть. Чтобы изменить таблицу, добавив, изменив или удалив ее столбец, воспользуйтесь командой ALTER TABLE (изменить таблицу). Команду ALTER можно применять не только к таблицам, но также к столбцам и доменам.



AVG



AVG

Функция AVG возвращает среднее арифметическое всех значений указанного столбца. к- и функция SUM, AVG применяется только к столбцам с числовым типом данных. Чтобы найти среднее арифметическое значение продаж, учитывая все финансовые операции, хранящиеся в базе, используйте функцию AVG следующим образом:

SELECT AVG(TotalSale) FROM INVOICE;

Имейте в виду, что неопределенные значения значениями не считаются, так что если в каких-либо строках в столбце TotalSale (всего продано) находятся неопределенные значения, то при подсчете средней продажи эти строки игнорируются.



COUNT



COUNT

Функция COUNT возвращает число строк указанной таблицы. Чтобы в базе данных сред. ней школы, используемой в качестве примера, подсчитать число самых юных учеников выпускных классов, воспользуйтесь следующим оператором (название GRADE означает "класс"):

SELECT COUNT (*)

    FROM STUDENT

         WHERE Grade =12 AND AGE < 14 ;



CREATE





CREATE

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

CREATE SCHEMA SALES

AUTHORIZATION SALES_MGR

DEFAULT CHARACTER SET ASCII_FULL ;

С помощью оператора CREATE DOMAIN (создать домен) устанавливаются ограничения на те значения, которые могут быть в столбце, или указывается порядок сопоставления. Устанавливаемые на домен ограничения определяют, какие объекты могут и какие не могут в нем находиться. Создавать домены можно после того, как установлена схема. Следующий пример демонстрирует, как можно использовать эту команду:

CREATE DOMAIN AGE AS INTEGER

    CHECK (AGE > 20) ;

Таблицы создаются с помощью оператора CREATE TABLE (создать таблицу), а представления — с помощью CREATE VIEW (создать представление). В этой главе уже приводились примеры использования операторов CREATE TABLE и CREATE VIEW. Когда с помощью оператора CREATE TABLE создается новая таблица, то в том же операторе на ее столбцы можно также установить ограничения. Впрочем, иногда требуется установить ограничения, которые относятся не только к таблице, но и ко всей схеме. В таких случаях используется оператор CREATE ASSERTION (создать утверждение).

Кроме того, имеются операторы CREATE CHARACTER SET (создать символьный набор), CREATE COLLATION (создать сопоставление) и CREATE TRANSLATION (создать трансляцию), которые предоставляют широкие возможности по созданию новых символьных наборов, последовательностей сопоставления или таблиц трансляции. (Последовательности сопоставления определяют порядок, в котором будут проводиться операции сравнения или сортировки. Таблицы трансляции управляют преобразованием символьных строк из одного символьного набора в другой.)



Делегирование ответственности за безопасность



Делегирование ответственности за безопасность

Если вы хотите сохранять свою систему в безопасности, то должны строго ограничить полномочия доступа, которые вы предоставляете, и круг тех людей, кому вы предоставляете эти полномочия. Однако те, кто не может работать из-за отсутствия доступа, скорее всего, будут постоянно вам надоедать. Чтобы иметь возможность сосредоточиться, вам придется кому-то делегировать часть своей ответственности за безопасность базы данных. В SQL такое Делегирование выполняется с помощью предложения WITH GRANT OPTION (с возможностью предоставления). Проанализируйте следующий пример:

GRANT UPDATE

    ON RETAIL_PRICE_LIST

         TO SALES_MANAGER WITH GRANT OPTION

Этот оператор похож на приведенный в предыдущем примере с GRANT UPDATE в том смысле, что дает возможность менеджеру по продажам обновлять розничный прайс - лист. Но, кроме того, новый оператор еще дает ему право предоставлять полномочия на обновление любому, кому он захочет. И если вы используете такую форму оператора GRANT, то обязаны не только быть уверены, что менеджер по продажам разумно использует предоставленные полномочия, но также должны быть уверены, что он будет осторожно предоставлять подобные полномочия другим пользователям.



DROP



DROP

Удалить таблицу из схемы базы данных легко. Надо только использовать команду DROP TABLE <имя_таблицы> (прекратить поддержку таблицы). В результате стираются все данные этой таблицы, а также метаданные, которые определяют ее в словаре данных, — после чего таблицы как будто и не было.



Компоненты SQL



Глава 3. Компоненты SQL

Иерархическая структура типичной базы данных SQL



Рисунок 3.5. Иерархическая структура типичной базы данных SQL












Итоговые функции



Итоговые функции

Иногда информация, которую вы хотите получить из таблицы, не связана с содержимым отдельных строк, но относится к данным таблицы, взятым в целом. Для таких ситуаций стандарт SQL: 2003 предусматривает пять итоговых функций: COUNT, MAX, MIN, SUM и AVG Каждая из этих функций выполняет действие по получению данных, относящихся к множеству строк, а не только к одной.



Язык манипулирования данными



Язык манипулирования данными

Как уже говорилось в этой главе, DDL является частью языка SQL, предназначенной для создания, модификации или разрушения структур базы данных. Непосредственно с данными язык DDL не работает. Для этого предназначена другая часть SQL — язык манипулирования данными (Data Manipulation Language, DML). Некоторые операторы DML можно читать как обычные предложения на английском языке, и эти операторы легко понять. Однако другие операторы DML могут быть, наоборот, очень сложными — как раз из-за того, что SQL дает необъятные возможности работы с данными. Если в операторе DML имеется множество выражений, предложений, предикатов или подзапросов, то даже просто понять, для чего этот оператор предназначен, может оказаться по-настоящему трудным делом. Поработав с некоторыми из них, вы, возможно, захотите переключиться на что-нибудь более легкое, например, на хирургию мозга или квантовую электродинамику. Впрочем, все не так плохо. Дело в том, что такие сложные операторы SQL можно мысленно разбивать на простые части и анализировать одну за другой.

Можно использовать такие операторы DML: INSERT (вставить), UPDATE (обновить), DELETE (удалить) и SELECT (выбрать). Они могут состоять из разных частей, в том числе из множества предложений. А в каждом предложении могут быть выражения со значениями, логические связки, предикаты, итоговые функции и подзапросы. Все они позволяют точнее отделять друг от друга записи базы данных и получать из своих данных больше информации. В главе 6 рассказывается о том, как работают команды DML, а более подробно о самих командах речь пойдет в главах 7-12.



Язык определения данных



Язык определения данных

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

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

Таблицы состоят из столбцов и строк. Схемы состоят из таблиц и представлений. Схемы находятся в каталогах.

Сама же база данных состоит из каталогов. Кое-где можно встретить и такое название базы данных, как кластер.



Язык управления данными



Язык управления данными

В языке управления данными (Data Control Language, DCL) имеются четыре команды: COMMIT (завершить), ROLLBACK (откат), GRANT (предоставить) и REVOKE (отозвать). Все эти команды связаны с защитой базы от случайного или умышленного повреждения.



Логические связки



Логические связки

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

"Ученик учится в выпускном классе".

"Ученику еще нет 14 лет".

Чтобы отделить нужные вам записи, можно с помощью логической связки AND (и) создать составной предикат, например, как этот:

CLASS = SENIOR AND AGE < 14

Если используется связка AND, то чтобы составной предикат был истинным, Должны быть оба входящих в него предиката. А если нужно, чтобы составной предикат был истинным тогда когда истинный какой-либо из входящих в него предикатов, то используйте логическую связку OR (или). Третьей логической связкой является NOT (отрицание). Строго говоря, эта связка не соединяет два предиката. Она применяется к единственному предикату и заменяет его логическое значение на противоположное. Возьмем, например, следующее выражение:

NOT (CLASS = SENIOR)

Это значение истинно только тогда, когда значение CLASS на самом деле не равно SENIOR



MAX



MAX

Функция MAX используется для определения максимального значения столбца. Скажем, требуется найти самого старшего ученика вашей школы. Естественно, таких переростков может быть несколько. Строку с его данными возвращает следующий оператор:

SELECT FirstName, LastName, Age

         FROM STUDENT

         WHERE Age = (SELECT MAX(Age) FROM STUDENT);

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

В этом запросе используется подзапрос. Этот подзапрос, SELECT MAX(Age) FROM STUDENT, находится внутри главного запроса.



Место для представления



Место для представления

Иногда из таблицы CUSTOMER (клиент) вам требуется получить определенную информацию. При этом не нужно просматривать все подряд, а только конкретные столбцы и строки. В таком случае требуется представление (view).

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



MIN



MIN

Функция MIN работает точно так же, как и МАХ, за исключением того, что MIN ищет в указанном столбце не максимальное, а минимальное значение. Чтобы найти самых юных учеников школы, можно использовать следующий запрос:

SELECT FirstName, LastName, Age

    FROM STUDENT

         WHERE Age = (SELECT MIN(Age) FROM STUDENT);

В результате появляются данные по самым младшим ученикам вашей школы.



Однотабличное представление



Однотабличное представление

Иногда данные, которые дадут ответ на ваш вопрос, находятся в единственной таблице базы данных. А если вся необходимая вам информация находится в одной таблице, то можно создать однотабличное представление данных. Скажем, например, что нужно просмотреть имена (first name), фамилии (last name) и телефонные номера (phone) всех клиентов, которые живут в штате Нью-Хэмпшир (который обозначается аббревиатурой NH). Тогда на основе таблицы CUSTOMER можно создать представление, содержащее только те данные, которые вам нужны. Оно создается при выполнении следующей команды:

CREATE VIEW NH_CUST AS

SELECT CUSTOMER.FirstName,

            CUSTOMER.LastName,

             CUSTOMER.Phone

        FROM CUSTOMER

WHERE CUSTOMER.State = 'NH' ;

Диаграмма на Рисунок 3.2 показывает, каким образом представление создается из таблицы CUSTOMER.



Ограничения ссылочной целостности угрожают вашим данным



Ограничения ссылочной целостности угрожают вашим данным

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

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

Скажем, вы, например, являетесь знаменитым аналитиком с Уолл-Стрит. Многие верят в точность вашего биржевого анализа, и если вы рекомендуете подписчикам своего бюллетеня какие-либо ценные бумаги, то многие люди их покупают, и стоимость этих бумаг растет. Ваш анализ хранится в базе данных, в которой находится таблица FOUR_STAR. В этой таблице содержатся самые лучшие рекомендации, предназначенные для следующего выпуска вашего бюллетеня. Естественно, что доступ к FOUR_STAR ограничен, чтобы ни слова не просочилось в массу инвесторов, пока бюллетень не дойдет до ваших платных подписчиков.

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

CREATE TABLE HOT_STOCKS (

         STOCK CHARACTER (30) REFERENCES FOUR_STAR

         );

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

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

REFERENCES (STOCK)

         ON FOUR_STAR

         TO IMASECRET_HACKER;

Совет 3
Совет 3

He предоставляйте полномочия тем, кто может ими злоупотребить. Конечно, гарантии у людей на лбу не написаны. Но если вы кому-либо не собираетесь давать свой новый автомобиль для дальней поездки, то, скорее всего, не должны также предоставлять этому человеку и полномочия REFERENCES на ценную таблицу.

Этот пример показывает первую уважительную причину, чтобы осторожно обращаться с полномочиями REFERENCES. А ниже указаны еще две причины, чтобы быть осторожными с этим видом полномочий.

Если кто-то другой установил в таблице HOT_STOCKS ограничение с помощью ключевого слова RESTRICT (ограничить), а вы пытаетесь из своей таблицы удалить строку, то СУБД сообщит, что вам этого делать нельзя, так как будет нарушена ссылочная целостность. Вы решаете, что для уничтожения вашей таблицы нужна команда DROP (прекратить), и обнаруживаете, что уничтожить свое ограничение (или свою таблицу) вначале должен кто-то другой.

Следовательно, предоставление другим лицам возможности устанавливать ограничения целостности на вашу таблицу не только создает потенциальную угрозу безопасности, но иногда и усложняет вашу работу.



Подзапросы



Подзапросы

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



Пользователи и полномочия



Пользователи и полномочия

Кроме повреждения данных, вызванного проблемами с оборудованием и программами или неумышленными совместными действиями двух пользователей, целостности данных угрожает и другая большая опасность. Это сами пользователи. Некоторым людям вообще нельзя иметь доступ к данным. Другим — только ограниченный доступ к некоторым данным и никакого доступа к остальным. А кое-кто должен иметь неограниченный доступ ко всем данным. Поэтому вам нужна система, предназначенная для классификации пользователей по категориям и присвоения этим пользователям в соответствии с их категорией определенных полномочий доступа.

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

SQL дает возможность защищать следующие объекты базы данных.

Таблицы. Столбцы. Представления. Домены. Символьные наборы. Сопоставления. Трансляции.

О символьных наборах, сопоставлениях и трансляциях рассказывается в главе 5. Стандарт SQL:2003 поддерживает различные виды защиты: защиту просмотра, добавления, модификации, удаления, применения ссылок и использования баз данных, а также виды защиты связанные с выполнением внешних процедур.

Доступ разрешается с помощью оператора GRANT (разрешить), а аннулируется с помощью тора REVOKE (отозвать). Управляя использованием команды SELECT, DCL позволяет определить тех, кто может видеть объекты базы данных, такие, например, как таблица, столбец или представление. В случае команды INSERT DCL позволяет определить тех, кто может добавлять в таблицу новые строки. То, что команда UPDATE может применяться только авторизованными пользователями, дает возможность назначать пользователей, ответственных за изменение табличных строк, и аналогично в случае команды DELETE — тех, кто может такие строки удалять.

Если в одной таблице базы данных имеется столбец, который для этой таблицы является внешним ключом, а для другой таблицы из этой базы — первичным, то для первой таблицы, если она ссылается на вторую, можно установить ограничение. Дело в том, что когда одна таблица ссылается на другую, то владелец первой из них, вероятно, сможет получать информацию о содержимом второй. Владельцу же второй таблицы, возможно, захочется этот доступ пресечь. Такая возможность дается в виде оператора GRANT REFERENCES (предоставить доступ по ссылке). В следующем разделе рассказывается о проблеме, связанной с "предательской" ссылкой, и о том, как оператор GRANT REFERENCES решает эту проблему. Применяя оператор GRANT USAGE (предоставить использование), можно назначать пользователей, которым позволено использование или просмотр содержимого домена, набора символов, сопоставления или трансляции. (Об этом рассказывается в главе 13.)

Операторы SQL, с помощью которых предоставляют или отзывают полномочия, приведены в табл. 3.4.



Предикаты



Предикаты

Предикаты- это используемые в SQL эквиваленты логических высказывании. Примером высказывания является следующее выражение:

"Ученик учится в выпускном классе".

В таблице, содержащей информацию об учениках, домен столбца CLASS (класс) может быть набором таких значений: SENIOR (выпускной), JUNIOR (предпоследний), SOPHOMORE (второй старший класс), FRESHMAN (первый старший класс) и NULL (неизвестен). Предикат CLASS = SENIOR можно использовать для отсева тех строк, для которых его значение ложно, оставляя, соответственно, только те строки, для которых значение этого предиката истинно. Иногда в какой - либо строке значение этого предиката не известно (т.е. представляет собой NULL). В таком случае строку можно отбросить или оставить в зависимости от конкретной ситуации.

CLASS = SENIOR - это пример предиката сравнения. В SQL имеется шесть операторов сравнения. В простом предикате сравнения используется только один из этих операторов. Предикаты сравнения и примеры их использования приведены в таблице 3.3.



Создание представления



Рисунок З.2. Создание представления NH_CUST из таблицы CUSTOMER


Совет 1
Совет 1

Этот код безупречно правильный, но немного громоздкий. Ту же самую операцию можно выполнить, набирая команды и покороче. Это возможно тогда, когда имеющаяся у вас реализация SQL допускает, что если в перечисленных атрибутах не указаны ссылки на таблицу, то все атрибуты относятся к таблице предложения FROM. Если ваша система в состоянии сделать это разумное допущение, то команду можно сократить до следующих строк:

CREATE VIEW NH_CUST AS

    SELECT FirstName, LastName, Phone

        FROM CUSTOMER

         WHERE STATE = 'NH' ;

Хотя этот вариант записи проще, подобное представление может неправильно работать после применения команд ALTER TABLE. Конечно, если оператор JOIN (соединить) не используется, такого не случится. А для представлений с операторами JOIN лучше использовать полные имена. Об операторах JOIN рассказывается в главе 10.



Создание многотабличного



Рисунок З.4. Создание многотабличного представления с помощью оператора JOIN


Ниже приведены положения для четырех операторов CREATE VIEW.

Первый оператор соединяет столбцы из таблицы CUSTOMER со столбцом из таблицы INVOICE и создает представление SKI_CUST1. Второй оператор соединяет представление SKLCUST1 со столбцом из таблицы INVOICE_LINE, создавая таким образом представление SKI_CUST2. Третий оператор соединяет представление SKLCUST2 со столбцом из таблицы PRODUCT и создает представление SKI_CUST3. Четвертый оператор отбрасывает все строки, где в поле категории товара отмечено не 'Ski' (лыжи). В результате получается представление SKI_CUST, в котором находятся имена, фамилии и адреса тех клиентов, которые хотя бы один раз купили товары категории 'Ski'. Каждому из этих клиентов, даже если он покупал лыжи много раз, в представлении SKI_CUST будет соответствовать только одна запись. Это достигается благодаря ключевому слову DISTINCT (отдельный), которое находится в SELECT четвертого оператора CREATE VIEW. (Об операторах JOIN подробно говорится в главе 10.)

Сборка таблиц в схемы



Сборка таблиц в схемы

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

В системе, где может сосуществовать несколько несвязанных друг с другом проектов, можно соединить все таблицы, связанные друг с другом отношениями, в одну схему. А из таблиц, не вошедших в эту схему, можно образовать другие схемы. Чтобы таблицы из одного проекта не оказались случайно в другом, схемам следует дать имена. У каждого проекта имеется своя собственная схема, которую по имени можно будет отличать от других схем. Некоторые табличные имена (например, CUSTOMER, PRODUCT и т.д.) могут встречаться сразу в нескольких проектах. Если есть хоть малейший шанс, что возникнет путаница с именами, необходимо в именах таблиц указывать имя схемы (примерно так: ИМЯ_СХЕМЫ.ИМЯ_ТЛБЛИЦЫ). Если имя схемы не указано, SQL будет считать, что эта таблица относится к схеме, подразумеваемой по умолчанию.

Помни: У базы данных, кроме логической, есть еще и физическая схема. Физическая схема — это способ, с помощью которого данные и соответствующие им компоненты, например индексы, физически размещаются на диске компьютера. И когда в книге говорится о схеме базы данных, то имеется в виду логическая схема, а не физическая.



Создание многотабличного представления



Создание многотабличного представления

Чтобы получать ответы на имеющиеся вопросы, часто приходится выбирать данные не менее чем из двух таблиц. Скажем, вы работаете в магазине спорттоваров, и для рассылки рекламы по почте вам нужен список клиентов, купивших у вас в прошлом году лыжное снаряжение. Скорее всего, потребуется информация из следующих таблиц: CUSTOMER (клиент), PRODUCT (товар), INVOICE (счет-фактура) и INVOICE_LINE (строка счета-фактуры). На их основе можно создать многотабличное представление, которое покажет нужные данные. Создав представление, его можно использовать снова и снова. При каждом гаком использовании представление отображает последние изменения в таблицах, на основе которых это представление создано.

В базе данных магазина спорттоваров имеются четыре таблицы: CUSTOMER, PRODUCT, INVOICE и INVOICE_LINE. Структура каждой из них показана в табл. 3.1.



Создание таблиц



Создание таблиц

Таблица базы данных представляет собой двумерный массив, состоящий из строк и столбцов. Создать таблицу можно с помощью команды языка SQL CREATE TABLE (создать таблицу). В команде следует указать имя и тип данных каждого столбца.

После того как таблица создана, можно приступать к ее заполнению данными. (Впрочем, загружать данные — это дело языка DML, а не DDL.) Если требования меняются, то изменить структуру уже созданной таблицы можно с помощью команды ALTER TABLE (изменить таблицу). Со временем таблица может перестать быть полезной или устареть. И если час таблицы пробил, то уничтожить ее можно с помощью команды DROP (прекратить). Имеющиеся в SQL разные формы команд — CREATE (создать) и ALTER (изменить), а также DROP — как раз и представляют собой язык DDL.

Скажем, вы проектируете базы данных и не хотите, чтобы их таблицы постепенно, по мере обновления имеющихся в них данных, стали бы "неудобоваримыми". Чтобы обеспечить поддержку целостности данных, вы принимаете решение: структура таблиц этой базы должна быть наилучшим образом нормализована. Нормализация, которая сама по себе является широким полем для исследования, — это способ задания такой структуры таблиц баз данных, в которой обновление данных не создавало бы аномалий. В каждой создаваемой таблице столбцы соответствуют атрибутам, которые тесно связаны друг с другом.

Вы, например, можете создать таблицу CUSTOMER (клиент), в которой имеются такие атрибуты: CUSTOMER.CustomerlD (идентификатор клиента), CUSTOMER.FirstName (имя), CUSTOMER.LastName (фамилия), CUSTOMER.Street (улица), CUSTOMER.Sity (город), CUSTOMER.State (штат), CUSTOMER.Zipcode (почтовый код) и CUSTOMER.Phone (телефон). Все эти атрибуты имеют отношение к описанию клиента, а не любого другого объекта. В них находится более-менее постоянная информация о клиентах вашей организации.

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

CREATE TABLE CUSTOMER (
CustomerlD INTEGER NOT NULL,
FirstName CHARACTER (15),
LastName CHARACTER (20) NOT NULL,
Street CHARACTER (25),  
City CHARACTER (20),  
State CHARACTER (2),  
Zipcode INTEGER  
Phone CHARACTER (13) ) ;  

Для каждого столбца указывается его имя (например, CustomerlD), тип данных (например, INTEGER) и, возможно, одно или несколько ограничений, например NOT NULL (не может быть неопределенным значением).

На Рисунок 3.1 показана часть таблицы CUSTOMER с теми данными, которые могут быть введены в нее.



Структура базы данных магазина спорттоваров



Рисунок 3.3. Структура базы данных магазина спорттоваров


Таблица CUSTOMER поддерживает отношение с таблицей INVOICE, используя их общий столбец CustomerlD. А отношение таблицы INVOICE с таблицей INVOICE_LINE поддерживается с помощью общего столбца InvoiceNumber. Отношение же таблицы PRODUCT с таблицей INVOICE_LINE поддерживается с помощью общего столбца ProductDD. В сущности эти отношения и делают саму базу реляционной, т.е. работающей на основе отношений.

Чтобы получить информацию о тех клиентах, которые купили лыжное оборудование, необходимы данные из следующих полей: FirstName, LastName, Street, City, State и Zipcode из таблицы CUSTOMER; Category — из таблицы PRODUCT; InvoiceNumber — из таблицы INVOICE, а также LineNumber— из таблицы INVOICE_LINE. Нужное представление можно создавать поэтапно, используя для этого следующие команды:

CREATE VIEW SKI_CUST1 AS

    SELECT FirstName,

         LastName, Street,

         City,

         State,

         Zipcode,

         InvoiceNumber

    FROM CUSTOMER JOIN INVOICE

    USING (CUSTOMER_ID) ;

CREATE VIEW SKI_CUST2 AS

   SELECT FirstName,

          LastName,

         Street,

         City,

         State,

         Zipcode,

         ProductID

    FROM SKI_CUST1 JOIN INVOICE_LINE

   USING (InvoiceNumber) ;

CREATE VIEW SKI_CUST3 AS

SELECT FirstName,

         LastName,

         Street,

         City,

         State,

         Zipcode,

         Category

    FROM SKI_CUST2 JOIN PRODUCT

   USING (ProductID) ;

CREATE VIEW SKI_CUST AS

   SELECT DISTINCT FirstName,

         LastName,

         Street,

         City,

         State,

         Zipcode

   FROM SKI_CUST3

   WHERE CATEGORY = 'Ski' ;

Эти операторы CREATE VIEW соединяют данные из множества таблиц, используя для этого оператор JOIN. Диаграмма всего этого процесса показана на Рисунок 3.4.



SUM



SUM

Функция SUM складывает значения из указанного столбца. Столбец должен иметь один из числовых типов данных, а значение суммы не должно выходить за пределы диапазона, предусмотренного для этого типа. Таким образом, если столбец имеет тип данных SMALLINT, то полученная сумма не должна превышать верхний предел, имеющийся у этого типа данных-В таблице INVOICE (счет-фактура) из базы данных, о которой уже говорилось в этой главе, хранятся данные по всем продажам. Чтобы найти общую сумму в долларах для всех продаж, иные которых хранятся в базе, используйте функцию SUM следующим образом:

CELECT SUM(TotalSale) FROM INVOICE;



базы данных магазина спорттоваров



Таблица 3.1. Таблицы базы данных магазина спорттоваров

Таблица Столбец Тип данных Ограничение
CUSTOMER CustomeriD (идентификационный номер клиента) INTEGER NOT NULL (не может быть
неопределенным значением)
FirstName (имя) CHARACTER (15)  
  LastName (фамилия) CHARACTER (20) NOT NULL
  Street (улица) CHARACTER (25)  
  City (ГОРОД) CHARACTER (20)  
  State (штат) CHARACTER (2)  
  Zipcode (ПОЧТОВЫЙ КОД) INTEGER  
  Phone (телефон) CHARACTER (13)  
PRODUCT Product id (идентификационный номер товара) INTEGER NOT NULL
  Name (название) CHARACTER (25)  
  Description (описание) CHARACTER (30)  
  Сategory (категория) CHARACTER (15)  
  Vendor id (идентификационный номер поставщика) INTEGER  
  VendorName (наименование поставщика) CHARACTER (30)  
INVOICE InvoiceNumber (номер счета-фактуры) INTEGER NOT NULL
  CustomeriD (идентификационный номер покупателя) INTEGER  
  InvoiceDate (дата выписки счета-фактуры) DATE  
  Totalsale (всего продано на сумму) NUMERIC (9 ,2)  
  TotalRemitted (всего оплачено) NUMERIC (9 ,2)  
  Formof Payment (форма платежа) CHARACTER (10)  
INVOICE_LINE LineNumber (номер строки) INTEGER NOT NULL
  InvoiceNumber (номер счета-фактуры) INTEGER  
  Product id (идентификационный номер товара) INTEGER  
  Quantity (количество) INTEGER  
  SalePrice (продано по цене) NUMERIC (9 ,2)  

Обратите внимание, что в некоторых столбцах табл. 3.1 имеется ограничение NOT NULL (не может быть неопределенным значением). Эти столбцы являются или первичными ключами соответствующих таблиц, или вы решили, что есть другие причины, по которым их значения обязательно должны быть определенными. Первичный ключ таблицы должен однозначно идентифицировать каждую ее строку. Значение этого ключа в каждой строке должно быть определенным. (Подробно о ключах говорится в главе 5.)

Таблицы связываются друг с другом посредством общих столбцов. Ниже описаны связи между таблицами. (Отношения таблиц представлены на Рисунок 3.3.)

Таблицу CUSTOMER связывает с другой таблицей, INVOICE, отношение "один ко многим". Один клиент может сделать множество покупок, в результате чего получится множество счетов-фактур. Однако каждый счет-фактура имеет отношение к одному и только одному клиенту. Таблицу INVOICE связывает с таблицей INVOICE_LINE также отношение "один ко многим". Ведь в счете-фактуре может быть множество строк, но каждая строка находится в одном и только одном счете-фактуре. Таблицу PRODUCT с таблицей INVOICE_LINE связывает отношение "один ко многим". Каждый товар может быть во множестве строк в одном или многих счетах-фактурах. Однако каждая строка относится к одному и только одному товару.

Примеры конкатенации строк



Таблица 3.2. Примеры конкатенации строк

Выражение Результат
'военная' | | 'разведка' 'военная разведка'
'абра' | | 'кадабра' 'абракадабра'
CITY| | ' ' | |STATE| | ' '| |ZIP Общая строка с названиями города, штата и с почтовым кодом, которые отделены друг от друга пробелами


Операторы и предикаты сравнения



Таблица 3.3. Операторы и предикаты сравнения

Оператор Сравнение Выражение
= Равно CLASS = SENIOR
<> Не равно CLASS <> SENIOR
< Меньше CLASS < SENIOR
> Больше CLASS > SENIOR
<= Меньше или равно CLASS <= SENIOR
>= Больше или равно CLASS >= SENIOR


Виды защиты



Таблица 3.4. Виды защиты

Действие по защите Оператор
Позволяет просматривать таблицу GRANT SELECT
Не позволяет просматривать таблицу REVOKE SELECT
Позволяет вставлять строки в таблицу GRANT INSERT
Не позволяет вставлять строки в таблицу REVOKE INSERT
Позволяет менять значения в строках таблицы GRANT UPDATE
Не позволяет менять значения в строках таблицы REVOKE UPDATE
Позволяет удалять строки из таблицы GRANT DELETE
Не позволяет удалять строки из таблицы REVOKE DELETE
Позволяет ссылаться на таблицу GRANT REFERENCES
Не позволяет ссылаться на таблицу REVOKE REFERENCES
Позволяет использовать домен, набор символов, сопоставление или трансляцию GRANT USAGE ON DOMAIN, REVOKE USAGE ON CHARACTER SET, REVOKE USAGE ON COLLATION, REVOKE USAGE ON TRANSLATION
Не позволяет использовать домен, набор сопоставление или трансляцию REVOKE USAGE ON DOMAIN, REVOKE USAGE ON CHARACTER SET, REVOKE USAGE ON COLLATION, REVOKE USAGE ON TRANSLATION

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

GRANT SELECT

    ON CUSTOMER

         TO SALES_MANAGER;

В этом случае один пользователь, менеджер по продажам, получает возможность пи сматривать таблицу CUSTOMER (клиент).

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

GRANT SELECT

         ON RETAIL_PRICE_LIST

         TO PUBLIC;

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

GRANT UPDATE

         ON RETAIL_PRICE_LIST

         TO SALES_MANAGER;

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

GRANT INSERT

         ON RETAIL_PRICE_LIST

         TO SALES_MANAGER;

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

GRANT DELETE

         ON RETAIL_PRICE_LIST

         TO SALES_MANAGER;



CUSTOMER которую можно



Рисунок 3.1. Таблица CUSTOMER, которую можно создать с помощью команды Create Table


Помни: Если используемая вами реализация SQL не полностью соответствует SQL.2003, то синтаксис, которым вам придется пользоваться, может и не совпадать с приведенным в этой книге. За специальной информацией обратитесь к документации к СУБД.

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

Не совсем. На самом деле это — неверный подход. Когда вдохновение и энтузиазм не дожидались, пока будет проведено тщательное планирование, многие проекты по созданию баз данных с самого начала получались ущербными. Пусть вы уверены, что имеете в уме четкое представление о том, какая структура должна быть у базы данных. Однако даже в этом случае запишите все на бумаге, а лишь после этого прикасайтесь к клавиатуре. Ниже приведены процедуры, о которых не стоит забывать при планировании базы данных.

Определите все таблицы, которые вам нужны. Определите, какие столбцы должны быть в каждой таблице. Присвойте каждой таблице первичный ключ, в уникальности которого вы уверены. (О первичных ключах говорится в главах 4 и 5. В каждой таблице должен быть как минимум один столбец, общий с какой-либо другой таблицей базы данных. Такие общие столбцы служат для логического соединения, позволяющего информации в одной таблице ссылаться на соответствующую информацию в другой. Приведите каждую таблицу по меньшей мере в третью нормальную форму (ЗНФ), гарантирующую от аномалий ввода, удаления или обновления. (О нормализации баз данных рассказывается в главе 5.

Только создав проект на бумаге и проверив, насколько хорошо он смотрится, вы будете готовы перенести его в компьютер, используя команду CREATE языка SQL.



Транзакции



Транзакции

Базы данных наиболее уязвимы именно тогда, когда в них вносят изменения. Изменения могут быть опасными даже для однопользовательских баз. Аппаратный или программный сбой, происшедший во время изменения, может застать базу данных в переходном состоянии — между состоянием в момент начала изменений и состоянием, которое было бы в момент завершения этих изменений.

С целью защиты базы данных язык SQL ограничивает операции, которые могут ее изменить, так что они выполняются только в пределах транзакций. Во время транзакции SQL записывает каждую операцию с данными в файл журнала. Если транзакцию, перед тем как она будет завершена оператором COMMIT, что-то прервет, то можно восстановить первоначальное состояние системы с помощью оператора ROLLBACK. Этот оператор обрабатывает журнал транзакций в обратном порядке, отменяя все действия, имевшие место во время транзакции. Выполнив откат базы данных до состояния, в котором она была перед началом транзакции, можно выяснить, что вызвало неполадки, а затем попробовать еще раз выполнить транзакцию.

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

Совет 2
Совет 2

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

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

Технические подробности: Возможно, вы удивитесь, что совместные действия двух пользователей могут при. вести к некорректным результатам. Скажем, Донна читает запись какой-либо таблицы из базы данных. Через мгновение Дэвид меняет в той записи значение числового поля. А теперь в то же иоле Донна записывает число, полученное на основе значения, прочитанного ею вначале. И так как она не знает об изменении, сделанном Дэвидом, то ее операция является некорректной.

Другая неприятность может произойти, когда Донна вносит в запись какие-то значения, а Дэвид затем эту запись читает. И если Донна проводит откат своей транзакции, то Дэвид не знает об этой операции и выполняет свои действия на основе прочитанного им значения, которое не совпадает со значением, имеющимся в базе после отката. То, что смешно в кинокомедии, не всегда приятно в реальной жизни.



это язык, специально разработанный, чтобы



В этой главе...

Создание баз данных Обработка данных Защита баз данных SQL — это язык, специально разработанный, чтобы создавать и поддерживать данные в реляционных базах. И хотя компании, поставляющие системы для управления такими базами, предлагают свои реализации SQL, развитие самого языка определяется и контролируется стандартом ISO/ANSI. Этот стандарт пересматривался последний раз в 2003 году. Все реализации в большей или меньшей степени отличаются от стандарта. Но как можно более полное следование стандарту— главное условие для работы базы данных и связанных с ней приложений на более чем одной платформе.
SQL не является программным языком общего назначения, но некоторые достаточно мощные средства у него все же имеются. Все необходимые действия по созданию, изменению, поддержке базы данных и обеспечению ее безопасности выполняются с помощью входящих в состав SQL трех языков.
Язык определения данных (Data Definition Language, DDL). Это та часть SQL, которая используется для создания (полного определения) базы данных, изменения ее структуры и удаления базы после того, как она становится ненужной. Язык манипулирования данными (Data Manipulation Language, DML). Предназначен для поддержки базы данных. С помощью этого мощного инструмента можно точно указать, что именно нужно сделать с данными, находящимися в базе, — ввести, изменить или выбрать нужные. Язык управления данными (Data Control Language, DCL). Защита базы данных от различных вариантов повреждения. При правильном использовании DCL обеспечивает защиту базы, а степень защищенности зависит от используемой реализации. Если реализация не обеспечивает достаточной защиты, то довести защиту до нужного уровня необходимо при разработке прикладной программы. В этой главе вы познакомитесь с DDL, DML и DCL.

В некоторых реализациях SQL вместо



Внимание

В некоторых реализациях SQL вместо || в качестве оператора конкатенации используют +. Есть реализации, в которых вместо конкатенации используются строковые операторы, но стандарт SQL:2OO3 эти операторы не поддерживает.



Внимание

В последнем примере только первые два выражения имеют смысл (CLASS = SENIOR и CLASS <> SENIOR). Это объясняется тем, что SOPHOMORE считается больше, чем SENIOR, потому что в последовательности сопоставления, установленной по умолчанию (т.е. когда сортировка выполняется по алфавиту), SO следует после SE. Однако такая интерпретация, по всей вероятности, — не то, что вам нужно.



Внимание

Крайняя доверчивость означает и крайнюю уязвимость. Будьте чрезвычайно осторожны, используя подобные операторы: GRANT ALL PRIVILEGES
         ON FOUR_STAR
         TO BENEDICT_ARNOLD WITH GRANT OPTION
Здесь пользователь В ENEDICT_ ARNOLD получает все полномочия FOUR_STAR с возможностью передачи этих полномочий другим лицам.
 

Выражения с числовыми значениями



Выражения с числовыми значениями

Чтобы комбинировать числовые значения, используйте операторы сложения (+), вычитания (-), умножения (*) и деления (/). В следующих строках приведено несколько примеров выражений с числовыми значениями:

12 - 7

15/3 - 4

6 * (8+2)

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

SUBTOTAL + TAX + SHIPPING

6 * MILES/HOURS

:months/12

Двоеточие в последнем примере говорит о том, что следующий за ним терм (months — месяцы) является или параметром, или базовой переменной.



Выражения с логическими значениями



Выражения с логическими значениями

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

(CLASS = SENIOR) IS TRUE

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

NOT (CLASS = SENIOR) IS TRUE

To же самое условие можно выразить и по-другому:

(CLASS = SENIOR) IS FALSE

Чтобы получить все строки, имеющие в столбце CLASS неопределенное значение, используйте

(CLASS = SENIOR) IS UNKNOWN



Выражения со строковыми значениями



Выражения со строковыми значениями

В выражениях со строковыми значениями может находиться оператор конкатенации (||). С его помощью, как показано в табл. 3.2, две текстовые строки объединяются в одну.



Выражения со значениями



Выражения со значениями

Чтобы комбинировать два или несколько значений, можно использовать выражения со значениями. В соответствии с разными типами данных имеется девять видов таких выражений:

числовые; строковые; даты-времени; интервальные; логические; определяемые пользователем; записи; коллекции.

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



Выражения со значениями датывремени



Выражения со значениями даты-времени и интервальными значениями

Выражения со значениями даты-времени, оказывается, работают (кто бы мог подумать!) со значениями даты и времени. В таких выражениях могут появляться данные типа DATE, TIME, TIMESTAMP и INTERVAL. Результатом выполнения выражений со значениями даты-времени всегда является другое значение даты-времени. К значению этого типа можно прибавить (или отнять от него) какой-либо интервал, а также задать часовой пояс.

Вот пример выражения со значениями даты-времени (название DUE_DATE означает "срок возврата", a INTERVAL 7' DAY — "интервал в 7 дней"):

DUE_DATE + INTERVAL '7' DAY

Такое выражение можно использовать в библиотечной базе данных, чтобы определять, когда отправить напоминание "должникам". А вот новый пример, где, правда, указывается не дата, а время:

TIME '18:55:48' AT LOCAL

Ключевые слова AT LOCAL означают, что указано местное время.

Выражения со значениями интервалов работают с промежутками времени между значениями даты-времени. Имеются два вида интервалов: год-месяц и день-время. Их нельзя использовать в одном и том же выражении.

Приведем пример использования интервалов. Скажем, кто-то возвращает в библиотеку книгу после истечения крайнего срока. Тогда, используя выражение со значениями интервалов, такое, например, как приведено в следующем примере, можно вычислить, сколько прошло дней задержки после крайнего срока, и соответственно назначить пеню (названия DATE_RETURNED и DATE_DLIE означают соответственно "дата возврата" и "крайний срок"):

(DATE_RETURNED-DATE_DUE) DAY

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



Выражения со значениями определяемыми пользователем



Выражения со значениями, определяемыми пользователем

О типах, определяемых пользователями, см. в главе 2. Благодаря такой возможности пользователи могут определять собственные типы данных, а не довольствоваться теми, которые есть на "складе" SQL. Если есть выражение, имеющее элементы данных какого-либо типа, определяемого пользователем, то значением этого выражения должен быть элемент того же типа.



Выражения со значениями типа коллекции



Выражения со значениями типа коллекции

Значением выражения типа коллекции является массив.



Выражения со значениями типа ссылки



Выражения со значениями типа ссылки

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



Выражения со значениями типа записи



Выражения со значениями типа записи

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

('Джозеф Тайкосинер', 'заслуженный профессор в отставке', 1918)

Это строка таблицы сотрудников факультета, содержащей поля имени, фамилии, статуса и года начала работы на факультете.



Заказ по каталогу



Заказ по каталогу

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

При указании имени таблицы можно также использовать имена ее каталога и схемы. Таким образом, гарантируется, что никто не перепутает две таблицы с одним и тем же именем, находящиеся в схемах с одинаковым именем. Имя таблицы с указанием каталога имеет следующий формат: ИМЯ_КАТАЛОГА.ИМЯ_СХЕМЫ.ИМЯ_ТАБЛИЦЫ.

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

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

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



Знакомство с командами DDL



Знакомство с командами DDL

Язык определения данных (DDL) работает со структурой базы данных, в то время как язык манипулирования (он будет описан позже) — с данными, которые находятся в этой структуре. DDL состоит из следующих трех команд.

Для создания основных структур базы данных используются разные формы команды CREATE (создать). Для изменения созданных структур применяется команда ALTER (изменить). Команда DROP (прекратить) применяется к таблице, чтобы не только удалить табличные данные, но и разрушить саму структуру этой таблицы.

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



Чтобы удалить таблицу выберите



Рисунок 4.12. Чтобы удалить таблицу, выберите ее имя и щелкните на пиктограмме


Приложение Access выдаст сообщение с вопросом, действительно ли вы хотите удалить выбранную таблицу. После подтверждения таблица будет немедленно удалена.

Помни: Если Access удаляет таблицу, то также удаляются все связанные с ней таблицы и все ее индексы.



Диалоговое окно Индексы



Рисунок 4.10. Диалоговое окно Индексы


Совет 2
Совет 2

Access автоматически создает индекс для поля PostalCode, поскольку это поле часто используется для поиска данных.

Вы можете заметить, что, в отличие от ProposalNumber, поле PostalCode может не являться первичным ключом, и его значения не обязательно уникальны. Можно создать индексы для полей LastName и HowKnown, так как они, вероятно, также будут использоваться для доступа к данным. На Рисунок 4.11 изображено, как выглядят эти новые индексы.



Диалоговое окно определения первичного ключа



Рисунок 4.6. Диалоговое окно определения первичного ключа


Сохранив таблицу, вы, возможно, решите, что первоначальный замысел нуждается в улучшении. (Об этом вы прочитаете в разделе "Изменение структуры таблицы".) Со своими заманчивыми предложениями к вам подходило столько людей, и в результате выяснилось, что некоторые из этих ребят одновременно и тезки и однофамильцы. Чтобы не было путаницы, вы решили к каждой записи из таблицы базы данных добавить уникальный номер предложения. Таким образом, вы сможете отличить одного Дэвида Ли от другого.



Диалоговое окно создания таблицы



Рисунок 4.2. Диалоговое окно создания таблицы


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

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





Рисунок 4.4. Диалоговое окно создания таблицы со всеми определенными полями


Теперь, когда таблица определена, сохраните ее, выбрав команду Файл - Сохранить.

На Рисунок 4.5 представлено диалоговое окно с предложением ввести имя таблицы, которую вы хотите сохранить. Свою таблицу я назвал PowerDesign. Эта таблица, созданная в режиме конструктора, будет состоять из победителей лотереи Пауэрбол.



Создание и поддержка простой базы данных



Глава 4. Создание и поддержка простой базы данных

Использование языка SQL с приложением Microsoft Access



Использование языка SQL с приложением Microsoft Access

Приложение Access было разработано как инструмент быстрой разработки приложений (RAD), не требующий программирования. Несмотря на то что можно писать и выполнять команды на языке SQL непосредственно в Access, чтобы сделать это, можно зайти также с "черного хода". Для того чтобы открыть основной редактор, который используется для ввода SQL-кода, выполните следующие действия.

Откройте базу данных, а затем выберите из списка Объекты опцию Запросы. В области задач, расположенной в правой части окна, выберите опцию Создание запроса в режиме конструктора. Отобразится диалоговое окно Добавить таблицу. Выберите любую из таблиц, щелкните на кнопках Добавить и Закрыть. Не обращайте внимание на курсор, который мигает в только что созданном окне Запрос. В главном меню Access выберите команду Вид Режим SQL. Отобразится окно редактора со стартовым оператором языка SQL SELECT. Удалите оператор SELECT, а затем введите необходимый оператор SQL. Закончив работу, щелкните на пиктограмме Сохранить. Access предложит ввести имя для только что созданного запроса. Введите имя запроса и щелкните на кнопке ОК.

Только что созданная команда будет сохранена и выполнена позже как запрос. К сожалению, Access не выполняет весь диапазон команд SQL. К примеру, оно не выполняет команду CREATE TABLE. Однако после создания таблицы можно выполнять практически любое необходимое преобразование с находящимися в ней данными.



Изменение структуры таблицы



Изменение структуры таблицы

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

Если вы создаете базу данных для себя, то недостатки в ее структуре, которых совсем не было видно до реального создания базы, уже после создания этой структуры неизбежно всплывут на поверхность. Возможно, что к вам, например, начинают поступать предложения не только из США. Тогда нужно добавить столбец Country (страна). Или вы решили, что будет полезен еще и адрес электронной почты. В любом случае придется вернуться назад и переделать то, что вы создали. Такая возможность— переделывать уже созданное— имеется во всех RAD-инструментах. Чтобы показать типичный пример, я, используя Access, внесу некоторые изменения в созданную мной таблицу. Другие инструменты работают подобным образом.

Предположим, нужно добавить уникальный номер предложения, чтобы можно было различать предложения от разных людей с одинаковыми именами и фамилиями. Если уж на то пошло, то можно также добавить еще два поля. Это, во-первых, еще одно поле Address2 (адрес 2), которое пригодится для тех, у кого несколько адресов, и, во-вторых, поле Country — для предложений из других стран.

Чтобы вставить новую строку и внести изменения, соответствующие требованиям, выполните следующие действия.

В диалоговом окне определения таблицы поместите курсор в самую верхнюю строку и выберите команду Вставить - Строки (Рисунок 4.7).



Изменение структуры таблицы

Для изменения структуры существующей таблицы можно использовать команду SQL ALTER TABLE (изменить таблицу). Интерактивные средства SQL, находящиеся на вашей клиентской станции, не такие удобные, как RAD-инструмент. Этот инструмент показывает табличную структуру, которую затем можно изменить. А используя SQL, необходимо заранее знать и структуру таблицы, и то, каким образом эту структуру следует изменять. В том месте экрана, где находится приглашение, необходимо для внесения изменения ввести соответствующую команду. Впрочем, если в прикладной программе нужно поместить операторы изменения таблицы, то обычно самый легкий способ это сделать — все-таки использовать SQL.

Чтобы добавить в таблицу PowerSQL второе поле для адреса, используйте следующую команду DDL:

ALTER TABLE PowerSQL

ADD COLUMN Address__2 CHAR (30);

Чтобы расшифровать этот код, не нужно быть гуру SQL. В действительности это может сделать даже профан со слабыми познаниями в английском. Эта команда изменяет таблицу с названием PowerSQL, добавляя в нее новый столбец, который называется Address2, имеет тип данных CHAR и длину 30 символов. Приведенный пример показывает, насколько легко менять структуру таблиц в базе данных, используя для этого команды DDL из SQL.

Стандарт SQL:2003 разрешает использовать этот оператор для добавления в таблицу столбца, а также удаления имеющегося столбца, как показано в следующем примере:

ALTER TABLE PowerSQL

    DROP COLUMN Address2;

Экран появившийся при создании



Рисунок 4.1. Экран, появившийся при создании новой базы данных в Microsoft Access












Экран проекта дает полный контроль



Экран проекта дает полный контроль

Экран, представленный на Рисунок 4.1, содержит намного больше информации, чем выводили программы СУБД предыдущих поколений. В 1980-е годы общение с типичной системой СУБД начиналось с пустого экрана, оттеняемого подсказкой из одного символа. С тех пор управление базами данных прошло долгий путь, и теперь намного легче узнать о том, с чего надо начинать. В правой части рабочего пространства находится область задач Приступая к работе с несколькими разделами.

Раздел Microsoft Office Online содержит команды, которые предоставляют доступ к интерактивным ресурсам Microsoft, связанным с приложением Асcess, и поле Искать. Раздел Открыть содержит список баз данных, которые были открыты в последнее время, и команду Создать файл.

Чтобы создать таблицу базы данных в приложении Access, выполните следующие действия.

Откройте программу Access и выберите в разделе Открыть (область задач Приступая к работе) команду Создать файл. Отобразится область задач Создание файла. В разделе Создание выберите команду Новая база данных. Отобразится диалоговое окно Файл новой базы данных. Присвойте какое-либо имя базе данных и сохраните ее в нужной папке. По умолчанию база данных будет сохранена в папке Мои документы, однако вы можете сохранить файл базы данных в любой выбранной вами папке. Поскольку в этом примере мы будем создавать базу данных, в которой будут отслеживаться данные о выигрышах в лотерее Пауэрбол, я назвал ее POWER.
После выполнения всех действий отобразится окно POWER : база данных. Выберите опцию Создать таблицу в режиме конструктора. Можно выбрать опцию Создать таблицу с помощью Мастера. Но в данном случае это будет не лучший выбор, потому что мастера не отличаются достаточной гибкостью. Мастер таблиц создает таблицу, состоящую из списка заранее определенных столбцов. Третий вариант создания базы данных Создание таблицы путем ввода данных также не достаточно подходит для создания серьезных проектов, поскольку предполагает относительно данных много допущений, принятых по умолчанию в Access.
Дважды щелкните на опции, чтобы появилось окно для создания таблицы (Рисунок 4.2).

Определение индексов для полей LastName и HowKnom



Рисунок 4.11. Определение индексов для полей LastName и HowKnom


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

Совет 3
Совет 3

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



Определение первичного ключа



Определение первичного ключа

Первичный ключ таблицы — это поле, которое однозначно определяет каждую строку.
Поле ProposalNumber (номер предложения) является хорошим кандидатом на роль первичного ключа таблицы PowerDesign, потому что значения этого поля однозначно определены для каждой строки таблицы. Это единственное поле, относительно которого вы можете быть уверены, что оно нигде в таблице не дублируется. Для того чтобы назначить это поле первичным ключом таблицы, поместите курсор в строке ProposalNumber, находящейся в диалоговом окне определения данных, а затем щелкните на пиктограмме Первичный ключ, которая расположена в центре панели инструментов Проектирование таблиц. В результате в самом левом столбце диалогового окна определения таблицы появится пиктограмма ключа. Это означает, что поле ProposalNumber теперь является первичным ключом таблицы PowerDesign. На Рисунок 4.9 показано, как выглядит окно определения таблицы после объявления первичного ключа.



Переделанное определение таблицы



Рисунок 4.8. Переделанное определение таблицы должно выглядеть примерно так












Переносимость



Переносимость

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

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

 


Поле ProposalNumber объявлено первичным ключом



Рисунок 4.9. Поле ProposalNumber объявлено первичным ключом












Правдоподобный сценарий



Правдоподобный сценарий

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

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

Имя (First Name). Фамилия (Last Name). Адрес (Address). Город (City). Штат или провинция (State or province). Почтовый код (Postal code). Телефон (Phone). Кто таков (How Known) (ваши взаимоотношения с тем, кто внес предложение). Само предложение (Proposal). Бизнес или благотворительность (Business or charity).

Кроме того, не желая слишком заниматься подробностями, вы решили заносить все эти данные в единственную таблицу базы данных. Запустив среду разработки Access, вы начинаете пристально всматриваться в экран (Рисунок 4.1).



Создание индекса



Создание индекса

Так как количество получаемых вами предложений об инвестициях и благотворительности может легко дойти до нескольких тысяч, то нужен способ, с помощью которого можно быстро выбрать интересующие вас записи. Вы сможете выполнить эту задачу самыми разными способами. Например, просмотреть все предложения, сделанные вашими братьями. Эти предложения можно эффективно выбрать, если использовать содержимое поля LastName (фамилия), как показано в следующем примере:

SELECT * FROM PowerDesign

WHERE LastName = 'Marx' ;

Впрочем, такая стратегия не работает для предложений, сделанных всеми вашими шуринами, деверями, свояками (по-английски любой из них называется одинаково — "brower-in-law". — Примеч. пер.), но эти предложения можно получить, используя другое поле, HowKnown (кто таков), как показано в следующем примере:

SELECT * FROM PowerDesign

    WHERE HowKnown = 'brother-in-law' ;

Что ж, запросы эти работают, но они, возможно, не будут работать очень быстро, если таблица PowerDesign достаточно большая (десятки тысяч записей). SQL перебирает всю таблицу построчно, отыскивая значения, которые удовлетворяют предложению WHERE. Работу можно значительно ускорить, применяя в таблице PowerDesign индексы. (Индекс — это таблица с указателями. Каждая строка в индексе указывает на соответствующую строку в таблице с данными.)

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

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

Совет 1
Совет 1

Так как поле ProposalNumber (номер предложения) одновременно и уникальное, и короткое, то с его помощью можно быстрее всего добраться к отдельной записи. Поэтому первичный ключ любой таблицы всегда должен быть индексирован. В Access это делается автоматически. Однако, чтобы использовать это поле, необходимо знать его значение в нужной вам записи. Вам могут потребоваться и дополнительные индексы, создаваемые на основе других полей, таких как LastName (фамилия), PostalCode (почтовый код) или HowKnown (кто таков). Если в таблице данных, проиндексированной по LastName, в результате поиска будет найдена первая строка, где значением этого поля является Marx, то будут найдены и все строки с таким же значением этого поля. В индексе ключи для всех этих строк идут друг за другом. Поэтому все строки, относящиеся к Chico, Groucho, Harpo, Zeppo и Karl, можно получить почти так же быстро, как и для одного только Chico.

В результате создания индекса возникает дополнительная нагрузка на вашу систему, от чего ее работа будет немного замедляться. Это замедление необходимо сравнивать с увеличением скорости доступа к записям в результате использования индекса. Если индексировать поля, часто используемые для доступа к записям из большой таблицы, то замедление работы оправдано. Однако если создавать индексы для полей, которые никогда не будут использоваться для доступа к записям, то потери времени во много раз превысят его экономию. Также не имеет смысла создавать индексы для полей, которые не позволяют отличить одну запись от другой. Например, поле BusiOrCharity (бизнес или благотворительность) просто разбивает все записи в таблице только на две категории, поэтому хороший индекс на основе этого поля создать нельзя.

Помни: Эффективность индекса в разных реализациях бывает разной. Если перенести базу данных с одной платформы на другую, то индексы, лучше всех работавшие в первой системе, могут плохо работать во второй. Случается, что база данных хуже работает с индексами, чем при их полном отсутствии. Индексы приходится заново настраивать для каждой конкретной конфигурации СУБД и аппаратного обеспечения. Какая из разных схем индексирования в общем работает лучше остальных, приходится определять опытным путем, принимая во внимание в каждом случае скорость получения данных и их обновления.

Чтобы создать индексы для таблицы PowerDesign, щелкните на пиктограмме Индексы, расположенной справа от пиктограммы Первичный ключ на панели инструментов Конструктор таблиц. Появится диалоговое окно Индексы, в котором уже есть поля Postal-Code и ProposalNumber. Диалоговое окно Индексы представлено на Рисунок 4.10.





Создание индекса

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

Удивительно, но в спецификации SQL:2003 нет средств для создания индекса. У поставщиков СУБД должны быть собственные реализации индексов. А так как эти реализации не стандартизированы, то вполне могут отличаться друг от друга. Большинство поставщиков реализует средство создания индекса, расширяя SQL оператором CREATE INDEX (создать индекс). Но даже если в двух реализациях используются одни и те же операторы, то способы их выполнения могут быть разными. В различных реализациях используются разные варианты синтаксиса этой команды. Необходимо внимательно изучать документацию по имеющимся у вас СУБД, чтобы знать, как можно создавать индексы с помощью этих систем.



Создание простой базы данных с помощью RADинструмента



Создание простой базы данных с помощью RAD-инструмента

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

Также имеются СУБД, поддерживающие оба этих подхода. В следующих разделах с помощью графического инструмента, предназначенного для проектирования баз данных, будет создана простая база, состоящая из одной таблицы. Это делается для того, чтобы вы могли увидеть, из каких операций состоит изучаемый процесс. Хотя я буду использовать Microsoft Access, но и в других средах разработки, работающих в Windows, процедура создания базы данных почти такая же.



Создание таблицы



Создание таблицы

При работе с полнофункциональной СУБД, например, такой, как Microsoft SQL Server, Oracle 9i или IBM DB2, в процессе создания таблицы с помощью SQL необходимо вводить ту же информацию, что и при создании таблицы с помощью какого-либо RAD-инструмента. Разница здесь в том, что RAD-инструмент помогает это делать, предоставив в ваше распоряжение диалоговое окно создания таблицы (или какую-либо подобную структуру) и не позволяя вводить неправильные имена полей, типы или размеры. SQL столько внимания вам не уделит. Работая с SQL, следует точно знать с самого начала, что именно надо делать. Необходимо ввести целый оператор CREATE TABLE, прежде чем SQL обратит на него внимание, не говоря уже о том, чтобы сообщить, нет ли в операторе каких-либо ошибок.

Следующая команда создает таблицу, идентичную созданной ранее:

CREATE TABLE PowerSQL (
ProposalNumber SMALL INT
FirstName CHAR (15),
LastName CHAR (20),
Address CHAR (30),
City CHAR (25),
StateProvince CHAR (2),
PostalCode CHAR (10),
Country CHAR (30),
Phone CHAR (14),
HowKnown CHAR (30),
Proposal CHAR (50),
BusinOrCharity CHAR (1) ;

Как видно, информация в сущности та же, что и при создании таблицы с помощью инструментов RAD (как описывалось ранее в этой главе). Можно отдать предпочтение любому способу создания таблиц. Впрочем, что хорошо в языке SQL — так это его универсальность. Один и гот же стандартный синтаксис будет работать в любой системе управления базами данных.

Помни: Любые усилия, вложенные в изучение SQL, будут оправдываться в течение долгого времени, потому что быстро сходить со сцены этот язык не собирается. А усилия, вложенные в то, чтобы стать экспертом в среде разработки, вероятно, принесут меньшую отдачу. И каким бы прекрасным ни был последний RAD-инструмент, будьте уверены — в течение двух-трех лет его заменит более совершенная технология. Замечательно, если за это время вы сможете возместить усилия, вложенные в изучение данного инструмента! Если сможете, то пользуйтесь им. А если не сможете, то будет мудрее придерживаться старого и испытанного средства. Знание SQL намного дольше будет приносить дивиденды.



Создание таблицы Power Design с помощью DDL



Создание таблицы Power Design с помощью DDL

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

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



Текстовое поле Имя таблицы в диалоговом окне Сохранить как



Рисунок 4.5. Текстовое поле Имя таблицы в диалоговом окне Сохранить как












Удаление индекса



Удаление индекса









Удаление таблицы



Удаление таблицы

Перед тем как таблица PowerDesign приобрела нужную вам структуру, вы, возможно, успели создать несколько промежуточных вариантов этой таблицы, которые не являются окончательными. Присутствие в системе этих вариантов может впоследствии запутывать пользователей. Поэтому, пока вы еще помните, что к чему, лучше всего эти таблицы удалить. Для удаления таблицы выберите ее имя в окне базы данных и щелкните на пиктограмме (Рисунок 4.12).



Удаление таблицы

Таблицу, которая вам не нужна и только зря занимает место на диске, удалить достаточно легко. Всего лишь воспользуйтесь командой DROP TABLE (удалить таблицу), такой, например, как следующая:

DROP TABLE PowerSQL;

Что может быть проще? Если такой командой удалить таблицу, то будут удалены все ее данные и метаданные. От таблицы не останется и следа.



Удаление таблицы



Удаление таблицы

Таблицу, которая вам не нужна и только зря занимает место на диске, удалить достаточно легко. Всего лишь воспользуйтесь командой DROP TABLE (удалить таблицу), такой, например, как следующая:

DROP TABLE PowerSQL;

Что может быть проще? Если такой командой удалить таблицу, то будут удалены все ее данные и метаданные. От таблицы не останется и следа.



и удаление таблицы из базы



В этой главе...

Создание, изменение и удаление таблицы из базы данных с помощью инструмента RAD. Создание, изменение и удаление таблицы из базы данных с помощью SQL. Перенос базы данных в другую СУБД. В течение своей истории компьютерные технологии менялись так быстро, что в череде их технологических "поколений" иногда нетрудно и запутаться. Вначале для работы с большими базами данных использовались языки высокого уровня, так называемые языки третьего поколения — FORTRAN, COBOL, Basic, Pascal и С. Затем вошли в употребление языки, специально предназначенные для использования с базами данных, например dBASE, Paradox и R:BASE. (А к какому поколению отнести эти языки? Может, к третьему с половиной?) Самым последним этапом этого прогресса является появление сред разработки, в которых приложения создаются с минимумом процедурного программирования или совсем без такового. Это, например, такие среды, как Access, Delphi, IntraBuilder или C++Builder— языки четвертого поколения. С помощью этих графических объектно-ориентированных инструментов (их еще называют инструментами быстрой разработки приложений (rapid application development), или RAD-инструментами) из элементов управления можно собирать готовые приложения.
Как вы узнали в главах 1-3, SQL полноценным языком не является. Таким образом, ни в одну из упомянутых категорий он не входит. Хотя в SQL используются команды, аналогичные командам языков третьего поколения, но, в сущности, он, подобно языкам четвертого поколения, является непроцедурным. Впрочем, не имеет значения, к какому классу отнести SQL. Ведь его можно использовать в сочетании с инструментами разработки как третьего, так и четвертого поколений. Код SQL можно писать самостоятельно, а можно с помощью графических инструментов, и тогда соответствующий код будет генерироваться средой разработки. Все равно, к удаленной базе данных пойдут только команды SQL.
В этой главе рассказывается, как с помощью RAD-инструмента создать, изменить и удалить простую таблицу, а затем вы узнаете, как то же самое проделать с помощью SQL.

В определение таблицы PowerDesign вставлена новая строка



Рисунок 4.7. В определение таблицы PowerDesign вставлена новая строка


Там, где находится курсор, появится новая незаполненная строка, а все остальные строки сдвинутся вниз.

Введите заголовки для тех столбцов, которые хотите использовать в своей таблице. В поле Имя поля я поместил ProposalNumber (номер предложения), в поле Тип данных — AutoNumber (счетчик), а в Описание — фразу "Unique identifier for each row of the PowerDesign table" (уникальный идентификатор для каждой строки таблицы POWER). AutoNumber — числовой тип данных, значение которого автоматически увеличивается для каждой последующей строки таблицы. Похожим образом под полями Address (адрес) и PostalCode (почтовый код) я соответственно вставил поля Address2 (адрес 2) и Country (страна). Результат представлен на Рисунок 4.8.

При попытке сохранить новую таблицу



Внимание

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

Внимание

Удаляя таблицу с помощью команды DROP TABLE, вы одновременно удаляете и все относящиеся к ней индексы. Впрочем, иногда требуется оставить таблицу, но удалить один из ее индексов. Стандарт SQL:2003 не определяет команду DROP INDEX (удалить индекс), но в большинстве реализаций она все-таки есть. Эта команда пригодится тогда, когда ваша система замедлит свою работу до черепашьей скорости и обнаружится, что таблицы в ней индексированы не лучшим образом. Исправление индексов должно привести к резкому увеличению производительности системы. Это, правда, может опечалить пользователей, привыкших в ожидании своих результатов устраивать перекур.

Значения по умолчанию для свойств



Рисунок 4.3. Значения по умолчанию для свойств поля FirstName, показанные в диалоговом окне создания таблицы


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

Не исключено, что вы захотите оставить или соответствующим образом изменить имеющиеся значения. Например, для создаваемого вами поля FirstName (имя) значение свойства Размер поля по умолчанию составляет 50 символов. Возможно, это значение больше, чем нужно. И если для этого свойства задать, например, значение 15 символов, то будет сэкономлен определенный объем дискового пространства. На Рисунок 4.4 приведено диалоговое окно создания таблицы после того, как введены значения свойств для всех полей.