Элементарные основы языка SQL

Запрос на выборку данных из базы данных

SELECT - используется, чтобы извлечь записи из БД как некоторый набор и сохранить их в новом объекте типа Recordset. Операторы SELECT не изменяют данные, а только извлекают их из базы данных.

Формат запроса:

SELECT список_полей

FROM список_таблиц IN внешняя_база_данных

WHERE условие_отбора

GROUP_BY список_полей

HAVING условие_группировки

ORDER BY список_полей

SELECT * FROM stud - запрос на выбор всех данных из всех полей из таблицы stud

SELECT fio_stud FROM stud - запрос на выбор всех данных из поля fio_stud из таблицы stud

SELECT birthday_stud as рождение FROM stud - создание псевдонимов столбцов

Если имя поля повторяется более чем в одной таблице предложения FROM, то при обращении к полю ставится имя таблицы, точка, имя поля:

SELECT stud.name, stud.surname, par.name, par.surname FROM stud, par

можно использовать алиасы (ссылки) для обращения к таблицам в громоздких конструкциях

SELECT s.name, s.surname, p.name, p.surname FROM stud as s, par as p

также допускается другая запись после from: FROM stud s, par p

Использование переменных VBA при формировании запроса

StrSQL = "SELECT name, birthday FROM stud WHERE name = '" & name.text & "'"

Фильтрация и сортировка результатов запроса.

Предикат DISTINCT позволяет пропускать записи, которые содержат повторяющиеся данные в выбранных столбцах

Если мы хотим увидеть все разные имена, которые имеют студенты группы 325, то можем выполнить следующий запрос

SELECT DISTINCT name FROM stud WHERE num_group=325

Предикат TOP N возвращает первые N записей (от начала набора записей) в порядке, определенном оператором ORDER BY

SELECT TOP 10 [name], [surname] FROM stud WHERE year_out = 2002 ORDER BY [average_mark] DESC - сортировать по уменьшению значения

Если не использовать ORDER BY, то будут возвращены 10 произвольных значений

Для того, чтобы возвратить процентное количество можно использовать предикат PERCENT

SELECT TOP 20 PERCENT [name], [surname]

FROM stud

WHERE year_out = 2002

ORDER BY [average_mark] DESC

Предложение WHERE указывает какие записи из таблиц, указанных в предложении FROM, будут включены в результат оператора SELEC

Если предложение WHERE не указоно, то возвращаются все записи таблицы

Если в запросе указывается более чем одна таблица и не включается предложение WHERE и предложение JOIN, запрос построит декартово произведение таблиц.

Замечание: Для объединения таблиц рекомендуется использовать предложение JOIN, хотя предложение WHERE может выполнять аналогичные задачи.

WHERE используется после FROM

Примеры:

WHERE cpec_group = 'физика'

WHERE stud_age BETWEEN 18 AND 25

Предложение WHERE может содержать 40 выражений, связанных логическими операторами AND и OR

Если имя поля содержит пробел или знаки пунктуации, тогда оно должно быть окружено квадратными скобками

SELECT [ID товара], [имеется на складе]

FROM Товары

WHERE [Имеется на складе] <= [Допустимый остаток]

Если в качестве условий выступает дата, то она должна быть записана в Американской нотации

MM/DD/YY и заключена в литералы даты (#)

Например, если вас интересуют товары с датой поставки 13 марта 2012 года, то запрос будет выглядеть так:

SELECT * FROM Заказы

WHERE [дата поставки] = #03/13/12#

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

Пример для программы в России

SELECT * FROM Заказы

WHERE [дата поставки] = DateValue('13/3/12')

Пример для программы в США

SELECT * FROM Заказы

WHERE [дата поставки] = DateValue('3/13/12')

GROUP BY объединяет записи с идентичными величинами в указанном поле в одну запись, если в оператор SELEC включена статистическая функция SUM или COUNT, то для каждой записи создается итоговое значение.

Если стат. функции нет, то итоговые значения не создаются. Величины Null группируются и не опускаются.

Предложение WHERE используется для исключения строк, которые не нужно группировать, а предложение HAVING для фильтрации записей после того как они сгруппированы

Поле в списке предложения GROUP BY может ссылаться на любое поле в предложении FROM, если оно не содержит данных типа MEMO, даже если поле не включено в оператор SELECT, при условии, что оператор SELECT содержит статистическую SQL функцию

SELECT [Название товара], SUM([Имеется на складе])

FROM Товары

GROUP BY [Название товара]

Предложение HAVING определяет какие записи показываются в операторе SELECT с предложение GROUP BY (подобно оператору WHERE)

Предложение ORDER BY определяет порядок сортировки записей, полученных в ходе выполнения запроса

SELECT * FROM stud

ORDER BY fio_stud ASC; - сортировка по возрастанию

SELECT [Фамилия], [Имя] FROM stud

ORDER BY [Фамилия] по умолчанию по возрастанию

Можно сортировать в порядке убывания по номеру столбца

SELECT [Фамилия], [Имя] FROM stud

ORDER BY 2 DESC

SELECT [Фамилия], Зарплата FROM Служащие

ORDER BY Зарплата DESC, Фамилия

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

SELECT COUNT (fio_stud) FROM stud WHERE num_group_stud =122 -запрос на подсчет количества студентов, числящихся в группе 122

SELECT COUNT DISTINCT (name_stud) FROM stud - запрос на подсчет количества различных имен в таблице

Запрос на создание таблицы

SELECT * INTO [Новые служащие] FROM Служащие

В данном случае создается новая таблица, а не набор записей

Запрос на удаление данных

DELETE - удаляет из одной и более таблиц записи, удовлетворяющие условию

WHERE

DELETE FROM stud WHERE key_stud = 22 - удаляет из таблицы stud запись, которой

соответствует значение поля key_stud, равное 22

Запрос на добавление данных

Оператор INSERT INTO используется, чтобы добавить записи к таблице или создать запрос на добавление.

INSERT INTO приемник [IN внешняя база данных]

SELECT [источник. ] поле1[, поле2]

FROM выражение

Если надо добавить одну запись, то

INSERT INTO приемник [(Поле1[, Поле2])]

VALUES (Значение1[, Значение2])

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

Пример.

Добавление информации в таблицу town

INSERT INTO town (name_town, region_town) VALUES ('Томск','Россия')

Более сложный вариант

INSERT INTO stud (fio_stud, birthday_stud, key_group, key_town, num_zachet_stud, data_in_stud, sex_stud)

Запрос на обновление данных

UPDATE таблица

SET новое значение

WHERE критерий

Пример:

UPDATE stud SET fio_stud='Петров В.В.' WHERE fio_stud like 'Петров В.А.'

Данный запрос позволяет изменить у всех экземпляров сущности Студент, хранящихся в таблице stud, имеющих значение поля fio_stud, похожее на "Петров В.А." на значение "Петров В.В."

Запрос используется в методе Execute

Обновление нескольких записей

UPDATE Заказы

SET [Сумма заказа]=[Сумма заказа]*1.1,

Фрахт = Фрахт * 1.03

WHERE [Страна поставки]='UK'

Составные запросы

Подзапросы

Для составления подзапроса используются следующие синтаксические формы

сравнение [ANY | ALL | SOME] (SQL -оператор)

выражение [NOT] IN (SQL-оператор)

[NOT] EXISTS (SQL-оператор)

Подзапрос может быть вместо выражения в списке полей оператора SELECT или в предложения WHERE и HAVING

ANY, SOME выбираются записи, которые удовлетворяют сравнению с какой-либо записью

ALL удовлетворяют сравнению со всеми записями

SELECT * FROM Товары

WHERE [Цена] > ANY

(SELECT [Цена] FROM [Подробности заказа]

WHERE [Скидка]>=25)

Если условие поменять на ALL, то возвратит только те продукты, у которых цена выше чем любого продукта, проданного со скидкой 25 процентов или более

Если надо извлечь записи совпадающие по величине, то

SELECT * FROM Товары

WHERE [Product ID] IN

(SELECT [Product ID] FROM [Подробности заказа]

WHERE [Скидка]>= 25)

Чтобы связать таблицу в основном запросе с таблицей в подзапросе можно воспользоваться алиасом

SELECT [Фамилия], [Имя], Должность, Зарплата

FROM Служащие AS T1

WHERE Зарплата >=

(SELECT AVG(Зарплата)

FROM Служащие

WHERE T1.Должность=Служащие.Должность) ORDER BY должность

СОЕДИНЕНИЯ

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

LEFT OUTER JOIN - включаются все записи первой таблицы и те записи второй таблицы, где заданные поля совпадают

RIGHT OUTER JOIN - включаются все записи второй таблицы и те записи первой таблицы, где заданные поля совпадают

FROM table1 INNER JOIN table2 ON table1.field1=table2.field2

FROM table1 [LEFT | RIGHT] JOIN ON table1.field1=table2.field2

Сложный запрос

SELECT поля

FROM таблица1 INNER JOIN

(таблица2 INNER JOIN [(] таблица 3

[INNER JOIN [(] таблицаX [INNER JOIN...)]

ON таблица3.поле3=таблицаХ.полеХ])

ON таблица2.поле2=таблица3.поле3)

ON таблица1.поле1=таблица2.поле2

SELECT DISTINCTROW sum([Цена]) * [Количество] AS [Объем сбыта], [Имя] & " " &

[Фамилия] AS Имя FROM Служащие

INNER JOIN (Заказы INNER JOIN [Подробности заказа]

ON Заказы.[ИД Заказа]=[Подробности заказа].[ИД Заказа])

ON Служащие.[ИД Служащего]=Orders.[ИД Служащего]

GROUP BY [Имя] & " " [Фамилия]

При работе с языком SQL. Для того, чтобы выполнить любой запрос, который не возвращает записи, необходимо заключить оператор в двойные кавычки и использовать его как аргумент метода Execute объектов Database или QueryDef

MyDB.Execute "CREATE TABLE stud ([fio_stud] TEXT, [sex_stud] bool)"

Для того, чтобы использовать любую из команд, которые возвращают строки (SELECT), запрос можно использовать как источник метода OpenRecordset

MyDB.OpenRecordset("SELECT * from stud",dbOpenDynaset)

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

1. Открыть Microsoft Access. Создать новую базу данных (Файл/Создать/База данных). В диалоговом окне указать путь сохранения диск D:\Личный_Каталог\ Базу данных назвать Uch_Proc. Расширение файла будет зависеть от версии СУБД ACCESS (может быть mdb, может быть accdb.

2. В открывшемся окне созданной базы данных выбрать объект Таблицы. Два раза щелкнуть по пункту меню «Создание таблицы в режиме конструктора». Заполнить появившуюся таблицу так, как это указано в табличной схеме. При сохранении макета, на вопрос как назвать Таблицу, задать имя сущности или отношения. В некоторых версиях MS Access имя таблицы запрашивается сразу при переходе в режим конструктора.

3. Для Access 2007 - Создание\Таблица\Режим конструктора\

4. Таким же образом в режиме конструктора создать все остальные таблицы сущностей (отношений)

5. Создание связей по внешним ключам можно осуществить с использованием мастера подстановок. Для выполнения данной процедуры необходимо выбрать искомую таблицу; перейти в режим конструктора; для поля являющегося внешним ключом выбрать тип данных - Мастер подстановок.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: