alan_beaulieu-learning_sql-ru (865932), страница 4
Текст из файла (страница 4)
д.Столбец (column)Отдельный элемент данных, хранящийся в таблице.19Что такое SQL?ТерминОпределениеСтрока (row)Набор столбцов, которые вместе полностью описывают сущность или некоторое действие, производимоенад сущностью. Также называется записью (record).Таблица (table)Набор строк, хранящийся в памяти (непостояннаятаблица) или на постоянном запоминающем устройстве (постоянная таблица).Результирующий набор Другое название непостоянной таблицы, обычно яв(result set)ляющейся результатом SQLзапроса.Первичный ключ(primary key)Один или более столбцов, которые можно использовать как уникальный идентификатор для каждойстроки таблицы.Внешний ключ(foreign key)Один или более столбцов, которые можно совместноиспользовать для идентификации одной строки другой таблицы.Что такое SQL?Помимо определения реляционной модели Кодд предложил язык дляработы с данными в реляционных таблицах, названный DSL/Alpha.Вскоре после публикации статьи Кодда в IBM была организована группа для создания прототипа языка на базе его идей.
Эта группа разработала упрощенную версию DSL/Alpha, которую назвали SQUARE. В результате усовершенствования SQUARE появился язык SEQUEL, который в конце концов получил имя SQL.Сейчас SQL разменял четвертый десяток, претерпев за свой век множество изменений. В середине 1980х Национальный институт стандартизации США (American National Standards Institute, ANSI) началразрабатывать первый стандарт языка SQL, который был опубликованв 1986 г. Дальнейшие доработки были отражены в следующих версиях стандарта SQL (1989, 1992, 1999 и 2003 гг.).
Наряду с усовершенствованием базового языка в SQL появились и новые возможности дляобеспечения объектноориентированной функциональности.SQL идет рука об руку с реляционной моделью, потому что результатомSQLзапроса является таблица (в данном контексте также называемаярезультирующим набором). Таким образом, в реляционной базе данныхможно создать новую постоянную таблицу, просто сохранив результирующий набор запроса. Аналогично в качестве входных данных запросможет использовать как постоянные таблицы, так и результирующиенаборы других запросов (подробно это будет рассмотрено в главе 9).И последнее замечание: SQL не акроним (хотя многие настаивают, чтоэто сокращение от Structured Query Language (Структурированныйязык запросов)).
Название этого языка произносится по буквам (т. е.«S», «Q», «L») или как «sequel» (сиквел).20Глава 1. Немного историиКлассы SQLвыраженийЯзык SQL разбит на несколько отдельных частей. В данной книге будутрассмотрены: SQLвыражения управления схемой данных (SQL schemastatements), предназначенные для определения структур данных, хранящихся в базе данных; SQLвыражения для работы с данными (SQLdata statements), предназначенные для работы со структурами данных,ранее определенными с помощью SQLвыражений управления схемой;SQLвыражения управления транзакциями, предназначенные для начала, завершения и отката транзакций (рассматриваются в главе 12).Например, новая таблица базы данных создается с помощью SQLвыражения управления схемой create table (создать таблицу), а чтобы заполнить ее данными, потребуется SQLвыражение для работы с данными insert (вставить).Чтобы дать представление об этих выражениях, приведем SQLвыражение управления схемой, создающее таблицу corporation (корпорация):CREATE TABLE corporation(corp_id SMALLINT,name VARCHAR(30),CONSTRAINT pk_corporation PRIMARY KEY (corp_id));Это выражение создает таблицу с двумя столбцами, corp_id и name, гдестолбец corp_id определен как первичный ключ таблицы.
Подробнаяинформация о данном выражении, например доступные в MySQL типы данных, приводится в следующей главе. Теперь рассмотрим SQLвыражение для работы с данными, которое вставляет в таблицу corporation запись для корпорации Acme Paper Corporation:INSERT INTO corporation (corp_id, name)VALUES (27, 'Acme Paper Corporation');Это выражение добавляет в таблицу corporation строку со значением 27в столбце corp_id и значением Acme Paper Corporation в столбце name.Наконец, приведем простое выражение select (выбрать) для извлечения только что созданных данных:mysql< SELECT name> FROM corporation> WHERE corp_id = 27;++| name|++| Acme Paper Corporation |++Все элементы БД, созданные посредством SQLвыражений управлениясхемой, хранятся в специальном наборе таблиц, который называетсясловарем данных (data dictionary).
Все эти «данные о базе данных» наЧто такое SQL?21зывают метаданными (metadata). К таблицам словаря данных можноделать запросы с помощью оператора select, в точности как к созданным вами таблицам. Таким образом, текущие структуры данных, развернутые в БД во время выполнения, становятся доступными. Например, если требуется создать отчет о новых счетах, открытых за последний месяц, можно жестко закодировать известные на момент написания отчета имена столбцов таблицы account либо сделать запроск словарю данных, получить текущий набор столбцов и динамическигенерировать отчет при каждом выполнении.Данная книга посвящена главным образом той части языка для работы с данными, к которой относятся команды select, update (обновить),insert и delete (удалить).
SQLвыражения управления схемой рассмотрены в главе 2, где создается БД, используемая в примерах даннойкниги. Вообще говоря, SQLвыражения управления схемой не требуютособого внимания, за исключением их синтаксиса, тогда как у SQLвыражений для работы с данными (хотя их и немного) есть масса нюансов, нуждающихся в подробном изучении. Поэтому большинство главданной книги посвящены SQLвыражениям для работы с данными.SQL: непроцедурный языкЕсли в прошлом вам приходилось работать с языками программирования, вы привыкли к описанию переменных и структур данных, использованию условной логики (ifthenelse), циклическим конструкциям (do while … end) и разделению кода на небольшие многократноиспользуемые части (объекты, функции, процедуры). Код передаетсякомпилятору, и результирующий исполняемый код делает в точности(ну, не всегда в точности) то, что вы запрограммировали.
С каким быязыком программирования ни работали, Java, C#, C, Visual Basic илилюбым другим процедурным языком, вы полностью управляете действиями программы. С SQL, однако, понадобится отказаться от привычного контроля над выполнением, потому что SQLвыражения определяют необходимые входные и выходные данные, а способ выполнениявыражения зависит от компонента механизма СУБД (database engine),называемого оптимизатором (optimizer). Работа оптимизатора заключается в том, чтобы рассмотреть SQLвыражение и с учетом конфигурации таблиц и доступных индексов принять решение о самом эффективном пути выполнения запроса (ну, не всегда самом эффективном).Большинство СУБД позволяют программисту влиять на решения оптимизатора с помощью подсказок оптимизатору (optimizer hints), например предложений по использованию конкретного индекса.
Однакобольшинство пользователей SQL никогда не доберется до этого уровнясложности и будет оставлять подобные тонкости администраторам БДили специалистам по вопросам производительности.Следовательно, с SQL писать полные приложения не получится. Еслитребуется создать чтото сложнее простого сценария для работы с оп22Глава 1. Немного историиределенными данными, понадобится интегрировать SQL со своим любимым языком программирования.
Некоторые производители базданных сделали это за вас, например Oracle с языком PL/SQL или Microsoft с TransactSQL. Благодаря этим языкам SQLвыражения для работы с данными являются частью грамматики языка программирования, что позволяет свободно интегрировать запросы к БД с процедурными командами. Однако при использовании не характерного для БДязыка, такого как Java, для выполнения SQLвыражений понадобитсяспециальное средство.
Некоторые из этих программных средств предоставляются производителями БД, тогда как другие создаются сторонними производителями или разработчиками ПО с открытым исходным кодом. В табл. 1.2 показаны некоторые доступные вариантыинтегрирования SQL в конкретные языки программирования.Таблица 1.2. Средства интегрирования SQLЯзыкПрограммное средствопрограммированияJavaJDBC (Java Database Connectivity) (JavaSoft)C++RogueWave SourcePro DB (инструмент сторонних производителей для соединения с БД Oracle, SQL Server,MySQL, Informix, DB2, Sybase и PostgreSQL)C/C++Pro*C (Oracle)MySQL C API (с открытым исходным кодом)DB2 Call Level Interface (IBM)C#ADO.NET (Microsoft)VisualBasicADO.NET (Microsoft)Если требуется только интерактивное выполнение SQLкоманд, каждый производитель БД обеспечивает как минимум простой инструментпередачи SQLкоманд механизму СУБД и просмотра результатов.
Большинство производителей предлагает также графический инструмент,в одном окне которого вводятся SQLкоманды, а в другом выводятся результаты их выполнения. Поскольку примеры данной книги работаютс базой данных MySQL, для запуска примеров и форматирования результатов я буду использовать утилиту командной строки mysql.Примеры SQLРанее в этой главе я обещал показать SQLвыражение, возвращающеевсе транзакции текущего счета Джорджа Блейка.
Не будем тянуть,вот оно:SELECT t.txn_id, t.txn_type_cd, t.date, t.amountFROM customer c INNER JOIN account a ON c.cust_id = a.cust_idINNER JOIN product p ON p.product_cd = a.product_cdINNER JOIN transaction t ON t.account_id = a.account_id23Что такое SQL?WHERE c.fname = 'George' and c.lname = 'Blake'AND p.name = 'checking';Без лишних на этом этапе подробностей: данный запрос идентифицирует в таблице account строку Джорджа Блейка, а в таблице product –строку с типом счета 'checking' (текущие расходы), в таблице accountнаходит строку, соответствующую данной комбинации «клиент/типсчета», и возвращает четыре столбца таблицы transaction для всехтранзакций по этому счету.