Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Запросы к БД. Простые и сложные запросы на выборку (сортировка, группировка, вычисляемые поля, составные операторы выборки). Псевдонимы полей.






 

) Запросы — это объект базы данных, который служит для извлечения данных из таблиц и предоставления их пользователю в удобном виде. Особенность запросов состоит в том, что они черпают данные из базовых таблиц и создают на их основе временную таблицу. Применение запросов позволяет избежать дублирования данных в таблицах и обеспечивает максимальную гибкость при поиске и отображении данных в базе данных Access позволяет создавать запросы двух типов: QBE-запросы, SQL-запросы. QBE-запросы (Query By Example) — запросы, строящиеся с помощью конструктора запросов, представляющего собой графический инструмент для создания запросов по образцу. SQL-запросы — запросы, строящиеся при помощи унифицированного набора инструкций SQL (Structured Query Language — структурированный язык запросов). Запросы-выборки осуществляют выборку данных из таблиц в соответствии с заданными условиями. К этой группе запросов относятся следующие. Давайте не буду Вас мучать, а сразу дам SQL-запрос на сортировку результата выборки: SELECT * FROM users ORDER BY date_registration В результате мы получим result_set, в котором записи отсортированы по возрастанию поля " date_registration ". Чтобы данные сортировались по убыванию, нужно использовать параметр " DESC ": SELECT * FROM users ORDER BY date_registration DESC Результат тот же, что и в предыщем запросе, но данные расположены по убыванию относительно поля " date_registration ". Разумеется, никто Вам не мешает использовать полноценный SQL-запрос на выборку записей с сортировкой: SELECT login FROM users WHERE id > 20 AND id < 100 ORDER BY login LIMIT 10, 30 После выполнения этого SQL-запроса у нас получится result_set, в котором содержатся записи из таблицы users (только поле " login "), причём id этих записей больше 20 и меньше 100, сортировка записей по возрастанию поля " login ", а берём мы записи, начиная с 10-ой включительно в количестве 30-ти штук. Для создания вычисляемых полей используются математические и строковые операторы. При этом Access проверяет синтаксис выражения и автоматически выставляет следующие символы: 1. квадратные скобки ([…]), в них заключаются имена элементов управления; 2. знаки номеров (#), в них заключаются распознанные даты; 3. кавычки («»), в них заключается текст, не содержащий пробелов или знаков пунктуации. Поле, содержимое которого является результатом расчета по содержимому других полей, называется вычисляемым полем. Вычисляемое поле существует только в результирующей таблице. Общий формат вычисляемого поля выглядит так: Имя вычисляемого поля: Выражение для создания вычисляемого поля. Например: Прибыль: [Доход] – [Расход]. Создание вычисляемого поля осуществляется путем простого ввода выражения для вычисления в ячейку «Поле» пустого столбца бланка запроса. После выполнения запроса вычисляемое поле, основанное на этом выражении, выводит на экран результат вычислений, а не само выражение. 1. В строку «Поле» пустого столбца бланка запроса введите выражение, начинающееся со знака «=» и состоящее из имен полей, записанных в квадратные скобки и какой-либо арифметической или другой операции.
2. После выполнения запроса в результирующей таблице появится новое поле с названием «Выражение1», используемым в качестве имени вычисления выражения.
3. В режиме конструктора запроса измените имя «Выражение1» на более значимое.
Для того, чтобы ввести сложные вычисления, используйте окно Построитель выражений, которое вызывается нажатием кнопки Построить панели инструментов, либо соответствующей командой контекстного меню.

19) Объединение запросов: SELECT `name` FROM `user` WHERE `id` IN (1, 2, 3)Сегодня мы поговорим о множественных операторах UNION и UNION ALL.Под множеством понимается результат одного запроса. Указанные операторы позволяют соединить несколько результатов запросов в один. При этом количество полей в каждом запросе должно быть одиннаково. Помимо этого есть еще одно ограничение — типы данных соответствующих полей должны совпадать. То есть получите ошибку если будете соединять чиловое поле таблицы со строковым полем другой таблицы. Разница между операторами UNION и UNION ALL заключается в том, что первый выкидывает из окончательного результата повторяющиеся строки. Также стоит упомянуть, что если нужна сортировка, то конструкция ORDER BY пишется в самом последнем запросе. Синтаксис оператора довольно прост

select поле1, поле2,... полеN from таблица1 where условие

UNION [ALL]

select поле1, поле2,... полеN from таблица2 where условие

...

UNION [ALL]

select поле1, поле2,... полеN from таблицаM where условие

ORDER BY 1, 2, 3...

Опять же обратите внимание на позицию ORDER BYВ качестве примера (без особой смысловой нагрузки) объединим результаты выборок из таблиц employees и departments

select id, name from employees

union

select id, name from departments.Стоит заметить, что данные операторы используются не очень часто, но иногда просто необходимы.

Самый простой пример многотабличного SQL-запроса:

SELECT * FROM A, B;

Этот запрос соединяет каждую строку из таблицы A с каждой строкой из таблицы B в одну строку, в которой будут все колонки из первой таблицы и все колонки из второй таблицы. И возвращает набор таких соединенных строк. Так, если в таблице A находиться N строк, а в таблице B находиться M строк, то запрос вернет N * M строк. Приведенный запрос соответствует оператору реляционного умножения из реляционной теории.Если в запросе будет три и более таблицы, то строки будут соединяться в тройки, четверки и т.д. по принципу каждая с каждой (или что проще представить: первая соединаяется со второй, потом с результатом соединяется третья и т.д.).Когда мы с Вами делали выборку из одной таблицы, то всё было очень просто: SELECT названия_нужных_полей FROM название_таблицы WHERE условие_выборки

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

SELECT * FROM table_1, table_2 WHERE table_1.id > table_2.user_id

Многим, кто не занимался подобными запросами, покажется, что всё очень просто, подумав, что здесь добавились только названия таблиц перед названиями полей. Фактически, это позволяет избежать противоречий между одинаковыми именами полей. Однако, сложность не в этом, а в алгоритме работы подобного SQL-запроса. Перед тем как читать дальше, попробуйте самостоятельно сообразить, как будет работать подобный SQL-запрос. Алгоритм работы следующий: берётся первая запись из table_1. Берётся id этой записи из table_1. Дальше полностью смотрится таблица table_2. И добавляются все записи, где значение поля user_id меньше id выбранной записи в table_1. Таким образом, после первой итерации может появиться от 0 до бесконечного количества результирующих записей. На следующей итерации берётся следующая запись таблицы table_1. Снова просматривается вся таблица table_2, и вновь срабатывает условие выборки table_1.id > table_2.user_id. Все записи, удовлетворившие этому условию, добавляются в результат. На выходе может получиться огромное количество записей, во много раз превышающих суммарный размер обеих таблиц.Предыдущий SQL-запрос, как таковой, редко используется. Он был просто дан для объяснения алгоритма выборки из нескольких таблиц. А теперь же разберём более приземистый SQL-запрос. Допустим, у нас есть две таблицы: с товарами (есть поле owner_id, отвечающего за id владельца товара) и с пользователями (есть поле id). Мы хотим одним SQL-запросом получить все записи, причём чтобы в каждой была информация о пользователе и его одном товаре. В следующей записи была информация о том же пользователе и следущем его товаре. Когда товары этого пользователя кончатся, то переходить к следующему пользователю. Таким образом, мы должны соединить две таблицы и получить результат, в котором каждая запись содержит информацию о пользователе и об одном его товаре. Подобный запрос заменит 2 SQL-запроса: на выборку отдельно из таблицы с товарами и из таблицы с пользователями. Вдобавок, такой запрос сразу поставит в соответствие пользователя и его товар.Сам же запрос очень простой (если Вы поняли предыдущий):

SELECT * FROM users, products WHERE users.id = products.owner_id

Алгоритм здесь уже несложный: берётся первая запись из таблицы users. Далее берётся её id и анализируются все записи из таблицы products, добавляя в результат те, у которых owner_id равен id из таблицы users. Таким образом, на первой итерации собираются все товары у первого пользователя. На второй итерации собираются все товары у второго пользователя и так далее.

 

 

19. Создание запросов к базе данных: подзапросы и многотабличные запросы. Объединение запросов. Оператор UNION ALL. Многотабличные запросы. Выборка данных из нескольких таблиц. Подзапросы. Операторы EXISTS, UNIQUE, ALL, ANY.

 

Подзапрос - это оператор выбора, который содержится внутри другого оператора выбора, вставки, обновления или удаления, внутри условного оператора или внутри другого подзапроса. Существуют два основных типа подзапросов: 1.Подзапросы, которым предшествует немодифицированная операция сравнения и которые возвращают единственное значение, называются подзапросами- выражениями (скалярными подзапросами). 2.Подзапросы, которые возвращают список значений и которым предшествует ключевое слово in (принадлежит) или операция сравнения, модифицированная кванторами any (некоторый) или all (все), а также подзапросы, проверяющие существование с помощью квантора exists (существует), называются квантифицированными предикатными подзапросами. Подзапросы любого из этих типов могут быть либо коррелированными (повторяющимися), либо некоррелированными. Некоррелированный подзапрос может вычисляться как независимый запрос. Иначе говоря, результаты подзапроса подставляются в основной оператор (или внешний запрос). Это не значит, что SQL-сервер именно так выполняет операторы с подзапросами. Некорреляционные подзапросы могут быть заменены соединением и будут выполняться как соединения SQL-сервером. Коррелированные подзапросы не могут выполняться как независимые запросы, поскольку они могут обращаться к данным, находящихся в столбцах таблицы, указанной в списке from внешнего запроса. Коррелированные подзапросы. Оператор EXISTS проверяет существование одной или нескольких строк в подзапросе родительского запроса.

SELECT *

FROM jobs

WHERE NOT EXISTS

(SELECT * FROM employee WHERE jobs.job_id=employye. job_id)

В этом примере проверяется в подзапросе записей с помощью дополнительного ключевого слова NOT. В следующем примере для извлечения основного результирующего набора данных производится поиск специфических записей в подзапросе.SELECT au_lname FROM authors WHERE EXISTS

(SELECT *

FROM publishers

WHERE authors.city=publishers.city)

Этот запрос возвращает фамилии авторов (au_lname), которые живут в том же городе, что и издатели (publishers). Обратите внимание, что можно использовать в подзапросе звездочку, поскольку подзапрос должен вернуть всего лишь одну запись с булевым значением ИСТИНА. В таких случаях столбцы не играют роли. Ключевой момент - это существование строки. Операторы any и all всегда используются в комбинации с одним или несколькими операторами сравнения. Общий синтаксис обоих операторов: column_name operator [any | all] query Здесь operator- обычный оператор сравнения, a query- внутренний запрос. Оператор any возвращает значение «истина», если результат выполнения соответствующего внутреннего запроса содержит, по меньшей мере, одну строку, соответствующую сравнению.Ключевое слово some является синонимом для any. В примере 6.25 показано использование оператора any.

 

Каждое значение столбца enterdate в примере 6.25 сравнивается со всеми значениями этого же столбца. Для всех дат этого столбца, за исключением самой ранней, сравнение возвращает истину как минимум один раз. Строка с самой ранней датой не принадлежит результату, потому что сравнение не возвращает истину в этом случае. Другими словами, выражение enterdate > any (select enter_date from works_on) является истинным, если существуют любые (одна или более) строк в таблице workson со значением столбца enterdate, меньшим, чем значение enterdate текущей строки. Это будет истинным для всех, кроме самого раннего значения столбца enterdate. Оператор all возвращает истину, если вычисление столбца таблицы во внутреннем запросе возвращает все значения этого столбца.

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.