Structured ) - Это Язык Структурированных Запросов. Он не такой богатый, как языки программирования высокого уровня. Тем не менее, это язык, без владения которым программисту, работающему с базами данных, не обойтись. Запросы, написанные на Windows. Расширение может быть любым, но традиционно используется *.sql. Все это позволяет создавать гибкие программы. Если организации, использующей ваше приложение, в дальнейшем потребуются какие-то новые возможности, например, им нужно дополнительно создать еще один отчет, то применение скриптовых файлов избавит вас от необходимости переделывать программу, для этого достаточно будет написать скрипт.
В этой лекции мы разберем работу основных операторов
Команда
SELECT * | { [ DISTINCT | ALL] <value expression>.,..}
FROM { <table name> [ <alias> ] }.,..
[ WHERE <predicate>]
[ GROUP BY { <column name> | <integer> }.,..]
[ HAVING <predicate>]
[ ORDER BY { <column name> | <integer> }.,..];
Здесь используются следующие элементы:
| Элемент | Описание |
|---|---|
| <value expression> | Выражение, которое производит значение. Оно может включать имена столбцов. |
| <table name> | Имя или синоним таблицы или представления |
| <alias> | Временный синоним для < table name >, определенный в этой таблице и используемый только в этой команде. |
| <predicate> | Условие, которое может быть верным или неверным для каждой строки или комбинации строк таблицы в предложении |
| <column name> | Имя столбца в таблице. |
| <integer> | Число с десятичной точкой. В этом случае, оно показывает < value expression > в предложении |
В простейшем случае применение команды
SELECT * FROM Table_Name;
Звездочка указывает, что нужно показать все поля. Вместо звездочки можно указать конкретное поле или поля, разделяя их запятыми. Иногда бывает, что требуются данные из разных таблиц, которые имеют поля с одинаковым именем. В этом случае, перед именем полей указывают имя таблицы, или ее псевдоним, разделяя имена таблицы и поля точкой:
SELECT Field1, Table1.Field2, Table2.Field2… FROM Table1, Table2;
Команда
SELECT Field1, f.Field2, s.Field2 FROM Table1 f, Table2 s;
Команда
SELECT Фамилия, Имя, Отдел, Должность FROM LichData, Doljnost;
Выполнив этот запрос, вы получите нечто непонятное. В полученном наборе данных всем сотрудникам подряд присваивается вначале первая должность, затем вторая, и так до конца. Другими словами, если у вас 10 сотрудников и 10 должностей, то вместо ожидаемых десяти записей вы получите 10 * 10 = 100 записей! Полученные данные называют недостоверными. Чтобы избежать этого, существует команда
SELECT Фамилия, Имя, Отдел, Должность FROM LichData, Doljnost WHERE Ключ = Сотрудник;
Теперь все в порядке, отдел и должность соответствуют каждому сотруднику. Мы указали, что нам нужны лишь те записи, значения которых в поле "Ключ" одной таблицы соответствуют значениям в поле "Сотрудник" другой таблицы. Полный синтаксис требует указания таблицы вместе с полем:
WHERE LichData.Ключ = Doljnost.Сотрудник;
Однако поскольку у нас в этих таблицах нет полей с похожими именами, мы можем воспользоваться упрощенным вариантом. И в том, и в другом случае мы получим одинаковый набор данных.
Как и в любом условии, здесь можно применять различные операторы сравнения:
| Оператор | Описание |
|---|---|
| = | Равно |
| > | Больше |
| < | Меньше |
| >= | Больше или равно |
| <= | Меньше или равно |
| <> | Не равно |
Кроме того, мы можем использовать логические операторы
SELECT Фамилия, Имя, Отдел, Должность FROM LichData, Doljnost WHERE (LichData.Ключ = Doljnost.Сотрудник) AND (Должность = "Бухгалтер");
Логические операторы имеют более высокий приоритет, поэтому в приведенном примере можно обойтись и без скобок. Данный запрос выдаст нам данные только на бухгалтеров. Как вы могли заметить, в отличие от Delphi, строка в
Еще следует заметить, что подобное связывание таблиц не требует наличия индексных полей. Но если такие поля есть,
Команда
SELECT Фамилия, Имя, Отдел, Должность FROM LichData, Doljnost WHERE Ключ = Сотрудник ORDER BY Фамилия;
Как уже говорилось, мы можем сортировать данные как по возрастанию (
ORDER BY Фамилия DESC;
Опять заметим, что для сортировки записей наличие индексных полей необязательно. Часто бывает, что нужно вывести данные из двух таблиц, имеющих связь один-ко-многим. При этом нужно сортировать данные не по одному, а по двум полям:
SELECT Фамилия, Имя, Телефон, Примечание FROM LichData, Telephones WHERE Ключ = Сотрудник ORDER BY Фамилия, Телефон;
В этом случае мы получим набор данных, в котором записи отсортированы вначале по фамилии сотрудника, затем по его номеру телефона:
(рис 8.1 ) Двойная сортировка данныхОператор
SELECT Фамилия, Имя, Город
FROM LichData, Adres
WHERE Ключ = Сотрудник AND
(Город = "Москва" OR Город = "Санкт-Петербург");
Последнюю строку запроса можно упростить, если использовать оператор
WHERE Ключ = Сотрудник AND Город IN
("Москва", "Санкт-Петербург");
Представьте, если нужны данные не по двум, а по десятку городов. В какого бы монстра превратился запрос со сложным условием, если не использовать
Оператор
SELECT Фамилия, Имя, Стаж FROM LichData WHERE Стаж BETWEEN 4 AND 10;
Оператор
SELECT Фамилия, Имя, Отчество FROM LichData WHERE Фамилия LIKE 'Л%';
Следует учитывать, что оператор
Оператор
SELECT AVG (Стаж) FROM LichData;
С помощью агрегатных функций можно формировать более сложные значения. Предположим, у нас есть таблица покупателей. В ней указан покупатель, код приобретенного товара, его стоимость и количество. Если требуется, например, вычислить общую сумму проданного товара, то можно выполнить запрос:
SELECT SUM (Стоимость * Количество) FROM Pokupateli;
В скобках функции указаны нужные параметры. Вначале для каждой записи вычисляется значение, в нашем случае, значение поля "Стоимость" умножается на значение поля "Количество". Таким образом, мы находим общую сумму, которую заплатил данный покупатель. Обойдя все поля таблицы, получим все суммы всех покупателей, после чего функция
В выражении агрегатных функций может участвовать любое количество полей таблицы, а само выражение может быть сколь угодно сложным, содержать различные арифметические операции, иметь вложенные скобки и т.д.
Команда
SELECT AVG(Стаж), Отдел FROM LichData, Doljnost WHERE Ключ = Сотрудник GROUP BY Отдел;
Как видите, команда Doljnost. Для каждого отдела будет рассчитано среднее значение поля "Стаж".
Команда
SELECT Отдел, Должность, MAX(Стаж) FROM LichData, Doljnost WHERE Ключ = Сотрудник GROUP BY Отдел, Должность;
В результате мы получим набор данных, сгруппированный не только по отделам, но и по должностям. Если должность занимает только один человек, то мы получим его стаж. Если несколько - то наибольший из них.
Команда
SELECT Отдел FROM Doljnost;
Однако поле "Отдел" не является уникальным в этой таблице, то есть, если в отделе работает десяток специалистов с разными должностями, то мы получим десяток повторяющихся записей. Команда
SELECT DISTINCT Отдел FROM Doljnost;
В результате мы получим все названия имеющихся отделов, но эти названия не будут повторяться.
Обратной командой является
Команда
SELECT Отдел, Должность, MAX(Стаж) FROM LichData, Doljnost WHERE Ключ = Сотрудник AND (MAX(Стаж) > 7) GROUP BY Отдел, Должность;
вызовет ошибку. Использование в запросе команды
SELECT Отдел, Должность, MAX(Стаж) FROM LichData, Doljnost WHERE Ключ = Сотрудник GROUP BY Отдел, Должность HAVING MAX(Стаж) > 7;
Мы изучили все основные команды
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.