русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Подзапросы


Дата добавления: 2013-12-23; просмотров: 2571; Нарушение авторских прав


Теоретико-множественные операции с таблицами

Объединение таблицы с собой

Объединение таблиц

WHERE условие;

FROM table_name

После слова SELECT идет перечисление имен атрибутов, значения которых мы выбираем. Можно все заменить символом «*» если нам необходимо выбрать данные всех атрибутов.

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

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

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

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

Для сортировки результатов отбора предусмотрен оператор ORDER BY. Он позволяет сортировать строки в результирующей таблице в соответствии со значениями выбранных атрибутов (если атрибутов несколько, то приоритет сортировки убывает при перечислении атрибутов слева направо). Поддерживается два типа сортировки: по возрастанию (ASC, этот режим действует по умолчанию) и по убыванию (DESC).

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

- AVG – получение среднего арифметического значения атрибута по всем результирующим строкам;

- MIN – нахождение минимального значения среди всех результирующих строк;



- MAX – нахождение максимального значения среди всех результирующих строк;

- SUM – подсчет суммы числовых значений атрибута;

- COUNT - подсчет количества строк выборки. В качестве единственного атрибута ей передается название атрибута, значения которого будут учитываться.

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

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

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

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

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

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

Перечислим основные характеристики объединений:

· операнды объединения (то есть те две таблицы, которые подаются на вход) обычно называют первой таблицей и второй, но для внешних объединений важен порядок, поэтому их называют левой и правой таблицей;

· таблицы всегда объединяются построчно при выполнении всевозможных условий, определенных в запросе;

· те строки, которые не соответствуют заданным условиям, могут быть как включены в объединение, так и исключены из него, в зависимости от типа этого объединения;

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

· связанные столбцы чаще всего являются связанными ключевыми столбцами, но, в общем-то, можно связать любые столбцы;

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

· связанные столбцы не обязательно должны иметь одинаковые названия;

· чтобы выполнить слияние более двух таблиц, объединения таблиц можно вкладывать друг в друга, выстраивать в цепочку и комбинировать, но при этом надо понимать, что СУБД проходит через ваш запрос шаг за шагом, выполняя объединения так, что за один раз всегда обрабатывается только две таблицы;

· количество таблиц для объединений, в общем-то, не ограничивается, но чем больше объединений, тем медленнее будет выполняться запрос;

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

Объединение (JOIN) является одной из сильнейших операций реляционной алгебры. Формат команды выборки данных с нескольких таблиц имеет вид:

SELECT <имя таблицы.имя столбца>,…, <имя таблицы.имя столбца> FROM <перечень имен таблиц> [WHERE <предикат>].

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

Команда обрабатывается в следующей последовательности: сначала обрабатывается фраза FROM, при этом выполняется декартово произведение таблиц, что принимают участие в запросе. В результате образовывается таблица больших размеров с количеством столбцов равных сумме столбцов начальных таблиц, за исключением общих для них столбцов; количество строк равняется произведению количества строк таблиц, которые соединяются. Потом выполняется условие отбора, оглашенное после слова WHERE. Строки которые не соответствуют условию отбора, исключаются из рассмотрения – выполняется операция реляционной алгебры – селекция. К строкам, что остались, применяется операция – проецирование.

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

В общем случае различают следующие типы объединений:

§ Полное или перекрестное объединение (CROSS JOIN) – группирует строки таблиц по правилу «каждая с каждой». В реляционной алгебре эта операция называется декартовым произведением.

§ Естественное объединение (NATURAL JOIN) – объединение по равенству. Связанными столбцами считаются те, которые в двух таблицах имею одинаковые имена. Объединяются те строки, в которых все значения связанных столбцов одной таблицы попарно совпадают с соответствующими значениями связанных столбцов другой таблицы. Остальные строки из объединения исключаются.

§ Внутреннее объединение (INNER JOIN) – тэта-объединение (можно использовать все операторы сравнения). Связанными столбцами считаются те, которые заданы условиями сравнения. Принцип объединения такой же, как и в естественном. Этот вид объединений используется чаще всего.

§ Левое внешнее объединение (LEFT OUTER JOIN) – сначала проводиться сравнение значений связанных столбцов. Но в результат объединения включаются все строки левой таблицы, а не только те для которой в правой таблице нашлись строки с удовлетворяющими сравнению значениями связанных столбцов. Если некоторой строке слева не нашлось ни одной строки справа, СУБД объединяет ее с искусственной строкой состоящей из значений null.

§ Правое внешнее объединение (RIGHT OUTER JOIN) – является зеркальным отображением левого внешнего объединения, но в результат включаются все строки правой таблицы.

§ Полное внешнее объединение (FULL OUTER JOIN) – включает все строки правой и левой таблиц. Если у какой-то из таблиц нет пары по связанным столбцам, СУБД объединяет ее с искусственной строкой, состоящей из значений null.

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

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

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

Для определения имен таблиц можно воспользоваться переменными корреляции или просто алиасами (псевдонимами). Вы определяете их в предложении FROM запроса – набираете имя таблицы, оставляете пробел, и затем набираете псевдоним для нее. Псевдонимы вы определяете заранее и, указывая названия столбцов после слова SELECT, вы перед ними используете алиасы, как префиксы таблиц.

Теоретико-множественные операции объединяют результаты многокомпонентного запроса в единый результат. В СУБД MySQL можно использовать только две следующие теоретико-множественные операции:

· UNION – формальное объединение результатов всех запросов SELECT в виде отношения с исключением дублирования;

· UNION ALL - формальное объединение результатов всех запросов SELECT в виде отношения с сохранением дублирования.

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

Подзапрос – это команда SELECT встроенная в другую команду SQL.

Подзапрос может располагаться в:

- предложении SELECT, FROM, WHERE или HAVING другой команды SELECT;

- другом подзапросе;

- команде INSERT, UPDATE или DELETE.

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

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

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

Структура подзапроса содержит следующие нюансы:

· подзапрос всегда должен заключаться в круглые скобки;

· не заканчивайте подзапрос точкой с запятой;

· не помещайте в подзапрос предложение сортировки

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

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

Чаще всего подзапрос используется в предложении WHERE и может принимать одну из следующих форм:

· WHERE test_expr op (subquery);

· WHERE test_expr [NOT] IN (subquery);

· WHERE test_expr op ALL (subquery);

· WHERE test_expr op ANY (subquery);

· WHERE [NOT] EXISTS (subquery);

test_expr является буквенным значением, названием столбца, выражением или запросом; op – это один из операторов сравнения; subquery – простой или сложный запрос.

Назначение оператора IN описывалось уже ранее.

Оператор EXISTS используется, чтобы указать предикату, производит ли подзапрос вывод. Возвращает булево значение.

Операторы SOME/ANY (взаимозаменяемы – различие в терминологии состоит в том, чтобы позволить людям использовать тот термин, который наиболее однозначен). Оператор ANY берет все значения выведенные подзапросом, причем такого же типа, как и те, которые сравнивают в основном предикате. В этом его отличие от EXISTS, который просто определяет, производит ли подзапрос результаты, и фактически не использует эти результаты.

Оператор ALL. В данном случае предикат является верным, если каждое значение выбранное подзапросом удовлетворяет условию в предикате внешнего запроса.

Эти формы можно также использовать в предложении HAVING.

SQL также позволяет вставлять в список предложения SELECT подзапросы.

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

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

Простые и сложные запросы.

Можно использовать два типа запросов с подзапросами – простые и сложные (корреляционные).

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

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

 



<== предыдущая лекция | следующая лекция ==>
Простые запросы | Управляющие функции


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

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


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.