在本教程中,您將學(xué)習(xí)如何使用SQL交叉聯(lián)接從兩個(gè)表中獲取數(shù)據(jù)。
如果在連接兩個(gè)表時(shí)未指定連接條件,則數(shù)據(jù)庫(kù)系統(tǒng)會(huì)將第一個(gè)表的每一行與第二個(gè)表的每一行合并。這種連接稱為交叉連接或笛卡爾乘積。下面的維恩圖說(shuō)明了交叉聯(lián)接的工作方式。
為了容易理解這一點(diǎn),讓我們來(lái)看看下面employees和departments表。
+--------+--------------+------------+---------+ | emp_id | emp_name | hire_date | dept_id | +--------+--------------+------------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 4 | | 2 | Tony Montana | 2002-07-15 | 1 | | 3 | Sarah Connor | 2005-10-18 | 5 | | 4 | Rick Deckard | 2007-01-03 | 3 | | 5 | Martin Blank | 2008-06-24 | NULL | +--------+--------------+------------+---------+ | +---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Administration | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ | |
表: employees | 表: departments |
交叉聯(lián)接中的行數(shù)是每個(gè)表中的行數(shù)的乘積。這是交叉連接操作的簡(jiǎn)單示例。
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 CROSS JOIN departments AS t2;
提示:交叉聯(lián)接將創(chuàng)建笛卡爾乘積或?qū)⒁粋€(gè)表中的所有行與另一個(gè)表中的所有行相乘。因此,例如,如果一個(gè)表有5行,而另一個(gè)表有10行,則交叉聯(lián)接查詢將產(chǎn)生50行,即5和10的乘積。
執(zhí)行完上述命令后,您將得到如下結(jié)果集:
+--------+--------------+------------+------------------+ | emp_id | emp_name | hire_date | dept_name | +--------+--------------+------------+------------------+ | 1 | Ethan Hunt | 2001-05-01 | Administration | | 2 | Tony Montana | 2002-07-15 | Administration | | 3 | Sarah Connor | 2005-10-18 | Administration | | 4 | Rick Deckard | 2007-01-03 | Administration | | 5 | Martin Blank | 2008-06-24 | Administration | | 1 | Ethan Hunt | 2001-05-01 | Customer Service | | 2 | Tony Montana | 2002-07-15 | Customer Service | | 3 | Sarah Connor | 2005-10-18 | Customer Service | | 4 | Rick Deckard | 2007-01-03 | Customer Service | | 5 | Martin Blank | 2008-06-24 | Customer Service | | 1 | Ethan Hunt | 2001-05-01 | Finance | | 2 | Tony Montana | 2002-07-15 | Finance | | 3 | Sarah Connor | 2005-10-18 | Finance | | 4 | Rick Deckard | 2007-01-03 | Finance | | 5 | Martin Blank | 2008-06-24 | Finance | | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 2 | Tony Montana | 2002-07-15 | Human Resources | | 3 | Sarah Connor | 2005-10-18 | Human Resources | | 4 | Rick Deckard | 2007-01-03 | Human Resources | | 5 | Martin Blank | 2008-06-24 | Human Resources | | 1 | Ethan Hunt | 2001-05-01 | Sales | | 2 | Tony Montana | 2002-07-15 | Sales | | 3 | Sarah Connor | 2005-10-18 | Sales | | 4 | Rick Deckard | 2007-01-03 | Sales | | 5 | Martin Blank | 2008-06-24 | Sales | +--------+--------------+------------+------------------+
正如您看到的,交叉聯(lián)接的作用不如前幾章所述。由于查詢未指定連接條件,因此employees表中的每一行與departments表中的每一行合并在一起。因此,除非您確定要使用笛卡爾積,否則不要使用交叉聯(lián)接。