Разработка баз данных в Delphi. 11 Уроков

       

 Реляционные операции. Команды языка манипулирования данными


Наиболее важной командой языка манипулирования данными является команда SELECT. За кажущейся простотой ее синтаксиса скрывается огромное богатство возможностей. Нам важно научиться использовать это богатство!

На данном уроке предполагается, если не оговорено противное, что все команды языка SQL вводятся интерактивным способом. В качестве информационной основы для примеров мы будем использовать базу данных “Служащие предприятия” (employee.gdb), входящую в поставку Delphi и находящуюся (по умолчанию) в поддиректории \IBLOCAL\EXAMPLES.

Ðèñ. 1: Ñòðóêòóðà áàçû äàííûõ EMPLOYEE

На рис.1 приведена схема базы данных EMPLOYEE для Local InterBase, нарисованная с помощью CASE-средства S?Designor (см. доп. урок). На схеме показаны таблицы базы данных и взаимосвязи, а также обозначены первичные ключи и их связи с внешними ключами. Многие из примеров, особенно в конце урока, являются весьма сложными. Однако, не следует на этом основании делать вывод, что так сложен сам язык SQL. Дело, скорее, в том, что обычные (стандартные) операции настолько просты в SQL, что примеры таких операций оказываются довольно неинтересными и не иллюстрируют полной мощности этого языка. Но в целях системности мы пройдем по всем возможностям SQL: от самых простых - до чрезвычайно сложных.

Начнем с базовых операций реляционных баз данных. Таковыми являются:

*                                                               выборка     (Restriction)

*                                                               проекция
   (Projection)

*                                                               соединение (Join)

*                                                               объединение        (Union).

Операция выборки позволяет получить все строки (записи) либо часть строк одной таблицы.

SELECT * FROM country      Получить все строки
                                                                         таблицы Country

COUNTRY         CURRENCY  

=============== ==========

USA             Dollar    

England         Pound     

Canada          CdnDlr    

Switzerland     SFranc    

Japan           Yen       

Italy           Lira      

France          FFranc    

Germany         D-Mark    

Australia       ADollar   

Hong Kong       HKDollar  

Netherlands     Guilder   

Belgium         BFranc    

Austria         Schilling 

Fiji            FDollar

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

SELECT * FROM country

WHERE currency = “Dollar”  Получить подмножество строк таблицы Country,                                                                             удовлетворяющее             условию Currency = “Dollar”

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



COUNTRY         CURRENCY  

=============== ==========

USA             Dollar

Операция проекции позволяет выделить подмножество столбцов таблицы. Например:

SELECT currency FROM country    Получить список
                                                                                       денежных единиц

CURRENCY  

==========

Dollar    

Pound     

CdnDlr    

SFranc    

Yen       

Lira      

FFranc    

D-Mark    

ADollar   

HKDollar  

Guilder   

BFranc    

Schilling 

FDollar

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

SELECT currency FROM country  

WHERE country = “Japan”        Найти денежную
                                                                                     единицу Японии

CURRENCY  

==========

Yen

SELECT first_name, last_name

FROM employee

WHERE first_name = "Roger"      Получить фамилии
                                                                              работников,
                                                                              которых зовут “Roger”

FIRST_NAME      LAST_NAME           

=============== ====================

Roger           De Souza            

Roger           Reeves

Эти примеры иллюстрируют общую форму команды SELECT в языке SQL (для одной таблицы):

SELECT  (выбрать) специфицированные поля

FROM    (из) специфицированной таблицы

WHERE   (где) некоторое специфицированное условие является                                                 истинным

Операция соединения позволяет соединять строки из более чем одной таблицы (по некоторому условию) для образования новых строк данных.

SELECT first_name, last_name, proj_name

FROM employee, project

WHERE emp_no = team_leader  Получить список


                                                                              руководителей проектов

FIRST_NAME     LAST_NAME         PROJ_NAME           

============== ================= ====================

Ashok          Ramanathan        Video Database      

Pete           Fisher            DigiPizza           

Chris          Papadopoulos      AutoMap             

Bruce          Young             MapBrowser port     

Mary S.        MacDonald         Marketing project 3

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

SELECT first_name, last_name, job_country

FROM employee

WHERE job_country = "France"

UNION

SELECT contact_first, contact_last, country

FROM customer

WHERE country = "France"     Получить список
                                                                                работников и заказчиков,
                                                                                проживающих во Франции

FIRST_NAME      LAST_NAME         JOB_COUNTRY    

=============== ================= ===============

Jacques         Glon              France         

Michelle        Roche             France

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

SELECT    [DISTINCT] список_выбираемых_элементов (полей)

FROM      список_таблиц (или представлений)

[WHERE    предикат]

[GROUP BY поле (или поля) [HAVING предикат]]

[UNION    другое_выражение_Select]

[ORDER BY поле (или поля) или номер (номера)];

Ðèñ. 2: Îáùèé ôîðìàò êîìàíäû SELECT

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

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




Содержание раздела