SQL教學
SQL RDBMS概念
SQL簡介
SQL NOT NULL約束
SQL DEFAULT約束
SQL唯一約束
SQL主鍵
SQL外鍵
SQL CHECK約束
SQL示例數據庫
SQL索引約束
SQL NULL值
數據庫 - 第一範式(1NF)
數據庫 - 第二範式(2NF)
數據庫 - 第三範式(3NF)
SQL RDBMS數據庫
SQL語法
SQL數據類型
SQL操運算符
SQL算術運算符
SQL比較運算符
SQL邏輯運算符
SQL表達式
SQL創建數據庫(CREATE DATABASE)
SQL丟棄或刪除數據庫(DROP DATABASE)
SQL選擇數據庫(SELECT Database, USE語句)
SQL創建表(CREATE Table)
SQL從現有表創建表
SQL刪除表(DROP或DELETE Table)
SQL INSERT INTO插入查詢
SQL SELECT查詢語句
SQL WHERE子句
SQL AND和OR運算符
SQL UPDATE更新查詢
SQL DELETE刪除查詢
SQL LIKE子句
SQL TOP,LIMIT,ROWNUM子句
SQL ORDER BY排序子句
SQL GROUP BY(分組)
SQL Distinct關鍵字
SQL排序結果
SQL約束
SQL Join聯接
SQL INNER JOIN(內部連接)
SQL LEFT JOIN(左連接)
SQL RIGHT JOIN(右連接)
SQL FULL JOIN(全連接)
SQL自連接
SQL笛卡爾或交叉連接
SQL UNION子句/操作符
SQL INTERSECT子句
SQL EXCEPT子句
SQL別名語法
SQL索引
SQL ALTER TABLE(修改表)
SQL TRUNCATE TABLE(截斷表)
SQL View(視圖)
SQL Having子句
SQL事務
SQL通配符運算符
SQL日期函數
SQL ADDDATE()函數
SQL ADDTIME()函數
SQL CONVERT_TZ()函數
SQL CURDATE()函數
SQL CURRENT_DATE()函數
SQL CURTIME()函數
SQL CURRENT_TIME()函數
SQL CURRENT_TIMESTAMP()方法
SQL DATE(expr)函數
SQL DATEDIFF()方法
SQL DATE_ADD()和DATE_SUB()方法
SQL DATE_FORMAT()函數
SQL DATE_SUB()方法
SQL DAY()函數
SQL DAYNAME()函數
SQL DAYOFMONTH()函數
SQL DAYOFWEEK()函數
SQL DAYOFYEAR()函數
SQL EXTRACT()函數
SQL FROM_DAYS()函數
SQL FROM_UNIXTIME()函數
SQL HOUR()方法
SQL LAST_DAY()函數
SQL LOCALTIME和LOCALTIME()函數
SQL LOCALTIMESTAMP和LOCALTIMESTAMP()函數
SQL MAKEDATE()函數
SQL MAKETIME()函數
SQL MICROSECOND()函數
SQL MINUTE()函數
SQL MONTH()函數
SQL MONTHNAME()函數
SQL NOW()函數
SQL PERIOD_ADD()函數
SQL PERIOD_DIFF()函數
SQL QUARTER()函數
SQL SECOND()函數
SQL SEC_TO_TIME()函數
SQL STR_TO_DATE()函數
SQL SUBDATE()函數
SQL SUBTIME()函數
SQL SYSDATE()函數
SQL TIME()函數
SQL TIMEDIFF()函數
SQL TIMESTAMP()函數
SQL TIMESTAMPADD()函數
SQL TIMESTAMPDIFF()函數
SQL TIME_FORMAT()函數
SQL TIME_TO_SEC()函數
SQL TO_DAYS()函數
SQL UNIX_TIMESTAMP()函數
SQL UTC_DATE()函數
SQL UTC_TIME()函數
SQL UTC_TIMESTAMP()函數
SQL WEEK()函數
SQL WEEKDAY()函數
SQL WEEKOFYEAR()函數
SQL YEAR()函數
SQL YEARWEEK()函數
SQL臨時表
SQL克隆表
SQL子查詢
SQL使用序列(自動遞增)
SQL DISTINCT重複處理
SQL注入
SQL實用函數
SQL MAX()函數
SQL MIN()函數
SQL AVG()函數
SQL SUM()函數
SQL SQRT()函數
SQL RAND()函數
SQL CONCAT()函數
SQL數值函數
SQL ABS()函數
SQL ACOS()函數
SQL ASIN(X)函數
SQL ATAN(X)函數
SQL ATAN2()函數
SQL BIT_AND()函數
SQL BIT_COUNT()函數
SQL BIT_OR()函數
SQL CEIL()函數
SQL CONV()函數
SQL COS()函數
SQL COT()函數
SQL DEGREES()函數
SQL EXP(X)函數
SQL FLOOR(X)函數
SQL FORMAT(X,D)函數
SQL GREATEST()函數
SQL INTERVAL()函數
SQL LEAST()函數
SQL LOG()函數
SQL LOG10(X)函數
SQL MOD()函數
SQL OCT(N)函數
SQL PI()函數
SQL POW()函數
SQL RADIANS()函數
SQL ROUND()函數
SQL SIGN(X)函數
SQL SIN(X)函數
SQL SQRT(X)函數
SQL STD()函數
SQL TAN(X)函數
SQL TRUNCATE()函數
SQL字符串函數
SQL ASCII(str)函數
SQL BIN(N)函數
SQL BIT_LENGTH()函數
SQL CHAR()函數
SQL CHAR_LENGTH()函數
SQL CHARACTER_LENGTH()函數
SQL字符串CONCAT()函數
SQL CONCAT_WS()函數
SQL CONV(N,from_base,to_base)函數
SQL ELT()函數
SQL EXPORT_SET()函數
SQL FIELD()函數
SQL FIND_IN_SET()函數
SQL FORMAT()函數
SQL HEX()函數
SQL INSERT()函數
SQL INSTR()函數
SQL LCASE()函數
SQL LEFT()函數
SQL LENGTH()函數
SQL LOAD_FILE()函數
SQL LOCATE()函數
SQL LOWER()函數
SQL LPAD()函數
SQL LTRIM()函數
SQL MAKE_SET()函數
SQL MID()函數
SQL OCT()函數
SQL OCTET_LENGTH()函數
SQL ORD()函數
SQL POSITION()函數
SQL QUOTE()函數
SQL REGEXP模式
SQL REPEAT()函數
SQL REPLACE()函數
SQL REVERSE()函數
SQL RIGHT()函數
SQL RPAD()函數
SQL SOUNDEX()函數
SQL SPACE()函數
SQL STRCMP()函數
SQL SUBSTRING()函數
SQL SUBSTRING_INDEX()函數
SQL TRIM()函數
SQL UCASE()函數
SQL UNHEX()函數
SQL UPPER()函數

SQL Cross Join子句

本教程將學習和演示如何使用SQL CROSS JOIN生成連接表的笛卡爾積。

1. SQL CROSS JOIN子句簡介

交叉連接是一種連接操作,它生成兩個或多個表的笛卡爾積。

在數學中,笛卡爾積是一種返回多組產品集的數學運算。

例如,有兩組集合:A {x,y,z}B {1,2,3}A x B的笛卡爾乘積是所有有序對(x,1)(x,2)(x,3)(y,1),(y,2)(y,3)(z,1)(z,2)(z,3)

下圖說明了AB的笛卡爾積:

SQL

類似地,在SQL中,兩個表AB的笛卡爾乘積是結果集,其中第一個表(A)中的每一行與第二個表(B)中的每一行配對。 假設A表有n行,而B表有m行,那麼AB表的交叉連接結果有n x m行。

以下是CROSS JOIN子句的語法:

SELECT column_list
FROM A
CROSS JOIN B;

下圖說明了表A和表B之間的交叉連接的結果。在圖中,表A具有三行記錄:1,23,而表B也具有三行記錄:xyz。 那麼笛卡爾積結果有九行:

SQL

注意,與INNER JOIN,LEFT JOIN和FULL OUTER JOIN不同,CROSS JOIN子句沒有連接條件。

以下語句等同於使用上面的CROSS JOIN子句的語句:

SELECT 
    column_list
FROM
    A,
    B;

2. SQL CROSS JOIN示例

我們將創建兩個用於演示交叉連接的新表:

  • sales_organization表存儲銷售組織。
  • sales_channel表存儲銷售渠道。

以下語句用於創建sales_organizationsales_channel表:

-- 創建表1
CREATE TABLE sales_organization (
    sales_org_id INT PRIMARY KEY,
    sales_org VARCHAR (255)
);

-- 創建表2
CREATE TABLE sales_channel (
    channel_id INT PRIMARY KEY,
    channel VARCHAR (255)
);

假設該公司有兩個國內(Domestic)和出口(Export)銷售組織,負責國內和國際市場的銷售。

以下語句將兩個銷售組織插入sales_organization表:

INSERT INTO sales_organization (sales_org_id, sales_org)
VALUES
    (1, 'Domestic'),
    (2, 'Export');

該公司可以通過批發(Wholesale),零售(Retail),電子商務(eCommerce)和電視購物(TV Shopping)等各種渠道分銷商品。 以下語句將銷售渠道插入sales_channel表:

INSERT INTO sales_channel (channel_id, channel)
VALUES
    (1, 'Wholesale'),
    (2, 'Retail'),
    (3, 'eCommerce'),
    (4, 'TV Shopping');

要查找銷售組織可以擁有的所有可能的銷售渠道,可以使用CROSS JOINsales_organnel表與sales_channel表連接,如下所示:

SELECT
    sales_org,
    channel
FROM
    sales_organization
CROSS JOIN sales_channel;

執行上面查詢語句,得到以下結果 -

SQL

結果集包括sales_organizationsales_channel表中的所有行記錄。

以下查詢等效於使用上面的CROSS JOIN子句的語句:

SELECT
    sales_org,
    channel
FROM
    sales_organization,
    sales_channel;

在某些數據庫系統(如PostgreSQL和Oracle)中,可以使用INNER JOIN子句,其條件始終求值爲true以執行交叉連接,例如:

SELECT
    sales_org,
    channel
FROM
    sales_organization
INNER JOIN sales_channel ON 1 = 1;

在本教程中,學習瞭如何使用SQL CROSS JOIN子句生成兩個或多個表的笛卡爾積。