Выборка данных в БД Access с помощью sql запросов. Иллюстрированный самоучитель по SQL для начинающих Запрос на языке sql в access

06.04.2023

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

Но, несмотря на постоянное использование баз данных, даже для многих разработчиков программных систем остается много «белых пятен» из-за разного толкования одних и тех же терминов. Мы дадим краткое определение основных терминов баз данных перед рассмотрением языка SQL. Итак.

База данных - файл или набор файлов для хранения упорядоченных структур данных и их взаимосвязей. Очень часто базой данных называют систему управления - это только хранилище информации в определенном формате и может работать с различными СУБД.

Таблица - представим себе папку, в которой хранятся документы, сгруппированные по определенному признаку, например список заказов за последний месяц. Это и есть таблица в компьютерной Отдельная таблица имеет свое уникальное имя.

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

Столбец и строка - все мы работали с электронными таблицами, в которых также присутствуют строки и столбцы. Любая реляционная база данных работает с таблицами аналогичным образом. Строки иногда называют записями.

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

Что такое SQL?

SQL (англ. - язык структурированных запросов) был разработан только для работы с базами данных и в настоящий момент является стандартом для всех популярных СУБД. Синтаксис языка состоит из небольшого количества операторов и прост в изучении. Но, несмотря на внешнюю простоту, он позволяет создание sql запросов для сложных операций с БД любого размера.

С 1992 г. существует общепринятый стандарт, называемый ANSI SQL. Он определяет базовый синтаксис и функции операторов и поддерживается всеми лидерами рынка СУБД, такими как ORACLE Рассмотреть все возможности языка в одной небольшой статье невозможно, поэтому мы кратко рассмотрим только основные SQL запросы. Примеры наглядно показывают простоту и возможности языка:

  • создание баз и таблиц;
  • выборка данных;
  • добавление записей;
  • модификация и удаление информации.

Типы данных SQL

Все столбцы в таблице базы данных хранят один тип данных. Типы данных в SQL такие же, как и в других языках программирования.

Создаем таблицы и базы данных

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

  • через консоль СУБД
  • Используя интерактивные средства администрирования, входящие в состав сервера баз данных.

Создается новая база данных оператором CREATE DATABASE <наименование базы данных>; . Как видим, синтаксис прост и лаконичен.

Таблицы внутри базы данных создаем оператором CREATE TABLE со следующими параметрами:

  • наименование таблицы
  • имена и типы данных столбцов

В качестве примера создадим таблицу Commodity со следующими столбцами:

Создаем таблицу:

CREATE TABLE Commodity

(commodity_id CHAR(15) NOT NULL,

vendor_id CHAR(15) NOT NULL,

commodity_name CHAR(254) NULL,

commodity_price DECIMAL(8,2) NULL,

commodity_desc VARCHAR(1000) NULL);

Таблица состоит из пяти столбцов. После наименования идет тип данных, столбцы разделяются запятыми. Значение столбца может принимать пустые значения (NULL) или должно быть обязательно заполнено (NOT NULL), и это определяется при создании таблицы.

Выборка данных из таблицы

Оператор выборки данных - самые часто используемые SQL запросы. Для получения информации необходимо указать, что мы хотим выбрать из такой таблицы. Вначале простой пример:

SELECT commodity_name FROM Commodity

После оператора SELECT указываем имя столбца для получения информации, а FROM определяет таблицу.

Результатом выполнения запроса будут все строки таблицы со значениями Commodity_name в том порядке, в котором они были внесены в базу данных т.е. без всякой сортировки. Для упорядочивания результата используется дополнительный оператор ORDER BY.

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

SELECT commodity_id, commodity_name, commodity_price FROM Commodity

Есть возможность получить как результат запроса значение всех столбцов строки. Для этого используется знак «*»:

SELECT * FROM Commodity

  • Дополнительно SELECT поддерживает:
  • Сортировку данных (оператор ORDER BY)
  • Выбор согласно условиям (WHERE)
  • Группировку срок (GROUP BY)

Добавляем строку

Для добавления строки в таблицу используются SQL запросы с оператором INSERT. Добавление может производиться тремя способами:

  • добавляем новую целую строку;
  • часть строки;
  • результаты запроса.

Для добавления полной строки необходимо указать имя таблицы и значения столбцов (полей) новой строки. Приведем пример:

INSERT INTO Commodity VALUES("106 ", "50", "Coca-Cola", "1.68", "No Alcogol ,)

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

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

INSERT INTO Commodity (commodity_id, vendor_id, commodity_name)

VALUES("106 ", ‘50", "Coca-Cola",)

Мы ввели только идентификаторы товара, поставщика и его наименование, а остальные поля отставили пустыми.

Добавление результатов запроса

В основном INSERT используется для добавления строк, но может использоваться и для добавления результатов оператора SELECT.

Изменение данных

Для изменения информации в полях таблицы базы данных необходимо использовать оператор UPDATE. Оператор может применяться двумя способами:

  • Обновляются все строки в таблице.
  • Только для определенной строки.

UPDATE состоит из трех основных элементов:

  • таблица, в которой необходимо производить изменения;
  • имена полей и их новые значения;
  • условия выбора строк для изменения.

Рассмотрим пример. Допустим, у товара с ID=106 изменилась стоимость, поэтому эту строку необходимо обновить. Пишем следующий оператор:

UPDATE Commodity SET commodity_price = "3.2" WHERE commodity_id = "106"

Мы указали имя таблицы, в нашем случае Commodity, где будет производиться обновление, затем после SET - новое значение столбца и нашли нужную запись, указав в WHERE нужное значение ID.

Для изменения нескольких столбцов после оператора SET указываются несколько пар столбец-значение, разделенных запятыми. Смотрим пример, в котором обновляется наименование и цена товара:

UPDATE Commodity SET commodity_name=’Fanta’, commodity_price = "3.2" WHERE commodity_id = "106"

Для удаления информации в столбце можно присвоить ему значение NULL, если это позволяет структура таблицы. Необходимо помнить, что NULL - это именно «никакое» значение, а не нуль в виде текста или числа. Удалим описание товара:

UPDATE Commodity SET commodity_desc = NULL WHERE commodity_id = "106"

Удаление строк

SQL запросы на удаление строк в таблице выполняются оператором DELETE. Есть два варианта использования:

  • в таблице удаляются определенные строки;
  • удаляются все строки в таблице.

Пример удаления одной строки из таблицы:

DELETE FROM Commodity WHERE commodity_id = "106"

После DELETE FROM указываем имя таблицы, в которой будут удаляться строки. Оператор WHERE содержит условие, по которому будут выбираться строки для удаления. В примере мы удаляем строку товара с ID=106. Указывать WHERE очень важно т.к. пропуск этого оператора приведт к удалению всех строк в таблице. Это относится и к изменению значения полей.

В операторе DELETE не указываются наименования столбцов и метасимволы. Он полностью удаляет строки, а удалить отдельный столбец он не может.

Использование SQL в Microsoft Access

Обычно используется в интерактивном режиме для создания таблиц, баз данных, для управления, изменения, анализа данных в базе данных и с целью внедрить запросы SQL Access через удобный интерактивный конструктор запросов (Query Designer), используя который можно построить и немедленно выполнить операторов SQL любой сложности.

Также поддерживается режим доступа к серверу, при котором СУБД Access может использоваться как генератор SQL-запросов к любому ODBC источнику данных. Эта возможность позволяет приложениям Access взаимодействовать с любого формата.

Расширения SQL

Поскольку SQL запросы не имеют всех возможностей процедурных языков программирования, таких как циклы, ветвления и т.д., производители СУБД разрабатывают свой вариант SQL с расширенными возможностями. В первую очередь это поддержка хранимых процедур и стандартных операторов процедурных языков.

Наиболее распространенные диалекты языка:

  • Oracle Database - PL/SQL
  • Interbase, Firebird - PSQL
  • Microsoft SQL Server - Transact-SQL
  • PostgreSQL - PL/pgSQL.

SQL в Интернет

СУБД MySQL распространяется под свободной лицензией GNU General Public License. Имеется коммерческая лицензия с возможностью разработки заказных модулей. Как составная часть входит в наиболее популярные сборки Интернет-серверов, таких как XAMPP, WAMP и LAMP, и является самой популярной СУБД для разработки приложений в сети Интернет.

Была разработана компанией Sun Microsystems и в настоящий момент поддерживается корпорацией Oracle. Поддерживаются базы данных размером до 64 терабайт, стандарт синтаксиса SQL:2003, репликация баз данных и облачных сервисов.

Запрос SQL - это запрос, создаваемый при помощи инструкций SQL. Язык SQL (Structured Query Language) используется при создании запросов, а также для обновления и управления реляционными базами данных, такими как базы данных Microsoft Access.

Когда пользователь создает запрос в режиме конструктора запроса, Microsoft Access автоматически создает эквивалентную инструкцию SQL. Есть ряд запросов, которые можно сделать только в режиме SQL. Опытным программистам часто проще сразу писать выражение на SQL, чем формировать запрос.

Вид запроса в конструкторе:

При сложных расчетах для получения результата приходится последовательно делать несколько запросов. Ясно, что эти действия должны производиться автоматически без участия пользователя.

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

Вычисления в запросах, возможности создания и редактирования формул.

Для полей из указанных в схеме запроса таблиц можно указать любые вычисления.

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

Итоговые запросы, группировка, итоговые функции.

Итоговый запрос создается с помощью режима - Сводный запрос.

Можно использовать три таблицы, включая связующую таблицу.

При этом можно с любом месте запроса вызвать контекстное меню (правая кнопка мыши) и выбрать признак «групповые операции».

В бланке запроса появится новая строка Группировка.

Итоговые функции: в поле, по которому мы хотим посчитать итоги, выбрать из списка функцию «Sum» (сумма), чтобы просуммировать все значения выбранных полей. Функция «Подсчет» посчитает количество значений поля. информация редактирование microsoft

Запрос - это обращение к СУБД для выполнения каких-либо операций с данными: выбора части данных из общего объема, добавление вычислимых полей, массовое изменение данных и т. д.

В запросе можно:

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

Типы запросов:

  • - выборка;
  • - создание таблицы;
  • - обновление (изменение данных);
  • - добавление записей;
  • - удаление записей.

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

В Microsoft Access есть несколько типов запросов.

СУБД Access

Microsoft Access является СУБД реляционного типа, в которой разумно сбалансированы все средства и возможности, типичных для современных систем управления базами данных. Реляционная база упрощает поиск, анализ, поддержку и защиту данных, поскольку они сохраняются в одном месте. Access в переводе с английского означает "доступ". MS Access одна из самых мощных, гибких и простых в использовании СУБД. В ней можно создавать большинство приложений, не написав ни единой строки программы, но если нужно создать нечто очень сложное, то на этот случай MS Access предоставляет мощный язык программирования - Visual Basic Application.

Популярность СУБД Microsoft Access обусловлена следующими причинами:

Доступность в изучении и понятность позволяют Access являться одной из лучших систем быстрого создания приложений управления базами данных;

Возможность использования OLE технологии;

Интегрированность с пакетом Microsoft Office;

Полная поддержка Web-технологий;

Визуальная технология позволяет постоянно видеть результаты своих действий и корректировать их;

Наличие большого набора "мастеров" по разработке объектов.

Основными видами объектов, с которыми работает программа, являются: таблица, запрос, форма, отчет, страница, макрос, модуль.

Таблица - это объект, который используется для хранения данных. Каждая таблица включает информацию об объекте определенного типа. Таблица содержит поля (столбцы), в которых хранятся различного рода данные, и записи (строки). Для каждой таблицы должен быть определен первичный ключ (одно поле, имеющее для каждой записи уникальное значение или несколько полей, совокупное значение которых для каждой записи уникально), который является однозначным идентификатором каждой записи таблицы.

Для увеличения скорости доступа к данным отдельные поля таблицы (или их совокупность) могут быть объявлены индексами. Индекс - средство, ускоряющее поиск и сортировку в таблице за счет использования ключевых значений, которое позволяет обеспечить уникальность строк таблицы. Первичный ключ таблицы индексируется автоматически. Не допускается создание индексов для полей с некоторыми типами данных.

Запрос - это объект, который позволяет пользователю получить нужные данные из одной или нескольких таблиц. С помощью запросов можно также создавать новые таблицы, используя данные одной или нескольких таблиц, которые уже существуют. Наиболее распространенный тип запросов - запрос на выборку. Запрос на выборку отбирает данные из одной или более таблиц по заданным условиям, а затем отображает их в нужном порядке.

Форма - это объект, предназначенный в основном для ввода данных, отображения их на экране или управления работой приложения.

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

визуальная разработка программирование база

Страница - используется для доступа к данным текущей базы данных Access.

Макрос - объект, представляющий собой структурированное описание одного или нескольких действий, которые должен выполнить Access в ответ на определенное событие.

Модуль - объект, содержащий программы на Microsoft Visual Basic, которые позволяют разбить процесс на более мелкие действия и обнаружить те ошибки, которые нельзя было бы найти с использованием макросов.

Запуск СУБД осуществляется Пуск - Программы - Мicrosoft Access. Выполнить команду Файл - Создать.

Интерфейс работы с объектами базы данных унифицирован. По каждому из них предусмотрены стандартные режимы работы: Создать (создание структуры объектов); Конструктор (изменение структуры объектов); Открыть (Просмотр, Запуск - предназначен для работы с объектами базы данных).

Язык запросов SQL

SQL (Structured Query Language - структурированный язык запросов) с 1986г. является стандартным языком реляционных баз данных. В частности, он используется в приложениях Access и Excel.

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

Язык SQL представляет собой совокупность операторов:

операторы определения данных (Data Definition Language, DDL);

операторы манипуляции данными (Data Manipulation Language, DML);

операторы определения доступа к данным (Data Control Language, DCL);

операторы управления транзакциями (Transaction Control Language, TCL).

Запросы в MS Access сохраняются и реализуются с помощью языка SQL. Хотя большинство запросов можно создать графическими средствами (запросы по образцу), однако хранятся они в виде инструкций SQL. В ряде случаев (например, в подчиненных запросах) можно использовать только язык SQL.

­ SQL относится к непроцедурным языкам. Он просто декларирует, что нужно сделать, а исполнение возлагается на СУБД (система управления базами данных).

­ В SQL используется трехзначная логика. Наряду с традиционными логическими значениями TRUE и FALSE используется NULL (НЕИЗВЕСТНО или ОТСУТСТВИЕ ДАННЫХ).

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

Запрос на языке SQL состоит из инструкций. Каждая инструкция может содержать несколько предложений.

Со временем в ходе может потребоваться перенос файл-серверной базы данных Microsoft Office Access (Access) в формат клиент-серверной СУБД. Обычно для этой цели используется ODBC. Однако для переноса в Microsoft SQL Server (MS SQL) СУБД Access и MS SQL имеют удобные специализированные средства.

Всего существует три способа переноса базы данных из Access в MS SQL. Рассмотрим их все на примере простой базы данных состоящей из двух таблиц и одного запроса.

Перенос базы данных средствами Access («Мастер преобразования в формат SQL Server»)

Для того чтобы начать перенос нужно нажать кнопку «SQL Server» в области «Перемещение данных» вкладки «Работа с базами данных».

В открывшемся окне нужно выбрать, куда будут перенесены данные.

Возможны два варианта:

  1. Экспорт в уже существующую базу данных MS SQL;
  2. Создание новой базы данных (по умолчанию).

Задаём имя сервера, на который будем переносить базу данных, имя создаваемой базы данных и указываем имя пользователя и пароль для подключения.

Для выбора одной таблицы служит кнопка «>», а для выбора всех таблиц кнопка «>>». Для того чтобы отказаться от переноса предназначены кнопки «<» и «<<» соответственно.

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

  • Создать новое клиент-серверное приложение с пользовательским интерфейсом Access;
  • Включить перенесённые таблицы в исходную базу данных в качестве внешних (по умолчанию);
  • Не выполнять никаких действий с исходной базой данных.

Когда вся необходимая информация собрана можно либо вернуться к одному из предыдущих шагов для проверки либо начать процесс переноса нажав кнопку «Готово».

Ход процесса переноса наглядно отображается в специальном окне.

По завершении переноса, можно открыть SQL Server Management Studio и увидеть результат.

Этот способ наиболее прост и удобен, но, к сожалению, он позволяет переносить только таблицы и сопутствующие им элементы (индексы, связи и т.д.).

Импорт базы данных Access средствами Microsoft SQL Server

MS SQL может импортировать данные из самых различных источников. Но прямой импорт из Access возможен только для баз данных старого формата (.mdb).

Подробнейшую инструкцию по импорту таких баз данных можно найти .

Импорт баз данных новых форматов (2007 и выше) гораздо сложнее.

Существует два способа решения данной задачи:

  • Предварительно экспортировать базу данных Access в старый формат.
    В таком случае, можно без проблем воспользоваться инструкцией приведённой по ссылке выше;
  • Использование ODBC.
    Создание источника данных для базы данных Access с последующим подключением через него из MS SQL Server.

К сожалению, способ, связанный с использованием ODBC, довольно сложен в случае 64-разрядных версий Windows.

Причина в том, что 64-разрядные версии MS SQL комплектуются 32-разрядными версиями SQL Server Management Studio. Данное обстоятельство приводит к тому, что базы данных Access, для которых источники данных были созданы на основе 64-разрядных драйверов, невозможно импортировать с помощью этой программы.

Выхода здесь опять же два (имеются в виду только способы с использование графического интерфейса):

  • Использовать 32-разрядные версии Windows, MS SQL, Office;
  • Использовать только 32-разрядный Access и сконфигурировать источник данных с помощью 32-разрядного диспетчера ODBC (обычно это файл C:\Windows\SysWOW64\odbcad32.exe);
  • Использовать альтернативное ПО для работы с MS SQL.

Однако даже, если всё-таки удастся наладить процесс импорта, пользы от этого может оказаться гораздо меньше, чем потрачено сил и времени.

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

Также следует отметить, что при прямом импорте из Access частично решается проблема с экспортом запросов (через ODBC доступа к запросам нет) . Но, запросы по умолчанию импортируются в базу данных MS SQL в виде обычных таблиц.

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

Для этого нужно в окне на скриншоте выше для выбранного запроса Access нажать кнопку «Изменить».

В открывшемся окне нажать кнопку «Изменить SQL…»

Откроется окно редактирования SQL запроса, в котором, собственно, и нужно заменить запрос, сгенерированный автоматически

своим собственным.

В результате, запрос из Access будет передан в базу данных MS SQL корректно, в виде представления, а не таблицы.

Конечно, подобные настройки это кропотливый ручной труд, требующий к тому же определённых знаний и навыков, но всё-таки, как говорится, «лучше, чем ничего».

Поэтому данный способ переноса баз данных Access в MS SQL больше подходит квалифицированным специалистам по обеим СУБД.

Ниже приведён пример импорта базы данных Access с помощью ODBC в 32-разрядной версии Windows. В 64-разрядной версии Windows при использовании 32-разрядной версии Access импорт осуществляется аналогично, но источник данных создаётся в 32-разрядном диспетчере ODBC.

Создаём источник данных.

В открывшемся окне указываем его имя.

Затем нажимаем на кнопку «Выбрать» и указываем, к какой базе данных Access необходимо подключиться.

Когда указаны имя источника и файл базы данных, остаётся нажать кнопку «Ok» и источник данных для нужной базы данных Access готов.

Теперь можно приступать непосредственно к импорту базы данных в MS SQL.

Для этого в контекстном меню базы данных, в которую необходимо выполнить импорт, выбираем пункты «Задачи» -> «Импорт данных».

Откроется «Мастер импорта и экспорта данных»

В раскрывающемся списке «Источник данных» необходимо выбрать «.Net Framework Data Provider for Odbc» (если не выбрано по умолчанию) и в строке Dsn в таблице указать имя созданного выше источника данных для базы данных Access. Строка подключения («Connection String») будет сформирована автоматически.

Далее необходимо указать в какую базу данных, какого экземпляра MS SQL импорт. Для этого после нажатия кнопки «Далее» выбираем в раскрывающемся списке «Назначение» либо «Microsoft SQL Server Native Client» (как показано на скриншоте ниже) либо «Microsoft OLE DB Provider for SQL Server», указываем нужную базу данных имя пользователя и пароль для подключения.

Затем нужно выбрать таблицы, которые будут импортированы. Как уже было отмечено выше, при использовании ODBC импорт запросов Accessне доступен. Поэтому, в отличие от предыдущего скриншота со списком объектов для импорта в этом списке будут исключительно таблицы.

С помощью флажков можно выбрать как все таблицы сразу (что и сделано в этом примере), так и некоторые из них в отдельности.

Затем будет показано окно с окончательными настройками процесса импорта. Оставим все значения по умолчанию.

После нажатия на кнопку «Готово» процесс импорта будет выполнен. Если всё сделано правильно и импорт выполнен успешно, окно с информацией о выполнении импорта не будет содержать ошибок (см. скриншот ниже).

Для завершения работы мастера достаточно нажать кнопку «Закрыть».

Результат можно увидеть SQL Server Management Studio.

Перенос базы данных со стороны средствами ODBC

Этот способ является универсальным для экспорта данных из Access в любую другую СУБД. Достаточно только чтобы она поддерживала работу с ODBC.

Пример такого экспорта уже был ранее рассмотрен в статье « »

Для MS SQL данный способ переноса базы данных из Access не желателен , так как экспортируются только таблицы с данными, а запросы экспортируются только в виде обычных таблиц.

Однако такая возможность переноса до сих пор имеется (версия 2014 не стала исключением). Поэтому, рассмотрим и её тоже.

Для начала создадим источник данных для работы с MS SQL (пусть это будет пользовательский DSN).

Укажем драйвер для источника.

После этого будет запущен процесс его создания и настройки.

Зададим имя источника данных и укажем имя экземпляра MS SQL, к которому требуется выполнить подключение.

После этого укажем базу данных, в которую планируется перенести таблицу или запрос. Перенос с помощью ODBC можно выполнить только в уже существующую базу данных . Поэтому, если данные требуется перенести в новую базу данных, её необходимо предварительно создать.

После нажатия кнопки «Готово» будет показано окно с итоговой информацией о создаваемом источнике данных.

Для того чтобы источник данных был окончательно создан, достаточно нажать кнопку «Ok». Но, лучше предварительно проверить его работоспособность, нажав на кнопку «Проверить источник данных».

Если всё сделано правильно, будет показано сообщение об успешной проверке.

Теперь, когда есть источник данных, можно приступать непосредственно к процессу переноса.В качестве примера экспортируем из базы данных единственный запрос «Contacts Запрос».

Для этого выделим его мышью и нажмём на кнопку «Дополнительно» в области «Экспорт» вкладки «Внешние данные». В раскрывшемся меню выберем «База данных ODBC».

В данном случае оставлено исходное значение.

После нажатия кнопки «Ok» необходимо выбрать созданный источник данных.

Затем ввести имя пользователя и пароль для подключения к серверу.

После нажатия кнопки «Ok» экспорт будет выполнен.

Однако, как уже говорилось выше, результат экспорта в случае запроса не корректный.

Вместо представления «Contacts Запрос» в базе данных MS SQL была создана одноимённая таблица.

Кроме того, даже если экспортировать только таблицы, после экспорта необходимо выполнить множество дополнительных действий (повторное создание связей и т.д.). Поэтому, описанный способ переноса баз данных из Access в MS SQL уже практически не применяется.

Описание учебного проекта "Магазин"

Схема связей таблиц

Описание таблиц

m_category - категории товаров

m_income - приход товаров

m_outcome - расход товаров

m_product - справочник, описание товаров

m_supplier - справочник ; информация о поставщиках

m_unit - справочник; единицы измерения

Для практической проверки примеров приведенных в данном учебном материале, необходимо иметь в наличие следующее программное обеспечение:

Microsoft Access 2003 или новей.

Запрос SQL в MS Access. Начало

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

Для перехода в режим редактирования полей таблицы, на верхней панели выберите режим Конструктора:

Для вывода результата запроса SQL, щелкните дважды на названии запроса на панели слева:

Для того чтобы перейти в режим редактирования запроса SQL , на верхней панели выберите режим SQL:

Запрос SQL. Примеры в MS Access. SELECT: 1-10

В запросе SQL оператор SELECT используется для осуществления выборки из таблиц базы данных.

Запрос SQL Q001. Пример запроса SQL для получения только нужных полей в нужной последовательности:

SELECT dt, product_id, amount


FROM m_income;

Запрос SQL Q002. В этом примере запроса SQL символ звездочки (*) использован для вывода всех столбцов таблицы m_product, иначе говоря, для получения всех полей отношения m_product:

SELECT *
FROM m_product;

Запрос SQL Q003. Инструкция DISTINCT используется для исключения повторяющихся записей и получения множества уникальных записей:

SELECT DISTINCT product_id


FROM m_income;

Запрос SQL Q004. Инструкция ORDER BY используется для сортировки (упорядочивания) записей по значениям определенного поля. Имя поля указывается за инструкцией ORDER BY:

SELECT *
FROM m_income


ORDER BY price;

Запрос SQL Q005. Инструкция ASC используется как дополнение к инструкции ORDER BY и служит для определения сортировки по возрастанию. Инструкция DESC используется как дополнение к инструкции ORDER BY и служит для определения сортировки по убыванию. В случае, когда ни ASC, ни DESC не указаны, подразумевается наличие ASC (default):

SELECT *
FROM m_income


ORDER BY dt DESC , price;

Запрос SQL Q006. Для отбора необходимых записей из таблицы пользуются различными логическими выражениями, которые выражают условие отбора. Логическое выражение приводится после инструкции WHERE. Пример получения из таблицы m_income всех записей , для которых значение amount больше 200:

SELECT *
FROM m_income


WHERE amount>200;

Запрос SQL Q007. Для выражения сложных условий пользуются логическими операциями AND (конъюнкция), OR (дизъюнкция) и NOT (логическое отрицание). Пример получения из таблицы m_outcome всех записей, для которых значение amount равно 20 и значение price больше или равно 10:

Price


FROM m_outcome
WHERE amount=20 AND price>=10;

Запрос SQL Q008. Для объединения данных двух или более таблиц пользуются инструкциями INNER JOIN, LEFT JOIN, RIGHT JOIN. В следующем примере извлекаются поля dt, product_id, amount, price из таблицы m_income и поле title из таблицы m_product. Запись таблицы m_income соединяется с записью таблицы m_product при равенстве значения m_income.product_id значению m_product.id:



ON m_income.product_id=m_product.id;

Запрос SQL Q009. В этом запросе SQL нужно обратить внимание на две вещи: 1) искомый текст заключен в одинарные кавычки ("); 2) дата приведена в формате #Месяц/День/Год#, что верно для MS Access. В других системах формат написания даты может быть другим. Пример вывода информации о поступлении молока 12-го июня 2011 года. Обратите внимание на формат даты #6/12/2011#:

SELECT dt, product_id, title, amount, price


FROM m_income INNER JOIN m_product

WHERE title="Молоко" And dt=#6/12/2011#;

Запрос SQL Q010. Инструкция BETWEEN используется для проверки принадлежности некоторому диапазону значений. Пример запроса SQL, выводящий информацию о товарах, поступивших между 1-м и 30-м июнем 2011 года:

SELECT *
FROM m_income INNER JOIN m_product


ON m_income.product_id=m_product.id
WHERE dt BETWEEN #6/1/2011# And #6/30/2011#;

Запрос SQL. Примеры в MS Access. SELECT: 11-20

Один запрос SQL можно вкладывать в другой. Подзапрос - есть не что иное , как запрос внутри запроса. Обычно, подзапрос используется в конструкции WHERE. Но возможны и другие способы использования подзапросов.

Запрос Q011. Выводится информация о товарах из таблицы m_product, коды которых есть и в таблице m_income:

SELECT *
FROM m_product


WHERE id IN (SELECT product_id FROM m_income);

Запрос Q012. Выводится список товаров из таблицы m_product, кодов которых нет в таблице m_outcome:

SELECT *
FROM m_product


WHERE id NOT IN (SELECT product_id FROM m_outcome);

Запрос Q013. В этом запросе SQL выводится уникальный список кодов и названий товаров, коды которых есть в таблице m_income, но которых нет в таблице m_outcome:

SELECT DISTINCT product_id, title


FROM m_income INNER JOIN m_product
ON m_income.product_id=m_product.id
WHERE product_id NOT IN (SELECT product_id FROM m_outcome);

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

SELECT DISTINCT title


FROM m_product
WHERE title LIKE "М*";

Запрос Q015. Пример выполнения арифметических операций над полями в запросе и переименования полей в запросе (alias). В этом примере для каждой записи о расходе товара подсчитываются сумма расхода = количество*цена и размер прибыли, при предположении, что прибыль составляет 7 процентов от суммы продаж:


amount*price/100*7 AS profit
FROM m_outcome;

Запрос Q016. Проанализировав и упростив арифметические операции , можно увеличить скорость выполнения запроса:

SELECT dt, product_id, amount, price, amount*price AS outcome_sum,


outcome_sum*0.07 AS profit
FROM m_outcome;

Запрос Q017. При помощи инструкции INNER JOIN можно объединить данные нескольких таблиц. В следующем примере, в зависимости от значения ctgry_id, каждой записи таблицы m_income, сопоставляется название категории из таблицы m_category, к которой принадлежит товар:

SELECT c.title, b.title, dt, amount, price, amount*price AS income_sum


FROM (m_income AS a INNER JOIN m_product AS b ON a.product_id=b.id)
INNER JOIN m_category AS c ON b.ctgry_id=c.id
ORDER BY c.title, b.title;

Запрос Q018. Такие функции как SUM - сумма, COUNT - количество, AVG – среднее арифметическое значение, MAX – максимальное значение, MIN – минимальное значение называются агрегатными функциями. Они принимают множество значений , и после их обработки возвращают единственное значение. Пример подсчета суммы произведения полей amount и price при помощи агрегатной функции SUM:

SELECT SUM(amount*price) AS Total_Sum


FROM m_income;

Запрос Q019. Пример использования нескольких агрегатных функций:

SELECT Sum(amount) AS Amount_Sum, AVG(amount) AS Amount_AVG,


MAX(amount) AS Amount_Max, Min(amount) AS Amount_Min,
Count(*) AS Total_Number
FROM m_income;

Запрос Q020. В этом примере подсчитана сумма всех товаров с кодом 1, оприходованных в июне 2011 года:

SELECT Sum(amount*price) AS income_sum


FROM m_income
WHERE product_id=1 AND dt BETWEEN #6/1/2011# AND #6/30/2011#;.

Запрос Q021. Следующий запрос SQL вычисляет на какую сумму было продано товаров, имеющих код 4 или 6:

SELECT Sum(amount*price) as outcome_sum


FROM m_outcome
WHERE product_id=4 OR product_id=6;

Запрос Q022. Вычисляется на какую сумму было продано 12 июня 2011 года товаров, имеющих код 4 или 6:

SELECT Sum(amount*price) AS outcome_sum


FROM m_outcome
WHERE (product_id=4 OR product_id=6) AND dt=#6/12/2011#;

Запрос Q023. Задача такова. Вычислить на какую общую сумму было оприходовано товаров категории "Хлебобулочные изделия".

Для решения этой задачи нужно оперировать тремя таблицами: m_income, m_product и m_category, потому что:


- количество и цена оприходованных товаров хранятся в таблице m_income;
- код категории каждого товара хранится в таблице m_product;
- название категории title хранится в таблице m_category.

Для решения данной задачи воспользуемся следующим алгоритмом:


- определение кода категории "Хлебобулочные изделия" из таблицы m_category посредством подзапроса;
- соединение таблиц m_income и m_product для определения категории каждого оприходованного товара;
- вычисление суммы прихода(= количество*цена) для товаров, код категории которых равен коду, определенному вышеуказанным подзапросом.
SELECT
FROM m_product AS a INNER JOIN m_income AS b ON a.id=b.product_id
WHERE ctgry_id = (SELECT id FROM m_category WHERE title="Хлебобулочные изделия");

Запрос Q024. Задачу вычисления общей суммы оприходованных товаров категории "Хлебобулочные изделия" решим следующим алгоритмом:
- каждой записи таблицы m_income, в зависимости от значения его product_id, из таблицы m_category, сопоставить название категории ;
- выделить записи, для которых категория равна "Хлебобулочные изделия";
- вычислить сумму прихода = количество*цена.

FROM (m_product AS a INNER JOIN m_income AS b ON a.id=b.product_id)

WHERE c.title="Хлебобулочные изделия";

Запрос Q025. В этом примере вычисляется сколько наименований товаров было израсходовано:

SELECT COUNT(product_id) AS product_cnt


FROM (SELECT DISTINCT product_id FROM m_outcome) AS t;

Запрос Q026. Инструкция GROUP BY используется для группировки записей. Обычно записи группируются по значению одного или нескольких полей, и относительно каждой группы применяется какая-либо агрегатная операция. Например, следующий запрос состявляет отчет о продаже товаров. То есть генерируется таблица , в которой будут названия товаров и сумма, на которую они проданы:

SELECT title, SUM(amount*price) AS outcome_sum


FROM m_product AS a INNER JOIN m_outcome AS b
ON a.id=b.product_id
GROUP BY title;

Запрос Q027. Отчет о продажах по категориям. То есть генерируется таблица, в которой будут названия категорий товаров, общая сумма, на которую проданы товары данных категорий, и средняя сумма продаж. Функция ROUND использована для округления среднего значения до сотой доли (второй знак после разделителя целой и дробной частей):

SELECT c.title, SUM(amount*price) AS outcome_sum,


ROUND(AVG(amount*price),2) AS outcome_sum_avg
FROM (m_product AS a INNER JOIN m_outcome AS b ON a.id=b.product_id)
INNER JOIN m_category AS c ON a.ctgry_id=c.id
GROUP BY c.title;

Запрос Q028. Вычисляется для каждого товара общее и среднее количество его поступлений и выводит информацию о товарах, общее количество поступления которых не менее 500:

SELECT product_id, SUM(amount) AS amount_sum,


Round(Avg(amount),2) AS amount_avg
FROM m_income
GROUP BY product_id
HAVING Sum(amount)>=500;

Запрос Q029. В этом запросе вычисляется для каждого товара сумма и среднее значение его поступлений, осуществленных во втором квартале 2011 года. Если общая сумма прихода товара не менее 1000, то отображается информация об этом товаре:

SELECT title, SUM(amount*price) AS income_sum


FROM m_income a INNER JOIN m_product b ON a.product_id=b.id
WHERE dt BETWEEN #4/1/2011# AND #6/30/2011#
GROUP BY title
HAVING SUM(amount*price)>=1000;

Запрос Q030. В некоторых случаях нужно сопоставлять каждой записи некоторой таблицы каждую запись другой таблицы ; что называется декартовым произведением. Таблица, образующаяся в результате такого соединения, называется таблицей Декарта. Например, если некоторая таблица А имеет 100 записей и таблица В имеет 15 записей, то их таблица Декарта будет состоять из 100*15=150 записей. Следующий запрос соединяет каждую запись таблицы m_income с каждой записью таблицы m_outcome:
FROM m_income, m_outcome;

Запрос Q031. Пример группирования записей по двум полям. Следующий запрос SQL вычисляет по каждому поставщику сумму и количество поступивщих от него товаров:


SUM(amount*price) AS income_sum

Запрос Q032. Пример группирования записей по двум полям. Следующий запрос вычисляет для каждого поставщика сумму и количество его продуктов, проданных нами:

SELECT supplier_id, product_id, SUM(amount) AS amount_sum,




GROUP BY supplier_id, product_id;

Запрос Q033. В этом примере два вышеприведенных запроса (q031 и q032) использованы как подзапросы. Результаты этих запросов методом LEFT JOIN объединены в один отчет. Следующий запрос выводит отчет о количестве и сумме поступивщих и реализованных продуктов по каждому поставщику. Следует обратить внимание на то, что если какой-то товар уже поступил, но еще не реализован, то клетка outcome_sum для этой записи будет пустой. , что данный запрос служит только примером использования относительно сложных запросов в качестве подзапроса. Производительность данного запроса SQL при большом объеме данных сомнительна:

SELECT *
FROM



SUM(amount*price) AS income_sum

ON a.product_id=b.id GROUP BY supplier_id, product_id) AS a
LEFT JOIN
(SELECT supplier_id, product_id, SUM(amount) AS amount_sum,
SUM(amount*price) AS outcome_sum
FROM m_outcome AS a INNER JOIN m_product AS b
ON a.product_id=b.id GROUP BY supplier_id, product_id) AS b
ON (a.product_id=b.product_id) AND (a.supplier_id=b.supplier_id);

Запрос Q034. В этом примере два вышеприведенных запроса (q031 и q032) использованы как подзапросы. Результаты этих запросов методом RIGTH JOIN объединены в один отчет. Следующий запрос выводит отчет о сумме платежей каждого клиента по использованным им платежным системам и сумме сделанных им инвестиций. Следующий запрос выводит отчет о количестве и сумме поступивщих и реализованных продуктов по каждому поставщику. Следует обратить внимание на то, что если какой-то товар уже реализован, но еще не поступил, то клетка income_sum для этой записи будет пустой. Наличие таких пустых клеток является показателем ошибки в учете продаж, так как до продажы сначала необходимо, чтобы соответствующий товар поступил:

SELECT *
FROM


(SELECT supplier_id, product_id, SUM(amount) AS amount_sum,
SUM(amount*price) AS income_sum
FROM m_income AS a INNER JOIN m_product AS b ON a.product_id=b.id
GROUP BY supplier_id, product_id) AS a
RIGHT JOIN
(SELECT supplier_id, product_id, SUM(amount) AS amount_sum,
SUM(amount*price) AS outcome_sum
FROM m_outcome AS a INNER JOIN m_product AS b ON a.product_id=b.id
GROUP BY supplier_id, product_id) AS b
ON (a.supplier_id=b.supplier_id) AND (a.product_id=b.product_id);

Запрос Q035. Выводится отчет о сумме доходов и расходов по продуктам. Для этого создается список продуктов по таблицам m_income и m_outcome, затем для каждого продукта из этого списка вычисляется сумма его приходов по таблице m_income и сумма его расходов по таблице m_outcome:

SELECT product_id, SUM(in_amount) AS income_amount,


SUM(out_amount) AS outcome_amount
FROM
(SELECT product_id, amount AS in_amount, 0 AS out_amount
FROM m_income
UNION ALL
SELECT product_id, 0 AS in_amount, amount AS out_amount
FROM m_outcome) AS t
GROUP BY product_id;

Запрос Q036. Функция EXISTS возвращает значение TRUE, если переданное ей множество содержит элементы. Функция EXISTS возвращает значение FALSE , если переданное ей множество пустое, то есть не содержит элементов. Следующий запрос выводит коды товаров, которые содержатся как в таблице m_income, так и в таблице m_outcome:

SELECT DISTINCT product_id


FROM m_income AS a
WHERE EXISTS(SELECT product_id FROM m_outcome AS b

Запрос Q037. Выводятся коды товаров, которые содержатся как в таблице m_income, так и в таблице m_outcome:

SELECT DISTINCT product_id


FROM m_income AS a
WHERE product_id IN (SELECT product_id FROM m_outcome)

Запрос Q038. Выводятся коды товаров, которые содержатся как в таблице m_income, но не содержатся в таблице m_outcome:

SELECT DISTINCT product_id


FROM m_income AS a
WHERE NOT EXISTS(SELECT product_id FROM m_outcome AS b
WHERE b.product_id=a.product_id);

Запрос Q039. Выводится список товаров, сумма продаж которых максимальная. Алгоритм таков. Для каждого товара вычисляется сумма его продаж. Затем, определяется максимум этих сумм. Затем, для каждого товара снова вычисляется сумма его продаж, и выводятся код и сумма продаж товаров , сумма продаж которых равна максимальной:

SELECT product_id, SUM(amount*price) AS amount_sum


FROM m_outcome
GROUP BY product_id
HAVING SUM(amount*price) = (SELECT MAX(s_amount)
FROM (SELECT SUM(amount*price) AS s_amount FROM m_outcome GROUP BY product_id));

Запрос Q040. Зарезервированное слово IIF (условный оператор) используется для оценки логического выражения и выполнения того или иного действия в зависимости от результата (TRUE или FALSE). В следующем примере поставка товара считается «малой», если количество меньше 500. В противном случае, то есть количество поступления больше или равно 500, поставка считается «большой»:

SELECT dt, product_id, amount,


IIF(amount FROM m_income;

Запрос SQL Q041. В случае, когда оператор IIF используется несколько раз, удобнее заменить его оператором SWITCH. Оператор SWITCH (оператор множественного выбора) используется для оценки логического выражения и выполнения того или иного действия в зависимости от результата. В следующем примере поставленная партия считается «малой», если количество товара в партии меньше 500. В противном случае, то есть если количество товара больше или равно 500, партия считается «большой»:

SELECT dt, product_id, amount,


SWITCH(amount =500,"большая") AS mark
FROM m_income;

Запрос Q042. В следующем запросе если количество товара в поступившей партии меньше 300, то партия считается «малой». В противном случае, то есть если условие amount SELECT dt, product_id, amount,
IIF(amount IIF(amount FROM m_income;

Запрос SQL Q043. В следующем запросе если количество товара в поступившей партии меньше 300, то партия считается «малой». В противном случае, то есть если условие amount SELECT dt, product_id, amount,
SWITCH(amount amount amount>=1000,"большая") AS mark
FROM m_income;

Запрос SQL Q044. В следующем запросе продажи разделяются на три группы: малые (до 150), средние (от150 до 300), большие (300 и более). Далее, для каждой группы вычисляется итоговая сумма:

SELECT Category, SUM(outcome_sum) AS Ctgry_Total


FROM (SELECT amount*price AS outcome_sum,
IIf(amount*price IIf(amount*price FROM m_outcome) AS t
GROUP BY Category;

Запрос SQL Q045. Функция DateAdd используется для прибавления дней, месяцев или лет к данной дате и получения новой даты. Следующий запрос:
1) к дате из поля dt прибавляет 30 дней и отображает новую дату в поле dt_plus_30d;
2) к дате из поля dt прибавляет 1 месяц и отображает новую дату в поле dt_plus_1m:

SELECT dt, dateadd("d",30,dt) AS dt_plus_30d, dateadd("m",1,dt) AS dt_plus_1m


FROM m_income;

Запрос SQL Q046. Функция DateDiff предназначена для вычисления разницы между двумя датами в различных единицах (днях, месяцах или годах). Следующий запрос вычисляет разницу между датой в поле dt и текущей датой в днях , месяцах и годах:

SELECT dt, DateDiff("d",dt,Date()) AS last_day,


DateDiff("m",dt,Date()) AS last_months,
DateDiff("yyyy",dt,Date()) AS last_years
FROM m_income;

Запрос SQL Q047. Вычисляются количество дней со дня поступления товара (таблица m_income) до текущей даты с помощью функции DateDiff и сопоставляется срок годности (таблица m_product):


DateDiff("d",dt,Date()) AS last_days
FROM m_income AS a INNER JOIN m_product AS b
ON a.product_id=b.id;

Запрос SQL Q048. Вычисляются количество дней со дня поступления товара до текущей даты, затем проверяется превышает ли это количество срок годности:

SELECT a.id, product_id, dt, lifedays,


DateDiff("d",dt,Date()) AS last_days, IIf(last_days>lifedays,"Да","Нет") AS date_expire
FROM m_income a INNER JOIN m_product b
ON a.product_id=b.id;

Запрос SQL Q049. Вычисляются количество месяцев со дня поступления товара до текущей даты. В столбце month_last1 вычисляется абсолютное количество месяцев, в столбце month_last2 вычисляется количество полных месяцев:

SELECT dt, DateDiff("m",dt,Date()) AS month_last1,


DateDiff("m",dt,Date())-iif(day(dt)>day(date()),1,0) AS month_last2
FROM m_income;

Запрос SQL Q050. Выводится поквартальный отчет о количестве и сумме оприходованных товаров за 2011 год:

SELECT kvartal, SUM(outcome_sum) AS Total


FROM (SELECT amount*price AS outcome_sum, month(dt) AS m,
SWITCH(m =10,4) AS kvartal
FROM m_income WHERE year(dt)=2011) AS t
GROUP BY kvartal;

Запрос Q051. Следующий запрос помогает выяснить , удалось ли пользователям ввести в систему информацию о расходе товара на сумму большую, чем сумма прихода товара:

SELECT product_id, SUM(in_sum) AS income_sum, SUM(out_sum) AS outcome_sum


FROM (SELECT product_id, amount*price as in_sum, 0 as out_sum
from m_income
UNION ALL
SELECT product_id, 0 as in_sum, amount*price as out_sum
from m_outcome) AS t
GROUP BY product_id
HAVING SUM(in_sum)
Запрос Q052. Нумерацию строк, возвращаемых запросом, реализуют по-разному. Например, можно перенумеровать строки отчета, подготовленного в MS Access, средствами самого MS Access. Перенумеровать можно и с использованием языков программирования , например, VBA или PHP. Однако иногда это необходимо сделать в самом запросе SQL. Итак, следующий запрос пронумерует строки таблицы m_income в соответствии с порядком возрастания значений поля ID:

SELECT COUNT(*) as N, b.id, b.product_id, b.amount, b.price


FROM m_income a INNER JOIN m_income b ON a.id GROUP BY b.id, b.product_id, b.amount, b.price;

Запрос Q053. Выводится пятерка лидеров среди продуктов по сумме продаж. Вывод первых пяти записей осуществляется с помощью инструкции TOP:

SELECT TOP 5, product_id, sum(amount*price) AS summa


FROM m_outcome
GROUP BY product_id
ORDER BY sum(amount*price) DESC;

Запрос Q054. Выводится пятерка лидеров среди продуктов по сумме продаж, и нумерует строки в результате:

SELECT COUNT(*) AS N, b.product_id, b.summa


FROM


FROM m_outcome GROUP BY product_id) AS a
INNER JOIN
(SELECT product_id, sum(amount*price) AS summa,
summa*10000000+product_id AS id
FROM m_outcome GROUP BY product_id) AS b
ON a.id>=b.id
GROUP BY b.product_id, b.summa
HAVING COUNT(*)ORDER BY COUNT(*);

Запрос Q055. Следующий SQL-запрос показывает использование математических функций COS, SIN, TAN, SQRT, ^ и ABS в MS Access SQL:

SELECT (select count(*) from m_income) as N, 3.1415926 as pi, k,


2*pi*(k-1)/N as x, COS(x) as COS_, SIN(x) as SIN_, TAN(x) as TAN_,
SQR(x) as SQRT_, x^3 as "x^3", ABS(x) as ABS_
FROM (SELECT COUNT(*) AS k
FROM m_income AS a INNER JOIN m_income AS b ON a.idGROUP BY b.id) t;

Запрос SQL. Примеры в MS Access. UPDATE: 1-10

Запрос U001. Следующий SQL-запрос на изменение увеличивает на 10% цены на товары с кодом 3 в таблице m_income:

UPDATE m_income SET price = price*1.1


WHERE product_id=3;

Запрос U002. Следующий SQL-запрос на обновление увеличивает в таблице m_income на 22 единицы количество всех товаров , названия которых начинаются со слова "Масло":

UPDATE m_income SET amount = amount+22


WHERE product_id IN (SELECT id FROM m_product WHERE title LIKE "Масло*");

Запрос U003. Следующий SQL-запрос на изменение в таблице m_outcome снижает на 2 процента цены на все товары, производителем которых является ООО "Сладкое":

UPDATE m_outcome SET price = price*0.98


WHERE product_id IN
(SELECT a.id FROM m_product a INNER JOIN m_supplier b
ON a.supplier_id=b.id WHERE b.title="ООО "Сладкое"");.