Управление и отладка SQL-запросов в MS Access. Запрос в access sql
Е.А. Бессонов Access Запросы на языке SQL
Министерство образования Российской Федерации
Кузбасский государственный технический университет
Кафедра вычислительной техники
и информационных технологий
ACCESS
Запросы на языке SQL
Методические указания к лабораторной работе для студентов специальности “Экономика и управление на предприятиях ” по курсу “Автоматизация экономических расчетов ”
Составитель Е.А. Бессонов
Утверждены на заседании кафедры Протокол № 11 от 23.06.2000
Рекомендованы к печати методической комиссией специальности 060800 Протокол № 1 от 3.10.2000
Электронная копия хранится в библиотеке главного корпуса КузГТУ
Кемерово 2001
SQL
SQL (Structured Query Language – структурированный язык запро-
сов) с 1986г. является стандартным языком реляционных баз данных. В частности, он используется в приложениях Access и Excel. Стандарт языка SQL изложен в [1].
SQL заметно отличается от других языков программирования высокого уровня.
1. SQL относится к непроцедурным языкам. Он просто декларирует, что нужно сделать, а исполнение возлагается на СУБД (система управления базами данных).
2.В SQL используется трехзначная логика. Наряду с традиционными логическими значениями TRUE и FALSE используется NULL (НЕИЗВЕСТНО или ОТСУТСТВИЕ ДАННЫХ).
3.Операции осуществляются над целыми наборами данных, а не над отдельными элементами, как в других языках программирования.
Запрос на языке SQL состоит из инструкций. Каждая инструкция может содержать несколько предложений.
FROM
Практически ни один запрос не обходится без предложения FROM, описывающего используемые таблицы или запросы, и имеющего синтаксис
FROM таблицы [IN внешняя_БД]
Таблицы - используемые таблицы/запросы и их взаимосвязи.
Если в предложении FROM присутствует конструкция IN(квадратные скобки указывают, что эта часть предложения не является обязательной), то после зарезервированного слова IN должно стоять имя базы данных, в которой находятся таблицы (предполагается, что используют таблицы не из текущей БД).
Пример
FROM Преподаватели
Если запрос строится на двух таблицах, то необходимо указать способ их объединения – один из следующих (предполагается , что читатель с ними знаком):
, декартово произведение; INNER JOIN внутреннее объединение; LEFT JOIN левое внешнее объединение; RIGHT JOIN правое внешнее объединение.
Сразу после способа объединения необходимо поместить фразу ON Таблица1.Ключ = Таблица2.ВнешнийКлюч
Ключ - имя ключевого поля со стороны 1.ВнешнийКлюч - имя связующего поля со стороны N.
Схема данных
На рисунке представлена схема объединения таблиц (схема данных), которая будет использоваться для большинства приводимых ниже примеров. Из рисунка, например, видно, что у таблицы “Экзаменаторы” поле “Предмет” является ключевым (выделено жирным шрифтом), а поле “Преподаватель” – внешним ключом для таблицы “Преподаватели”. Объединение между указанными таблицами – внутреннее с обеспечением целостности данных. Об этом свидетельствуют знаки 1 и ∞ на концах связующей линии (“Преподаватели” – главная таблица, а “Экзаменаторы” – подчиненная). При внешнем объединении можно увидеть на линии объединения таблиц стрелку, направленную к подчиненной таблице. Это значит, что в главной таблице будут показаны все записи, даже если им нет соответствующих записей в подчиненной. Например, можно получить список преподавателей и названий предметов. Если
некоторого преподавателя нет в таблице “Экзаменаторы”, то поле названия предмета этого преподавателя будет пусто, если используется объединение LEFT JOIN.
Пример
FROM Экзаменаторы INNER JOIN Экзамены ON Экзаменаторы.Предмет = Экзамены.Предмет
В предложении FROM перед зарезервированными словами INNER JOIN указывается имя таблицы со стороны 1 (в нашем случае таблица “Экзаменаторы”). Если в предложении FROM больше двух таблиц, то объединение двух таблиц можно заключить в круглые скобки и рассматривать его как одну таблицу при объединении с другими таблицами или объединениями. Таким способом можно описать объединение любого числа таблиц.
Пример
FROM Преподаватели INNER JOIN (Экзаменаторы
INNER JOIN Экзамены
ON Экзаменаторы.Предмет = Экзамены.Предмет)
ON Преподаватели.Преподаватель = Экзаменаторы.Преподаватель Описана вся схема данных (см. рисунок).
SELECT
Инструкция SELECT обеспечивает выборку необходимых полей из таблиц или запросов. Формат минимального варианта:
SELECT поля
FROM таблицы;
Поля - множество выражений и имен полей, разделенных запятыми.Пример
SELECT Группа, Студент, Оценка FROM Экзамены;
Если имя повторяется в нескольких таблицах, перечисленных в предложении FROM, то перед именем надо поместить имя таблицы и точку, например: [Экзаменаторы].Преподаватель или [Экзамены]. [Предмет]
Если имя таблицы или поля содержит пробел или другой спецсимвол, то это имя нужно заключить в квадратные скобки. В других случаях скобки необязательны.
Вприведенном примере в режиме таблицы запрос выдает таблицу
сзаголовками столбцов “Группа”, ”Студент”, ”Оценка” (именно в этом порядке). Иногда бывает желательно, чтобы заголовок отличался от
имени поля. В этом случае после имени поля следует поместить зарезервированное слово AS и заголовок (псевдоним), например:
SELECT Группа, Студент AS ФИО,Оценка
Вэтом случае вместо заголовка “Студент” появится “ФИО”. Если
взаголовке более одного слова, его необходимо заключить в квадратные скобки.
Если необходимо выдать все поля таблицы, то аргумент поля следует задать звездочкой или в виде “Таблица.*”.
Пример
SELECT Преподаватели.* FROM Преподаватели;
Выдаются все 5 полей из таблицы “Преподаватели”.
Иногда требуется выдать не значение поля, а результат вычислений над значениями полей. В этом случае вместо имени поля надо задать выражение. Правила записи выражений не отличаются от правил, применяемых в конструкторе запросов.
Пример
SELECT Avg([Оценка]) As [Средний балл] FROM Экзамены;
Запрос выдает одно число в столбце с заголовком “Средний балл”
– среднее арифметическое всех оценок студентов. Пример
SELECT Count([Преподаватель]) As [Число преподавателей] FROM Преподаватели;
Под заголовком “Число преподавателей” будет помещено число строк таблицы “Преподаватели”, в которых поле “Преподаватель” не пусто (а оно всегда не пусто, так как является ключевым). Это и есть число преподавателей, так как в каждой записи есть номер преподавателя, отличный от номеров других преподавателей.
Винструкции SELECT сразу после слова SELECT может быть за-
писан предикат – одно из слов ALL, DISTINCT, DISTINCTROW, TOP N [PERCENT].
Предикат ALL предписывает выдавать все записи, даже если они содержат повторы.
DISTINCT запрещает выводить записи, содержащие повторы в отобранных полях. Использование предиката DISTINCT эквивалентно установке значения “Да” свойства “Уникальные значения” в бланке свойств конструктора запросов.
DISTINCTROW влияет на результат только в том случае, если в запрос включены не все поля из анализируемых таблиц. Предикат игнорируется, если запрос содержит только одну таблицу. Предикат DISTINCTROW исключает записи, повторяющиеся полностью. Использование предиката DISTINCTROW эквивалентно установке значения “Да” свойства “Уникальные записи” в бланке свойств конструктора запросов.
Предикат Top N используется для возврата N записей, находящихся в начале или конце набора, отсортированного по возрастанию или убыванию значений этого поля. Сортировка определяется с помощью предложения ORDER BY, размещаемого после предложения FROM инст-
рукции SELECT.
После слов ORDER BY надо поместить имя поля и слово ASC (по возрастанию, не обязательно) или DESC (по убыванию). Следующая инструкция SQL позволяет получить список из 5 лучших студентов.
| Успеваемость | Таблица 1 | |
Предмет | Группа | Студент | Средний балл |
1 | 1 | Волков | 2,4 |
1 | 1 | Медведев | 4,5 |
2 | 2 | Белкин | 5,0 |
2 | 2 | Лисицын | 2,1 |
1 | 1 | Воробьев | 3,3 |
3 | 1 | Кротова | 4,8 |
|
|
|
|
Пример
SELECT TOP 5 Студент, [Средний балл] FROM Успеваемость
ORDER BY[Средний балл] DESC;
Пример
SELECT DISTINCT [Студент] FROM Экзамены
ORDER BY [Студент];
Запрос выдает список студентов, отсортированный по возрастанию фамилий.
WHERE
После предложения FROM инструкции SELECT можно написать
предложение WHERE в форме WHERE условие
Условие - логическое выражение, которое вычисляется для каждой записи исходной таблицы.
Если условие истинно, то запись (совокупность полей в списке полей предложения SELECT) включается в результирующее множество, если ложно – не включается.
Пример
SELECT DISTINCT Группа, Студент
FROM Экзамены
WHERE Оценка = 2;
Создается список студентов – двоечников. Пример
SELECT [ФИО] FROM Преподаватели
WHERE [Должность]=”Доцент” OR [Степень]=”К.т.н.” ORDER BY [ФИО];
Выдается список преподавателей, имеющих ученое звание доцента или ученую степень кандидата технических наук. В этом примере нет необходимости применять предикат, поскольку записи принадлежат разным преподавателям, и повторы невозможны.
При отборе строковых выражений можно использовать оператор Выражение Likeшаблон, который проверяет соответствие результата вычислениявыражения шаблону. В шаблоне могут использоваться некоторые символы, имеющие специальное назначение:
* любое количество любых символов;
# цифра;
?любой символ.
Вквадратных скобках можно указать диапазон, в котором находится или не находится символ.
[A-F]символ в диапазоне от A до F включительно.[!A-F]символ не входит в диапазонA-F.
Пример
SELECT [ФИО] FROM Преподаватели
WHERE [ФИО] LIKE “B*” OR [ФИО] LIKE “Щ*”;
Врезультирующее множество войдут фамилии преподавателей, начинающиеся с букв Д или Щ.
Пример
Х LIKE “P[A-F]###”
Написанному условию удовлетворяют строки из 5 символов, начинающиеся с буквы Р. За ней должна следовать буква из диапазона A-F.Строку должны завершать 3 цифры.
PARAMETERS
Если перед каждым выполнением запроса необходимо изменять условия отбора, удобно использовать предложение вида:
PARAMETERS тексты;
Тексты - список текстов, разделенных запятыми.
После каждого текста через пробел указывается тип данных. При выполнении запроса с параметрами не требуется открывать окно конструктора запросов и вносить изменения в условия отбора. Вместо этого пользователю предлагается ввести нужное условие во время выполнения запроса. Для каждого текста из предложения PARAMETERS на экране появляется диалоговое окно, где каждый текст из описания играет роль подсказки – что именно нужно ввести. В диалоговое окно следует ввести данное указанного типа.
Текст, содержащий пробелы и знаки препинания, необходимо заключить в квадратные скобки. Тип данных TEXT указывать не обязательно.
Если используется предложение PARAMETERS, оно должно находиться перед всеми остальными инструкциями, в том числе и перед инструкцией SELECT, и заканчиваться точкой с запятой.
Пример
PARAMETERS [Укажите начальную дату] DATETIME, [Укажите конечную дату] DATETIME;
В условиях отбора предложений WHERE и HAVING можно использовать текст без указания типов данных. При выполнении запроса текст заменяется на введенное значение.
Пример
PARAMETERS [Укажите группу] TEXT; SELECT Студент, Оценка
FROM Экзамены
WHERE [Группа]=[Укажите группу] And [Предмет]=1;
Запрос выдает оценки студентов указанной группы по предмету с кодом 1.
GROUP BY
Предложение GROUP BY поля объединяет группу записей в указанном списке (поля) полей в одну запись. Если инструкция SELECT содержит групповую функцию (например Avg или Sum), то для записи в результирующее множество будет вычислено значение – итог по группе записей. Так, например, если в таблице “Экзамены” сгруппировать записи по предмету, то с помощью функции Avg можно получить средний балл по предмету. Группировка по предмету и группе позволит получить средние баллы студенческих групп по указанному предмету.
GROUP BY не является обязательным предложением. Если оно присутствует в предложении SELECT, то располагается после предложения FROM.
При использовании предложения GROUP BY все поля в списке полей предложения SELECT должны быть либо включены в список полей предложения GROUP BY, либо использоваться в качестве аргументов групповой функции SQL.
Если используются групповые функции, а предложение GROUP BY отсутствует, то роль группы играет вся совокупность исходных записей запроса.
Пример
SELECT Группа, Студент, Avg([Оценка]) AS [Средний балл] FROM Экзамены
GROUP BY [Группа],[Студент];
Для каждого студента подсчитывается среднее арифметическое значение его оценок.
HAVING
Необязательное предложение HAVING условие должно располагаться после GROUP BY. Оно определяет, какие из сгруппированных записей войдут в результирующее множество.Условие в HAVING – обычное логическое выражение, как и в WHERE. WHERE и HAVING могут присутствовать в инструкции SELECT и одновременно. В этом случае WHERE отфильтровывает записи до группировки, а HAVING - сгруппированные записи (группы).
Пример
PARAMETERS [Введите название предмета] TEXT; SELECT Группа, Предмет, Avg([Оценка]) AS [Средний балл] FROM Экзаменаторы INNER JOIN Экзамены
ON Экзаменаторы.Предмет=Экзамены.Предмет
WHERE [Название предмета]=[Введите название предмета] GROUP BY Группа, Студент
HAVING Avg([Оценка])>=4,5 And Min([Оценка])>2;
Запрос возвращает список студентов с их средними баллами. В список входят студенты, не имеющие двоек и со средними баллами не ниже 4,5.
TRANSFORM
Инструкция TRANSFORM используется для создания перекрестного запроса. Данные, представленные с помощью перекрестного запроса, изображаются в более компактном виде, чем с помощью запросавыборки. Синтаксис:
TRANSFORM Функция SELECT …;
PIVOT поле;
Функция - групповая функция SQL, обрабатывающая данные ячейки таблицыПоле - поле или выражение, значения из которого становятся заголов-
ками столбцов.
Запрос в режиме таблицы имеет столько столбцов, сколько различных значений принимает поле. Например, еслиполе выдает названия месяцев, то получится до 12 столбцов, заголовки которых упорядочены по возрастанию (Август, Апрель…Январь). После аргументаполе можно поместить предложение IN(список_значений). Фиксированные значения всписке_значений разделяются запятыми. При наличии предложения IN каждое значениеполя сравнивается со значениями всписке_значений. При совпадении в соответствующем столбце выводится результат вычисления функции. Фиксированные заголовки, которым не соответствуют реальные данные, можно использовать для создания дополнительных столбцов.
Использование предложения PIVOT эквивалентно определению свойства “Заголовки столбцов” в бланке свойств конструктора запросов.
studfiles.net
Вложенные SQL запросы в СУБД Access
Форум: "Начинающим";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2007.05.20;Скачать: [xml.tar.bz2];Вниз
Вложенные SQL запросы в СУБД Access
Kostafey © (2007-05-04 01:52) [0]В прошлый раз имел дело с MS SQL Sever, теперь Access.Ужесть... Но вопрос не в этом.
Скажите, пожалуйста, можно ли в Access реализовать что-то подобное
SELECT * FROM ( SELECT.. FROM ... WHERE ...) aи так далее, т.е. реализовать вложенный(е) запрос(ы) ?
Есть ли вообще литература по SQL в Accessи что-нибудь по контролю и восстановлению ссылочной целостности БД в Access ?
EvS © (2007-05-04 09:33) [1]> можно ли в Access реализовать что-то подобное
Можно
Kostafey © (2007-05-04 09:59) [2]Ну на том спасибо, порадовали, а синтаксис как выглядеть будет ?Так как в [0] не работает.
P.S. Шутка по поводу что такое "..." будет очень удачной, но я уже пошутил первым !
ЮЮ © (2007-05-04 10:06) [3]в MS Access 2003 такое работет:
SELECT * FROM (SELECT DISTINCT Договор.[На Должность]FROM Договор) aORDER BY 1;
так что всё дело в ... Да и ошибку озвучит не мешало бы
sniknik © (2007-05-04 10:54) [4]> Так как в [0] не работает.естественно, "..." синтаксисом не предусмотрено.
> но я уже пошутил первым !смысл не в том кто первый, смысл в том кому это надо...
вообще у вас что конкурс под лозунгом "кто меньше всего скажет, но тем не менее получит ответ"?
> Да и ошибку озвучит не мешало бызачем? просто переносим ветку в прочее и продолжаем отвлеченно трепаться. порадуется гораздо больше народу чем успешному решению "проблемы".
Kostafey © (2007-05-04 12:24) [5]Уважаемые мастера ЮЮ, sniknik !
Прошу прощения ! Поторопился вчера сюда постить.Все дело вот в чем.
Тестировал запрос я в "запросе на выборку" Access.Если вставить в него вот такой запрос (на этот раз цитирую):SELECTDogovor.NomerDogovora as [Номер договора],Dogovor.NomerActa as [Номер акта],TipDogovora.Tip as [Тип договора],Dogovor.DataDogovora as [Дата договора],Subject.Tip as [Тип субъекта],Subject.Familiya as [Фамилия],Subject.Naimenovanie as [Наименование],Location.Tip as [Тип страны]
FROM Dogovor, Subject, TipDogovora, LocationWHERE Dogovor.D_S_id = Subject.S_id and Dogovor.D_TD_id = TipDogovora.TD_id and Subject.S_L_id = Location.L_idОн успешно выполняется. Запрос сохраняю, закрываю.Заново открываю. Вид запроса уже изменлся:SELECT Dogovor.NomerDogovora AS [Номер договора], Dogovor.NomerActa AS [Номер акта], TipDogovora.Tip AS [Тип договора], Dogovor.DataDogovora AS [Дата договора], Subject.Tip AS [Тип субъекта], Subject.Familiya AS Фамилия, Subject.Naimenovanie AS Наименование, Location.Tip AS [Тип страны]FROM Dogovor, Subject, TipDogovora, LocationWHERE Dogovor.D_S_id=Subject.S_id And Dogovor.D_TD_id=TipDogovora.TD_id And Subject.S_L_id=Location.L_id;Но он выполняется.Дописываю:select *from (SELECT Dogovor.NomerDogovora AS [Номер договора], Dogovor.NomerActa AS [Номер акта], TipDogovora.Tip AS [Тип договора], Dogovor.DataDogovora AS [Дата договора], Subject.Tip AS [Тип субъекта], Subject.Familiya AS Фамилия, Subject.Naimenovanie AS Наименование, Location.Tip AS [Тип страны]FROM Dogovor, Subject, TipDogovora, LocationWHERE Dogovor.D_S_id=Subject.S_id And Dogovor.D_TD_id=TipDogovora.TD_id And Subject.S_L_id=Location.L_id;) aВыдает: "Ошибка синтаксиса в предложении FROM"Вот тут я и сбился с толку.
Однако если обратится к исходному варианту, т.е.select *from (SELECTDogovor.NomerDogovora as [Номер договора],Dogovor.NomerActa as [Номер акта],TipDogovora.Tip as [Тип договора],Dogovor.DataDogovora as [Дата договора],Subject.Tip as [Тип субъекта],Subject.Familiya as [Фамилия],Subject.Naimenovanie as [Наименование],Location.Tip as [Тип страны]
FROM Dogovor, Subject, TipDogovora, LocationWHERE Dogovor.D_S_id = Subject.S_id and Dogovor.D_TD_id = TipDogovora.TD_id and Subject.S_L_id = Location.L_id) aТо он прекрасно работает.
Сохраняю запрос. Закрываю. Заново открываю.Он несколько видоизменяется, но продолжает работать:SELECT *FROM [SELECTDogovor.NomerDogovora as [Номер договора],Dogovor.NomerActa as [Номер акта],TipDogovora.Tip as [Тип договора],Dogovor.DataDogovora as [Дата договора],Subject.Tip as [Тип субъекта],Subject.Familiya as [Фамилия],Subject.Naimenovanie as [Наименование],Location.Tip as [Тип страны]
FROM Dogovor, Subject, TipDogovora, LocationWHERE Dogovor.D_S_id = Subject.S_id and Dogovor.D_TD_id = TipDogovora.TD_id and Subject.S_L_id = Location.L_id]. AS a;
На самом деле все эти сохранения/перезапуски, открытия/закрытия мне все равноне понадобятся, т.к. тексты запросов будут хранится во внешних файлах.
Спасибо и еще раз прошу прощения за невнимательность.
Kostafey © (2007-05-04 12:30) [6]Вся ошибка заключается в ; которой заканчивается запрос.Access ее зачем - то сам добавляет.
Форум: "Начинающим";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2007.05.20;Скачать: [xml.tar.bz2];Наверх
Память: 0.75 MBВремя: 0.081 c
www.delphimaster.net
access - Sql запрос в Microsoft Access
У меня есть этот запрос, написанный на Microsoft Access:
SELECT p.artnbr AS [Number], p.name AS Name, s.sizename AS Sizes, s.sizeindex AS SizeIndex, s.oid AS SizeId, l.name AS LocationName, (SELECT od.quantity FROM orderdetails od WHERE od.ORDER = (SELECT o.oid FROM [order] o WHERE o.active = -1 AND o.location = l.oid) AND od.productsize = s.oid) AS Quantity FROM [size] AS s INNER JOIN (product AS p INNER JOIN (favorite AS f INNER JOIN location AS l ON f.customer = l.customer) ON p.oid = f.product) ON p.oid = s.product WHERE f.customer = @customerСсылка ниже показывает таблицы, которые я использовал и их отношения. https://dl.dropbox.com/u/18377860/QueryTables.png
Этот запрос возвращает правильный результат, но поскольку вы можете видеть, что я использую запрос Sub для получения количества. Я не могу понять, как я могу переписать этот запрос с помощью операторов соединения вместо этого длинного подзапроса. Любая помощь будет оценена по достоинству. С уважением
EDIT: Чтобы сделать его более понятным, мой запрос должен получить все уникальные комбинации (продукт, размер, местоположение), имеют ли они [Заказ] или нет, и отображают упорядоченное количество. Если заказ не существует для конкретной комбинации, количество должно быть нулевым.
EDIT2: мне удалось построить запрос, и это выглядит следующим образом:
SELECT p.ArtNbr AS [Number], p.Name AS Name, s.SizeName AS Sizes, s.SizeIndex AS SizeIndex, s.Oid AS SizeId, l.Name AS LocationName, so.qty AS Quantity FROM ([Size] AS s INNER JOIN (Product AS p INNER JOIN (Favorite AS f INNER JOIN Location AS l ON f.Customer = l.Customer) ON p.OID = f.Product) ON p.OID = s.Product) LEFT JOIN (SELECT od.ProductSize AS PS, od.Quantity AS qty, o.Location as Location FROM OrderDetails AS od INNER JOIN [Order] AS o ON od.Order = o.OID WHERE o.Active = -1) AS so ON so.PS = s.OID WHERE f.Customer = @customer AND (l.OID = so.Location OR so.Location is null)Я сделал, как сказал Мэтт, я переместил подзапрос в FROM секции, я включен ProductSize и расположение в выберите запрос производной таблицы, а затем свяжите результат с таблицей «Размер», и я, наконец, добавил условие к разделу where, чтобы исключить повторение одной и той же записи для каждого местоположения.
stackoverrun.com
Выборка данных в СУБД Access
Запросы на выборку данных в СУБД Access 2003 или 2007
2016-02-02Автор: Владимир Ткаченко
Источник: Обучение в интернет
В предыдущих статьях были рассмотрены вопросы создания базы данных «sql_training_st.mdb» с помощью инструкций SQL. Рассмотрена технология создания структуры таблиц базы данных «sql_training_st.mdb» на основе SQL запросов. Кроме того, с помощью SQL запросов было осуществлено заполнение таблиц СУБД ACCESS "sql_training_st.mdb".
Известно, что в реляционных базах данных язык SQL предназначен для манипулирования данными, определения структуры баз данных и ее составных частей, управления доступом пользователей к БД и для управления транзакциями или управления изменениями в БД.
Язык SQL состоит из четырех групп:
- язык манипулирования данными DML;
- язык определения данных DDL;
- язык управления данными DCL;
- язык управления транзакциями TCL.
К группе DML относятся четыре основных типа запросов SQL:
- INSERT — предназначен для добавления одной или нескольких записей в конец таблицы;
- UPDATE — предназначен для изменения уже существующих записей в столбцах таблицы или модификации данных в таблице;
- DELETE — предназначен для удаления записей из таблицы;
- SELECT — предназначен для выборки данных из таблиц.
Первые три типа SQL запросов (INSERT, UPDATE, DELETE), которые относятся к корректирующим запросам к базе данных, были рассмотрены на страничке "Запросы на изменение записей в таблицах с помощью SQL".
В данной статье рассмотрим запросы на выборку данных из таблиц БД Access.
Для извлечения информации, хранящейся в базе данных БД Access 2003 или 2007, можно применить запрос SELECT на выборку данных из таблиц.
Составим следующий SQL запрос (инструкцию SQL) на выборку, для этого выберем режим SQL, выполнив команду Вид/Режим SQL. Вводим с клавиатуры следующую инструкцию SQL:
SELECT * FROM Студенты;
Эта инструкция состоит из двух предложений "SELECT *" и "FROM Студенты". Первое предложение содержит оператор SELECT и идентификатор * ("идентификатор *" означает вывод всех столбцов таблицы). Второе предложение содержит оператор FROM и идентификатор "Студенты".
FROM - определяет таблицу "Студенты", которая содержат поля, указанные в предложении SELECT. Следует отметить, что в запросе на выборку всегда присутствуют два оператора: SELECT и FROM. В зависимости от условий отбора в запросе на выборку могут присутствовать и другие операторы. На рисунке 1 представлен скриншот запроса на выборку данных.
Рис. 1. SQL запрос SELECT на выборку данныхВ данном примере формируется выборка данных из всех столбцов таблицы Студенты.
Сохраняем запрос с именем "Студенты-запрос1". В результате выполнения команды "Сохранить" в «Области переходов» появится объект - «Запросы: Студенты-запрос1».
После сохранения запроса на выборку необходимо выполнить этот запрос, щелкая на пиктограмме «Выполнить». Результаты выполнения команды «Выполнить» представлены на рис. 2.
Рис. 2. Выборка данных из всех столбцов таблицы СтудентыСкачать sql_training_st.mdb
www.lessons-tva.info
debugging - Управление и отладка SQL-запросов в MS Access
Отладка - это большая проблема. Если один столбец выключен, это обычно довольно легко исправить. Но я предполагаю, что у вас есть более сложные задачи отладки, которые вам нужно выполнить.
Когда flummoxed, я обычно начинаю отладку с предложением FROM. Я возвращаюсь ко всем таблицам и подзапросам, которые содержат более крупный запрос, и убедитесь, что соединения правильно определены.
Затем я проверяю свое предложение WHERE. Я запускаю множество простых запросов в таблицах и в подзапросах, которые я уже проверил, или которые я уже доверяю, и убедитесь, что, когда я запускаю более крупный запрос, я получаю то, что ожидаю с помощью WHERE условия на месте. Я дважды проверяю условия JOIN.
Я дважды проверю определения столбцов, чтобы убедиться, что я извлекаю то, что я действительно хочу видеть, особенно если сложные формулы сложны. Если у вас есть что-то сложное, как скоординированный подзапрос в определении столбца
Затем я проверю, правильно ли я группирую данные, убедившись, что "DISTINCT" и "UNION" без UNION ALL не удаляют необходимые дубликаты.
Я не думаю, что когда-либо сталкивался с SQL-запросом, который не мог быть разбит таким образом. Я не всегда так методичен, как это, но это хороший способ начать разрушать реальный камень.
Одна вещь, которую я мог бы порекомендовать при написании ваших запросов, таков: Никогда не используйте SELECT * в производственном коде. Выбор всех столбцов таким образом - это кошмар обслуживания, и это приводит к большим проблемам, когда ваш изменение базовых схем. Вы всегда должны выписывать каждый столбец, если вы пишете SQL-код, который вы будете поддерживать в будущем. Я сэкономил много времени и беспокоился, просто избавившись от "SELECT *" в моих проектах.
Недостатком этого является то, что эти дополнительные столбцы не будут отображаться автоматически в запросах, относящихся к запросам "SELECT *". Но вы должны знать, как ваши запросы связаны друг с другом, так или иначе, и если вам нужны дополнительные столбцы, вы можете вернуться и добавить их.
Есть некоторые проблемы, связанные с поддержкой репозитория кода, но если у вас есть программное обеспечение для управления версиями, проблема в этом больше, чем того стоит. Я слышал о способах кодирования кода SQL, написанного в базе данных Access, но, к сожалению, я их никогда не использовал.
qaru.site
Запросы в Access - Базы данных Access
Запросы в Access являются основным инструментом выборки, обновления и обработки данных в таблицах базы данных. Access в соответствии с концепцией реляционных баз данных для выполнения запросов использует язык структурированных запросов SQL (Structured Query Language). С помощью инструкций языка SQL реализуется любой запрос в Access.
Основным видом запроса является запрос на выборку. Результатом выполнения этого запроса является новая таблица, которая существует до закрытия запроса. Записи формируются путем объединения записей таблиц, на которых построен запрос. Способ объединения записей таблиц указывается при определении их связи в схеме данных или при создании запроса. Условия отбора, сформулированные в запросе, позволяют фильтровать записи, составляющие результат объединения таблиц.
В Access может быть создано несколько видов запроса:
- запрос на выборку — выбирает данные из одной таблицы или запроса или нескольких взаимосвязанных таблиц и других запросов. Результатом является таблица, которая существует до закрытия запроса. Формирование записей таблицы результата производится в соответствии с заданными условиями отбора и при использовании нескольких таблиц путем объединения их записей;
- запрос на создание таблицы — выбирает данные из взаимосвязанных таблиц и других запросов, но, в отличие от запроса на выборку, результат сохраняет в новой постоянной таблице;
- запросы на обновление, добавление, удаление — являются запросами действия, в результате выполнения которых изменяются данные в таблицах.
Запросы в Access в режиме конструктора содержат схему данных, отображающую используемые таблицы, и бланк запроса, в котором конструируется структура таблицы запроса и условия выборки записей (рис. 4.1).
С помощью запроса можно выполнить следующие виды обработки данных:
- включить в таблицу запроса выбранные пользователем поля таблицы;
- произвести вычисления в каждой из полученных записей;
- выбрать записи, удовлетворяющие условиям отбора;
- сформировать на основе объединения записей взаимосвязанных таблиц новую виртуальную таблицу;
- сгруппировать записи, которые имеют одинаковые значения в одном или нескольких полях, одновременно выполнить над другими полями группы статистические функции и в результат включить одну запись для каждой группы;
- создать новую таблицу базы данных, используя данные из существующих таблиц;
- произвести обновление полей в выбранном подмножестве записей;
- удалить выбранное подмножество записей из таблицы базы данных;
- добавить выбранное подмножество записей в другую таблицу.
Запросы в Access служат источниками записей для других запросов, форм, отчетов. С помощью запроса можно собрать полные сведения для формирования некоторого документа предметной области из нескольких таблиц, далее использовать его для создания формы — электронного представления этого документа. Если форма или отчет создаются мастером на основе нескольких взаимосвязанных таблиц, то для них в качестве источника записей автоматически формируется запрос.Для закрепления смотрим видеоурок:
accesshelp.ru
sql - Длительный SQL-запрос в Access
Я пытаюсь написать запрос, который по какой-то причине приводит к тому, что Access 2007-2010 просто зависает, и я предполагаю это, потому что запрос просто берет навсегда. Я никогда не ждал достаточно долго, чтобы узнать, вернет ли он результаты.
У меня есть таблица "MAIN" с домашними адресами 100k+ и другая таблица "ALIAS" со 100 адресами. Таблица "MAIN" - это записи, которые я хочу вернуть. Таблица "ALIAS" имеет небольшое подмножество адресов от MAIN с другими адресами, которых нет в MAIN. Таблица ALIAS существует для группировки наборов связанных адресов. Подумайте об этом как текущих/главных адресах и старых /ALIAS адресах. Они имеют идентификатор в таблице ALIAS, поэтому я знаю, какие из них связаны.
Таким образом, чтобы запросить адрес и вернуть адрес в таблице MAIN ИЛИ что-либо в таблице MAIN, которая имеет отношение записи в таблице ALIAS. Вот пример:
ГЛАВНЫЙ номер, направление, имя, тип 123 Вт 1-й ST 456 Вт 1-й ST
ALIAS номер, направление, имя, тип, groupID 456 Вт 1-й ST 99 789 E 2nd ST 99 Поэтому, если пользователь запрашивает 789 E второй ST, он должен вернуть 456 W 1 ST из MAIN, потому что адрес 789 существует в таблице ALIAS и связан с 456, а 456 также находится в MAIN.
Вот запрос, который у меня есть, и он работает слишком долго и может занять несколько дней...
SELECT dbo_ae_dt9.docid, dbo_ae_dt9.ID, dbo_ae_dt9.Permit, dbo_ae_dt9.stDirection, dbo_ae_dt9.stNumber, dbo_ae_dt9.stType, dbo_ae_dt9.inspDate, dbo_ae_dt9.stName, dbo_ae_dt9.numobjects FROM dbo_ae_dt9 LEFT JOIN dbo_ae_alias ON (dbo_ae_dt9.stNumber=dbo_ae_alias.stNumber) AND (dbo_ae_dt9.stDirection=dbo_ae_alias.stDirection) AND (dbo_ae_dt9.stName=dbo_ae_alias.stName) AND (dbo_ae_dt9.stType=dbo_ae_alias.stType) WHERE (dbo_ae_alias.aliasID in (SELECT aliasID FROM dbo_ae_alias WHERE ((IIf(IsNull(Forms!frmMain!txtstName),dbo_ae_alias.stName like "*", dbo_ae_alias.stName=Forms!frmMain!txtstName)) AND (IIf(IsNull(Forms!frmMain!txtstNumber),dbo_ae_alias.stNumber like "*", dbo_ae_alias.stNumber=Forms!frmMain!txtstNumber)) AND (IIf(IsNull(Forms!frmMain!txtstDirection),dbo_ae_alias.stDirection like "*", dbo_ae_alias.stDirection=Forms!frmMain!txtstDirection)) AND (IIf(IsNull(Forms!frmMain!txtstType),dbo_ae_alias.stType like "*", dbo_ae_alias.stType=Forms!frmMain!txtstType))))) OR ((IIf(IsNull([Forms]![frmMain]![txtPermit]),dbo_ae_dt9.Permit Like "*",dbo_ae_dt9.Permit = Forms!frmMain!txtPermit)) And (IIf(IsNull(Forms!frmMain!txtstNumber),dbo_ae_dt9.stNumber Like "*",dbo_ae_dt9.stNumber = Forms!frmMain!txtstNumber)) And (IIf(IsNull(Forms!frmMain!txtstDirection),dbo_ae_dt9.stDirection Like "*",dbo_ae_dt9.stDirection = Forms!frmMain!txtstDirection)) And (IIf(IsNull(Forms!frmMain!txtstName),dbo_ae_dt9.stName Like "*",dbo_ae_dt9.stName = Forms!frmMain!txtstName)) And (IIf(IsNull(Forms!frmMain!txtstType),dbo_ae_dt9.stType Like "*",dbo_ae_dt9.stType = Forms!frmMain!txtstType)) And (IIf(IsNull(Forms!frmMain!txtstInspDate),dbo_ae_dt9.inspDate Like "*",dbo_ae_dt9.inspDate = Forms!frmMain!txtstInspDate)))qaru.site