Как настроить смартфоны и ПК. Информационный портал

Язык SQL. Назначение языка SQL

Программы клиенты

Протокол TFTP

TFTP - тоже протокол FTP, но поверх протокола UDP (т.е. протокол без гарантированной доставки). Может использоваться в локальной сети, где скорость передачи важнее. На практике используется редко.

FTP - программа запускается с командной строки.

Windows Comander - может работать как FTP-клиент. Позволяет работать с удаленными каталогами также как с локальными.

NetVampire - Специализированный FTP-клиент, который позволяет качать большие файлы и качать по плохим каналам.

SQL (Structured Query Language) - это структурированный язык запросов к реляционным базам данных. На этом языке можно формулировать выражения (запросы), которые извлекают требуемые данные, модифицируют их, создают таблицы и изменяют их структуры, определяют права доступа к данным и многое другое.

Запросы выполняются системой управления базой данных (СУБД). Если вы не являетесь специалистом по разработке и администрированию баз данных, то вполне можете быть их пользователем, который просматривает или/и изменяет данные в уже имеющихся таблицах. Во многих случаях эти и другие операции с базой данных выполняются с помощью специальных приложений, предоставляющих пользователю удобный интерфейс. Обычно приложения пишутся на специальных языках программирования (С, Pascal, Visual Basic и т. п.) и чаще всего создаются с помощью интегрированных сред разработки, например, Delphi, C++ Builder и др. Однако доступ к базе данных можно получить и без них - с помощью только SQL. Следует заметить также, что и специализированные приложения обычно используют SQL-фрагменты кода при обращениях к базе данных.

Таким образом, SQL - широко распространенный стандартный язык работы с реляционными базами данных. Синтаксис этого языка достаточно прост, чтобы его могли использовать рядовые пользователи, а не только программисты. В настоящее время обычный пользователь компьютера должен владеть, по крайней мере, текстовым редактором (например, Microsoft Word) и электронными таблицами (например, Microsoft Excel). Неплохо, если он также умеет пользоваться базами данных. Различных СУБД существует много, а универсальное средство работы с базами данных одно - SQL. Знание SQL, хотя бы его основ, и умение его применять для поиска и анализа данных является фундаментальной частью компьютерной грамотности даже рядовых пользователей.

Первые разработки систем управления реляционными базами данных (реляционных СУБД) были выполнены в компании IBM в начале 1970-х годов. Тогда же был создан язык данных, предназначенный для работы в этих системах. Экспериментальная версия этого языка называлась SEQUEL - от англ. Structured English QUEry Language (структурированный английский язык запросов). Однако официальная версия была названа короче - SQL (Structured Query Language). Точнее говоря, SQL - это подъязык данных, поскольку СУБД содержит и другие языковые средства.

В 1981 году IBM выпускает реляционную СУБД SQL/DS. К этому времени компания Relation Software Inc. (сегодня это Oracle Corporation) уже выпустила свою реляционную СУБД. Эти продукты сразу же стали стандартом систем, предназначенных для управления базами данных. В состав этих продуктов вошел и SQL, который фактически стал стандартом для подъязыков данных. Производители других СУБД выпустили свои версии SQL. В них имелись не только основные возможности продуктов IBM. Чтобы получить некоторое преимущество для "своей" СУБД, производители вводили некоторые расширения SQL. Вместе с тем, начались работы по созданию общепризнанного стандарта SQL.

В 1986 году Американский национальный институт стандартов (American National Standards Institute, ANSI) выпустил официальный стандарт SQL-86, который в 1989 году был обновлен и получил новое название SQL-89. В 1992 году этот стандарт был назван SQL-92 (ISO/IEC 9075:1992). Последней версией стандарта SQL является SQL:2003 (ISO/IEC 9075X:2003).

Любая реализация SQL в конкретной СУБД несколько отличается от стандарта, соответствие которому объявлено производителем. Так, многие СУБД (например, Microsoft Access 2003, PostgreSQL 7.3) поддерживают SQL-92 не в полной мере, а лишь с некоторым уровнем соответствия. Кроме того, они поддерживают и элементы, которые не входят в стандарт. Однако разработчики СУБД стремятся к тому, чтобы новые версии их продуктов как можно в большей степени соответствовали стандарту SQL.

Внимание. В данном пособии описаны элементы SQL2003, не все из которых поддерживаются существующими СУБД. Прежде чем применять их на практике, следует убедиться, что они будут работать в вашей СУБД. Об этом можно узнать из технической документации. Большинство описанных элементов соответствуют и более ранним версиям SQL, в частности, широко распространенному SQL-92.

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

На практике с базой данных обычно работают посредством приложений, написанных программистами на процедурных языках, например, на С, Visual Basic, Pascal, Java и др. Часто приложения создаются в специальных средах визуальной разработки, таких как Delphi, Microsoft Access, Visual dBase и т. п. При этом разработчику приложения практически не приходится писать коды программ, поскольку за него это делает система разработки. Во всяком случае, работа с программным кодом оказывается минимальной. Эти приложения имеют удобный графический интерфейс, не вынуждающий пользователя непосредственно вводить запросы на языке SQL. Вместо него это делает приложение. Впрочем, приложение может как использовать, так и не использовать SQL для обращения к базе данных. SQL не единственное, хотя и очень эффективное средство получения, добавления и изменения данных, и если есть возможность использовать его в приложении, то это следует делать.

Реляционные базы данных могут существовать и действительно существуют вне зависимости от приложений, обеспечивающих пользовательский интерфейс. Если по каким-либо причинам такого интерфейса нет, то доступ к базе данных можно осуществить с помощью SQL, используя консоль или какое-нибудь приложение, с помощью которого можно соединиться с базой данных, ввести и отправить SQL-запрос (например, Borland SQL Explorer).

Язык SQL считают декларативным (описательным) языком, в отличие от языков, на которых пишутся программы. Это означает, что выражения на языке SQL описывают, что требуется сделать, а не каким образом.

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

SELECT Фамилия, Должность FROM Сотрудники WHERE Отдел=102;

По-русски данное выражение звучит так:

ВЫБРАТЬ Фамилия, Должность ИЗ Сотрудники ПРИ УСЛОВИИ, ЧТО Отдел = 102;

Чтобы изменить значение "Иванов " на "Петров " столбца Фамилия , достаточно выполнить следующий запрос:

UPDATE Сотрудники SET Фамилия = "Петров" WHERE Фамилия = "Иванов";

По-русски данное выражение выглядит так:

ОБНОВИТЬ Сотрудники УСТАНОВИВ Фамилия РАВНЫМ "Петров " ГДЕ Фамилия = "Иванов" ;

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

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

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

· DML (Data Manipulation Language - язык манипулирования данными ) предназначен для поддержки базы данных: выбора (SELECT ), добавления (INSERT ), изменения (UPDATE ) и удаления (DELETE ) данных из таблиц. Эти операторы (команды) могут содержать выражения, в том числе и вычисляемые, а также подзапросы - запросы, содержащиеся внутри другого запроса. В общем случае выражение запроса может быть настолько сложным, что сразу и не скажешь, что он делает. Однако сложный запрос можно мысленно разбить на части, которые легче анализировать. Аналогично, сложные запросы создаются из относительно простых для понимания выражений (подзапросов).

· DDL (Data Definition Language - язык определения данных ) предназначен для создания, модификации и удаления таблиц и всей базы данных. Примерами операторов, входящих в DDL, являются CREATE TABLE (создать Таблицу)," CREATE VIEW (создать представление), CREATE SHEMA (создать схему), ALTER TABLE (изменить таблицу), DROP (удалить) и др.

· DCL (Data Control Language - язык управления данными ) предназначен для обеспечения защиты базы данных от различного рода повреждений. СУБД предусматривает некоторую защиту данных автоматически. Однако в ряде случаев следует предусмотреть дополнительные меры, предоставляемые DCL.

Перевод: Alexandr Pyramidin

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

Как работает SQL?

SQL это язык, ориентированный специально на реляционные базы данных (РБД). Он выполняет большую работу, которую вы должны были бы делать, если бы использовали универсальный язык программирования, например C. Чтобы сформировать РБД на C, вам необходимо было бы начать с нуля. Вы должны были бы определить объект, называемый таблицей, которая могла бы увеличиваться, чтобы иметь любое число строк, а затем создавать постепенно процедуры для вставки и извлечения значений.

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

  • Рассмотреть строку таблицы.
  • Выполнить проверку: является ли эта строка одной из строк, которая вам нужна.
  • Если это так, сохранить её где-нибудь, пока вся таблица не будет проверена.
  • Проверить, имеются ли другие строки в таблице.
  • Если имеются, возвратиться на шаг 1.
  • Если строк больше нет, вывести все значения, сохранённые в шаге 3.

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

Что делает ANSI?

Как мы уже сказали во Введении, стандарт SQL определяется с помощью кода ANSI (Американский Национальный Институт Стандартов). SQL не изобретался ANSI. Это, по существу, изобретение IBM. Но другие компании подхватили SQL сразу же. По крайней мере одна компания (Oracle) отвоевала у IBM право на рыночную продажу SQL-продуктов.

После того как появился ряд конкурирующих программ SQL на рынке, ANSI определил стандарт, к которому они должны быть приведены. (Определение таких стандартов и является функцией ANSI). Однако после этого появились некоторые проблемы. Возникли они, в результате стандартизации ANSI, в виде некоторых ограничений. Так как не всегда ANSI определяет то, что является наиболее полезным, то программы пытаются соответствовать стандарту ANSI, не позволяя ему ограничивать их слишком сильно. Это, в свою очередь, ведет к случайным несогласованностям. Программы Баз Данных обычно придают ANSI SQL дополнительные особенности и часто ослабляют многие ограничения. Поэтому распространённые разновидности ANSI будут также рассмотрены. Хотя мы, очевидно, не сможем рассмотреть каждое исключение или разновидность, удачные идеи имеют тенденцию к внедрению и использованию в различных программах, даже когда они не определены стандартом ANSI. ANSI это вид минимального стандарта, и вы можете делать больше, чем он позволяет, хотя и должны выполнять его указания при выполнении задач, которые он определяет.

Интерактивный и вложенный SQL

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

Вложенный SQL состоит из команд SQL, помещённых внутри программ, которые обычно написаны на другом языке (типа КОБОЛа или ПАСКАЛя). Это делает такие программы более мощными и эффективным.

Однако, допуская эти языки, приходится иметь дело со структурой SQL и стилем управления данных, который требует некоторых расширений интерактивного SQL. Передача SQL-команд во вложенный SQL является пропускаемой ("passed off") для переменных или параметров, используемых программой, в которую они были вложены.

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

Подразделы SQL

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

  • DDL (Язык Определения Данных) - так называемый Язык Описания Схемы в ANSI - состоит из команд, которые создают объекты (таблицы, индексы, просмотры и так далее) в базе данных.
  • DML (Язык Манипулирования Данными) это набор команд, которые определяют, какие значения представлены в таблицах в любой момент времени.
  • DCD (Язык Управления Данными) состоит из средств, которые определяют, разрешить ли пользователю выполнять определённые действия, или нет. Они являются составными частями DDL в ANSI.

Не забывайте эти названия. Это не различные языки, а разделы команд SQL, сгруппированные по их функциям.

Различные типы данных

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

Так как системы с РБД базируются на связях между фрагментами информации, различные типы данных должны отличаться друга от друга так, чтобы соответствующие процессы и сравнения могли быть в них выполнены. В SQL это делается с помощью назначения каждому полю типа данных, указывающего тип значения, которое это поле может содержать. Все значения в данном поле должны иметь одинаковый тип. В таблице Заказчиков, например, cname и city содержат строки текста для оценки, а snum и cnum это числа. По этой причине вы не можете ввести значение Highest (Наивысший) или значение None (Никакой) в поле rating, которое имеет числовой тип данных. Это ограничение удачно, так как оно налагает некоторую структурность на ваши данные. Вы часто будете сравнивать некоторые или все значения в данном поле, поэтому вы можете выполнять действие только на определенных строках, а не на всех. Вы не могли бы сделать этого, если бы значения полей имели смешанный тип данных.

К сожалению, определение этих типов данных является основной областью, в которой большинство коммерческих программ БД и официальный стандарт SQL не всегда совпадают. ANSI SQL-стандарт распознаёт только text и number, в то время как большинство коммерческих программ используют другие специальные типы. Такие как DATA (ДАТА) и TIME (ВРЕМЯ) - фактически, почти стандартные типы (хотя точный формат их меняется). Некоторые пакеты также поддерживают такие типы как, например, MONEY (ДЕНЬГИ) и BINARY (ДВОИЧНЫЙ). (MONEY это специальная "валютная" система исчисления, используемая компьютерами.)

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

ANSI определяет несколько числовых типов, различия между которыми довольно тонки, и иногда их путают. Разрешённые ANSI-типы данных перечислены в Приложении B. Сложность числовых типов ANSI можно, по крайней мере частично, объяснить усилием сделать вложенный SQL совместимым с рядом других языков. Два типа чисел ANSI - INTEGER (ЦЕЛОЕ ЧИСЛО) и DECIMAL (ДЕСЯТЕРИЧНОЕ ЧИСЛО) (которые можно сокращать как INT и DEC, соответственно), будут адекватны для наших целей, так же как и для целей большинства практических деловых прикладных программ. Естественно, что тип ЦЕЛОЕ можно представить как ДЕСЯТЕРИЧНОЕ ЧИСЛО, которое не содержит никаких цифр справа от десятичной точки.

Тип для текста - CHAR (или СИМВОЛ), относящийся к строке текста. Поле типа CHAR имеет длину, определяемую максимальным числом символов, которые могут быть введены в это поле. Большая часть реализаций также имеют нестандартный тип, называемый VARCHAR (ПЕРЕМЕННОЕ ЧИСЛО СИМВОЛОВ), который является текстовой строкой и может иметь любую длину до определённого реализацией максимума (обычно 254 символа). Значения CHARACTER и VARCHAR включаются в одиночные кавычки как "текст". Различие между CHAR и VARCHAR в том, что CHAR должен резервировать достаточное количество памяти для максимальной длины строки, а VARCHAR распределяет память по мере необходимости.

Символьные типы состоят из всех печатных символов, включая числа. Однако число 1 это не то же, что символ "1". Символ "1" - только печатный фрагмент текста, не определяемый системой как числовое значение 1. Например 1 + 1 = 2, но "1" + "1" не равно "2". Символьные значения сохраняются в компьютере как двоичные значения, но показываются пользователю как печатный текст.

Преобразование выполняется по формату, определяемому системой, которую вы используете. Этот формат преобразования будет одним из двух стандартных типов (возможно, с расширениями), используемых в компьютерных системах: ASCII-код (используемый во всех персональных и малых компьютерах) и EBCDIC-код (Расширенном Двоично-Десятеричном Код Обмена Информации) (используемый в больших компьютерах). Определенные операции, такие как упорядочивание в алфавитном порядке значений поля, будет изменяться вместе с форматом.

Мы должны следить за рынком, а не за ANSI, в использовании типа DATE (ДАТА). (В системе, которая не распознает тип ДАТА, вы, конечно, можете объявить дату как символьное или числовое поле, но это сделает большинство операций более трудоёмкими.)

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

SQL. Несогласованности.

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

ЧТО ТАКОЕ "ПОЛЬЗОВАТЕЛЬ"?

SQL обычно находится в компьютерных системах, которые имеют больше чем одного пользователя и, следовательно, должен различать их (ваше семейство PC может иметь любое число пользователей, но оно обычно не имеет способов, чтобы отличать одного пользователя от другого).

Обычно в такой системе каждый пользователь имеет некий вид кода проверки прав, который идентифицирует его или её (терминология изменяется). В начале сеанса с компьютером пользователь входит в систему (регистрируется), сообщая компьютеру, кто этот пользователь, идентифицируясь с помощью определенного ID (Идентификатора). Любое количество людей, использующих ID доступа, являются отдельными пользователями; и, аналогично, один человек может представлять большое количество пользователей (в разное время), используя различные идентификаторы доступа к SQL. Действия в большинстве сред SQL приведены к специальному Идентификатору доступа, который точно соответствует определённому пользователю. Таблица или другой объект принадлежит пользователю, который имеет над ним полную власть. Пользователь может или может не иметь привилегии на выполнение действия над объектом. Для наших целей мы договоримся, что любой пользователь имеет необходимые привилегии для выполнения любого действия, пока мы не возвратимся специально к обсуждению привилегий в Главе 22. Специальное значение USER (ПОЛЬЗОВАТЕЛЬ) может использоваться как аргумент в команде. Оно указывает на доступный Идентификатор пользователя, выдавшего команду.

Условные обозначения и терминология

Ключевые слова это слова, которые имеют специальное значение в SQL. Они могут быть командами, но не текстом и не именами объектов. Мы будем выделять ключевые слова, печатая их ЗАГЛАВНЫМИ БУКВАМИ. Вы должны быть внимательны, чтобы не путать ключевые слова с терминами.

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

Команды или предложения являются инструкциями, с помощью которых вы обращаетесь к БД SQL.

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

Предложения начинаются ключевым словом и состоят из ключевых слов и аргументов. Например, предложения, с которыми вы можете сталкиваться, это "FROM Salespeope" и "WHERE city = "London"". Аргументы завершают или изменяют значение предложения. В примерах выше, Salespeople - аргумент, а FROM - ключевое слово предложения FROM. Аналогично "city = "London"" - аргумент предложения WHERE.

Объекты это структуры БД, которым даны имена и которые сохраняются в памяти. Сюда относятся базовые таблицы, представления и индексы.

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

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

Резюме

Мы кратко рассмотрели в этой главе основы. Но нашим намерением и было - бегло рассмотреть основы SQL так, чтобы вы смогли охватить весь объём информации.

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

ЯЗЫК SQL: МАНИПУЛИРОВАНИЕ ДАННЫМИ

В ЭТОЙ ЛЕКЦИИ...

· Назначение языка Structure Query Language (SQL) и его особая роль при работе с базами данных.

· История возникновения и развития языка SQL.

· Запись операторов языка SQL.

· Выборка информации из баз данных с помощью оператора SELECT.

· построение операторов SQL, характеризующихся следующими особенностями:

· применение конструкции WHERE для выборки строк, удовлетворяющих различным условиям;

· сортировка результатов выполнения запроса с помощью конструкции ORDER BY;

· использование агрегирующих функций языка SQL;

· группирование выбранных данных с помощью конструкции GROUP BY;

· применение подзапросов;

· применение соединений таблиц;

· применение операций с множествами (UNION, INTERSECT, EXCEPT).

· Внесение изменений в базу данных с помощью операторов INSERT, UPDATE и DELETE.

Одним из языков, появившихся в результате разработки реляционной модели данных, является SQL, который в настоящее время получил очень широкое распространение и фактически превратился в стандартный язык реляционных баз данных. Стандарт на язык SQL был выпущен Национальным институтом стандартизации США (ANSI) в 1986 году, а в 1987 году Международная организация по стандартизации (ISO) приняла этот стандарт в качестве международного. В настоящее время язык SQL поддерживается сотнями СУБД различных типов, разработанных для самых разнообразных вычислительных платформ, начиная от персональных компьютеров и заканчивая мэйнфреймами.

В этой лекции используется определение языка SQL, данное в стандарте ISO.

Введение в язык SQL

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

Назначение языка SQL

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

· создавать базы данных и таблицы с полным описанием их структуры;



· выполнять основные операции манипулирования данными, такие как вставка, модификация и удаление данных из таблиц;

· выполнять простые и сложные запросы.

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

И, наконец, язык должен быть универсальным, т.е. отвечать некоторому признанному стандарту, что позволит использовать один и тот же синтаксис и структуру команд при переходе от одной СУБД, к другой. Современный стандарт языка SQL удовлетворяет практически всем этим требованиям.

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

· язык Data Definition Language (DDL), предназначенный для определения структур базы данных и управления доступом к данным;

· язык Data Manipulation Language (DML), предназначенный для выборки и обновления данных.

До появления стандарта SQL3 язык SQL включал только команды определения и манипулирования данными; в нем отсутствовали какие-либо команды управления ходом вычислений. Другими словами, в этом языке не было команд IF ... THEN ...ELSE, GO TO, DO ... WHILE и любых других, предназначенных для управления ходом вычислительного процесса. Подобные задачи должны были решаться программным путем, с помощью языков программирования или управления заданиями, либо интерактивно, в результате действий, выполняемых самим пользователем. По причине подобной незавершенности, с точки зрения организации вычислительного процесса, язык SQL мог использоваться двумя способами. Первый предусматривал интерактивную работу, заключающуюся во вводе пользователем с терминала отдельных операторов SQL. Второй состоял во внедрении операторов SQL в программы на процедурных языках.

Достоинства языка SQL3, формальное определение которого принято в 1999 году:

· Язык SQL относительно прост в изучении.

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

· Как и большинство современных языков, SQL поддерживает свободный формат записи операторов. Это означает, что при вводе отдельные элементы операторов не связаны с фиксированными позициями на экране.

· Структура команд задается набором ключевых слов, представляющих собой обычные слова английского языка, такие как CREATE TABLE -Создать таблицу, INSERT - Вставить, SELECT -Выбрать.

Например:

CREATE TABLE [Продажи] ( (S), [Наименование объекта] VARCHAR(15), [Стоимость] DECIMAL(7,2));

INSERT INTO [Объект] VALUES ("SG16", "Brown", 8300);

SELECT , [Наименование объекта], [Стоимость];

FROM [Продажи]

WHERE [Стоимость] > 10000;

· Язык SQL может использоваться широким кругом пользователей, включая администраторов баз данных (АБД), руководящий персонал компании, прикладных программистов и множество других конечных пользователей разных категорий.

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

История языка SQL

История реляционной модели данных, и косвенно языка SQL, началась в 1970 году с публикации основополагающей статьи Е. Ф. Кодда, который в то время работал в исследовательской лаборатории корпорации IBM в Сан-Хосе. В 1974 году Д. Чемберлен, работавший в той же лаборатории, публикует определение языка, получившего название "Structured English Query Language", или SEQUEL. В 1976 году была выпущена переработанная версия этого языка, SEQUEL/2; впоследствии его название пришлось изменить на SQL по юридическим соображениям - аббревиатура SEQUEL уже использовалась филологами. Но до настоящего времени многие по-прежнему произносят аббревиатуру SQL как "сиквэл", хотя официально ее рекомендуется читать как "эс-кю-эл".

В 1976 году на базе языка SEQUEL/2 корпорация IBM выпустила прототип СУБД, имевший название "System R". Назначение этой пробной версии состояло в проверке осуществимости реализации реляционной модели. Помимо прочих положительных аспектов, важнейшим из результатов выполнения этого проекта можно считать разработку собственно языка SQL, Однако корни этого языка уходят в язык SQUARE (Specifying Queries as Rational Expressions), который являлся предшественником проекта System R. Язык SQUARE был разработан как исследовательский инструмент для реализации реляционной алгебры посредством фраз, составленных на английском языке.

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

Чуть позже появилась СУБД INGRES, использовавшая язык запросов QUEL.

Этот язык был более структурированным, чем SQL, но семантика его менее близка к обычному английскому языку. Позднее, когда SQL был принят как стандартный язык реляционных баз данных, СУБД INGRES была полностью переведена на его использование. В 1981 году корпорация IBM выпустила свою первую коммерческую реляционную СУБД под названием SQL/DS (для среды DOS/VSE). В 1982 году вышла в свет версия этой системы для среды VM/CMS, а в 1983 году - для среды MVS, но уже под названием DB2.

В 1982 году Национальный институт стандартизации США (ANSI) начал работу над языком Relation Database Language (RDL), руководствуясь концептуальными документами, полученными от корпорации IBM. В 1983 году к этой работе подключилась Международная организация по стандартизации (ISO). Совместные усилия обеих организаций увенчались выпуском стандарта языка SQL. От названия RDL в 1984 году отказались, а черновой проект языка был переработан с целью приближения к уже существующим реализациям языка SQL.

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

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

В 1989 году ISO опубликовала дополнение к стандарту, в котором определялись функции поддержки целостности данных. В 1992 году была выпущена первая, существенно пересмотренная версия стандарта ISO, которую иногда называют SQL2 или SQL-92. Хотя некоторые из функций были определены в этом стандарте впервые, многие из них уже были полностью или частично реализованы в одной или нескольких коммерческих реализациях языка SQL.

А следующая версия стандарта, которую принято называть SQL3, была выпущена только в 1999 году. Эта версия содержит дополнительные средства поддержки объектно-ориентированных функций управления данными.

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

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

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

Функциональные возможности языка SQL

Основные функциональные возможности языка SQL приведены ниже.

Определение данных. Эта функция SQLпредставляет собой описание структуры поддерживаемых данных и организацию реляционных отношений (таблиц). Для ее реализации предназначены операторы создания базы данных, создания таблиц и доступа к данным.

Создание базы данных . Для создания новой базы данных используется оператор CREATE DATABASE. В структуре оператора указывается имя создаваемой базы данных.

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

INTEGER – целое число;

CHAR – символьное значение;

VARCHAR – символьное значение, сохраняются только непустые символы;

DECIMAL – десятичное число;

FLOAT – число с плавающей запятой;

DOUBLE PRECISION – удвоенная точность с плавающей точкой;

DATETIME – дата и время;

BOOL – булевое значение.

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

Таблица 4.8 Ограничения на определяемые данные

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

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

Нельзя использовать оператор создания таблицы несколько раз для одной и той же таблицы. Если после ее создания обнаружились неточности в ее определении, то внести изменения можно с помощью оператора ALTER TABLE. Этот оператор предназначен для изменения структуры существующей таблицы: можно удалить или добавить поле к существующей таблице.

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

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

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

SET сумма=сумма+1000.00

WHERE сумма>0

Удаление строк из таблицы осуществляется с помощью оператора DELETE. Синтаксис оператора имеет вид:

FROM таблица

Предложение WHERE не является обязательным, однако, если его не включить, то будут удалены все записи таблицы. Полезно использовать оператор SELECT c тем же синтаксисом, что и оператор DELETE, чтобы предварительно проверить, какие записи будут удалены.

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

Выборка данных – одна из важнейших функций базы данных, которой соответствует оператор SELECT. Пример использования оператора был рассмотрен в предыдущем разделе.

В SQL можно создавать вложенные последовательности запросов (подзапросы). Существуют определенные типы запросов, которые лучше реализовывать с помощью подзапросов. К таким запросам относятся так называемые проверки существования. Предположим, что требуется получить данные о студентах, которые не имеют оценку «семь баллов». Если будет возвращено пустое множество, то это означает лишь одно – у каждого студента есть, по крайней мере, одна такая оценка.

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

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

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

Управление доступом. SQL обеспечивает синхронизацию обработки базы данных различными прикладными программами, защиту данных от несанкционированного доступа.

Доступ к данным в многопользовательской среде регулируется с помощью операторов GRANT и REVOKE. В каждом операторе необходимо указать пользователя, объект (таблицу, представление), по отношению к которому задаются полномочия, и сами полномочия. Например, оператор GRANT задает пользователю Х возможность производить выборку данных из таблицы ТОВАР:

GRANT SELECT ON ТОВАР TO X

Оператор REVOKE аннулирует все предоставленные ранее полномочия.

Встраивание SQL в прикладные программы . Реальные приложения обычно написаны на других языках, генерирующих код на языке SQL и передающих их в СУБД в виде текста в формате ASCII.

Стандартом фирмы IBM для SQL-продуктов регламентировано использование встроенного языка SQL. При написании прикладной программы ее текст представляет собой смесь команд основного языка программирования (например, C, Pascal, Cobol, Fortran, Assembler) и команд SQL со специальным префиксом, например. ExecSQL. Структура SQL-предложений расширена для размещения переменных основного языка в SQL-конструкции.



SQL-процессор видоизменяет вид программы в соответствии с требованиями компилятора основного языка программирования. Функция компилятора состоит в трансляции (перевод) программы с исходного языка программирования на язык, близкий к машинному. После компиляции прикладная программа (приложение) представляет собой самостоятельный модуль.

Диалекты языка SQL

В современных реляционных СУБД для описания и манипулирования данными используются диалекты языка SQL. Подмножество языка SQL, позволяющее создавать и описывать БД, называется DDL (Data Definition Language).

Первоначально язык SQL назывался SEQUEL(Structured English Query Language), потом SEQUEL/2, а затем просто – SQL. Сегодня язык SQL –фактический стандарт для реляционных СУБД.

Первый стандарт языка появился в 1989 г. – SQL-89 и поддерживался практически всеми коммерческими реляционными СУБД. Он имел общий характер и допускал широкое толкование. Достоинствами SQL-89 можно считать стандартизацию синтаксиса и семантики операторов выборки и манипулирования данными, а также фиксацию средств ограничения целостности базы данных. Однако в нем отсутствовал такой важный раздел как манипулирование схемой базы данных. Неполнота стандарта SQL-89 привела к появлению в 1992г. следующей версии языка SQL.

SQL2 (или SQL-92) охватывает практически все необходимые проблемы: манипулирование схемой базы данных, управление транзакциями и сессиями, поддерживает архитектуры клиент-сервер или средства разработки приложений.

Дальнейшим шагом развития языка является вариант SQL 3. Эта версия языка дополняется механизмом триггеров, определением произвольного типа данных, объектным расширением.

В настоящее время существует три уровня языка: начальный, промежуточный и полный. Многие производители своих СУБД применяют собственные реализации SQL, основанные как минимум на начальном уровне соответствующего стандарта ANSI, и содержащие некоторые расширения, специфические для той или иной СУБД. В табл. 4.9 приведены примеры диалектов SQL.

Таблица 4.9 Диалекты языка SQL

СУБД Язык запросов
СУБД System R SQL
DB2 SQL
Access SQL
SYBASE SQL Anywhere Watcom-SQL
SYBASE SQL Server Transact_SQL
My SQL SQL
Oracle PL/SQL

В объектно-ориентированных БД используется язык объектных запросов OQL (Object Query Language). За основу языка OQL была взята команда SELECT языка SQL2 и добавлены возможность направлять запрос к объекту или коллекции объектов, а также возможность вызывать методы в рамках одного запроса.

Совместимость многих используемых диалектов SQL обусловливает совместимость СУБД. Так, СУБД SYBASE SQL Anywhere максимально, насколько это возможно для СУБД такого класса, совместима с СУБД SYBASE SQL Server. Одной из сторон такой совместимости является поддержка в SYBASE SQL Anywhere такого диалекта языка SQL как Transact-SQL . Этот диалект используется в SYBASE SQL Server и может применяться в SYBASE SQL Anywhere наряду с собственным диалектом языка SQL - Watcom-SQL .

Контрольные вопросы

1. Как можно классифицировать СУБД?

2. Какие модели баз данных существуют?

3. Что является основными элементами инфологических моделей?

4. Какие типы связей между сущностями существуют?

5. Что такое ER-диаграммы и для чего они используются?

6. Что позволяет делать процедура нормализации таблиц?

7. Назовите языковые и программные средства СУБД?

8. К каому типу относится СУБД MS Access?

9. Назовите основные объекты СУБД MS Access?

10. Для чего используются основные операторы языка SQL?

Язык структурированных запросов Structure Query Language (SQL) был создан в результате разработки реляционной модели данных и в настоящее время является фактическим стандартом языка реляционных СУБД. Язык SQL сегодня поддерживается огромным количеством СУБД различных типов.

Название языка SQL произносится обычно по буквам «эс-кью-эль». Иногда используют мнемоническое имя «See-Quel».

Язык SQL предоставляет пользователю (при минимальных усилиях с его стороны) следующие возможности:

Создавать базы данных и таблицы с полным описанием их структуры

Выполнять основные операции манипулирования данными: вставка, изменение, удаление данных

Выполнять как простые, так и сложные запросы.

Язык SQL является реляционно полным.

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

Язык SQL имеет два основных компонента:

Язык DDL (Data Definition Language) для определения структур базы данных и управления доступом к данным

Язык DML (Data Manipulation Language), предназначенный для выборки и обновления данных.

Язык SQL является непроцедурным, т. е. при его использовании необходимо указывать то, какая информация должна быть получена, а не то, как ее можно получить. Команды языка SQL представляют собой обычные слова английского языка (SELECT, INSERT и др.). Рассмотрим вначале операторы SQL DML:

SELECT - выборка данных из базы

INSERT - вставка данных в таблицу

UPDATE - обновление данных в таблице

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

Оператор SELECT

Оператор выборки SELECT выполняет действия, эквивалентные следующим операциям реляционной алгебры: выборка, проекция и соединение.

Простейший SQL-запрос с его использованием выглядит следующим образом:

SELECT col_name FROM tbl

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

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

Для выборки всех столбцов и всех строк таблицы достаточно сделать запрос SELECT * FROM tbl;

Рассмотрим таблицу Product, содержащую сведения о цене на различные виды продукции:

Результатом запроса

SELECT * FROM Product;

будет вся таблица Product.

Выбрать конкретные столбцы таблицы можно с помощью запроса

SELECT col1, col2, … , coln FROM tbl;

Так, результатом запроса

SELECT Type, Price FROM Product;

будет таблица

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

Для того чтобы выбрать лишь те строки таблицы, которые удовлетворяют некоторым ограничениям, используется специальное ключевое слово where, после которого следует логическое условие. Если запись удовлетворяет такому условию, она попадает в результат. В противном случае такая запись отбрасывается.

Например, выбор тех товаров из таблицы Product, цена которых удовлетворяет условию Price <3200, можно осуществить, используя запрос

SELECT * FROM Product where Price <3200;

Его результат:

Условие может быть составным и объединяться при помощи логических операторов NOT , AND, OR, XOR, например: where id_ Price>500 AND Price<3500. Допускается также использование выражений в условии: where Price>(1+1) и строковых констант: where name= "автовесы".

Применение конструкции BETWEEN var1 AND var2 позволяет проверить, попадают ли значения какого-либо выражения в интервал от var1 до var2 (включая эти значения):

SELECT * FROM Product where Price BETWEEN 3000 AND 3500;

По аналогии с оператором NOT BETWEEN существует оператор NOT IN.

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

SELECT Type AS model, Type_id AS num FROM Product where Type_id =3

вернет (имена псевдонимов следует записывать без кавычек):

Оператор LIKE предназначен для сравнения строки с образцом:

SELECT * FROM tbl where col_name LIKE "abc"

Этот запрос возвращает лишь те записи, которые содержат в столбце col_name строковое значение abc.

В образце разрешается использовать два трафаретных символа: "_" и "%". Первый из них заменяет в шаблоне один произвольный символ, а второй - последовательность произвольных символов. Так, "abc%" соответствует любой строке, начинающейся на abc, "abc_" - строке из 4-х символов, начинающейся на abc, "%z" - произвольной строке, заканчивающейся на z, и, наконец, "%z%" - последовательности символов, содержащих z.

Найти все записи таблицы Product, в которых значение Type начинается с буквы "a" можно так:

SELECT * FROM Product where Type LIKE "а%";

автовесы

Если искомая строка содержит трафаретный символ, то следует задать управляющий символ в предложении ESCAPE. Этот управляющий символ должен использоваться в образце перед трафаретным символом, сообщая о том, что последний следует трактовать как обычный символ. Например, если в некотором поле следует отыскать все значения, содержащие символ "_", то шаблон "%_%" приведет к тому, что будут возвращены все записи из таблицы. В данном случае шаблон следует записать следующим образом:

"%|_%" ESCAPE "|"

Для проверки значения на соответствие строке "20%" можно воспользоваться таким оператором:

LIKE "20#%" ESCAPE "#"

Оператор IS NULL позволяет проверить отсутствие (наличие) NULL-значения в полях таблицы. Использование в этих случаях обычных операторов сравнения может привести к неверным результатам, так как сравнение со значением NULL дает результат UNKNOWN (неизвестно). Таким образом, условие отбора должно выглядеть так:

where col_name IS NULL, вместо where col_name=NULL.

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

SELECT * FROM tbl ORDER BY col_name;

В результате этого запроса записи будут возвращены в порядке возрастания значения атрибута col_name.

Сортировку записей можно производить и по нескольким столбцам. Для этого их названия надо указать после ORDER BY через запятую:

SELECT * FROM tbl ORDER BY col_name1, col_name2.

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

Если требуется отсортировать записи в обратном порядке (например, по убыванию даты), требуется указать ORDER BY col_name DESC.

Для прямой сортировки существует ключевое слово ASC, которое принято в качестве значения по умолчанию.

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

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

SELECT * FROM tbl ORDER BY col_name1 DESC LIMIT 10

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

SELECT * FROM tbl ORDER BY col_name1 DESC LIMIT 10,10

Для извлечения следующих 10 записей необходимо использовать конструкцию LIMIT 20, 10.

Лучшие статьи по теме