Database
 sql >> база данни >  >> RDS >> Database

SQL кръстосано присъединяване

Тази статия предоставя общ преглед на CROSS JOIN в SQL, както и някои основни примери.

SQL CROSS JOIN (или FULL OUTER JOIN ) връща редове, които комбинират всеки ред от първата таблица с всеки ред от втората таблица.

С други думи, той връща декартовото произведение на редовете от таблици в обединението.

Синтаксис

Посочвате кръстосано присъединяване в FROM клауза.

Синтаксисът е така:

SELECT *
FROM Table1 CROSS JOIN Table2 
ON Table1.Column = Table2.Column;

Пример 1

Ето пример за демонстрация.

Примерни данни

Първо, ето таблиците, които ще използваме за примера.

t1 таблица:

+--------+
| col1   |
|--------|
| a      |
| b      |
| c      |
+--------+

t2 таблица:

+--------+
| col1   |
|--------|
| 1      |
| 2      |
| 3      |
+--------+

Заявката за кръстосано присъединяване

Ето пример за извършване на кръстосано свързване срещу тези две таблици.

SELECT * FROM t1 
CROSS JOIN t2;

Резултат:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Така че нашата заявка връща 9 реда, въпреки че има само 3 реда във всяка таблица.

Това се дължи на начина, по който работи кръстосаното съединение. Броят на върнатите редове е броят на редовете в лявата таблица, умножен по броя на редовете в дясната таблица.

Вижте как преминава през лявата таблица, като извежда всеки ред в дясната таблица за всеки ред в лявата таблица.

Това има същия ефект като извършването на следното:

SELECT * FROM t1, t2

Резултат:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Пример 2

Ето какво се случва, ако добавим WHERE клауза към нашето кръстосано присъединяване.

SELECT * FROM t1 
CROSS JOIN t2
WHERE t1.col1 = 'a';

Резултат:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| a      | 2      |
| a      | 3      |
+--------+--------+
(3 rows affected)

Пример 3

Да предположим, че имаме следните таблици.

PetTypes таблица:

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Pets таблица:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

В този случай Pets.PetTypeId колоната е външен ключ на PetTypes.PetTypeId колона.

Сега, ето пример за изпълнение на кръстосано присъединяване на тези две таблици, но с помощта на WHERE клауза.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;

Резултат:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Добавяне на WHERE клаузата за кръстосано съединение го превърна във вътрешно съединение.

Ето какво се случва, ако премахнем WHERE клауза.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt;

Резултат:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Bird      |
| Fetch     | Bird      |
| Scratch   | Bird      |
| Wag       | Bird      |
| Tweet     | Bird      |
| Fluffy    | Bird      |
| Bark      | Bird      |
| Meow      | Bird      |
| Fluffy    | Cat       |
| Fetch     | Cat       |
| Scratch   | Cat       |
| Wag       | Cat       |
| Tweet     | Cat       |
| Fluffy    | Cat       |
| Bark      | Cat       |
| Meow      | Cat       |
| Fluffy    | Dog       |
| Fetch     | Dog       |
| Scratch   | Dog       |
| Wag       | Dog       |
| Tweet     | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Dog       |
| Fluffy    | Rabbit    |
| Fetch     | Rabbit    |
| Scratch   | Rabbit    |
| Wag       | Rabbit    |
| Tweet     | Rabbit    |
| Fluffy    | Rabbit    |
| Bark      | Rabbit    |
| Meow      | Rabbit    |
+-----------+-----------+
(32 rows affected)

Получаваме кръстосано съединение, което връща 32 реда.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете обект на ResultSet с възможност за превъртане и актуализация в JDBC

  2. SQL с чужд ключ:Всичко, което трябва да знаете за операциите с чужд ключ

  3. Тестване на DML изявления за OLTP в паметта

  4. Първи стъпки с Django Channels

  5. Основи на табличните изрази, част 7 – CTE, съображения за оптимизация