Опубликован: 07.05.2010 | Доступ: свободный | Студентов: 2863 / 291 | Оценка: 4.49 / 4.19 | Длительность: 25:58:00
Лекция 8:

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

< Лекция 7 || Лекция 8: 12 || Лекция 9 >

Оператор LIKE

Оператор LIKE работает только с символьными и строковыми полями. Этот оператор позволяет находить записи, имеющие заданную подстроку. Предположим, нам требуется вывести всех сотрудников, чья фамилия начинается на букву "Л". Запрос будет таким:

SELECT Фамилия, Имя, Отчество
FROM LichData
WHERE Фамилия LIKE 'Л%';

Следует учитывать, что оператор LIKE чувствителен к регистру букв. Если вы будете производить поиск записи в программе при помощи SQL -запроса, позаботьтесь заранее привести буквы к нужному регистру.

Оператор LIKE использует маску символов, что позволяет задавать довольно сложные условия. Маска может иметь два специальных символа:

  • " _ " - Символ подчеркивания обозначает, что в этом месте должен быть любой символ. Например, "м_р" может выводить такие слова, как "мир", "мор" или "мур", но не сможет вывести слово "мера".
  • " % " - Символ процента обозначает, что в этом месте может быть любое количество любых символов. Например, маска '_и_и%' выведет такие фамилии, как Лисичкин, Синичкин, Милиев.

Агрегатные функции

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

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

SELECT AVG (Стаж)
FROM LichData;

MAX - Функция возвращает максимальное значение указанного поля. Синтаксис аналогичен функции AVG.

MIN - Функция возвращает минимальное значение указанного поля. Синтаксис аналогичен функции AVG.

SUM - Функция возвращает сумму значений в указанном поле. Синтаксис аналогичен функции AVG.

COUNT - Функция возвращает общее количество строк, сформированных запросом. В нашем случае это количество будет равно количеству сотрудников. Однако так называемые NULL -строки, то есть строки без значения, функция не учитывает. Если у какого-то сотрудника нет указания стажа его работы, то COUNT вернет меньшее количество, чем имеется сотрудников на предприятии. Синтаксис аналогичен функции AVG.

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

SELECT SUM (Стоимость * Количество)
FROM Pokupateli;

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

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

Команда GROUP BY

Команда GROUP BY позволяет группировать записи по какому-то определенному значению, и применяется совместно с агрегатными функциями. Предположим, нам требуется не просто получить средний стаж всех сотрудников, а еще и разбить эти данные по отделам. Вдруг директору приспичит узнать, в каком отделе у него работает больше всего молодых или старых специалистов! В нашу задачу входит выявить средний стаж сотрудников для каждого имеющегося отдела. Это мы можем выявить таким запросом:

SELECT AVG(Стаж), Отдел
FROM LichData, Doljnost
WHERE Ключ = Сотрудник
GROUP BY Отдел;

Как видите, команда GROUP BY используется после команды WHERE и группирует записи по значению поля "Отдел". В результате получим таблицу из двух полей. Первое поле будет сформировано агрегатной функцией, второе поле "Отдел" из таблицы Doljnost. Для каждого отдела будет рассчитано среднее значение поля "Стаж".

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

SELECT Отдел, Должность, MAX(Стаж)
FROM LichData, Doljnost
WHERE Ключ = Сотрудник
GROUP BY Отдел, Должность;

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

Команда DISTINCT | ALL

Команда DISTINCT (Отличие) предназначена для удаления избыточных (дублирующих) данных. Предположим, нам нужно получить список отделов на предприятии. Мы можем воспользоваться запросом:

SELECT Отдел
FROM Doljnost;

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

SELECT DISTINCT Отдел
FROM Doljnost;

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

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

Команда HAVING

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

SELECT Отдел, Должность, MAX(Стаж)
FROM LichData, Doljnost
WHERE Ключ = Сотрудник AND (MAX(Стаж) > 7)
GROUP BY Отдел, Должность;

вызовет ошибку. Использование в запросе команды HAVING решает эту проблему:

SELECT Отдел, Должность, MAX(Стаж)
FROM LichData, Doljnost
WHERE Ключ = Сотрудник
GROUP BY Отдел, Должность
HAVING MAX(Стаж) > 7;

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

< Лекция 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 В операции должен использоваться обновляемый запрос'. 

Сергей Власюк
Сергей Власюк
Украина
Игорь Крещенников
Игорь Крещенников
Россия, Новосибирск