Оператор on в sql – Оператор соединения JOIN SQL — CodeTown.ru

Содержание

Оператор соединения JOIN SQL - CodeTown.ru

Доброго времени суток! В этой статье по языку SQL мы познакомимся с оператором соединения двух таблиц — JOIN. Как и всегда, разберем практические примеры и посмотрим на различные варианты применения оператора JOIN в SQL.

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

Введение

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

В этой статье мы разберем несколько вариантов применения оператора JOIN:

  • INNER JOIN
  • OUTER JOIN
    • RIGHT OUTER JOIN
    • LEFT OUTER JOIN

Про эти варианты использования мы и поговорим подробнее.

Оператор INNER JOIN

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

Вывести сумму заказов и дату, которые проводил продавец с фамилией Колованов. Используйте оператор INNER JOIN.

SELECT amt, odate
FROM orders
INNER JOIN salespeople on orders.snum = salespeople.snum and sname = 'Колованов'

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

amtodate
3482017-04-08
802017-09-02

Рассмотрим еще один пример на оператор INNER JOIN, уже сложнее:

Вывести среднюю суму заказов для каждого продавца.

SELECT AVG(amt) as 'Средняя цена', salespeople.sname
FROM orders
INNER JOIN salespeople on orders.snum = salespeople.snum 
GROUP BY salespeople.sname

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

Средняя ценаsname
214Колованов
315.667Кучеров
1180Мозякин
640Плотников
900Проворов

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

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

Оператор OUTER JOIN

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

Оператор RIGHT OUTER JOIN

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

SELECT AVG(amt) as 'Средняя цена', salespeople.sname
FROM orders
RIGHT OUTER JOIN salespeople on orders.snum = salespeople.snum 
GROUP BY salespeople.sname

И вот, что поменялось в выводе:

Средняя ценаsname
214Колованов
315.667Кучеров
NULLМалкин
1180Мозякин
NULLПетров
640Плотников
900Проворов
NULLШипачев

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

Оператор LEFT OUTER JOIN

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

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

Итак, нам нужны все покупатели — значит в качестве первой (левой) таблицы возьмем таблицу customers, а затем будем присоединять таблицу orders.

SELECT customers.cname, odate
FROM customers
LEFT OUTER JOIN orders on orders.cnum = customers.cnum

Вывод:

cnameodate
Чудинов2016-01-01
Лосев2016-04-10
Краснов2017-04-08
Кириллов2016-06-07
Колесников2017-12-04
Колесников2016-03-03
Лермонтов2017-09-02
Деснов2016-03-07
Кириллов2017-10-07
Пушкин2016-01-08
ЕрмолаевNULL
БелыйNULL

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

Примеры на соединение таблиц в SQL

1.Напишите запрос, который бы использовал оператор INNER JOIN для получения всех Заказов для покупателя с фамилией Краснов.

SELECT onum, amt, odate, cname
FROM orders
INNER JOIN customers on orders.cnum = customers.cnum and cname = 'Краснов'

2.Напишите запрос, который бы вывел фамилии и города продавцов, комиссия которых составляет более 20%.

SELECT DISTINCT(sname), city, comm
FROM salespeople
INNER JOIN orders on orders.snum = salespeople.snum and comm > 20

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

SELECT SUM(amt), salespeople.city
FROM orders
INNER JOIN salespeople on orders.snum = salespeople.snum 
GROUP BY salespeople.city

4.Повторите предыдущий запрос, но выведите все города, даже если в них не совершалась сделка.

SELECT SUM(amt), salespeople.city
FROM orders
RIGHT OUTER JOIN salespeople on orders.snum = salespeople.snum 
GROUP BY salespeople.city

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

SELECT customers.city, MAX(amt)
FROM customers
LEFT OUTER JOIN orders on orders.cnum = customers.cnum 
GROUP BY customers.city

Заключение

После ознакомления с этой статьей у вас должно появиться понимание как работает оператор JOIN в SQL. Его особенности и преимущества над вложенными запросами мы отметили и рекомендуем в своих практических задачах пользоваться именно такими конструкциями. На этом все. Не забывайте оставлять ваши комментарии. До следующей статьи.

Поделиться ссылкой:

Похожее

codetown.ru

Оператор SQL INNER JOIN: примеры, синтаксис и особенности

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

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

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

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

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

Способы подключения дополнительных таблиц

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

  1. Оператор Inner Join.
  2. Left Join или, это второй способ записи, Left Outer Join.
  3. Cross Join.
  4. Full Join.

Использование операторов объединения таблиц на практике можно усвоить, рассмотрев применение оператора SQL - Inner Join. Пример его использования будет выглядеть следующим образом:

Select * from Person

Inner join Subdivision on Su_Person = Pe_ID

Язык SQL и оператор Join Inner Join можно использовать не только для объединения двух и более таблиц, но и для подключения иных подзапросов, что значительно облегчает работу администраторов базы данных и, как правило, может значительно ускорить выполнение определенных, сложных по структуре запросов.

Объединение данных в таблицах построчно

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

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

Описание оператора Inner Join

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

Если рассмотреть такую работу с точки зрения графической интерпретации, то получим структуру оператора SQL Inner Join, пример которой можно показать с помощью следующей схемы:

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

Синтаксис оператора Inner Join

Как уже говорилось ранее, оператор Inner Join, а именно его синтаксис, необычайно прост. Для организации связей между таблицами в пределах одной выборки достаточно будет запомнить и использовать следующую принципиальную схему построения оператора, которая прописывается в одну строчку программного SQL-кода, а именно:

  • Inner Join [Имя таблицы] on [ключевое поле из таблицы, к которой подключаем] = [Ключевому полю подключаемой таблицы].

Для связи в данном операторе используются главные ключи таблиц. Как правило, в группе таблиц, которые хранят информацию о сотрудниках, ранее описанные Person и Subdivision имеют хотя бы по одной похожей записи. Итак, рассмотрим подробнее оператор SQL Inner Join, пример которого был показан несколько ранее.

Пример и описание подключения к выборке одной таблицы

У нас есть таблица Person, где хранится информация обо всех сотрудниках, работающих в компании. Сразу отметим, что главным ключем данной таблицы является поле – Pe_ID. Как раз по нему и будет идти связка.

Вторая таблица Subdivision будет хранить информацию о подразделениях, в которых работают сотрудники. Она, в свою очередь, связана с помощью поля Su_Person с таблицей Person. О чем это говорит? Исходя из схемы данных можно сказать, что в таблице подразделений для каждой записи из таблицы «Сотрудники» будет информация об отделе, в котором они работают. Именно по этой связи и будет работать оператор Inner Join.

Для более понятного использования рассмотрим оператор SQL Inner Join (примеры его использования для одной и двух таблиц). Если рассматривать пример для одной таблицы, то тут все довольно просто:

Select * from Person

Inner join Subdivision on Su_Person = Pe_ID

Пример подключения двух таблиц и подзапроса

Оператор SQL Inner Join, примеры использования которого для выборки данных из нескольких таблиц можно организовать вышеуказанным образом, работает по чуть усложненному принципу. Для двух таблиц усложним задачу. Скажем, у нас есть таблица Depart, в которой хранится информация обо всех отделах в каждом из подразделений. В в эту таблицу записан номер подразделения и номер сотрудника и нужно дополнить выборку данных названием каждого отдела. Забегая вперед, стоит сказать, что для решения этой задачи можно воспользоваться двумя методами.

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

Select Pe_ID, Pe_Name, Su_Id, Su_Name, Dep_ID, Dep_Name from Person

Inner join Subdivision on Su_Person = Pe_ID

Inner join Depart on Su_Depart = Dep_ID and Pe_Depart = Dep_ID

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

Select Pe_ID, Pe_Name, Su_Id, Su_Name, Dep_ID, Dep_Name from Person

Inner join Subdivision on Su_Person = Pe_ID

Inner join (Select Dep_ID, Dep_Name, Pe_Depart from Depart) as T on Su_Depart = Dep_ID and Pe_Depart = Dep_ID

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

Пример использования оператора Inner Join для выборок из большого количества таблиц

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

В данном случае подключено (к основной таблице) еще три дополнительно и введено несколько условий выбора данных.

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

Заключение

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

fb.ru

SQL - Операторы

Арифметические операторы SQL
ОператорОписание
+Добавление
-Вычитание
*Умножение
/Деление
%Модуль

 

Побитовые операции SQL
ОператорОписание
&Побитовое И
|Побитовое ИЛИ
^Побитовое исключение ИЛИ


 

Операторы сравнения SQL
ОператорОписание
=Равно
>Больше
<Меньше
>=Больше или равно
<=Меньше или равно
<>Не равно

 

Составные операторы SQL
ОператорОписание
+ = Добавить равно
- =Вычесть равно
*=Умножить равно
/=Разделить равно
%=Модуль равно
&=Побитовое И равно
^ - =Побитовое исключающее равно
| * =Побитовое ИЛИ равно

 

Логические операторы SQL
ОператорОписание
ALLЕсли все значения подзапроса являются TRUE
ANDЕсли все условия, разделенные И, являются TRUE
ANYЕсли какое-либо из значений подзапроса соответствует TRUE условию
BETWEENЕсли операнд находится в диапазоне сравнения
EXISTSЕсли подзапрос возвращает одну или несколько записей
INЕсли операнд равен одному из списка выражений
LIKEЕсли операнд соответствует шаблону
NOTОтображает запись, если условие (И) НЕ TRUE
ORЕсли любое из условий, разделенных OR, является TRUE. 
SOMEЕсли какое-либо из значений подзапроса соответствует условию

 

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

unetway.com

SQL - Оператор UNION

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

Синтаксис UNION

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

Синтаксис UNION ALL

Оператор UNION по умолчанию выбирает только разные значения. Чтобы разрешить повторяющиеся значения, используйте UNION ALL:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

Пример UNION

Следующий оператор SQL выбирает все разные города (только отдельные значения) от «users» и «delivery»:

Пример:

SELECT city FROM users
UNION
SELECT city FROM delivery
ORDER BY city;

Пример SQL UNION ALL

Следующий оператор SQL выбирает все города (дублирующиеся значения также) из «users» и «delivery»:

Пример:

SELECT city FROM users
UNION ALL
SELECT city FROM delivery
ORDER BY city;

SQL UNION с WHERE

Следующий оператор SQL выбирает все разные испанские города (только отдельные значения) от «users» и «delivery»:

Пример:

SELECT city, country FROM users
WHERE country='Spain'
UNION
SELECT city, country FROM delivery
WHERE country='Spain'
ORDER BY city;

SQL UNION ALL с WHERE

Следующий оператор SQL выбирает все испанские города (повторяющиеся значения) также из «users» и «delivery»:

Пример:

SELECT city, country FROM users
WHERE country='Spain'
UNION ALL
SELECT city, country FROM delivery
WHERE country = 'Spain'
ORDER BY city;

 

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

unetway.com

Соединение таблиц или действие оператора SQL JOIN на примерах : WEBCodius

Оператор JOIN используется для соединения двух или нескольких таблиц. Соединение таблиц может быть внутренним (INNER) или внешним (OUTER), причем внешнее соединение может быть левым (LEFT), правым (RIGHT) или полным (FULL). Далее на примере двух таблиц рассмотрим различные варианты их соединения.

Синтаксис соединения таблиц оператором JOIN имеет вид:

FROM <таблица 1>
 [INNER]
 {{LEFT | RIGHT | FULL } [OUTER]} JOIN <таблица 2>
[ON <предикат>]

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

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

id   name          id   sum
--   ----          --   ----
1    bmw           1    250
2    opel          5    450
3    kia           3    300
4    audi          6    400

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

1. Внутреннее соединение (INNER JOIN) означает, что в результирующий набор попадут только те соединения строк двух таблиц, для которых значение предиката равно TRUE. Обычно используется для объединения записей, которые есть и в первой и во второй таблице, т. е. получения пересечения таблиц:

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

Итак, сам запрос:

SELECT * FROM 'Auto'
INNER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id

И результат:

id   name          id   sum
--   ----          --   ----
1    bmw           1    250
3    kia           3    300

Ключевое слово INNER в запросе можно опустить.

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

2. Внешнее соединение (OUTER JOIN) бывает нескольких видов. Первым рассмотрим полное внешнее объединение (FULL OUTER JOIN), которое объединяет записи из обоих таблиц (если условие объединения равно true) и дополняет их всеми записями из обоих таблиц, которые не имеют совпадений. Для записей, которые не имеют совпадений из другой таблицы, недостающее поле будет иметь значение NULL. Граф выборки записей будет иметь вид:

Переходим к запросу:

SELECT * FROM 'Auto'
FULL OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id

Результат:

id   name          id   sum
--   ----          --   ----
1    bmw           1    250
2    opel        NULL   NULL
3    kia           3    300
4    audi        NULL   NULL
NULL NULL          5    450
NULL NULL          6    400

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

Ключевое слово OUTER можно опустить.

3. Левое внешнее объединение (LEFT OUTER JOIN). В этом случае получаем все записи удовлетворяющие условию объединения, плюс все оставшиеся записи из внешней таблицы, которые не удовлетворяют условию объединения. Граф выборки:

Запрос:

SELECT * FROM 'Auto'
LEFT OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id

Результат:

id   name          id   sum
--   ----          --   ----
1    bmw           1    250
2    opel        NULL   NULL
3    kia           3    300
4    audi        NULL   NULL

Запрос также можно писать без ключевого слова OUTER.

В итоге здесь мы получили все записи таблицы Auto. Записи для которых были найдены совпадения по полю id в таблице Selling соединяются, для остальных недостающие поля заполняются значением NULL.

Еще существует правое внешнее объединение (RIGHT OUTER JOIN). Оно работает точно также как и левое объединение, только  в качестве внешней таблицы будет использоваться правая (в нашем случае таблица Selling или таблица Б на графе).

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

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

То есть в нашем случае, нам надо получить все автомобили из таблицы Auto, которые не имеют продаж в таблице Selling.

Запрос:

SELECT * FROM 'Auto'
LEFT OUTER JOIN 'Selling' ON 'Auto'.id = 'Selling'.id
WHERE 'Selling'.id IS null

Результат:

id   name          id   sum
--   ----          --   ----
2    opel        NULL   NULL
4    audi        NULL   NULL

5. И последний вариант, получить все записи из таблицы А и Таблицы Б, которые не имеют объединений. Граф:

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

Запрос:

SELECT * FROM 'Auto'
FULL OUTER JOIN 'Selling'
ON 'Auto'.id = 'Selling'.id
WHERE 'Auto'.id IS null
OR 'Selling'.id IS null

Результат:

id   name          id   sum
--   ----          --   ----
2    opel        NULL   NULL
4    audi        NULL   NULL
NULL NULL          5    450
NULL NULL          6    400

На этом все, до новых встреч на страницах блога.

webcodius.ru

Операторы Inner Join и Outer (left, right, full) Join в SQL (Oracle)

2006-01-06 Базы данных и язык запросов SQL

Ключевое слово join в SQL используется при построении select выражений. Инструкция Join позволяет объединить колонки из нескольких таблиц в одну. Объединение происходит временное и целостность таблиц не нарушается. Существует три типа join-выражений:

  • inner join;
  • outer join;
  • cross join;

В свою очередь, outer join может быть left, right и full (слово outer обычно опускается).

В качестве примера (DBMS Oracle) создадим две простые таблицы и сконструируем для них SQL-выражения с использованием join.

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


create table t_users (
t_id number(11, 0),
t_nick varchar(16),
primary key (t_id) )

create table t_resources (
t_id number(11, 0),
t_name varchar(16),
t_userid number (11, 0),
primary key (t_id) )

Содержимое таблиц пусть будет таким:


T_ID  T_NICK
  1    user1     
  3    user3
  4    user4 

T_ID  T_NAME  T_USERID    
  1    res1     3           
  2    res2     1           
  3    res3     2           
  5    res5     3   

Конструкция join выглядит так:


... join_type join table_name on condition ...

Где join_type - тип join-выражения, table_name - имя таблицы, которая присоединяется к результату, condition - условие объединения таблиц.

Кострукция join располагается сразу после select-выражения. Можно использовать несколько таких конструкций подряд для объединения соответствующего кол-ва таблиц. Логичнее всего использовать join в том случае, когда таблица имеет внешний ключ (foreign key).

Inner join необходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда. Пример:


select t_resources.t_name, t_users.t_nick
  from t_resources 
  inner join t_users on t_users.t_id = t_resources.t_userid

Результат будет таким:


 T_NAME  T_NICK      
  res2    user1          
  res1    user3    
  res5    user3          

В случае с left join из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу. Пример:


select t_resources.t_name, t_users.t_nick
  from t_resources 
  left join t_users on t_users.t_id = t_resources.t_userid

Результат выполнения запроса:


 T_NAME  T_NICK    
  res1    user3     
  res2    user1 
  res3    (null)    
  res5    user3     

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

Right join отображает все строки удовлетворяющие правой части условия condition, даже если они не имеют соответствия в главной (левой) таблице:


select t_resources.t_name, t_users.t_nick
  from t_resources 
  right join t_users on t_users.t_id = t_resources.t_userid

А результат будет следующим:


 T_NAME  T_NICK    
  res2    user1     
  res1    user3     
  res5    user3     
  (null)  user4   

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

Full outer join (ключевое слово outer можно опустить) необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и right join.


select t_resources.t_name, t_users.t_nick
  from t_resources 
  full join t_users on t_users.t_id = t_resources.t_userid

А результат будет таким:


 T_NAME  T_NICK    
  res1      user3     
  res2      user1     
  res3      (null)    
  res5      user3     
 (null)     user4  

Некоторые СУБД не поддерживают такую функциональность (например, MySQL), в таких случаях обычно используют объединение двух запросов:


select t_resources.t_name, t_users.t_nick
  from t_resources
  left join t_users on t_users.t_id = t_resources.t_userid
union
select t_resources.t_name, t_users.t_nick
  from t_resources
  right join t_users on t_users.t_id = t_resources.t_userid

Наконец, cross join. Этот тип join еще называют декартовым произведением (на английском - cartesian product). Настоятельно рекомендую использовать его с умом, так как время выполнения запроса с увеличением числа таблиц и строк в них растет нелинейно. Вот пример запроса, который аналогичен cross join:


select t_resources.t_name, t_users.t_nick 
  from t_resources, t_users

Конструкция Join (в сочетании с другими SQL конструкциями, например, group by) часто встречается при программировании под базы данных. Думаю, эта статья будет вам полезна.

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

www.javenue.info

Основные операторы SQL

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

Введение

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

Определяют несколько категорий операторов SQL:

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

Операторы SQL для манипулирования данными

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

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

INSERT INTO

имя таблицы (имя столбца 1, имя столбца 2)

VALUES (значение 1, значение 2).

Для использования оператора SQL запроса INSERT при нескольких значениях, применяется такой синтаксис:

INSERT INTO

имя таблицы 1 (имя столбца 1, имя столбца 2)

SELECT имя столбца 1, имя столбца 2

FROM имя таблицы 2

WHERE имя таблицы 2.имя столбца 1>2

Этот запрос выберет все данные из таблицы 2, которые больше 2 по столбцу 1 и вставит их в первую.

UPDATE. Как видно из названия, этот оператор SQL запроса обновляет данные в существующей таблице по определённому признаку.

Пример:

UPDATE имя таблицы 1

SET имя столбца 2 = «Василий»

WHERE имя таблицы 1.имя столбца 1 = 1

Данная конструкция заполнит значением Василий все строки, в которых встретит цифру 1 в первом столбце.

DELETE. Удаляет данные из таблицы. Можно указать какое-либо условие или же убрать все строки.

DELETE FROM имя таблицы

WHERE имя таблицы.имя столбца 1 = 1

Приведённый запрос удалит из базы все данные со значением один в первом столбце. А вот так можно очистить всю таблицу:

DELETE FROM имя таблицы.

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

Оператор SELECT

Главное назначение SELECT — выборка данных по определенным условиям. Результатом его работы всегда является новая таблица с отобранными данными. Оператор MS SQL SELECT может быть использован в массе различных запросов. Поэтому наряду с ним можно рассмотреть и другие смежные ключевые слова.

Для выбора всех данных из определённой таблицы используется знак «*».

SELECT *

FROM имя таблицы 1

Результатом работы данного запроса будет точная копия таблицы 1.

А здесь происходит выборка по условию WHERE, которое достаёт из таблицы 1 все значения, больше 2 в столбце 1.

SELECT *

FROM имя таблицы 1

WHERE имя таблицы 1.имя столбца 1 > 2

Также можно указать в выборке, что нужны только определённые столбцы.

SELECT имя таблицы 1.имя столбца 1

FROM имя таблицы 1

Результатом данного запроса будут все строки, со значениями из столбца 1. С помощью операторов MS SQL можно составить собственную таблицу, на ходу заменив, вычислив и подставив определённые значения.

SELECT

имя таблицы 1.имя столбца 1

имя таблицы 1.имя столбца 2

имя таблицы 1.имя столбца 3

«=» AS EQ

имя таблицы 1.имя столбца 2 * имя таблицы 1.имя столбца 3 AS SUMMA

FROM имя таблицы 1

Данный, на первый взгляд сложный запрос выполняет выборку всех значений из таблицы 1, затем создаёт новые колонки EQ и SUMMA. В первую заносит знак «+», во вторую произведение данных из столбца 2 и 3. Полученный результат можно представить в виде таблицы, для понимания как это работает:

Столбец 1

Столбец 2

Столбец 3

EQ

SUMMA

Имя товара 1

10

50

+

500

Имя товара 2

15

100

+

1500

При использовании оператора SELECT, можно сразу провести упорядочивание данных по какому-либо признаку. Для этого используется слово ORDER BY.

SELECT

имя таблицы 1.имя столбца 1

имя таблицы 1.имя столбца 2

имя таблицы 1.имя столбца 3

FROM имя таблицы 1

ORDER BY имя столбца 2

Результирующая таблица будет выглядеть таким образом:

Столбец 1

Столбец 2

Столбец 3

1

1

54

3

2

12

7

3

100

2

5

1

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

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

Таблица «Сотрудники»

Номер

Имя

Фамилия

1

Вася

Васин

2

Петя

Петин

Таблица «Зарплата»

Номер

Ставка

Начислено

1

1

10000

2

0,5

3500

Теперь нужно, как-то связав эти две таблицы получить общие значения. Используя основные операторы SQL сделать это можно так:

SELECT

Сотрудники.Номер

Сотрудники.Имя

Зарплата.Ставка

Зарплата.Начислено

FROM Сотрудники, Зарплата

WHERE Сотрудники.Номер = Зарплата.Номер

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

Номер

Имя

Ставка

Начислено

1

Вася

1

10000

2

Петя

0,5

3500

Ещё немного о SELECT. Использование агрегатных функций

Один из основных операторов SQL SELECT может производить некоторые вычисления при выборке. Для этого он использует определённые функции и формулы.

К примеру, чтобы получить количество записей из таблицы «Сотрудники», нужно использовать запрос:

SELECT COUNT (*) AS N

FROM Сотрудники

В результате получится таблица с одним значением и столбцом.

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

Например, нужно провести выборку из уже известной таблицы «Зарплата»:

Номер

Ставка

Начислено

1

1

10000

2

0,5

3500

Можно применить такой запрос и посмотреть что получится:

SELECT

SUM(Зарплата.Начислено) AS SUMMA

MAX(Зарплата.Начислено) AS MAX

MIN(Зарплата.Начислено) AS MIN

AVG(Зарплата.Начислено) AS SRED

FROM Зарплата

Итоговая таблица будет такой:

SUMMA

MAX

MIN

SRED

13500

10000

3500

6750

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

Объединение, пересечение и разности

Объединить несколько запросов в SQL

SELECT Сотрудники.Имя

FROM Сотрудники

WHERE Сотрудники.Номер = 1

UNION

SELECT Сотрудники.Имя

FROM Сотрудники, Зарплата

WHERE Зарплата.Номер = 1

При этом стоит учитывать, что при таком объединении таблицы должны быть совместимы. То есть иметь одинаковое количество столбцов.

Синтаксис оператора SELECT и порядок его обработки

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

Затем может присутствовать SQL оператор WHERE. С его помощью SELECT пробегает по всем строкам таблицы и проверяет данные на соответствие условию.

Если в запросе имеется GROUP BY, то происходит группировка значений по указанным параметрам.

Операторы для сравнения данных

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

  • «=». Обозначает, как можно догадаться, равенство двух выражений. Например, он уже использовался в примерах выше - WHERE Зарплата.Номер = 1.

  • «>». Знак больше. Если значение левой части выражения больше, то возвращается логическое TRUE и условие считается выполненным.

  • «<». Знак меньше. Обратный предыдущему оператор.

  • Знаки «<=» и «>=». Отличается от простых операторов больше и меньше, тем, что при равенстве операндов условие также будет истинным.

  • «<>». Не равно. Условие будет считаться TRUE, только если один операнд не равен другому. У него имеется ещё одна интерпретация - «!=».

LIKE

Перевести данное ключевое слово можно как «похожий». Оператор LIKE в SQL используется примерно по такому же принципу — выполняет запрос по шаблону. То есть он позволяет расширить выборку данных из базы используя регулярные выражения.

Например, поставлена такая задача: из уже известной базы «Сотрудники» получить всех людей, чьё имя заканчивается на «я». Тогда запрос можно составить так:

SELECT *

FROM Сотрудники

WHERE Имя LIKE `%я`

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

CASE

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

Например, нужно выбрать из таблицы «Зарплата» максимальное и минимальное значение.

Номер

Ставка

Начислено

1

1

10000

2

0,5

3500

Тогда запрос можно составить так:

SELECT *

FROM Зарплата

WHERE CASE WHEN SELECT MAX(Начислено) THEN Максимум

WHEN SELECT MIN(Начислено) THEN Минимум

END итог

В данном контексте система ищет максимальное и минимальное значение в столбце «Начислено». Затем с помощью END создаётся поле «итог», в которое будет заноситься «Максимум» или «Минимум» в зависимости от результата выполнения условия.

Кстати, в SQL имеется и более компактная форма CASE — COALESCE.

Операторы определения данных

Это вид позволяет проводить разнообразное изменение таблиц — создание, удаление, модификации и работу с индексами.

Первый из них, который стоит рассмотреть — CREATE TABLE. Он делает не что иное, как создаёт таблицу. Если просто набрать запрос CREATE TABLE, ничего не случится, так как нужно ещё указать несколько параметров.

Например, для создания уже знакомой таблицы «Сотрудники» нужно использовать команды:

CREATE TABLE Сотрудники

(Номер number(10) NOT NULL

Имя varchar(50) NOT NULL

Фамилия varchar(50) NOT NULL)

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

DROP TABLE

Выполняет одну простую задачу — удаление указанной таблицы. Имеет дополнительный параметр IF EXISTS. Он поглощает ошибку при удалении, если искомая таблица не существует. Пример использования:

DROP TABLE Сотрудники IF EXISTS.

CREATE INDEX

В SQL имеется система индексов, которая позволяет ускорить доступ к данным. В общем, он представляет собой ссылку, которая указывает на определённый столбец. Создать индекс можно простым запросом:

CREATE INDEX название_индекса

ON название_таблицы(название_столбца)

Используется данный оператор в T-SQL, Oracle, PL SQL и многих других интерпретациях технологиях.

ALTER TABLE

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

Далее будут представлены различные варианты использования ALTER TABLE.

  • ADD. Осуществляет добавление столбца в таблицу. Синтаксис его такой: ALTER TABLE название_таблицы ADD название_столбца тип_хранимых_данных. Может иметь параметр IF NOT EXISTS, что подавить ошибку, если создаваемый столбец уже есть;

  • DROP. Удаляет столбец. Также имеет ключ IF EXISTS, без которого сгенерируется ошибка, говорящая о том, что требуемый столбец отсутствует;

  • CHANGE. Служит для переименования имени поля в указанное. Пример использования: ALTER TABLE название_таблицы CHANGE старое_имя новое_имя;

  • MODIFY. Данная команда поможет сменить тип и дополнительные атрибуты определённого столбца. А используется он вот так: ALTER TABLE название_таблицы MODIFY название_столбца тип_данных атрибуты;

CREATE VIEW

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

Процесс создания происходит с помощью простого запроса:

CREATE VIEW название представления AS SELECT FROM * название таблицы

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

Немного о функциях

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

  • COUNT. Производит подсчёт записей или строк в конкретной таблице. В качестве параметра можно указать имя столбца, тогда данные будут взяты из него. SELECT COUNT * FROM Сотрудники;

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

  • MIN и MAX. Эти функции уже использовались в этой статье. Определяют они максимальное и минимальное значения из указанного столбца;

  • SUM. Все просто — функция вычисляет сумму значений столбца. Применяется исключительно для числового вида данных. Добавив в запрос параметр DISTINCT, будут суммироваться только уникальные значения;

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

  • LEN. Простая функция, вычисляющая длину значений столбца. Результатом будет новая таблица с указанием количества символов;

  • NOW. Это ключевое слово используется для вычисления текущей даты и времени.

Дополнительные операторы

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

  • AS. Применяется, когда нужно визуально оформить результат, присваивая указанное имя получившейся таблице.

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

  • NOT. Оператор придаёт противоположность выражению.

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

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

  • UNION. Очень удобный оператор для объединения нескольких запросов. Он уже встречался среди примеров этой в этой статье. Можно вывести нужные строки из нескольких таблиц, объединив их UNION для более удобного использования. Синтаксис его такой: SELECT имя_столбца FROM имя_таблицы UNION SELECT имя_другого_столбца FROM имя_другой таблицы. В результате получится сводная таблица с объединёнными запросами.

  • PRIMARY KEY. Переводится как «первичный ключ». Собственно, именно такая терминология и используется в справочных материалах. Он означает уникальный идентификатор строки. Применяется, как правило, при создании таблицы для указания поля, которое и будет содержать его.

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

Несколько советов при разработке платформы для работы с SQL

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

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

  3. Ограничения. Если нужно получить из базы с тысячами строк всего лишь двух, то стоит использовать операторы типа LIMIT или TOP. Не нужно извлекать данные средствами языка разработки оболочки.

  4. Соединение. После получения данных из нескольких таблиц многие программисты начинают сводить их воедино средствами памяти оболочки. Но зачем? Ведь можно составить один запрос в котором это все будет присутствовать. Не придётся писать лишний код и резервировать дополнительную память в системе.

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

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

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

  8. Типы. Для экономии места и ресурсов нужно чутко относиться к видам используемых данных. Если есть возможность воспользоваться менее «тяжёлым» для памяти типом, то надо применять именно его. Например, если известно, что в данном поле числовое значение не будет превышать 255, то зачем использовать 4-байтный INT, если есть TINYINT в 1 байт.

Заключение

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

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

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

fb.ru

Отправить ответ

avatar
  Подписаться  
Уведомление о