Выборка данных из нескольких таблиц (JOIN). Select из двух таблиц пример


Выборка данных из нескольких таблиц.

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

  1. Составлять SQLзапросы для выбора данных из нескольких таблиц, используя эквисоединения и соединения других видов;

  2. Использовать соединение таблицы с собой;

  3. Использовать внешние соединения для просмотра данных, не удовлетворяющих обычным условиям соединения;

  4. Создавать декартово произведение всех строк из двух или более таблиц.

1. Выборка данных из нескольких таблиц.

Иногда требуются данные из более, чем одной таблицы. Отчёт в приведённом ниже примере содержит данные из двух разных таблиц:EMPLOYEESиDEPARTMENTS.

EMPLOYEE_ID

LAST_NAME

DEPARTMENT_ID

DEPARTMENT_ID

DEPARTMENT_NAME

LOCATION_ID

100

King

90

10

Administration

1700

101

Kochhar

90

20

Marketing

1800

. . .

50

Shipping

1500

202

Fay

20

60

IT

1400

205

Higgins

110

80

Sales

2500

206

Gietz

110

90

Executive

1700

110

Accounting

1700

190

Contracting

1700

Результат:

EMPLOYEE_ID

DEPARTMENT_ID

DEPARTMENT_NAME

100

90

Executive

101

90

Executive

. . .

202

20

Marketing

205

110

Accounting

206

110

Accounting

. . .

2. Виды соединений.

СУБД Oracle, начиная с версии 9i, позволяет использовать синтаксис стандарта SQL:1999 и поддерживает следующие типы соединений:

  1. Перекрестные соединения;

  2. Натуральные соединения;

  3. Опция USING;

  4. Полное (или двухстороннее) внешнее соединение;

  5. Произвольные условия соединения для внешнего соединения.

2.1 Соединение таблиц с помощью sql:1999

SELECT table1.column, table2.column

FROM table1

[NATURAL JOIN table2] |

[JOIN table2 USING (column_name)] |

[JOIN table2

ON (table1.column_name = table2.column_name)]|

[LEFT|RIGHT|FULL OUTER JOIN table2

ON (table1.column_name = table2.column_name)]|

[CROSS JOIN table2];

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

Указание 1.

Для соединения Nтаблиц требуется, по крайней мере, (N-1) условий соединения. Это правило не распространяется на таблицы с составным первичным ключом. В этом случае для однозначной идентификации строки требуется более одного столбца.

2.2 Создание натуральных соединений (natural join).

Правила:

  1. Предложение NATURAL JOINосновывается на всех столбцах двух таблиц, имеющих одинаковые имена;

  2. Выбираются строки из двух таблиц, которые имеют одинаковые значения во всех соответствующих столбцах;

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

Пример 1.

SELECT department_id, department_name, location_id, city

FROM departments

NATURAL JOIN locations ;

Пример 2.

SELECT department_id, department_name, location_id, city

FROM departments

NATURAL JOIN locations

WHERE department_id in (20, 50) ;

Пример 3.

SELECT departments.department_id,

departments.department_name,

locations.location_id,

locations.city

FROM departments, locations

WHERE departments.location_id = locations.location_id ;

Примечание.

В основе натурального соединения лежит эквисоединение(equi-join) всех столбцов с одинаковыми именами.

studfiles.net

Выборка данных из нескольких таблиц (JOIN)

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

SELECT ename, deptno FROM emp ORDER BY deptno; SELECT deptno, dname FROM dept ORDER BY deptno;
ENAMEDEPTNO
CLARK10
KING10
MILLER10
JONES20
FORD20
ADAMS20
SMITH20
SCOTT20
WARD30
TURNER30
ALLEN30
JAMES30
BLAKE30
MARTIN30
DEPTNODNAME
10ACCOUNTING
20RESEARCH
30SALES
40OPERATIONS

Давайте рассмотрим пример оператора соединения (join), использующего традиционный синтаксис Oracle, где мы объединяем вместе содержимое таблиц emp и dept для получения перечня всех сотрудников и названий отделов, где они работают:

SELECT e.ename, e.deptno, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno; ENAMEDEPTNODNAME
CLARK10ACCOUNTING
KING10ACCOUNTING
MILLER10ACCOUNTING
JONES20RESEARCH
FORD20RESEARCH
ADAMS20RESEARCH
SMITH20RESEARCH
SCOTT20RESEARCH
WARD30SALES
TURNER30SALES
ALLEN30SALES
JAMES30SALES
BLAKE30SALES
MARTIN30SALES

Обратите внимание на многие важные компоненты этого соединения таблиц. Использование во фразе FROM двух таблиц четко указывает на то, что имеет место соединиения таблиц. Обратите также внимание на то, что перед именем каждой таблицы присутствует буква: e для таблицы emp или d для таблицы dept. Это служит иллюстрацией интересной концепции – столбцы могут иметь псевдонимы точно так же, как их имеют таблицы. Псевдонимы служат важной цели – они не дают Oracle запутаться в том, какую таблицу использовать при выводе данных в столбец deptno. Вспомните, что в обеих таблицах (emp и dept) имеются столбцы с именем deptno.

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

SELECT emp.ename, emp.deptno, dept.dname FROM emp, dept WHERE emp.deptno = dept.deptno;

Заметьте, что в нашу фразу WHERE включено сравнение по полю deptno, соединяющему данные в emp с данными в dept. В случае отсутствия этой связи в выходные данные были вы включены все данные из emp и dept.

Синтаксис соединения по ANSI/ISO

В соответствии с синтаксисом ANSI/ISO, для того, чтобы соединить содержимое двух таблиц для получения единого результата, мы должны включить в SQL-оператор фразу JOIN имя_таблицы ON условие_соединения. Если вы хотите в соответствии с этим синтаксисом выполнить то же соединение таблиц, которое мы делали раньше, наш оператор будет выглядеть следующим образом:

SELECT ename, emp.deptno, dname FROM emp JOIN dept ON emp.deptno = dept.deptno;
ENAMEDEPTNODNAME
CLARK10ACCOUNTING
KING10ACCOUNTING
MILLER10ACCOUNTING
JONES20RESEARCH
FORD20RESEARCH
ADAMS20RESEARCH
SMITH20RESEARCH
SCOTT20RESEARCH
WARD30SALES
TURNER30SALES
ALLEN30SALES
JAMES30SALES
BLAKE30SALES
MARTIN30SALES

Обратите внимание на различия между этим синтаксисом и синтаксисом Oracle. Во-первых, в синтаксисе ANSI/ISO сравнения, используемые для соединения, отделяются от всех остальных сравнений с помощью специального ключевого слова ON, указывающего на то, что именно это сравнение используется для соединения. Вы по-прежнему можете включать в соответствующие ANSI/ISO запросы на соединение фразу WHERE. Единственное отличие состоит в том, что фраза WHERE теперь будет содержать только дополнительные операторы сравнения, используемые дл дополнительной фильтрации данных. Кроме того, вы не должны теперь указывать во фразе FROM имена всех объединяемых таблиц. Вместо этого сразу же после фразы FROM вы должны использовать фразу JOIN, в которой и будут определены имена всех соединяемых таблиц.

Естественные соединения (NATURAL JOIN)

Естественным соединением называется соединение между двумя таблицами, в котором Oracle соединяет таблицы по одинаково называющемуся столбцу (столбцам) обеих таблиц (естественным образом!). Естественное соединение выполняется в том случае, если указано ключевое слово NATURAL.

Единственным совпадающим столбцом для таблиц emp и dept является столбец depnto,

SELECT ename, deptno, dname FROM emp NATURAL JOIN dept ORDER BY deptno; ENAMEDEPTNODNAME
CLARK10ACCOUNTING
KING10ACCOUNTING
MILLER10ACCOUNTING
JONES20RESEARCH
FORD20RESEARCH
ADAMS20RESEARCH
SMITH20RESEARCH
SCOTT20RESEARCH
WARD30SALES
TURNER30SALES
ALLEN30SALES
JAMES30SALES
BLAKE30SALES
MARTIN30SALES

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

plsql.ru

Выборка из нескольких таблиц (Основы Баз Данных

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

Как одним запросом извлечь информацию из нескольких таблиц сразу?

Для базы данных с такой структурой такой метод на первый взгляд не подхо­ дит. Информация об авторах больше не хранится в таблице material, поэтому ее для соответствующей шутки придется извлекать отдельно. В этом случае для каждой выводимой записи потребуется вызывать метод query из объекта PDO. Получится неаккуратно и медленно, а по мере увеличения объема базы данных подобные за­просы существенно снизят производительность сайта.

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

SELECT столбцы FROM таблица1 INNER JOIN таблица2 ON условие(я) связанности данных

Предположим, что в нашем случае интерес представляют столбцы id и materialtext из таблицы text , а также name и email из таблицы author. Условие связанности записей в двух таблицах (ON) заключается в том, что значение поля authorid (из material) обязано совпадать с содержимым Столбца id (из author).

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

#Получаем список материалов SELECT id, LEFT(materialtext, 20), authorid FROM material #Получаем список авторов SELECT * FROM author

В третьем запросе происходит самое интересное — используется оператор JOIN:

#Выводим текст материала и данные об авторе вместе SELECT material.id, LEFT(materialtext, 20), name, email FROM material INNER JOIN author ON authorid = author.id

Объединяющий запрос группирует значения из двух таблиц в единый резуль­тирующий набор, сопоставляя связанные между собой данные. Даже несмотря на то что необходимая вам информация хранится в двух разных местах, вы все равно способны получить ее с помощью всего одного запроса к базе данных. Обратите вни­мание: поскольку свой столбец id есть и у материалов, и у авторов, то при упоминании такого столбца в запросе следует указывать имя таблицы, из которой вы хотите его извлечь. Идентификаторы таблиц material и author записываются соответственно как material.id и author.id. Если этого не сделать, MySQL не поймет, какой именно столбец id вы имеете в виду, и выдаст ошибку

#Запрос, который приведет к ошибке SELECT id, LEFT(materialtext, 20), name, email FROM material INNER JOIN author ON authorid = id

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

SELECT materialtext FROM material INNER JOIN author ON authorid = author.id WHERE name = "Имя Автора"

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

codrob.ru

SQL запрос из двух таблиц

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2002.07.22;Скачать: [xml.tar.bz2];

Вниз

SQL запрос из двух таблиц 
Alexcool   (2002-06-27 20:16) [0]

Правда, не знаю как сделать, подскажите. Мне нужно сделать что-то вроде SELECT * FROM Table1, Table2. Но в этих таблицах есть поля с одинаковыми названиями, например ID. В результате я получаю DataSet с полями ID и ID_1, а хотелось бы с полями Table1ID и Table2ID. Это возможно? Если возможно, то как?

Anatoly Podgoretsky   (2002-06-27 20:36) [1]

Если заменить * на список полей, то да, используй предикат AS

dimis   (2002-06-27 21:00) [2]

select a.id Table1id,b.id Table2id from table1 a,table2 b

Viewer   (2002-06-27 21:04) [3]

Пример

SELECT R.*, T.ID AS TOWN_TOWN_ID, T.NAME AS TOWN_NAME, T.CODE AS TOWN_CODE, T.CTYPE_ID AS T_CTYPE_ID, S.ID AS STREET_STREET_ID, S.NAME AS STREET_NAME, C.ID AS C_ID, C.ABR AS C_ABR FROM BUYERS R, TOWNS T, STREET S, CTYPE C

Viewer   (2002-06-27 21:06) [4]

Еще можно проектировать таблицы и поля как TABLE1_FIELDNAME1

Но для универсальности это не здорово, хотя и обходимо.

Polevi   (2002-06-28 08:20) [5]

это извращение

Diana   (2002-07-02 08:41) [6]

А как на счет стандартного метода? Select t1.*,t2.* from table1 t1, table2 t2 where t1.<Имя ключевого поля>=t2.<Имя ключевого поля>

Имейте в виду без t1.<Имя ключевого поля>=t2.<Имя ключевого поля> записи в таблицах просто перемножатся друг на друга. Да и все столбцы выберать не обязательно, можно так select t1.<Поле> П1, t2.<Поле> П2 ... И все будет... :-)

Oleggg   (2002-07-02 09:38) [7]

Юзай UNION select * from t1 union select * from t2.

ЗЫ Спасибо Динана, насмешила - хороший пример того, что до девушек туго доходит, что нужно парням :)

Sergey13   (2002-07-02 09:46) [8]

2Oleggg (02.07.02 09:38) А ты сам то понял о чем речь? 8-) Хороший пример того, что до некоторых парней вообще не доходит...

Lemon_AlexL   (2002-07-02 11:18) [9]

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

Присвоить в выборке им (полям) свои названия используя инструкцию "ИМЯ_ПОЛЯ_В_ТАБЛИЦЕ" AS "ИМЯ_ПОЛЯ_В_РЕЗУЛЬТАТЕ". Правда для этого придется отказаться от символа "*" в SELECT, в мсто этого перечислять поля как они есть. Пример: SELECT (T1.FIELD1) AS FIELD1_FROM_T1, (T2.FIELD1) AS FIELD1_FROM_T2 FROM TABLE1 T1, TABLE2 T2 ... ну и т. д.

Форум: "Базы";Поиск по всему сайту: www.delphimaster.net;Текущий архив: 2002.07.22;Скачать: [xml.tar.bz2];

Наверх

EMAIL={{}};LOGIN={{Alexcool}};TITLE={{SQL запрос из двух таблиц}};ATTRIBUTES={{}};ID_MSG={{133500}};ID_GROUP={{3}};ID_NNTP={{28322}};ID_DM={{70657}};REPLYNR={{0}};ID_DM_AUTHOR={{0}};ARCHIVE={{2002.07.22}};REPLYDATE={{2002-06-27 20:16}};CNT={{9}};

Память: 0.75 MBВремя: 0.019 c

www.delphimaster.net

Выборка из двух таблиц в MySQL с помощью оператора JOIN

Вам нужно сделать выборку из двух таблиц? Тогда читайте ниже :)

Допустим, у нас есть две таблицы:

Таблица tbl1:

Таблица tbl2:

Произведём простейший запрос к двум таблицам.

SELECT * FROM tbl1,tbl2 WHERE tbl1.id=tbl2.id

В результате этого запроса получится следующая таблица:

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

SELECT * FROM tbl1 JOIN tbl2 WHERE tbl1.id=tbl2.id

Для формирования условия в запросах, использующих объединение JOIN, вместо ключевого слова WHERE предпочтительно использовать ключевое слово ON, как это продемонстрировано в следующем листинге:

SELECT * FROM tbl1 JOIN tbl2 ON tbl1.id=tbl2.id

Выше было продемонстрировано перекрестное объединение таблиц tbl1 и tbl2. При это результирующая таблица содержит комбинации строк обеих таблиц, удовлетворяющих условию tbl1.id = tbl2.id. Левое объединение (LEFT JOIN) позволяет включить в результирующую таблицу строки "левой" таблицы tbl1, которой не нашлось соответствие в "правой" таблице tbl2. Смотрите следующий пример:

SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl1.id=tbl2.id

Результатом будет следующая таблица

Как видно из этого примера, записи в таблице tbl1 со значением id = 1 не нашлось соответствия в таблице tbl2, т.к. поле id в ней принимает значения 2,3,4. Тем не менее в результирующую таблицу запись включена, при этом значения полей из таблицы tbl2 принимают значение NULL. Следует заметить, что для задания условия вместо ключевого слова WHERE при левом и правом объединениях используется ключевое слово ON.В следующем примере демонстрируется "правое" объединение при помощи конструкции RIGHT JOIN.

SELECT * FROM tbl1 RIGHT JOIN tbl2 ON tbl1.id=tbl2.id

Результирующая таблица:

Как видим, при правом объединении возвращаются строки, удовлетворяющие условию tbl1.id = tbl2.id, и строки "правой" таблицы tbl2, которым не нашлось соответствия в левой таблице tbl1.

x3m-slider.org.ua