DeepEdit!

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

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

SQL - стандартный язык запросов

SQL — это язык, который позволяет вам запрашивать или обновлять данные в реляционных базах данных, таких как IBM DB2, Firebird, Ingres, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL и SQLite. Реляционная база данных представляет собой систему, хранящую различные отношения между её данными. Примерами отношений могут быть, например, поля, записи, таблицы и ссылки на другие поля, таблицы, записи и базы данных. Несмотря на то, что имеется стандарт языка SQL, его реализации в различных существующих базах данных могут существенно различаться. Это связано с тем, что вендоры часто разрабатывают собственные расширения для стандартного SQL. Для соответствия стандарту ANSI (американский национальный институт стандартов - организация, управляющая стандартами в США) должны быть реализованы как минимум базовые команды языка, которые мы обсудим в данной статье. Прочие же команды (например, создания базы данных или управления пользователями) всецело зависят от специфики СУБД или от вендора.
В данной статье рассматриваются основные команды языка SQL: SQL:  SELECT,  INSERT, UPDATE,  and DELETE.
Прочие SQL-команды используются в основном при администрировании баз данных. Они используются программами с графическим интерфейсом для выполнения задач администрирования, которые есть для большинства СУБД. Подробную информацию об этих SQL-командах вы можете получить, изучив руководство по используемой вами СУБД, либо обратившись на соответствующие форумы в Интернете. Будем называть команды SQL операторами.
SELECT
Наиболее часто используемым оператором языка SQL, по всей видимости, является SELECT. Эта команда «задаёт вопросы» базе данных - вот почему SQL называется "языком запросов".
Типичная запись оператора SELECT выглядит так: SELECT * FROM Customer
Эта команда запрашивает все записи таблицы CUSTOMER (Клиенты).
Название таблицы, к которой мы получаем доступ, следует за кодовым словом FROM. За этим словом на самом деле может следовать не одна таблица, а целый список таблиц, из которых будут собираться данные. Синтаксис языка SQL поддерживает так называемые "предложения" (clause) - специфические кодовые слова, формирующие наиболее важные блоки внутри оператора SQL. Оператор SQL может содержать, например, следующие предложения: SELECT,  FROM, WHERE GROUP BY и ORDER BY. Предложения SELECT и FROM являются обязательными, остальные — нет.
Вот более расширенная запись оператора SELECT:
SELECT   C . LastName   C . FirstName ,   I . TotalAmount  AS  Amount
FROM  Customer  AS   C,   Invoice  AS   I
WHERE   NOT   Paid
AND   I . DueDate  <   Now ()
AND   C . Id  =   I.CustomerId ORDER BY  C . LastName
Этот оператор запрашивает имена клиентов и суммы по всем неоплаченным счетам, у которых должная дата оплаты уже прошла. Этот пример содержит предложения SELECT, FROM, WHERE и ORDER BY.
В этом примере предложение SELECT выбирает три поля — LastName (фамилия), FirstName (имя) и TotalAmount (общая сумма). Здесь для поля TotalAmount записан псевдоним (alias): Amount. Поэтому в результирующей выборке это поле будет иметь заголовок Amount, а не TotalAmount. Эта особенность может быть использована для передачи результата в компонент, в котором названия полей используются в качестве названий столбцов. Предложение ORDER BY указывает, каким образом результат должен быть отсортирован. Если оно отсутствует, порядок данных в выборке будет произвольным. Вы можете указать в этой фразе одно или несколько полей, разделяя их запятыми. Порядок сортировки по умолчанию — по возрастанию значений, однако если указать после названия столбца слово DESC, этот порядок будет по убыванию значений. То есть, при записи ORDER BY C.Amount наибольшее значение TotalAmount будет идти в выборке самым первым.
В предложении FROM указано, что таблица Customer также может быть доступна через псевдоним C, а таблица Invoice - через псевдоним I. Псевдоним является своего рода «кратким названием» таблицы, которое можно использовать, когда эти таблицы должны быть выделены в тексте запроса. Например, если таблица Customer ("Клиент") содержит поле с именем LastName, а таблица Invoice ("Счёт") такого поля не содержит, вы можете просто использовать название LastName в предложении SELECT. Но если две таблицы содержат поля с одним и тем же названием, например, CreationDate, СУБД не сможет определить, поле из какой таблицы имелось в виду. В этом случае следует указать нужную таблицу (Customer или Invoice), используя её имя или псевдоним — C.CreationDate или I.CreationDate.
Если в предложении FROM присутствует несколько таблиц, получится результат в виде так называемого "декартового произведения" этих таблиц. При отсутствии предложения WHERE число записей в выборке будет равно произведению всех записей всех таблиц (например, для трёх таблиц с пятью записями в каждой из них результат будет содержать 5 x 5 x 5 = 125 записей). Записи в выборке-результате содержат все возможные комбинации записей этих таблиц. Но так как нам нужны только комбинации записей из таблиц Customer и Invoice, в которых счета связаны со своими владельцами, мы включаем условие C.Id=I.CustomerID. В принципе, предложение WHERE обычно должно содержать такие объединяющие условия для каждой таблицы, если таблиц больше одной.
Предложение WHERE указывает, в каких случаях записи должны включаться в результат выборки. Для определения условий включения записи используются логические выражения и операторы. В приведённом выше примере команды SELECT запись включается в результат, если счёт, относящийся к конкретному пользователю, до сих пор не оплачен, и при этом дата, до которой он должен был быть оплачен, уже прошла. Используемая здесь функция Now() возвращает текущие дату и время.
INSERT
Чтобы добавить запись в таблицу, используйте команду INSERT, как показано ниже:
INSERT   INTO   Customer    (FirstName,   LastName,   Address, HouseNumber,   City)
VALUES    ("Henk",    "Janssen",    Stationsstraat",   4,
Utrecht")
Предложение INSERT INTO содержит название таблицы, в которую добавляется запись, а за ним в круглых скобках перечисляются поля, в которые будут помещены значения. Поля таблицы, которые в этом списке указаны не будут, получат значение по умолчанию (обычно NULL, то есть поле останется пустым). Не следует включать в список полей автоинкрементные поля (или идентификаторы), так как они получат свои значения автоматически.
Предложение VALUES, которое следует за INSERT INTO, содержит значения полей, указанных в INSERT INTO; при этом порядок значений в VALUES должен соответствовать порядку названий полей в INSERT INTO. В зависимости от типа СУБД нужно помещать текстовые значения либо в кавычки ("), либо в апострофы ('). Заметим: количество полей должно быть равно количеству значений.

UPDATE
Оператор UPDATE предназначен для изменения значений записей:
UPDATE   Customer
SET  Address   =   "Steenweg",   HouseNumber   =   12,
City        Naarden"   WHERE   Id  =   12
В этом примере приведены все предложения, которые могут быть представлены в команде UPDATE: обязательные UPDATE и SET, и необязательное WHERE. Как видите, команда UPDATE имеет запись, несколько отличную от команды INSERT. Предложение UPDATE содержит название таблицы, в которой должны быть изменены одна или более записей. Предложение SET содержит разделённый запятыми список, в элементах которого содержатся названия полей таблицы, знак равенства (=) и значение, которое требуется присвоить этому полю.
Предложение WHERE аналогично одноимённому предложению в операторе SELECT: его параметром является логическое выражение. Будут изменены все записи, для которых результат этого выражения будет True. Будьте осторожны: при отсутствии предложения WHERE будут изменены ВСЕ записи таблицы!
DELETE
Наш обзор основных команд SQL завершим командой DELETE. При разработке новой базы данных важно знать разницу между логическим и физическим удалением записей из таблицы. Когда вы удаляете запись только логически, она физически остаётся в базе данных, при этом получая пометку "удалена".
Следите за тем, чтобы логически удалённая запись не показывалась в выборках (просто добавьте во все команды SELECT условие для исключения удалённых или неактивных записей). Логическое удаление обычно рекомендуется в ситуациях, когда неопытные пользователи могут удалить значительный объём данных, либо в сценариях с протоколированием. При физическом удалении записи эта запись больше не будет храниться в базе данных.
" Peter" " Halsema"
В SQL физическое удаление делается командой DELETE: DELETE  FROM  Customer
WHERE  FirstName = AND  LastName  =
Команда DELETE имеет только два предложения: обязательное DELETE FROM и дополнительное WHERE. За DELETE FROM следует название таблицы, из которой нужно удалить записи. Предложение WHERE аналогично одноимённому в предложениях SELECT и UPDATE. Будьте осторожны: если предложения WHERE в запросе не будет, после выполнения команды таблица станет пустой!
Заключение
Используя базовые операторы SQL, вы можете сделать гораздо больше, чем то, о чём я смог рассказать в этой вводной статье. Если это будет интересно, я более подробно рассмотрю SQL-операторы в следующей статье. Если у вас есть вопросы по SQL, не стесняйтесь, пишите мне (mvdlaar@gmail.com).
 









jAntivirus