Опубликован: 07.05.2010 | Уровень: специалист | Доступ: платный
Лекция 8:

Краткий курс языка запросов SQL

< Лекция 7 || Лекция 8: 12 || Лекция 9 >
Аннотация: На этой лекции вы познакомитесь с основными командами языка запросов SQL и научитесь формировать как простые, так и сложные запросы.

SQL ( Structured Query Language ) - Это Язык Структурированных Запросов. Он не такой богатый, как языки программирования высокого уровня. Тем не менее, это язык, без владения которым программисту, работающему с базами данных, не обойтись. Запросы, написанные на SQL, часто называют скриптами. Как вы уже знаете, эти скрипты можно непосредственно вводить в свойство SQL компонента-запроса в момент проектирования приложения, а можно значение этого свойства менять и в процессе прогона программы. Однако нередко используют и третий способ: программист создает набор скриптовых файлов, в процессе работы программа считывает из них SQL -инструкции в компоненты запросов и выполняет их. Это простые текстовые файлы, созданные в любом редакторе текстов, например, стандартном Блокноте Windows. Расширение может быть любым, но традиционно используется *.sql. Все это позволяет создавать гибкие программы. Если организации, использующей ваше приложение, в дальнейшем потребуются какие-то новые возможности, например, им нужно дополнительно создать еще один отчет, то применение скриптовых файлов избавит вас от необходимости переделывать программу, для этого достаточно будет написать скрипт.

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

Команда SELECT

Команда SELECT является основой запроса. Большинство SQL -запросов начинаются с нее. Множество других команд вкладываются в блок SELECT. Полный синтаксис этой команды таков:

SELECT * | { [ DISTINCT | ALL] <value expression>.,..}
   FROM { <table name> [ <alias> ] }.,..
   [ WHERE <predicate>]
   [ GROUP BY { <column name> | <integer> }.,..]
   [ HAVING <predicate>]
   [ ORDER BY { <column name> | <integer> }.,..];

Здесь используются следующие элементы:

Таблица 8.1 . Элементы команды SELECT
Элемент Описание
<value expression> Выражение, которое производит значение. Оно может включать имена столбцов.
<table name> Имя или синоним таблицы или представления
<alias> Временный синоним для < table name >, определенный в этой таблице и используемый только в этой команде.
<predicate> Условие, которое может быть верным или неверным для каждой строки или комбинации строк таблицы в предложении FROM.
<column name> Имя столбца в таблице.
<integer> Число с десятичной точкой. В этом случае, оно показывает < value expression > в предложении SELECT с помощью идентификации его местоположения в этом предложении.

В простейшем случае применение команды SELECT выглядит так:

SELECT *
FROM Table_Name;

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

SELECT Field1, Table1.Field2, Table2.Field2…
FROM Table1, Table2;

Команда FROM определяет имена таблиц, из которых осуществляется выборка данных. Если таблиц несколько, их имена разделяются запятыми. Иногда таблицы имеют длинные имена. В этом случае бывает выгодно использовать псевдонимы (alias) имен таблиц, указывая их через пробел после имени таблицы:

SELECT Field1, f.Field2, s.Field2
FROM Table1 f, Table2 s;

Команда WHERE

Команда WHERE позволяет использовать условие, которые может быть верным или нет для каждой записи БД. Если условие верное, то запись добавляется в набор данных, иначе отвергается. Давайте рассмотрим пример. Загрузите SQL -монитор из прошлой лекции. Предположим, нам нужно получить следующие данные на каждого сотрудника: Фамилия, Имя, Отдел, Должность. Пишем соответственный SQL -запрос:

SELECT Фамилия, Имя, Отдел, Должность
FROM LichData, Doljnost;

Выполнив этот запрос, вы получите нечто непонятное. В полученном наборе данных всем сотрудникам подряд присваивается вначале первая должность, затем вторая, и так до конца. Другими словами, если у вас 10 сотрудников и 10 должностей, то вместо ожидаемых десяти записей вы получите 10 * 10 = 100 записей! Полученные данные называют недостоверными. Чтобы избежать этого, существует команда WHERE, которая позволяет задать условие выборки данных:

SELECT Фамилия, Имя, Отдел, Должность
FROM LichData, Doljnost
WHERE Ключ = Сотрудник;

Теперь все в порядке, отдел и должность соответствуют каждому сотруднику. Мы указали, что нам нужны лишь те записи, значения которых в поле "Ключ" одной таблицы соответствуют значениям в поле "Сотрудник" другой таблицы. Полный синтаксис требует указания таблицы вместе с полем:

WHERE LichData.Ключ = Doljnost.Сотрудник;

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

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

Таблица 8.2 . Операторы сравнения
Оператор Описание
= Равно
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
<> Не равно

Кроме того, мы можем использовать логические операторы AND, OR и NOT, формируя более сложные запросы:

SELECT Фамилия, Имя, Отдел, Должность
FROM LichData, Doljnost
WHERE (LichData.Ключ = Doljnost.Сотрудник) 
   AND (Должность = "Бухгалтер");

Логические операторы имеют более высокий приоритет, поэтому в приведенном примере можно обойтись и без скобок. Данный запрос выдаст нам данные только на бухгалтеров. Как вы могли заметить, в отличие от Delphi, строка в SQL заключается не в одинарные, а в двойные кавычки! Однако SQL более демократичен, одинарные кавычки тоже принимаются. Обычно их используют, если внутри строки требуется указать кавычки, например, 'Строка "в кавычках" будет отображена'.

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

Команда ORDER BY

Команда ORDER BY позволяет сортировать записи по определенному полю как в возрастающем, так и в убывающем порядке. Воспользуемся предыдущим примером, и отсортируем записи по полю "Фамилия":

SELECT Фамилия, Имя, Отдел, Должность
FROM LichData, Doljnost
WHERE Ключ = Сотрудник
ORDER BY Фамилия;

Как уже говорилось, мы можем сортировать данные как по возрастанию ( ASC ), так и по убыванию ( DESC ) значений. Сортировка по возрастанию установлена "по умолчанию", а вот чтобы сортировать записи по убыванию, после имени поля следует поставить служебное слово DESC:

ORDER BY Фамилия DESC;

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

SELECT Фамилия, Имя, Телефон, Примечание
FROM LichData, Telephones
WHERE Ключ = Сотрудник
ORDER BY Фамилия, Телефон;

В этом случае мы получим набор данных, в котором записи отсортированы вначале по фамилии сотрудника, затем по его номеру телефона:

Двойная сортировка данных

Рис. 8.1 . Двойная сортировка данных

Оператор IN

Оператор IN позволяет определить набор значений. Предположим, нам нужны сотрудники, проживающие в городах Москва и Санкт-Петербург. Мы можем сформировать сложный запрос:

SELECT Фамилия, Имя, Город
FROM LichData, Adres
WHERE Ключ = Сотрудник AND 
    (Город = "Москва" OR Город = "Санкт-Петербург");

Последнюю строку запроса можно упростить, если использовать оператор IN:

WHERE Ключ = Сотрудник AND Город IN 
  ("Москва", "Санкт-Петербург");

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

Оператор BETWEEN

Оператор BETWEEN работает примерно так же, как IN, но задает не список, а диапазон значений. Предположим, нам нужно выявить сотрудников, которые имеют стаж работы от 4 до 10 лет включительно. Подобный запрос выглядит так:

SELECT Фамилия, Имя, Стаж
FROM LichData
WHERE Стаж BETWEEN 4 AND 10;
< Лекция 7 || Лекция 8: 12 || Лекция 9 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'. 

Денис Попов
Денис Попов
Россия, Оренбург, Оренбургский государственный университет, 2015
Рустам Кадыров
Рустам Кадыров
Россия, Тирлян, Тирлянская школа №5, 2003