Как найти запрос в базе данных

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

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

  • вычисление или сведение данных;

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

Примечание:  Если необходимо использовать запросы, описанные в примере, используйте базу данных Access на компьютере.

  • Запросы как средство поиска данных и работы с ними

  • Создание запроса на выборку

  • Создание запроса с параметрами

  • Создание итогового запроса

  • Создание перекрестного запроса

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

  • Создание запроса на добавление

  • Создание запроса на обновление

  • Создание запроса на удаление

Запросы как средство поиска данных и работы с ними

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

Основные типы запросов

Назначение

Запрос на выборку

Получение данных из таблицы и выполнение вычислений.

Запрос на изменение

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

Создание запроса на выборку

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

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

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

  1. Откройте базу данных и на вкладке Создание нажмите кнопку Конструктор запросов.

  2. На вкладке “Таблицы” дважды щелкните таблицу “Товары”.

  3. Допустим, в таблице “Товары” содержатся поля “Наименование товара” и “Цена по прейскуранту”. Дважды щелкните элементы Наименование товара и Цена по прейскуранту, чтобы добавить эти поля в бланк запроса.

  4. На вкладке Конструктор нажмите кнопку Выполнить. Запрос будет выполнен, и отобразится список товаров и цен на них.

К началу страницы

Одновременный просмотр данных из нескольких связанных таблиц

Например, если у вас есть база данных для магазина, который продает продукты питания, и вы хотите просмотреть заказы клиентов, которые живут в конкретном городе. Скажем, данные о заказах и сведения о клиентах хранятся в двух таблицах с именами “Клиенты” и “Заказы” соответственно. Если каждая таблица имеет поле “ИД клиента”, которое является основой отношение “один-ко-многим” между двумя таблицами. Вы можете создать запрос, возвращающий заказы для клиентов в конкретном городе, например в Лас-Вегасе, используя следующую процедуру:

  1. Откройте базу данных. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.

  2. На вкладке “Таблицы” дважды щелкните “Клиенты” и “Заказы”.

    Обратите внимание на линию (называемую соединением), которая соединяет поле “Код” в таблице “Заказчики” с полем “Код заказчика” в таблице “Заказы”. Эта линия отображает связь между двумя таблицами.

  3. В таблице “Клиенты” дважды щелкните элементы Организация и Город, чтобы добавить эти поля в бланк запроса.

  4. В бланке запроса в столбце Город снимите флажок в строке Показать.

  5. В строке Условие отбора столбца Город введите Тюмень.

    Если снять флажок Показать, в результатах запроса не будет отображаться город, а слово Тюмень в строке Условие отбора означает, что требуется просмотреть только те записи, для которых в поле “Город” указано значение “Тюмень”. В этом случае запрос возвращает данные только о тех клиентах, которые находятся в Тюмени. Для использования поля в условии отбора показывать его на экране не обязательно.

  6. В таблице “Заказы” дважды щелкните элементы Код заказа и Дата размещения, чтобы добавить эти поля в два следующих столбца в бланке запроса.

  7. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить. Происходит выполнение запроса и отображается список заказов клиентов из Тюмени.

  8. Нажмите клавиши CTRL+S, чтобы сохранить запрос.

К началу страницы

Создание запроса с параметрами

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

Примечание:  Запрос с параметрами невозможно создать в веб-приложении Access.

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

  1. В области навигации щелкните правой кнопкой мыши запрос Заказы по городу (созданный в предыдущем разделе) и выберите в контекстном меню пункт Конструктор.

  2. В бланке запроса в строке Условие отбора столбца “Город” удалите слово Тюмень и введите [Для какого города?].

    Строка [Для какого города?] является предложением ввести параметр. Квадратные скобки показывают, что при выполнении запроса должно появиться предложение ввести данные, а текст (в данном случае Для какого города?) представляет собой вопрос, отображаемый в предложении.

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

  3. Установите флажок в строке Показать столбца “Город”, чтобы в результатах запроса отображался город.

  4. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить. Запрос предложит ввести значение в строке “Город”.

  5. Введите слово Москва и нажмите клавишу ВВОД, чтобы увидеть заказы для клиентов в Москве.

    Но что делать, если значения, которые можно указать, неизвестны? В приглашении на ввод можно использовать подстановочные знаки.

  6. На вкладке Главная в группе Представления нажмите кнопку Представление и выберите пункт Конструктор.

  7. В бланке запроса в строке Условие отбора столбца Город введите Like [Для какого города?]&”*”.

    В этом предложении ввести параметр ключевое слово Like, амперсанд (&) и звездочка (*), заключенная в кавычки, позволяют ввести сочетание знаков, включая подстановочные знаки, для получения разных результатов. Например, если пользователь вводит *, запрос возвращает все города; если пользователь вводит М, запрос возвращает все города, начинающиеся на букву “М”; если пользователь вводит *с*, запрос возвращает все города, в названиях которых имеется буква “с”.

  8. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить, в строке приглашения запроса введите Создать и нажмите клавишу ВВОД.

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

Указание типов данных для параметра

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

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

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

  1. Когда запрос открыт в конструкторе, на вкладке Конструктор в группе Показать или скрыть нажмите кнопку Параметры.

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

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

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

К началу страницы

Создание итогового запроса

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

Примечание:  В веб-приложении Access агрегатные функции использовать нельзя.

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

  1. На вкладке Главная нажмите кнопку Режим и выберите Конструктор.

    Запрос “Промежуточные суммы для товаров” будет открыт в конструкторе.

  2. На вкладке Конструктор в группе Показать или скрыть нажмите кнопку Итоги.

    В бланке запроса отобразится строка Итоги.

Примечание:  Несмотря на схожие названия, строка Итоги в бланке и строка Итог в таблице — не одно и то же.

  • С помощью строки Итоги в бланке можно группировать данные по значениям полей.

  • Строку Итог из таблицы можно добавить в результаты запроса итоговых значений.

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

  • Во втором столбце бланка в строке Итог выберите в раскрывающемся списке вариант Sum.

  • На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить. Происходит выполнение запроса, а затем отображается список товаров с промежуточными суммами.

  • Нажмите клавиши CTRL+S, чтобы сохранить запрос. Оставьте запрос открытым.

Дополнительные сведения см. в статье Отображение итогов по столбцу в таблице с помощью строки “Итог”.

К началу страницы

Выполнение расчетов на основе данных

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

Например, существует база данных с информацией о товарах, которые вы хотите продать. Она содержит таблицу под названием “Сведения о заказе”, в которой находится информация о товарах, например цена и количество каждого товара. Можно вычислить промежуточные суммы с помощью запроса, который умножает количество каждого товара на цену за единицу этого товара, количество каждого товара на цену за единицу этого товара и скидку этого товара, а затем вычитает общую скидку из общей цены. Если в предыдущем примере была создана база данных, откройте ее и выполните следующие действия.

  1. На вкладке “Создание” нажмите кнопку “Конструктор запросов”.

  2. На вкладке “Таблицы” дважды щелкните “Сведения о заказе”.

  3. В таблице “Сведения о заказе” дважды щелкните Код товара, чтобы добавить это поле в первый столбец бланка запроса.

  4. Во втором столбце бланка щелкните правой кнопкой мыши строку Поле, а затем выберите в контекстном меню команду Область ввода.

  5. В диалоговом окне Область ввода введите или вставьте следующее выражение: Промежуточный итог: ([Количество]*[Цена за единицу])-([Количество]*[Цена за единицу]*[Скидка])

  6. Нажмите кнопку ОК.

  7. На вкладке Конструктор нажмите кнопку Выполнить. Происходит выполнение запроса, а затем отображается список товаров с промежуточными суммами для каждого заказа.

  8. Нажмите клавиши CTRL+S, чтобы сохранить запрос, и назовите его Промежуточные суммы для товаров.

Дополнительные сведения см. в статье Отображение итогов по столбцу в таблице с помощью строки “Итог”.

К началу страницы

Просмотр сводных данных и статистических показателей

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

  1. Запустите ранее созданный запрос “Итоги по продуктам” и оставьте результаты открытыми в Режим таблицы.

  2. На вкладке “Главная” нажмите кнопку “Итоги”. В нижней части таблицы появится новая строка со словом “Итог” в первом столбце.

  3. Щелкните ячейку в последней строке с именем Итог.

  4. Щелкните стрелку, чтобы просмотреть доступные агрегатные функции. Поскольку столбец содержит текстовые данные, существует только два варианта: “Нет” и “Количество”.

  5. Выберите Количество. Содержимое ячейки изменится с Итог на число значений в столбце.

  6. Щелкните соседнюю ячейку (второй столбец). Обратите внимание на стрелку, которая появилась в ячейке.

  7. Щелкните стрелку и выберите Сумма. В поле будет отображаться сумма значений в столбце.

  8. Оставьте запрос открытым в режиме таблицы.

К началу страницы

Создание перекрестного запроса

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

Примечание: Перекрестный запрос не может отображаться в веб-приложении Access.

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

  1. На вкладке Главная в группе Представления нажмите кнопку Представление и выберите пункт Конструктор.

  2. В группе “Настройка запроса” нажмите кнопку “Добавить таблицы” (или “Добавить таблицу в Access 2013 “).

  3. Дважды щелкните “Заказы”и нажмите кнопку “Закрыть”.

  4. На вкладке Конструктор в группе Тип запроса щелкните элемент Перекрестная таблица. В бланке строка Показать скрыта, а отображается строка Перекрестная таблица.

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

  6. В диалоговом окне Область ввода введите или вставьте следующее выражение: Месяц: “Месяц” & DatePart(“м”, [Дата заказа])

  7. Нажмите кнопку ОК.

  8. В строке Перекрестная таблица выберите следующие значения в раскрывающемся списке: Заголовки строк для первого столбца, Значение для второго столбца и Заголовки столбцов для третьего.

  9. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить. Происходит выполнение запроса, а затем отображаются промежуточные суммы, собранные по месяцам.

  10. Нажмите клавиши CTRL+S, чтобы сохранить запрос.

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

К началу страницы

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

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

Примечание:  Запрос на таблицу не доступен в веб-приложениях Access.

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

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

  1. Откройте базу данных из предыдущего примера.

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

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

  2. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.

  3. Дважды щелкните “Сведения о заказе” и “Заказы”.

  4. В таблице Заказы дважды щелкните поля Код заказчика и Город получателя, чтобы добавить их в бланк.

  5. В таблице Сведения о заказе дважды щелкните элементы Код заказа, Код товара, Количество, Цена за единицу и Скидка, чтобы добавить эти поля в бланк.

  6. В столбце Город получателя бланка снимите флажок в строке Показать. В строке Условие отбора введите ‘Ростов’ (включая одинарные кавычки). Проверьте результаты выполнения запроса, прежде чем использовать их для создания таблицы.

  7. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

  8. Нажмите клавиши CTRL+S, чтобы сохранить запрос.

  9. В поле Имя запроса введите Запрос по заказам в Ростове и нажмите кнопку ОК.

  10. На вкладке Главная в группе Представления нажмите кнопку Представление и выберите пункт Конструктор.

  11. На вкладке Конструктор в группе Тип запроса нажмите кнопку Создание таблицы.

  12. В диалоговом окне Создание таблицы в поле Имя таблицы введите Заказы в Ростове и нажмите кнопку ОК.

  13. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

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

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

Дополнительные сведения об использовании запросов на создание таблиц см. в теме “Создание запроса на создание таблицы”.

К началу страницы

Создание запроса на добавление

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

Примечание:  Запрос на приложение не доступен в веб-приложениях Access.

Предположим, вы создали таблицу для совместной работы с партнером из Ростова, но вспомнили, что этот партнер работает также с клиентами из Казани. Необходимо добавить в эту таблицу строки с данными по Казани. Используя следующую процедуру, можно добавить эти данные в таблицу “Заказы в Ростове”.

  1. Откройте запрос “Запрос по заказам в Чикаго”, созданный ранее в конструкторе.

  2. На вкладке Конструктор в группе Тип запроса выберите команду Добавить. Откроется диалоговое окно Добавление.

  3. В диалоговом окне Добавление щелкните стрелку в поле Имя таблицы и выберите Заказы в Ростове в раскрывающемся списке, а затем нажмите кнопку ОК.

  4. В бланке в строке Условие отбора столбца “Город получателя” удалите значение ‘Ростов’ и введите ‘Казань’.

  5. В строке Добавление записей в таблицу выберите соответствующее поле для каждого столбца.

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

  6. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

Примечание:  При выполнении запроса, который возвращает большое количество данных, может появится сообщение об ошибке, в котором будет сказано, что отменить запрос не удастся. Попробуйте увеличить ограничение сегмента памяти до 3 МБ, чтобы выполнить запрос до конца.

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

К началу страницы

Создание запроса на обновление

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

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

В предыдущем примере строки были указаны в таблице “Заказы в Чикаго”. В таблице “Заказы в Чикаго” поле “ИД товара” содержит числовой ИД товара. Чтобы сделать данные отчетами более полезными, замените их их наименованиями продуктов. Для этого сделайте следующее:

  1. Откройте таблицу “Заказы в Ростове” в конструкторе.

  2. В строке “Код товара” измените тип данных Числовой на Текстовый.

  3. Сохраните и закройте таблицу “Заказы в Ростове”.

  4. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.

  5. Дважды щелкните “Заказы в Чикаго” и “Товары”.

  6. На вкладке Конструктор в группе Тип запроса нажмите кнопку Обновить.

  7. В бланке больше не будут отображаться строки Сортировка и Показать и появится строка Обновление.

  8. В таблице Заказы в Ростове дважды щелкните элемент Код товара, чтобы добавить это поле в бланк.

  9. В бланке в строке Обновление столбца Код товара введите или вставьте следующую строку: [Товары].[Наименование]

    Совет:  Запрос на обновление можно использовать для удаления значений полей; для этого используется пустая строка (“”) или значение NULL в строке Обновление.

  10. В строке Условие отбора введите или вставьте следующую строку: [Код продукта] Like ([Товары].[Код])

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

  12. На вкладке Конструктор выберите Режим >Режим таблицы. Запрос возвращает список кодов товаров, которые будут обновлены.

  13. На вкладке Конструктор нажмите кнопку Выполнить.

    При открытии таблицы “Заказы в Ростове” можно будет увидеть, что числовые значения в поле “Код товара” заменены наименованиями из таблицы “Товары”.

Дополнительные сведения о запросах на обновление см. в статье Создание и запуск запроса на обновление.

К началу страницы

Создание запроса на удаление

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

Примечание:  Запрос на удаление не доступен в веб-приложениях Access.

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

Вы можете использовать запрос для удаления из таблицы “Заказы в Ростове” строк, в которых отсутствует значение “Код заказа”. Для этого выполните описанную ниже процедуру.

  1. На вкладке Создание нажмите кнопку Конструктор запросов.

  2. Дважды щелкните “Заказы в Чикаго”.

  3. На вкладке Конструктор в группе Тип запроса нажмите кнопку Удаление. В бланке больше не будут отображаться строки Сортировка и Показать и появится строка Удалить.

  4. В таблице Заказы в Ростове дважды щелкните поле Код заказа , чтобы добавить его в бланк.

  5. В бланке в строке Условие отбора в столбце “Код заказа” введите Is Null.

  6. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

Дополнительные сведения об удалении запросов см. в теме “Создание и выполнение запроса на удаление”.

К началу страницы

Время на прочтение
5 мин

Количество просмотров 61K

Описание общей потребности в поиске данных и объектов в базе данных

Поиск данных, а также хранимых процедур, таблиц и других объектов в базе данных является достаточно актуальным вопросом в том числе и для C#-разработчиков, а также и для .NET-разработки в целом.

Достаточно часто может возникнуть ситуация, при которой нужно найти:

  1. объект базы данных (таблицу, представление, хранимую процедуру, функцию и т д)
  2. данные (значение и в какой таблице располагается)
  3. фрагмент кода в определениях объектов базы данных

Существует множество готовых решений как платных, так и бесплатных.

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

Поиск с помощью встроенных средств самой СУБД

Определить есть ли таблица Employee в базе данных можно с помощью следующего скрипта:

Поиск таблицы по имени

select [object_id], [schema_id],
	   schema_name([schema_id]) as [schema_name], 
	   [name], 
	   [type], 
	   [type_desc], 
	   [create_date], 
	   [modify_date]
from sys.all_objects
where [name]='Employee';

Результат может быть примерно такой:

Здесь выводятся:

  1. идентификаторы объекта и схемы, где располагается объект
  2. название этой схемы и название этого объекта
  3. тип объекта и описание этого типа объекта
  4. даты и время создания и последней модификации объекта

Чтобы найти все вхождения строки “Project”, то можно использовать следующий скрипт:

Поиск всех объектов по подстроке в имени

select [object_id], [schema_id],
	   schema_name([schema_id]) as [schema_name], 
	   [name], 
	   [type], 
	   [type_desc], 
	   [create_date], 
	   [modify_date]
from sys.all_objects
where [name] like '%Project%';

Результат может быть примерно такой:

Как видно из результата, здесь подстроку “Project” содержат не только две таблицы Project и ProjectSkill, но и также некоторые первичные и внешние ключи.

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

Поиск всех объектов по подстроке в имени с выводом родительских объектов

select ao.[object_id], ao.[schema_id],
	   schema_name(ao.[schema_id]) as [schema_name],
	   ao.parent_object_id,
	   p.[schema_id] as [parent_schema_id],
	   schema_name(p.[schema_id]) as [parent_schema_name],
	   p.[name] as [parent_name],
	   ao.[name], 
	   ao.[type], 
	   ao.[type_desc], 
	   ao.[create_date], 
	   ao.[modify_date]
from sys.all_objects as ao
left outer join sys.all_objects as p on ao.[parent_object_id]=p.[object_id]
where ao.[name] like '%Project%';

Результатом будет вывод таблицы с детальной информацией о родительских объектах, т е где определены первичные и внешние ключи:

В запросах используются следующие системные объекты:

  • таблица sys.all_objects
  • скалярная функция schema_name

Итак, разобрали как найти объекты в базе данных с помощью встроенных средств самой СУБД.
Теперь покажем как найти данные в базе данных на примере поиска строк.

Чтобы найти строковое значение по всем таблицам базы данных, можно воспользоваться следующим решением. Упростим данное решение и покажем как можно найти например значение “Ramiro” с помощью следующего скрипта:

Поиск строковых значений по подстроке во всех таблицах базы данных

set nocount on
declare @name varchar(128), @substr nvarchar(4000), @column varchar(128)
set @substr = '%Ramiro%'

declare @sql nvarchar(max);

create table #rslt 
(table_name varchar(128), field_name varchar(128), [value] nvarchar(max))

declare s cursor for select table_name as table_name from information_schema.tables where table_type = 'BASE TABLE' order by table_name
open s
fetch next from s into @name
while @@fetch_status = 0
begin
 declare c cursor for 
	select quotename(column_name) as column_name from information_schema.columns 
	  where data_type in ('text', 'ntext', 'varchar', 'char', 'nvarchar', 'char', 'sysname', 'int', 'tinyint') and table_name  = @name
 set @name = quotename(@name)
 open c
 fetch next from c into @column
 while @@fetch_status = 0
 begin
   --print 'Processing table - ' + @name + ', column - ' + @column

   set @sql='insert into #rslt select ''' + @name + ''' as Table_name, ''' + @column + ''', cast(' + @column + 
	' as nvarchar(max)) from' + @name + ' where cast(' + @column + ' as nvarchar(max)) like ''' + @substr + '''';

	print @sql;

   exec(@sql);

   fetch next from c into @column;
 end
 close c
 deallocate c
 fetch next from s into @name
end
select table_name as [Table Name], field_name as [Field Name], count(*) as [Found Mathes] from #rslt
group by table_name, field_name
order by table_name, field_name

drop table #rslt
close s
deallocate s

Результат выполнения может быть таким:

Здесь выводятся имена таблиц и в каких столбцах хранится значение, содержащие подстроку “Ramiro”. А также количество найденных входов данной подстроки для найденной пары таблица-колонка.

Чтобы найти объекты, в определениях которых есть заданный фрагмент кода, можно воспользоваться следующими системными представлениями:

  1. sys.sql_modules
  2. sys.all_sql_modules
  3. sys.syscomments

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

Поиск фрагмента кода в определениях объектов базы данных

select obj.[object_id],
	   obj.[name],
	   obj.[type_desc],
	   sc.[text]
from sys.syscomments as sc
inner join sys.objects obj on sc.[id]=obj.[object_id]
where sc.[text] like '%code snippet%';

Здесь будет выведен идентификатор, название, описание и полное определение объекта.

Поиск с помощью бесплатной утилиты dbForge Search

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

Для вызова этой утилиты в окне SSMS нажмите на кнопку .

Появится следующее окно поиска:

Обратите внимание на верхнюю панель (слева направо):

  1. можно переключать режим поиска (ищем DDL (объекты) или данные)
  2. непосредственно что ищем (какую подстроку)
  3. учитывать ли регистр, искать точное соответствие слову, искать вхождения:

  4. группировать результат по типам объектов — кнопка
  5. выбрать нужные типы объектов для поиска:

  6. также можно задать несколько баз данных для поиска и выбрать экземпляр MS SQL Server

Это все в режиме поиска объектов, т е когда включен DDL:

В режиме поиска данных изменится только выбор типов объектов:

А именно будут доступны для выбора только таблицы, где и хранятся собственно сами данные:

Теперь как и раньше найдем все вхождения подстроки “Project” в названиях объектов:

Как видно, был выбран режим поиска по DDL-объектам, заполнено что ищем-строка “Project”, остальное все было по умолчанию.

При выделении найденного объекта внизу отображается код определения данного объекта или всего его родительского объекта.

Также можно переместить навигацию на найденный объект, щелкнув на кнопку :

Можно также сгруппировать найденные объекты по их типу:

Обратите внимание, что выводятся даже те таблицы, в которых есть поля, в именах которых содержится подстрока “Project”. Однако, напомним, что режим поиска можно менять: искать полное соответствие/частичное/учитывать регистр или нет.

Теперь найдем значение “Ramiro” по всем таблицам:

Обратите внимание, что внизу отображаются все строки, в которых содержится подстрока “Ramiro” выбранной таблицы Employee.

Также можно переместить навигацию к найденному объекту, нажав как и ранее на кнопку :

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

Заключение

Были рассмотрены способы поиска как самих данных, так и объектов в базе данных как с помощью встроенных средств самой СУБД MS SQL Server, так и с помощью бесплатной утилиты dbForge Search.

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

Источники

  • Search_Script.sql
  • SSMS
  • dbForge Search
  • Документация по Microsoft SQL
  • Бесплатные решения от компании Devart

Приложение СУБД MS Access – это полноценный помощник для создания и ведения баз данных, заключенных в таблицы и массивы. Если база имеет слишком большой объем, быстро найти необходимые значения довольно сложно.

Именно поэтому в Access существует такая функция, как запросы. Рассмотрим, что это такое, как работает, какие имеет особенности.

Создание запросов в Microsoft Access

Чтобы разобраться, как создавать запросы в Access, нужно знать основные положения работы с СУБД.

Существует два способа выполнить данную процедуру:

  • Конструктор запросов.
  • Мастер запросов.

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

Легкий путь для новичков

Знающий человек за несколько кликов мышью выбирает те компоненты, которые потребуются пользователю для выполнения запроса, а затем быстро формирует реестр, в соответствии с собранными ключевыми значениями. Если это первое знакомство с СУБД, и пользователь не представляет, как создавать запросы в Access, то выбирается программа Мастер.

Как создавать запросы в Access

В данном режиме можно ознакомиться и разобраться со следующими типами запросов:

  • Простой.
  • Перекрестный.
  • Записи без подчиненных.
  • Повторяющиеся записи.

Данный выбор осуществляется уже на первом этапе работы с Мастером. А в дальнейшем, следуя четким указаниям, даже начинающий пользователь легко создаст запрос. Познакомимся с его разновидностями.

Простой запрос

Этот инструмент работы с таблицами собирает нужные данные из указанных пользователем полей. Уже по названию видно, что это самый популярный тип запросов для новичков. Его удобство заключается в том, что такая процедура открывается в новой вкладке. Поэтому ответ на вопрос, как создать запрос в Access 2010, становится очевидным уже после открытия первого меню Мастера.

Как создавать запросы в Access 2007

Перекрестный запрос

Этот тип выборки более сложный. Чтобы разобраться, как создать перекрестный запрос в Access с помощью “Мастера” в данном режиме, нужно кликнуть по этой функции в первом окне.

Как создать запрос в Access 2010

На экране появится таблица, в которой можно выбрать до трех столбцов, расположенных в оригинале.

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

Как создать запрос на выборку в Access

На фото показано, что перекрестный запрос создан, и что по заданным параметрам совершены необходимые действия.

Повторяющиеся записи

Как понятно из названия, основное предназначение данного запроса – выборка всех одинаковых строк в таблице по указанным параметрам. Выглядит это так:

Как создать запрос с параметром в Access

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

Чтобы выбрать повторяющиеся записи, нужно раскрыть список запросов и создать там новую папку. Далее в окошке “Новый запрос” выбрать строку “Поиск повторяющихся записей”. Далее нужно следовать указаниям Мастера.

Записи без подчиненных

Это последний тип запросов, доступный в режиме “Мастер – Записи без подчиненных”.

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

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

Как создать перекрестный запрос в Access

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

Функции запросов в MS Access

Разберемся, зачем нужно выполнять описанные выше действия. Задача всех простых и сложных запросов в СУБД Access заключается в следующем:

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

Запрос на выборку

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

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

Как создать запрос в базе данных Access

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

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

Как создать запрос на выборку в Access

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

Чтобы завершить операцию, нужно нажать на кнопку “Выполнить”.

Запрос с параметрами

Это еще одна разновидность сложной процедуры, которая потребует от пользователя определенных навыков работы с базами данных. Одним из главных направлений такого действия является подготовка к созданию отчетов с объемными данными, а также получение сводных результатов. Как создавать запросы в Access 2007 с помощью конструктора, будет рассмотрено ниже.

Начинать данную процедуру по выборке данных нужно с создания простого запроса, чтобы выбрать нужные поля. Далее через режим Конструктора обязательно нужно заполнить поле «Условие отбора» и, уже исходя из внесенного значения, будет осуществляться отбор.

Таким образом, на вопрос о том, как создать запрос с параметром в Access, ответ простой – внести исходные параметры для выборки. Чтобы работать с Конструктором необходимо пользоваться Мастером запросов. Там создается первичные данные для фильтрации, которые служат основой дальнейшей работы.

Расширенный перекрестный запрос

Продолжаем усложнять ситуацию. Еще труднее для понимания является информация о том, как создавать запросы в Access, если присутствует несколько таблиц с данными. Перекрестный запрос уже рассматривался выше, как один из вариантов работы с Мастером. Однако, и в режиме “Конструктора” можно создавать подобный запрос.

Для этого необходимо нажать «Конструктор запросов» – «Перекрестный».

Открывается меню добавления исходных таблиц, а также возможность заполнения выборочных полей. Единственное, на что следует обратить внимание, – пункты «групповая операция» и «перекрестная таблица». Их нужно заполнять правильно, иначе процедура не будет выполнена корректно.

Как создать перекрестный запрос в Access

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

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

Конечно, присутствуют и «подводные камни», которые могут помешать в работе. Например, при создании запроса на сортировку базы данных по значению столбцов система выдает ошибку. То есть доступна только сортировка по стандартным пунктам – «возрастание и убывание».

Краткие рекомендации

Подводя итоги, нужно сказать, что решить, как создавать запросы в Access – с помощью Мастера или Конструктора, должен сам пользователь. Хотя, для большинства людей, которые используют СУБД MS Access, больше подойдет первый вариант. Ведь Мастер сам сделает всю работу, оставив для пользователя только несколько кликов мышью, при выборе условий запроса.

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

Есть один момент, который доступен лишь программистам. Так как основным языком СУБД является SQL, то нужный запрос можно написать в виде программного кода. Чтобы работать в данном режиме, достаточно нажать на строку уже созданного запроса, и в открывшемся контекстном меню выбрать «Режим SQL».

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

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

Инженер-тестировщик: новая работа через 9 месяцев

Получится, даже если у вас нет опыта в IT

Узнать больше

Виды SQL-запросов

Ключевые слова этого языка делят на четыре логические группы.

1️⃣ DDL

Data Definition Language — язык определения данных. В него входят ключевые слова CREATE, DROP, RENAME и другие, которые относят к определению и манипулированию структурой базы данных. Их используют, чтобы создавать базы данных и описывать структуру, устанавливать, как размещать данные.

2️⃣ DML

Data Manipulation Language — язык манипулирования данными. В этой группе — запросы SELECT, INSERT, UPDATE, DELETE и другие. Их используют, чтобы изменять, получать, обновлять и удалять данные из базы.

3️⃣ DCL

Data Control Language  — язык управления данными. К этой группе относят запросы разрешений, прав и различных ограничивающих доступ настроек. Например, GRANT или DENY.

4️⃣ TCL

Transaction Control Language — язык управления транзакциями. В эту группу входят все запросы, которые относят к управлению транзакциями и их жизненными циклами. Например, BEGIN TRANSACTION, ROLLBACK TRANSACTION, COMMIT TRANSACTION.Виды SQL-запросов

Структура SQL-запросов

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

Выбрать Столбец2, Столбец3 из Таблица1, где Столбец1 равен одному

На SQL это выглядит похоже:

SELECT (Column2, Column3) FROM Table1 WHERE Column1 = 1

Простые запросы SQL

Ключевые слова

Их используют, чтобы составить запросы:

✔️ WHERE

Это ключевое слово отфильтровывает записи. Мы использовали его в абстрактном примере:

SELECT (Column2, Column3) FROM Table1 WHERE Column1 = 1

✔️ GROUP BY

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

✔️ AND, OR и BETWEEN

AND или OR расширяют выборку, создаваемую с помощью WHERE. Либо сужают ее, если указать дополнительные значения. Ключевое слово BETWEEN позволяет указать диапазон значений, чтобы создать выборку.

✔️  LIMIT

Лимитирует количество значений выборки. Например, по указанным фильтрам получено 100 значений, а нужны только первые 10. Тогда применяют синтаксис LIMIT 10.

Команды

С них начинаются запросы.

Предположим, нам необходимо создать базу данных, чтобы хранить информацию о прочитанных книгах, извлекать и изменять данные. В примерах мы будем использовать самую простую СУБД — sqlite3 в среде Linux. Создайте базу данных командой sqlite3 demo.db — и сразу попадете в командную строку программы:

sqlite3 demo.db

SQLite version 3.27.2 2019-02-25 16:06:06
Enter ".help" for usage hints.
sqlite>

🚀 CREATE TABLE

Чтобы создать таблицу, используют команду CREATE TABLE. Если создаете таблицу с прочитанными книгами, вероятно, понадобятся три столбца: id, название и автор.

sqlite> CREATE TABLE Books (id INTEGER PRIMARY KEY, title CHAR(255), author CHAR(255));
sqlite> .tables
Books

Команда .tables отображает список таблиц.

🚀 INSERT

Команда создает новые записи. Добавим три книги в нашу таблицу:

sqlite> INSERT INTO Books(title, author) VALUES
   ...> ("Язык SQL", "Неизвестный автор"),
   ...> ("SQL. Сборник рецептов", "Энтони Молинаро"),
   ...> ("Книга №3", "Без автора");

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

🚀 SELECT

Извлекает записи из таблицы:

sqlite> SELECT * FROM Books;
1|Язык SQL|Неизвестный автор
2|SQL. Сборник рецептов|Энтони Молинаро
3|Книга №3|Без автора

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

sqlite> SELECT title, author FROM Books;
Язык SQL|Неизвестный автор
SQL. Сборник рецептов|Энтони Молинаро
Книга №3|Без автора

🚀 UPDATE

Изменяет существующие записи. Чтобы использовать эту команду, укажите уникальный идентификатор изменяемой записи. Либо характеристику, по которой можно получить одну запись или группу из нескольких записей. Обновим авторов у первой и последней записи:

sqlite> UPDATE Books
   ...> SET author = "Unknown"
   ...> WHERE id = 1 OR id = 3;

sqlite> 
sqlite> SELECT title, author FROM Books;
Язык SQL|Unknown
SQL. Сборник рецептов|Энтони Молинаро
Книга №3|Unknown

🚀 DELETE

Удаляет записи из таблицы по поисковому запросу. Удалим книгу с id, равным двум:

sqlite> DELETE FROM Books WHERE id = 2;
sqlite> 
sqlite> SELECT * FROM Books;
1|Язык SQL|Unknown
3|Книга №3|Unknown

🚀 DROP TABLE

Удаляет таблицы из базы данных. Создадим и удалим демонстрационную таблицу:

sqlite> CREATE TABLE Demo (id INTEGER PRIMARY KEY, text TEXT);
sqlite> 
sqlite> .tables
Books  Demo 
sqlite> 
sqlite> DROP TABLE Demo;
sqlite> 
sqlite> .tables
Books

🚀 ALTER TABLE

Команда в сочетании с другими ключевыми словами изменяет названия таблиц или добавляет новые столбцы. Изменим название нашей таблицы Books:

sqlite> ALTER TABLE Books RENAME TO MyBooks;
sqlite> 
sqlite> .tables
MyBooks

Добавим в нее новый столбец is_finished с булевым значением:

sqlite> ALTER TABLE MyBooks ADD COLUMN is_finished BOOLEAN;
sqlite> UPDATE MyBooks
   ...> SET is_finished = True;
sqlite> 
sqlite> SELECT * FROM MyBooks;
1|Язык SQL|Unknown|1
3|Книга №3|Unknown|1

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

Их используют, чтобы проводить дополнительные вычисления внутри полученной выборки:

✔️ COUNT(название_столбца) — возвращает количество строк выборки, где значение столбца не NULL.

✔️ SUM(название_столбца) — вычисляет и возвращает сумму значений в указанном столбце.

✔️ AVG(название_столбца) — вычисляет и возвращает среднее значение по столбцу.

✔️ MIN(название_столбца) — возвращает наименьшее значение для указанного столбца.

✔️ MAX(название_столбца) — возвращает наибольшее значение указанного столбца.

Вложенные подзапросы

Это SQL-запрос внутри другого SQL-запроса. Подзапросы помогают, если выборку фильтруют по значениям, которые тоже можно отфильтровать. Например, получим названия футбольных команд — участников соревнований с 2010 по 2020 годы:

SELECT DISTINCT club_name
FROM clubs
WHERE game_year = 2010 AND club_id IN
(SELECT club_id
FROM clubs
WHERE game_year = 2020
);

Ключевое слово DISTINCT убирает из выборки дублирующиеся результаты.

Главное

  • SQL используют в реляционных СУБД, где хранят данные в виде таблиц.
  • Основные команды SQL делят на четыре логические группы: DDL, DML, DCL, TCL.
  • С SQL можно создавать, читать, изменять и удалять данные. Например, чтобы создать таблицу, используют команду CREATE TABLE, извлечь записи — SELECT, удалить таблицу баз данных — DROP TABLE.
  • Для дополнительных вычислений нужны агрегатные функции: вычислять и возвращать сумму, наименьшее и наибольшее значение для указанного столбца.

Узнайте, как решать бизнес-задачи с помощью SQL, на курсе Skypro «Аналитик данных». За 5-9 месяцев научитесь фильтровать, группировать и объединять данные из разных таблиц, проводить аналитические исследования, вычислять показатели из большого объема информации. Студенты участвуют в вебинарах и выполняют задания, разбирают реальные задачи на командных мастер-классах под руководством эксперта.

Вступление

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

В системах управления реляционными базами данных query – это любая команда, используемая для извлечения данных из таблицы. В языке структурированных запросов (SQL) запросы почти всегда выполняются с помощью оператора + SELECT +.

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

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

Предпосылки

В общем, команды и концепции, представленные в этом руководстве, могут использоваться в любой операционной системе на базе Linux, на которой работает любое программное обеспечение базы данных SQL. Однако он был написан специально для сервера Ubuntu 18.04 с MySQL. Для настройки вам понадобится следующее:

  • Машина Ubuntu 18.04 с пользователем без полномочий root с привилегиями sudo. Это можно настроить, используя наше Initial Руководство по установке сервера для Ubuntu 18.04.

  • MySQL установлен на машине. Наше руководство по Как установить MySQL в Ubuntu 18.04 может помочь вам настроить это.

С этой настройкой мы можем начать учебник.

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

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

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

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

_Теперь, что эта традиция продолжается какое-то время, вы решили начать отслеживать записи с этих турниров. Кроме того, чтобы упростить планирование обедов, вы решаете создать запись о днях рождения ваших друзей и их любимых блюдах, сторонах и десертах. Вместо того чтобы хранить эту информацию в физической книге, вы решаете использовать свои навыки работы с базами данных, записав ее в базу данных MySQL.

Для начала откройте приглашение MySQL как ваш пользователь * root * MySQL:

Затем создайте базу данных, запустив:

CREATE DATABASE `birthdays`;

Затем выберите эту базу данных, набрав:

Затем создайте две таблицы в этой базе данных. Мы будем использовать первую таблицу, чтобы отслеживать записи ваших друзей в боулинге. Следующая команда создаст таблицу с именем + tourneys + со столбцами для + name + каждого из ваших друзей, количества выигранных ими турниров (+ wins +), их общего рейтинга + best + и какой размер обуви для боулинга они носят (+ размер +):

CREATE TABLE tourneys (
name varchar(30),
wins real,
best real,
size real
);

После того, как вы запустите команду + CREATE TABLE и заполните ее заголовками столбцов, вы получите следующий вывод:

OutputQuery OK, 0 rows affected (0.00 sec)

Заполните таблицу + tourneys + некоторыми примерами данных:

INSERT INTO tourneys (name, wins, best, size)
VALUES ('Dolly', '7', '245', '8.5'),
('Etta', '4', '283', '9'),
('Irma', '9', '266', '7'),
('Barbara', '2', '197', '7.5'),
('Gladys', '13', '273', '8');

Вы получите такой вывод:

OutputQuery OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

После этого создайте еще одну таблицу в той же базе данных, которую мы будем использовать для хранения информации о любимых блюдах ваших друзей на день рождения. Следующая команда создает таблицу с именем + dinners + со столбцами для + name + каждого из ваших друзей, их + birthdate +, их любимых + entree +, их предпочтительных блюд + side + и их любимых ` + десерт + `:

CREATE TABLE dinners (
name varchar(30),
birthdate date,
entree varchar(30),
side varchar(30),
dessert varchar(30)
);

Аналогично для этой таблицы вы получите отзыв, подтверждающий успешное выполнение команды:

OutputQuery OK, 0 rows affected (0.01 sec)

Заполните эту таблицу также некоторыми примерами данных:

INSERT INTO dinners (name, birthdate, entree, side, dessert)
VALUES ('Dolly', '1946-01-19', 'steak', 'salad', 'cake'),
('Etta', '1938-01-25', 'chicken', 'fries', 'ice cream'),
('Irma', '1941-02-18', 'tofu', 'fries', 'cake'),
('Barbara', '1948-12-25', 'tofu', 'salad', 'ice cream'),
('Gladys', '1944-05-28', 'steak', 'fries', 'ice cream');
OutputQuery OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

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

Понимание утверждений SELECT

Как упоминалось во введении, SQL-запросы почти всегда начинаются с оператора + SELECT +. + SELECT + используется в запросах, чтобы указать, какие столбцы из таблицы должны быть возвращены в наборе результатов. Запросы также почти всегда включают + FROM +, который используется для указания таблицы, которую запрос будет запрашивать оператор.

Как правило, SQL-запросы следуют этому синтаксису:

Например, следующий оператор вернет весь столбец + name + из таблицы + dinners +:

SELECT name FROM dinners;
Output+---------+
| name    |
+---------+
| Dolly   |
| Etta    |
| Irma    |
| Barbara |
| Gladys  |
+---------+
5 rows in set (0.00 sec)

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

SELECT name, birthdate FROM dinners;
Output+---------+------------+
| name    | birthdate  |
+---------+------------+
| Dolly   | 1946-01-19 |
| Etta    | 1938-01-25 |
| Irma    | 1941-02-18 |
| Barbara | 1948-12-25 |
| Gladys  | 1944-05-28 |
+---------+------------+
5 rows in set (0.00 sec)

Вместо того, чтобы называть конкретный столбец или набор столбцов, вы можете следовать за оператором + SELECT + со звездочкой (+ * +), которая служит заполнителем, представляющим все столбцы в таблице. Следующая команда возвращает каждый столбец из таблицы + tourneys +:

Output+---------+------+------+------+
| name    | wins | best | size |
+---------+------+------+------+
| Dolly   |    7 |  245 |  8.5 |
| Etta    |    4 |  283 |    9 |
| Irma    |    9 |  266 |    7 |
| Barbara |    2 |  197 |  7.5 |
| Gladys  |   13 |  273 |    8 |
+---------+------+------+------+
5 rows in set (0.00 sec)

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

Оператор сравнения в предложении + WHERE + определяет способ сравнения указанного столбца со значением. Вот некоторые распространенные операторы сравнения SQL:

Operator What it does

=

tests for equality

!=

tests for inequality

<

tests for less-than

>

tests for greater-than

<=

tests for less-than or equal-to

>=

tests for greater-than or equal-to

BETWEEN

tests whether a value lies within a given range

IN

tests whether a row’s value is contained in a set of specified values

EXISTS

tests whether rows exist, given the specified conditions

LIKE

tests whether a value matches a specified string

IS NULL

tests for NULL values

IS NOT NULL

tests for all values other than NULL

Например, если вы хотите найти размер обуви Ирмы, вы можете использовать следующий запрос:

SELECT size FROM tourneys WHERE name = 'Irma';
Output+------+
| size |
+------+
|    7 |
+------+
1 row in set (0.00 sec)

SQL допускает использование подстановочных знаков, и это особенно удобно при использовании в предложениях + WHERE +. Знаки процента (+% +) представляют ноль или более неизвестных символов, а подчеркивания (+ _ +) представляют один неизвестный символ. Они полезны, если вы пытаетесь найти конкретную запись в таблице, но не уверены, что именно это за запись. Для иллюстрации предположим, что вы забыли любимую запись нескольких своих друзей, но уверены, что эта запись начинается с буквы «т». Вы можете найти ее имя, выполнив следующий запрос:

SELECT entree FROM dinners WHERE entree LIKE 't%';
Output+--------+
| entree |
+--------+
| tofu   |
| tofu   |
+--------+
2 rows in set (0.00 sec)

Основываясь на вышеприведенном выводе, мы видим, что забытая запись – + tofu +.

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

SELECT name AS n, birthdate AS b, dessert AS d FROM dinners;
Output+---------+------------+-----------+
| n       | b          | d         |
+---------+------------+-----------+
| Dolly   | 1946-01-19 | cake      |
| Etta    | 1938-01-25 | ice cream |
| Irma    | 1941-02-18 | cake      |
| Barbara | 1948-12-25 | ice cream |
| Gladys  | 1944-05-28 | ice cream |
+---------+------------+-----------+
5 rows in set (0.00 sec)

Здесь мы указали SQL отображать столбец + name + как + n +, столбец + birthdate + как + b +, а столбец + десерт + как + d +.

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

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

Часто при работе с данными вам не обязательно видеть сами данные. Скорее, вам нужна информация о данных. Синтаксис SQL включает в себя ряд функций, которые позволяют вам интерпретировать или выполнять вычисления на ваших данных, просто выполнив запрос + SELECT +. Они известны как aggregate functions.

Функция + COUNT + считает и возвращает количество строк, соответствующих определенным критериям. Например, если вы хотите узнать, сколько ваших друзей предпочитают тофу для своего дня рождения, вы можете выполнить этот запрос:

SELECT COUNT(entree) FROM dinners WHERE entree = 'tofu';
Output+---------------+
| COUNT(entree) |
+---------------+
|             2 |
+---------------+
1 row in set (0.00 sec)

Функция + AVG + возвращает среднее (среднее) значение столбца. Используя наш пример таблицы, вы можете найти средний лучший результат среди ваших друзей с этим запросом:

SELECT AVG(best) FROM tourneys;
Output+-----------+
| AVG(best) |
+-----------+
|     252.8 |
+-----------+
1 row in set (0.00 sec)

+ SUM + используется для нахождения общей суммы данного столбца. Например, если вы хотите посмотреть, сколько игр вы и ваши друзья играли в боулинг за эти годы, вы можете выполнить этот запрос:

SELECT SUM(wins) FROM tourneys;
Output+-----------+
| SUM(wins) |
+-----------+
|        35 |
+-----------+
1 row in set (0.00 sec)

Обратите внимание, что функции + AVG + и + SUM + будут работать правильно только при использовании с числовыми данными. Если вы попытаетесь использовать их для нечисловых данных, это приведет к ошибке или просто «+ 0 +», в зависимости от того, какую СУБД вы используете:

SELECT SUM(entree) FROM dinners;
Output+-------------+
| SUM(entree) |
+-------------+
|           0 |
+-------------+
1 row in set, 5 warnings (0.00 sec)

+ MIN + используется для поиска наименьшего значения в указанном столбце. Вы можете использовать этот запрос, чтобы увидеть, какой худший из всех боулинг-рекордов (с точки зрения количества побед):

SELECT MIN(wins) FROM tourneys;
Output+-----------+
| MIN(wins) |
+-----------+
|         2 |
+-----------+
1 row in set (0.00 sec)

Аналогично, + MAX + используется для поиска наибольшего числового значения в данном столбце. Следующий запрос покажет лучший общий результат в боулинге:

SELECT MAX(wins) FROM tourneys;
Output+-----------+
| MAX(wins) |
+-----------+
|        13 |
+-----------+
1 row in set (0.00 sec)

В отличие от + SUM и` + AVG`, функции + MIN и` + MAX` могут использоваться как для числовых, так и для буквенных типов данных. При запуске в столбце, содержащем строковые значения, функция + MIN + покажет первое значение в алфавитном порядке:

SELECT MIN(name) FROM dinners;
Output+-----------+
| MIN(name) |
+-----------+
| Barbara   |
+-----------+
1 row in set (0.00 sec)

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

SELECT MAX(name) FROM dinners;
Output+-----------+
| MAX(name) |
+-----------+
| Irma      |
+-----------+
1 row in set (0.00 sec)

Агрегатные функции имеют много применений помимо того, что было описано в этом разделе. Они особенно полезны при использовании с предложением + GROUP BY +, которое рассматривается в следующем разделе, а также с несколькими другими предложениями запроса, которые влияют на порядок сортировки результатов.

Манипуляции с результатами запросов

В дополнение к предложениям + FROM и` + WHERE`, есть несколько других предложений, которые используются для манипулирования результатами запроса + SELECT +. В этом разделе мы объясним и предоставим примеры для некоторых из наиболее часто используемых предложений запросов.

Одним из наиболее часто используемых предложений запроса, помимо + FROM и` + WHERE`, является предложение + GROUP BY. Обычно он используется, когда вы выполняете статистическую функцию для одного столбца, но в отношении сопоставления значений в другом.

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

SELECT COUNT(name), entree FROM dinners GROUP BY entree;
Output+-------------+---------+
| COUNT(name) | entree  |
+-------------+---------+
|           1 | chicken |
|           2 | steak   |
|           2 | tofu    |
+-------------+---------+
3 rows in set (0.00 sec)

Предложение + ORDER BY используется для сортировки результатов запроса. По умолчанию числовые значения сортируются в порядке возрастания, а текстовые значения сортируются в алфавитном порядке. Для иллюстрации следующий запрос перечисляет столбцы + name и` + birthdate`, но сортирует результаты по дате рождения:

SELECT name, birthdate FROM dinners ORDER BY birthdate;
Output+---------+------------+
| name    | birthdate  |
+---------+------------+
| Etta    | 1938-01-25 |
| Irma    | 1941-02-18 |
| Gladys  | 1944-05-28 |
| Dolly   | 1946-01-19 |
| Barbara | 1948-12-25 |
+---------+------------+
5 rows in set (0.00 sec)

Обратите внимание, что стандартное поведение + ORDER BY + заключается в сортировке результирующего набора в порядке возрастания. Чтобы отменить это и отсортировать результирующий набор в порядке убывания, закройте запрос с помощью + DESC +:

SELECT name, birthdate FROM dinners ORDER BY birthdate DESC;
Output+---------+------------+
| name    | birthdate  |
+---------+------------+
| Barbara | 1948-12-25 |
| Dolly   | 1946-01-19 |
| Gladys  | 1944-05-28 |
| Irma    | 1941-02-18 |
| Etta    | 1938-01-25 |
+---------+------------+
5 rows in set (0.00 sec)

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

SELECT COUNT(name), side FROM dinners WHERE COUNT(name) >= 3;
OutputERROR 1111 (HY000): Invalid use of group function

Предложение + HAVING + было добавлено в SQL, чтобы обеспечить функциональность, аналогичную предложению + WHERE +, а также совместимость с агрегатными функциями. Полезно думать о разнице между этими двумя пунктами как о том, что + WHERE + применяется к отдельным записям, в то время как + HAVING + применяется к групповым записям. С этой целью каждый раз, когда вы вводите предложение + HAVING, также должно присутствовать предложение` + GROUP BY`.

Следующий пример – еще одна попытка найти, какие гарниры являются фаворитами как минимум трех ваших друзей, хотя этот вернет результат без ошибок:

SELECT COUNT(name), side FROM dinners GROUP BY side HAVING COUNT(name) >= 3;
Output+-------------+-------+
| COUNT(name) | side  |
+-------------+-------+
|           3 | fries |
+-------------+-------+
1 row in set (0.00 sec)

Агрегатные функции полезны для суммирования результатов конкретного столбца в данной таблице. Однако во многих случаях необходимо запросить содержимое более чем одной таблицы. Мы рассмотрим несколько способов сделать это в следующем разделе.

Запрос нескольких таблиц

Чаще всего база данных содержит несколько таблиц, каждая из которых содержит разные наборы данных. SQL предоставляет несколько разных способов выполнения одного запроса для нескольких таблиц.

Предложение + JOIN + может использоваться для объединения строк из двух или более таблиц в результате запроса. Это достигается путем нахождения связанного столбца между таблицами и надлежащим образом сортирует результаты в выходных данных.

Операторы + SELECT +, которые включают предложение + JOIN +, обычно следуют этому синтаксису:

SELECT ., .
FROM
JOIN  ON .=.;

Обратите внимание: поскольку предложения + JOIN + сравнивают содержимое нескольких таблиц, в предыдущем примере указывается, из какой таблицы выбрать каждый столбец, предшествуя имени столбца с именем таблицы и точкой. Вы можете указать, из какой таблицы должен быть выбран столбец, например, для любого запроса, хотя это необязательно при выборе из одной таблицы, как мы делали в предыдущих разделах. Давайте рассмотрим пример, используя наши примеры данных.

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

SELECT tourneys.name, tourneys.size, dinners.birthdate
FROM tourneys
JOIN dinners ON tourneys.name=dinners.name;
Output+---------+------+------------+
| name    | size | birthdate  |
+---------+------+------------+
| Dolly   |  8.5 | 1946-01-19 |
| Etta    |    9 | 1938-01-25 |
| Irma    |    7 | 1941-02-18 |
| Barbara |  7.5 | 1948-12-25 |
| Gladys  |    8 | 1944-05-28 |
+---------+------+------------+
5 rows in set (0.00 sec)

Предложение + JOIN, используемое в этом примере, без каких-либо других аргументов, является внутренним предложением` + JOIN`. Это означает, что он выбирает все записи, которые имеют совпадающие значения в обеих таблицах, и печатает их в наборе результатов, в то время как все несоответствующие записи исключаются. Чтобы проиллюстрировать эту идею, давайте добавим новую строку в каждую таблицу, в которой нет соответствующей записи в другой:

INSERT INTO tourneys (name, wins, best, size)
VALUES ('Bettye', '0', '193', '9');
INSERT INTO dinners (name, birthdate, entree, side, dessert)
VALUES ('Lesley', '1946-05-02', 'steak', 'salad', 'ice cream');

Затем повторно запустите предыдущий оператор + SELECT с предложением` + JOIN`:

SELECT tourneys.name, tourneys.size, dinners.birthdate
FROM tourneys
JOIN dinners ON tourneys.name=dinners.name;
Output+---------+------+------------+
| name    | size | birthdate  |
+---------+------+------------+
| Dolly   |  8.5 | 1946-01-19 |
| Etta    |    9 | 1938-01-25 |
| Irma    |    7 | 1941-02-18 |
| Barbara |  7.5 | 1948-12-25 |
| Gladys  |    8 | 1944-05-28 |
+---------+------+------------+
5 rows in set (0.00 sec)

Обратите внимание, что, поскольку таблица + tourneys + не имеет записи для Лесли, а таблица + dinners + не имеет записи для Бетти, эти записи отсутствуют в этих выходных данных.

Тем не менее, можно вернуть все записи из одной из таблиц, используя предложение outer + JOIN +. В MySQL предложения + JOIN + записываются как + LEFT JOIN + или + RIGHT JOIN +.

Предложение + LEFT JOIN + возвращает все записи из «левой» таблицы и только совпадающие записи из правой таблицы. В контексте внешних объединений левая таблица – это таблица, на которую ссылается условие + FROM +, а правая таблица – любая другая таблица, на которую ссылается после оператора + JOIN +.

Выполните предыдущий запрос еще раз, но на этот раз используйте предложение + LEFT JOIN +:

SELECT tourneys.name, tourneys.size, dinners.birthdate
FROM tourneys
LEFT JOIN dinners ON tourneys.name=dinners.name;

Эта команда будет возвращать каждую запись из левой таблицы (в данном случае + tourneys +), даже если у нее нет соответствующей записи в правой таблице. Каждый раз, когда в правой таблице нет подходящей записи, она возвращается как + NULL + или просто пустое значение, в зависимости от вашей СУБД:

Output+---------+------+------------+
| name    | size | birthdate  |
+---------+------+------------+
| Dolly   |  8.5 | 1946-01-19 |
| Etta    |    9 | 1938-01-25 |
| Irma    |    7 | 1941-02-18 |
| Barbara |  7.5 | 1948-12-25 |
| Gladys  |    8 | 1944-05-28 |
| Bettye  |    9 | NULL       |
+---------+------+------------+
6 rows in set (0.00 sec)

Теперь снова запустите запрос, на этот раз с предложением + RIGHT JOIN +:

SELECT tourneys.name, tourneys.size, dinners.birthdate
FROM tourneys
RIGHT JOIN dinners ON tourneys.name=dinners.name;

Это вернет все записи из правой таблицы (+ dinners +). Поскольку дата рождения Лесли записана в правой таблице, но для нее нет соответствующей строки в левой таблице, столбцы + name + и + size + вернутся как значения + NULL + в этой строке:

Output+---------+------+------------+
| name    | size | birthdate  |
+---------+------+------------+
| Dolly   |  8.5 | 1946-01-19 |
| Etta    |    9 | 1938-01-25 |
| Irma    |    7 | 1941-02-18 |
| Barbara |  7.5 | 1948-12-25 |
| Gladys  |    8 | 1944-05-28 |
| NULL    | NULL | 1946-05-02 |
+---------+------+------------+
6 rows in set (0.00 sec)

Обратите внимание, что левые и правые объединения могут быть записаны как + LEFT OUTER JOIN + или + RIGHT OUTER JOIN +, хотя подразумевается часть + OUTER + в предложении. Аналогично, указание + INNER JOIN даст тот же результат, что и простое написание` + JOIN`.

В качестве альтернативы использованию + JOIN + для запроса записей из нескольких таблиц, вы можете использовать предложение + UNION +.

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

Для иллюстрации выполните следующий запрос:

SELECT name FROM tourneys UNION SELECT name FROM dinners;

Этот запрос удалит все повторяющиеся записи, что является поведением по умолчанию оператора + UNION:

Output+---------+
| name    |
+---------+
| Dolly   |
| Etta    |
| Irma    |
| Barbara |
| Gladys  |
| Bettye  |
| Lesley  |
+---------+
7 rows in set (0.00 sec)

Чтобы вернуть все записи (включая дубликаты), используйте оператор + UNION ALL +:

SELECT name FROM tourneys UNION ALL SELECT name FROM dinners;
Output+---------+
| name    |
+---------+
| Dolly   |
| Etta    |
| Irma    |
| Barbara |
| Gladys  |
| Bettye  |
| Dolly   |
| Etta    |
| Irma    |
| Barbara |
| Gladys  |
| Lesley  |
+---------+
12 rows in set (0.00 sec)

Имена и количество столбцов в таблице результатов отражают имя и количество столбцов, запрошенных первым оператором + SELECT +. Обратите внимание, что при использовании + UNION + для запроса нескольких столбцов из более чем одной таблицы каждый оператор + SELECT + должен запрашивать одинаковое количество столбцов, соответствующие столбцы должны иметь одинаковые типы данных, а столбцы в каждом + SELECT + Заявление должно быть в том же порядке. В следующем примере показано, что может произойти, если вы используете предложение + UNION для двух операторов` + SELECT`, которые запрашивают разное количество столбцов:

SELECT name FROM dinners UNION SELECT name, wins FROM tourneys;
OutputERROR 1222 (21000): The used SELECT statements have a different number of columns

Другой способ запроса нескольких таблиц – использование subqueries. Подзапросы (также известные как inner или nested query) – это запросы, заключенные в другой запрос. Это полезно в тех случаях, когда вы пытаетесь отфильтровать результаты запроса по сравнению с результатами отдельной агрегатной функции.

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

SELECT name, wins FROM tourneys
WHERE wins > (
SELECT wins FROM tourneys WHERE name = 'Barbara'
);
Output+--------+------+
| name   | wins |
+--------+------+
| Dolly  |    7 |
| Etta   |    4 |
| Irma   |    9 |
| Gladys |   13 |
+--------+------+
4 rows in set (0.00 sec)

Подзапрос в этом операторе был выполнен только один раз; нужно только найти значение из столбца + wins + в той же строке, что и + Barbara + в столбце + name +, и данные, возвращаемые подзапросом и внешним запросом, не зависят друг от друга. Однако существуют случаи, когда внешний запрос должен сначала прочитать каждую строку в таблице и сравнить эти значения с данными, возвращенными подзапросом, чтобы получить требуемые данные. В этом случае подзапрос называется коррелированным подзапросом.

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

SELECT name, size FROM tourneys AS t
WHERE wins > (
SELECT AVG(wins) FROM tourneys WHERE size = t.size
);

Чтобы запрос завершился, он должен сначала собрать столбцы + names и` + size of` из внешнего запроса. Затем он сравнивает каждую строку из этого набора результатов с результатами внутреннего запроса, который определяет среднее количество побед для людей с одинаковыми размерами обуви. Поскольку у вас есть только два друга с одинаковым размером обуви, в наборе результатов может быть только одна строка:

Output+------+------+
| name | size |
+------+------+
| Etta |    9 |
+------+------+
1 row in set (0.00 sec)

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

SELECT name, entree, side, dessert
FROM dinners
WHERE name = (SELECT name FROM tourneys
WHERE wins = (SELECT MAX(wins) FROM tourneys));
Output+--------+--------+-------+-----------+
| name   | entree | side  | dessert   |
+--------+--------+-------+-----------+
| Gladys | steak  | fries | ice cream |
+--------+--------+-------+-----------+
1 row in set (0.00 sec)

Обратите внимание, что этот оператор не только включает подзапрос, но также содержит подзапрос в этом подзапросе.

Добавить комментарий