Выборка данных из нескольких таблиц (JOIN). Select из двух таблиц пример
Выборка данных из нескольких таблиц.
Цели: После освоение материала данной лекции, студенты должны быть в состоянии выполнить следующие действия:
Составлять SQLзапросы для выбора данных из нескольких таблиц, используя эквисоединения и соединения других видов;
Использовать соединение таблицы с собой;
Использовать внешние соединения для просмотра данных, не удовлетворяющих обычным условиям соединения;
Создавать декартово произведение всех строк из двух или более таблиц.
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 | | IT | 1400 | |
205 | Higgins | 110 | 80 | Sales | 2500 | |
206 | Gietz | 110 | 90 | Executive | 1700 | |
110 | Accounting | 1700 | ||||
190 | Contracting | 1700 |
Результат:
EMPLOYEE_ID | DEPARTMENT_ID | | ||||
100 | 90 | Executive | ||||
101 | 90 | Executive | ||||
. . . | ||||||
202 | 20 | Marketing | ||||
205 | 110 | Accounting | ||||
206 | 110 | Accounting | ||||
. . . |
2. Виды соединений.
СУБД Oracle, начиная с версии 9i, позволяет использовать синтаксис стандарта SQL:1999 и поддерживает следующие типы соединений:
Перекрестные соединения;
Натуральные соединения;
Опция USING;
Полное (или двухстороннее) внешнее соединение;
Произвольные условия соединения для внешнего соединения.
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).
Правила:
Предложение NATURAL JOINосновывается на всех столбцах двух таблиц, имеющих одинаковые имена;
Выбираются строки из двух таблиц, которые имеют одинаковые значения во всех соответствующих столбцах;
Если столбцы с одинаковыми именами имеют разные типы данных, возвращается сообщение об ошибке.
Пример 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; | ||||||||||||||||||||||||||||||||||||
|
|
Давайте рассмотрим пример оператора соединения (join), использующего традиционный синтаксис Oracle, где мы объединяем вместе содержимое таблиц emp и dept для получения перечня всех сотрудников и названий отделов, где они работают:
CLARK | 10 | ACCOUNTING |
KING | 10 | ACCOUNTING |
MILLER | 10 | ACCOUNTING |
JONES | 20 | RESEARCH |
FORD | 20 | RESEARCH |
ADAMS | 20 | RESEARCH |
SMITH | 20 | RESEARCH |
SCOTT | 20 | RESEARCH |
WARD | 30 | SALES |
TURNER | 30 | SALES |
ALLEN | 30 | SALES |
JAMES | 30 | SALES |
BLAKE | 30 | SALES |
MARTIN | 30 | SALES |
Обратите внимание на многие важные компоненты этого соединения таблиц. Использование во фразе 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;CLARK | 10 | ACCOUNTING |
KING | 10 | ACCOUNTING |
MILLER | 10 | ACCOUNTING |
JONES | 20 | RESEARCH |
FORD | 20 | RESEARCH |
ADAMS | 20 | RESEARCH |
SMITH | 20 | RESEARCH |
SCOTT | 20 | RESEARCH |
WARD | 30 | SALES |
TURNER | 30 | SALES |
ALLEN | 30 | SALES |
JAMES | 30 | SALES |
BLAKE | 30 | SALES |
MARTIN | 30 | SALES |
Обратите внимание на различия между этим синтаксисом и синтаксисом 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;CLARK | 10 | ACCOUNTING |
KING | 10 | ACCOUNTING |
MILLER | 10 | ACCOUNTING |
JONES | 20 | RESEARCH |
FORD | 20 | RESEARCH |
ADAMS | 20 | RESEARCH |
SMITH | 20 | RESEARCH |
SCOTT | 20 | RESEARCH |
WARD | 30 | SALES |
TURNER | 30 | SALES |
ALLEN | 30 | SALES |
JAMES | 30 | SALES |
BLAKE | 30 | SALES |
MARTIN | 30 | SALES |
Нетрудно заменить, что естественные соединения позволяют в значительной степени упростить запросы с соединением за счет устранения псевдонимов таблиц и сравнений дл соединения.
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 cwww.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