Язык SQL: краткая инструкция по работе, синтаксис и операторы

Основы работы с SQL на примерах

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



Простая база данных

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

  • о клиентах, которые покупают товары компании;
  • о заказах, сделанных клиентами;
  • о служащих компании, которые продают товары клиентам;
  • об офисах, где работают служащие.

Эта база данных, как и большинство других, является моделью "реального мира". Данные, содержащиеся в ней, представляют реальные сущности: клиенты, заказы, служащие компании и офисы. Для каждой сущности имеется собственная отдельная таблица. Например, в таблице SALESREPS каждый продавец представлен отдельной строкой, а каждый столбец хранит определенную информацию о продавце, такую как его имя или офис, где он работает. Запросы к базе данных, создаваемые с помо­щью SQL, отражают события, происходящие в реальном мире: клиенты делают, отменяют и изменяют заказы, владелец компании нанимает и увольняет служащих и т.д. Давайте посмотрим, что можно делать с этими данными с помощью SQL.

 

Рис. 1. Простая реляционная база данных

 

Выборка данных при помощи SQL

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

SELECT CITY, OFFICE, SALES
FROM OFFICES;

CITY          OFFICE            SALES
------------ -------     ------------
Denver            22      $186,042.00
New York          11      $692,637.00
Chicago           12      $735,042.00
Atlanta           13      $367,911.00
Los Angeles       21      $835,915.00

Инструкция SELECT применяется во всех SQL-запросах на выборку данных. Так, далее приведен запрос, который запрашивает список имен и текущих объе­мов продаж по всем служащим в базе данных. Кроме того, в запросе приводится планируемый объем продаж и номер офиса, где работает служащий. В этом слу­чае данные извлекаются из таблицы SALESREPS. Инструкция SELECT запрашивает для каждого офиса три вида данных: город, номер офиса и объем продаж. Еще она определяет, что данные находятся в табли­це OFFICES, в которой хранится информация об офисах. Результаты запроса при­ведены сразу после рассматриваемой инструкции в форме таблицы. Заметим, что форматирование вывода результатов запроса зависит от конкретной реализации SQL и может изменяться при переходе от одной СУБД к другой.

SELECT NAME, REP_OFFICE, SALES, QUOTA FROM SALESREPS;

NАМЕ          REP OFFICE          SALES         QUOTA
------------- ----------    -----------   -----------
Bill Adams            13    $367,911.00   $350,000.00
Mary Jones            11    $392,725.00   $300,000.00
S11e Smith            21    $474,050.00   $350,000.00
Sam Clark             11    $299,912.00   $275,000.00
ВоЬ Smith             12    $142,594.00   $200,000.00
Dan Roberts           12    $305,673.00   $300,000.00
Tom Snyder          NULL     $75,985.00          NULL
Larry Fitch           21    $361,865.00   $350,000.00
Paul Cruz             12    $286,775.00   $275,000.00
Nancy Angelli         22    $186,042.00   $300,000.00

SQL позволяет также запрашивать вычисляемые результаты. Например, можно попросить вычислить сумму, на которую каждый служащий опережает план или отстает от него. Значения NULL в строке продавца Тома Снайдера представляют отсутствующие или неизвестные данные. Он — новичок в компании и пока не получил ни назна­чения в определенный офис, ни планируемый объем продаж. Но тем не менее он уже осуществил некоторое количество продаж, о чем свидетельствуют выведен­ные данные в его строке.

 

SELECT NAME, SALES, QUOTA, (SALES – QUOTA)
FROM SALESREPS;

NAME                  SALES            QUOTA    (SALES–QUOTA)
-------------- ------------     ------------   --------------
Bill Adams      $367,911.00      $350,000.00       $17,911.00
Mary Jones      $392,725.00      $300,000.00       $92,725.00
Sue Smith       $474,050.00      $350,000.00      $124,050.00
Sam Clark       $299,912.00      $275,000.00       $24,912.00
Bob Smith       $142,594.00      $200,000.00      –$57,406.00
Dan Roberts     $305,673.00      $300,000.00        $5,673.00
Tom Snyder      $75,985.00              NULL             NULL
Larry Fitch     $361,865.00      $350,000.00       $11,865.00
Paul Cruz       $286,775.00      $275,000.00       $11,775.00
Nancy Angelli   $186,042.00      $300,000.00     –$113,958.00

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

 

SELECT NAME, SALES, QUOTA, (SALES – QUOTA)
  FROM SALESREPS
  WHERE SALES < QUOTA;

NAME                  SALES         QUOTA  (SALES–QUOTA)
-------------- ------------  ------------  -------------
Bob Smith       $142,594.00   $200,000.00    –$57,406.00
Nancy Angelli   $186,042.00   $300,000.00   –$113,958.00

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

SELECT ORDER_NUM, CUST, PRODUCT, QTY, AMOUNT
     FROM ORDERS
  WHERE AMOUNT > 25000.00
  ORDER BY AMOUNT;

  ORDER_NUM     CUST    PRODUCT    QTY        AMOUNT
 ----------    -----   --------   ----   -----------
     112987     2103      4100Y     11    $27,500.00
     113069     2109       775C     22    $31,350.00
     112961     2117      2A44L      7    $31,500.00
     113045     2112      2A44R     10    $45,000.00

 

Получение итоговых данных в SQL

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

SELECT AVG(AMOUNT)
   FROM ORDERS;

  AVG(AMOUNT)
 ------------
    $8,256.37

Можно также узнать среднюю стоимость всех заказов, сделанных конкретным клиентом.

SELECT AVG(AMOUNT)
     FROM ORDERS
   WHERE CUST = 2103;

 AVG(AMOUNT)
 -----------
   $8,895.50

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

SELECT CUST, SUM(AMOUNT)
     FROM ORDERS
   GROUP BY CUST;

 CUST     SUM(AMOUNT)
-----    ------------
 2101       $1,458.00
 2102       $3,978.00
 2103      $35,582.00
 2106       $4,026.00
 2107      $23,132.00
 2108       $7,255.00
 2109      $31,350.00
 2111       $6,445.00
 2112      $47,925.00
 2113      $22,500.00
 2114      $22,100.00
 2117      $31,500.00
 2118       $3,608.00
 2120       $3,750.00
 2124       $3,082.00


Добавление данных (INSERT)

SQL можно использовать и для добавления в таблицы новых данных. Предпо­ложим, что вы открыли в Далласе новый офис "Western" с плановым объемом продаж $275000. Ниже приведена инструкция INSERT, которая добавляет в соот­ветствующую таблицу новый офис с номером 23.

INSERT INTO OFFICES (CITY, REGION, TARGET, SALES, OFFICE)
   VALUES ('Dallas', 'Western', 275000.00, 0.00, 23);

1 row inserted.

Аналогично, если служащая Мери Джонс (номер 109) заключает договор с но­вым клиентом, компанией Acme Industries, приведенная ниже инструкция INSERT добавит в соответствующую таблицу имя клиента с номером 2125 и лимитом кре­дита в $25000.

INSERT INTO CUSTOMERS (COMPANY, CUST_REP, CUST_NUM, CREDIT_LIMIT)
   VALUES ('Acme Industries', 109, 2125, 25000.00);

1 row inserted.

 

Как можно заметить, механизм базы данных возвращает сообщение (1 row inserted) о том, что инструкция сработала. Точный текст и форматирование от­вета варьируются от одной реализации SQL к другой.

 

Удаление данных (DELETE)

Точно так же, как инструкция INSERT добавляет в таблицу новые данные, ин­струкция DELETE удаляет данные из таблицы. Если через несколько дней компа­ния Acme Industries решит отказаться от ваших услуг и уйти к конкуренту, вы сможете удалить из базы данных информацию о ней с помощью следующей инст­рукции.

DELETE FROM CUSTOMERS
   WHERE COMPANY = 'Acme Industries';

1 row deleted.

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

DELETE FROM SALESREPS
   WHERE SALES < QUOTA;

2 rows deleted.

 

Обновление данных (UPDATE)

SQL можно использовать и для обновления информации, уже содержащейся в базе данных. Например, чтобы увеличить лимит кредита для компании First Corp, до $75000, можно воспользоваться следующей инструкцией UPDATE.

 

UPDATE CUSTOMERS
     SET CREDIT_LIMIT = 75000.00
   WHERE COMPANY = 'First Corp.';

1 row updated.

С помощью инструкции UPDATE можно вносить в базу данных несколько об­новлений одновременно. Например, следующая инструкция UPDATE увеличивает план для всех продавцов на $15000.

UPDATE SALESREPS
     SET QUOTA = QUOTA + 15000.00;

8 rows updated.

 

Защита данных и права доступа

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

GRANT INSERT
    ON CUSTOMERS
    TO MARY;

Privilege granted.

Аналогично приведенная ниже инструкция дает Мери разрешение на измене­ние данных о клиентах и чтение информации о них с помощью SELECT.

GRANT UPDATE, SELECT
     ON CUSTOMERS
     TO MARY;

Privilege granted.

Если вы решите запретить Мери добавлять в базу данных сведения о новых клиентах, для этого достаточно воспользоваться инструкцией REVOKE.

REVOKE INSERT
     ON CUSTOMERS
     FROM MARY;

Privilege revoked.

Точно так же следующая инструкция revoke отменит все привилегии Мери на доступ и модифицирование данных о клиентах.

REVOKE ALL
     ON CUSTOMERS
     FROM MARY;

Privilege revoked.

 

Создание базы данных

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

  • идентификатор производителя — три символа;
  • идентификатор товара — пять символов;
  • описание — до тридцати символов;
  • цена товара;
  • количество товара.

Приведенная далее инструкция CREATE table определяет новую таблицу для хранения указанных данных о товарах.

CREATE TABLE PRODUCTS
  (MFR_ID CHAR(3),
   PRODUCT_ID CHAR(5),
   DESCRIPTION VARCHAR(30),
   PRICE DECIMAL(9,2),
   QTY_ON_HAND INTEGER);

Table created.

Хотя инструкция CREATE TABLE не столь очевидна, как инструкции, рассмат­ривавшиеся ранее, тем не менее она все же довольно проста. Эта инструкция при­сваивает новой таблице имя PRODUCTS и определяет для каждого из пяти ее столб­цов имя и тип данных, хранимых в нем. Идентификаторы производителя и товара хранятся в виде последовательностей символов фиксированной длины, описание товара — в виде строки переменной длины, цена представляет собой десятичные данные (действительное число), а количество — целочисленное значение.

После того как таблица создана, ее можно заполнять данными. Вот инструкция INSERT, предназначенная для ввода данных о новой партии изделия Size 7 Widget (товар ACI-41007) в количестве 250 единиц по цене $225 за штуку.

INSERT INTO PRODUCTS (MFR_ID, PRODUCT_ID, DESCRIPTION, PRICE, QTY_ON_HAND)
      VALUES ('ACI', '41007', 'Size 7 Widget', 225.00, 250);

1 row inserted.

Наконец, если позднее вы решите, что в базе данных больше не требуется хра­нить информацию о товарах, то можете удалить таблицу (вместе со всеми данны­ми, которые в ней содержатся) с помощью инструкции DROP TABLE.

DROP TABLE PRODUCTS;

 

Заключение

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

  • SQL используется для выборки информации из базы данных с помощью инструкции SELECT. Можно извлечь все данные из таблицы или лишь часть из них, отсортировать их и получить итоговые значения, вычисляя суммы и средние величины.
  • SQL используется для изменения информации в базе данных. Инструкция INSERT добавляет данные, инструкция DELETE удаляет их, а инструкция update обновляет существующие данные.
  • SQL используется для управления доступом к базе данных. С помощью инструкций SQL предоставляются и отменяются разного рода привиле­гии для различных пользователей.
  • SQL используется для создания и изменения базы данных путем опреде­ления структуры новых таблиц и удаления таблиц, ставших ненужными, для чего применяются инструкции CREATE и DROP.

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

Вас заинтересует / Intresting for you:

SQL: Правила выполнения однота...
SQL: Правила выполнения однота... 1452 просмотров Дэйзи ак-Макарова Sat, 31 Jul 2021, 06:47:05
Типы данных SQL: стандарт ANSI...
Типы данных SQL: стандарт ANSI... 4940 просмотров Дэн Sat, 05 Jun 2021, 09:43:17
Использование констант в запро...
Использование констант в запро... 4844 просмотров Дэйзи ак-Макарова Sat, 12 Jun 2021, 18:48:10
Операции SQL в базе данных Ora...
Операции SQL в базе данных Ora... 6801 просмотров Antoni Wed, 11 Apr 2018, 12:22:28
Войдите чтобы комментировать