311549902 STEPHENS TINA D RR 3 BOX 17A GREENWOOD IN 47890
3178784465 MARKETING
442346889 PLEW LINDA С 3301 BEACON INDIANAPOLIS IN 46224
3172978990 TEAM LEADER
213764555 GLASS BRANDON S 1710 MAIN ST WHITELAND IN 47885
3178984321 3175709980 SALES MANAGER
313782439 GLASS JACOB 3789 RIVER BLVD INDIANAPOLIS IN 45734
3175457676 8887345678 SALESMAN
220984332 WALLACE MARIAH 7789 KEYSTONE INDIANAPOLIS IN 46741
3173325986 SHIPPER
443679012 SPURGEON TIFFANY 5 GEORGE COURT INDIANAPOLIS IN 46234
3175679007 SHIPPER
6 строк выбраны.
Обратите внимание на то, как здесь располагаются данные вывода Перенос строк возникает из-за того, что строки данных оказываются длиннее ширины страницы
Использование псевдонимов для имен таблиц означает переименование таблицы в рамках используемого оператора SQL. При этом истинное имя таблицы в базе данных не меняется. Как мы с вами увидим ниже, назначение таблице псевдонима необходимо при рекурсивном связывании (SELF JOIN). Часто псевдонимы назначаются таблицам с целью сокращения объема печатания, в результате чего операторы SQL становятся короче и проще для понимания. Кроме того, чем меньше печатать, тем меньше будет ошибок При назначении таблицам псевдонимов псевдонимы должны использоваться и при точном определении столбцов. Вот пример использования псевдонимов таблиц и соответствующее использование столбцов.
SELECT E.EMP_ID, EP.SALARY, EP.DATE_HIRE, E.LAST_NAME
FROM EMPLOYEEJTBL E,
EMPLOYEE_PAY_TBL EP
WHERE E.EMP_ID = EP.EMP_ID
AND EP.SALARY > 20000;
В этом примере таблицам назначаются псевдонимы. Вместо имени EMPLOYEE_TBL используется Е, поскольку имя этой таблицы начинается с Е. Имя второй таблицы, EMPLOYEE_PAY_TBL, тоже начинается с Е, но для нее используется псевдоним ЕР, поскольку псевдонимы разных таблиц в одном операторе должны быть разными. Выбранные столбцы приравниваются с использованием псевдонимов таблиц. Обратите внимание на то, что для используемого в выражении ключевого слова WHERE имени столбца SALARY тоже должен использоваться псевдоним соответствующей таблицы.
При связывании по неравенству (NON-EQUIJOINS) две или несколько таблиц объединяются по условию неравенства значения столбца таблицы значению из столбца другой таблицы.
Синтаксис соответствующей части оператора следующий.
FROM таблица1, таблица2 [,таблицаЗ ]
WHERE таблица1.имя_столбца != таблица2.имя_столбца
[ AND таблица1.имя_столбца != таблицаЗ.имя_столбца ]
Например,
SELECT EMPLOYEE_TBL.EMP_ID, EMPLOYEE_PAY TBL.DATE_HIRE
FROM EMPLOYEE_TBL,
EMPLOYEE_PAY_TBL
WHERE EMPLOYEE_TBL.EMP_ID != EMPLOYEE_PAY_TBL.EMP_ID;
Этот оператор SQL возвратит табельный номер служащего и даты поступления на работу для всех служащих с несоответствующими табельными номерами Вот пример связывания по неравенству из реальной базы данных
SELECT E.EMP_ID, E.LAST_HAME, P.POSITION
FROM EMPLOYEE_TBL E,
EMPLOYEE_PAY_TBL P
WHERE E.EMP_ID = P.EMP_ID;
EMP_ID LAST_NAM POSITION
442346889 PLEW MARKETING
213764555 GLASS MARKETING
313782439 GLASS MARKETING
220984332 WALLACE MARKETING
443679012 SPURGEON MARKETING
311549902 STEPHENS TEAM LEADER
213764555 GLASS TEAM LEADER
313782439 GLASS TEAM LEADER
220984332 WALLACE TEAM LEADER
443679012 SPURGEON TEAM LEADER
311549902 STEPHENS SALES MANAGER
442346889 PLEW SALES MANAGER
313782439 GLASS SALES MANAGER
220984332 WALLACE SALES MANAGER
443679012 SPURGEON SALES MANAGER
3115499C2 STEPHENS SALESMAN
442346889 PLEW SALESMAN
213764555 GLASS SALESMAN
220984332 WALLACE SALESMAN
443679012 SPURGEON SALESMAN
311549902 STEPHENS SHIPPER
442346889 PLEW SHIPPER
213764555 GLASS SHIPPER
313782439 GLASS SHIPPER
30 строк выбраны.
Вы, наверное, удивитесь, что в данном случае из базы данных были извлечены 30 строк данных, хотя в таблице имеется всего 6 записей Объяснение этому следующее. Каждой записи из таблицы EMPLOYEE_TBL соответствует запись из таблицы EMPLOYEE_PAY_TBL. Но по причине связывания по неравенству каждой записи из первой таблицы сопоставляются все записи второй таблицы, за исключением той самой единственной соответствующей записи Значит, каждая строка первой таблицы оказывается связанной с пятью строками второй. Записей всего 6, поэтому в результате мы получаем 30 строк.
В отличие от данного случая, в предыдущем разделе при связывании по равенству каждая строка таблицы связывалась с единственной соответствующей строкой второй таблицы, поэтому там в выводе получалось 6 строк.
При связывании по неравенству обычно в выводе присутствует ряд строк, которые на самом деле оказываются ненужными, так что результаты запроса, в котором используется связывание по неравенству, всегда требуют дополнительной проверки
Внешнее связывание (OUTER JOIN) используется, когда вывод должен содержать все записи одной таблицы, даже если некоторые из ее записей не имеют соответствующих записей в другой таблице. В запросе для задания внешнего связывания используется (+). Символ (+) помещается в конце имени таблицы в выражении ключевого слова WHERE. Таблицей с символами ( + ) должна быть та таблица, записям которой нет соответствующих записей из другой таблицы. Во многих реализациях языка внешнее связывание разбито на левое внешнее связывание (LEFT OUTER JOIN), правое внешнее связывание (RIGHT OUTER JOIN) и полное внешнее связывание (FULL OUTER JOIN). В таких реализациях внешнее связывание (OUTER JOIN) обычно является опцией.
Обязательно проверьте правила использования внешнего связывания и синтаксис соответствующих операторов по документации той реализации языка, с которой вы работаете Символы ( + ) используются в большинстве основных реализаций SQL, но стандартом они не задаются
Общий синтаксис следующий.
FROM таблица1
{RIGHT | LEFT | FULL} [OUTER] JOIN
ON таблица2
В Oracle используется следующий синтаксис.
FROM таблица1, таблица2 [,таблицаЗ ]
WHERE таблица1.имя_столбца[(+)] = таблица2.имя_столбца[(+)]
[ AND таблица!.имя_столбца[(+)] = таблицаЗ.имя_столбца[(+)]]
Внешнее связывание можно задать только для,одной из связываемых сторон, но зато внешнее связывание можно указать для нескольких столбцов одной таблицы.
Использование внешнего связывания поясняется следующими примерами. В первом примере выбираются описание товара и его количество, причем эти значения извлекаются из двух разных таблиц. Здесь нужно помнить о том, что не для каждого товара имеется соответствующая запись в таблице ORDERS_TBL. Сначала используем связывание по равенству:
SELECT P.PROD_DESC, О. QTY
FROM PRODUCTS_TBL P,
ORDERS_TBL О
WHERE P.PROD_ID = O.PROD_ID;
PRODJ3ESC QTY
КОСТЮМ ВЕДЬМЫ 1
ПЛАСТИКОВЫЕ ТЫКВЫ 25
ПЛАСТИКОВЫЕ ТЫКВЫ 2
ФОНАРИ 10
ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ 20
ЦЕПОЧКА ДЛЯ КЛЮЧЕЙ 1
6 строк выбраны.
Здесь оказались выбранными всего 6 строк, хотя различных товаров более 10. Но вы хотели бы увидеть список всех товаров, независимо от того, имеются ли на них заказы или нет.
В следующем примере эта задача решается с помощью внешнего связывания. Для соответствующего оператора используется синтаксис Oracle.
SELECT P.PROD_DESC, О.QTY
FROM PRODUCTS_TBL P,
ORDERS_TBL О
WHERE P . PROD_ID = О . PROD_ID (+);
PROD_DESC QTY
КОСТЮМ ВЕДЬМЫ 1
МАСКИ В АССОРТИМЕНТЕ
ИСКУССТВЕННЫЕ ПАРАФИНОВЫЕ ЗУБЫ 20
КОСТЮМЫ В АССОРТИМЕНТЕ