[转自]http://www.cnblogs.com/chenxizhang/archive/2008/11/10/1330325.html

CROSS JOIN又称为笛卡尔乘积,实际上是把两个表乘起来。

[实例]:

SQL CROSS JOIN will return all records where each row from the first table is combined with each row from the second table. Which also mean CROSS JOIN returns the Cartesian product of the sets of rows from the joined tables.

CROSS JOIN can be specified in two ways: using the JOIN syntax or by listing the tables in the FROM clause separated by commas without using a WHERE clause to supply join criteria.

SQL CROSS JOIN syntax:

SELECT * FROM [TABLE 1] CROSS JOIN [TABLE 2]

OR

SELECT * FROM [TABLE 1], [TABLE 2]  //重点,平时写法要注意啊

EXAMPLE :

Let's try with 2 tables below:

Table 1: GameScores

PlayerName DepartmentId Scores
Jason 1 3000
Irene 1 1500
Jane 2 1000
David 2 2500
Paul 3 2000
James 3 2000

Table 2: Departments

DepartmentId DepartmentName
1 IT
2 Marketing
3 HR

SQL statement :

SELECT* FROM GameScores CROSS JOIN Departments 

Result:

PlayerName DepartmentId Scores DepartmentId DepartmentName
Jason 1 3000 1 IT
Irene 1 1500 1 IT
Jane 2 1000 1 IT
David 2 2500 1 IT
Paul 3 2000 1 IT
James 3 2000 1 IT
Jason 1 3000 2 Marketing
Irene 1 1500 2 Marketing
Jane 2 1000 2 Marketing
David 2 2500 2 Marketing
Paul 3 2000 2 Marketing
James 3 3000 2 Marketing
Jason 1 3000 3 HR
Irene 1 1500 3 HR
Jane 2 1000 3 HR
David 2 2500 3 HR
Paul 3 2000 3 HR
James 3 3000 3 HR

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

另外贴一个CSDN的帖子,那Roy和小f的回答来讲解其中笛卡尔积的应用

[转自]http://topic.csdn.net/u/20111107/11/0f4581d4-1cfd-4913-ad0d-7b50bb6e7395.html#replyachor

现在有一个表student 结构如下:
id name class blood
1 张三 1 A
2 李四 2 C
3 王五 1 B
4 黄六 3 D
5 朱八 2 C
现在想查询出每个班的每种血型人数统计(假设只有ABCD四种血型)统计结果如下:
class blood num
1 A 1
1 B 1
1 C 0
1 D 0
2 A 0
2 B 0
2 C 2
2 D 0
3 A 0
3 B 0
3 C 0
3 D 1

if object_id('student') is not null
drop table student
go
create table student(
id int,
[name] varchar(50),
class varchar(50),
blood varchar(50))goinsert student
select 1,'张三','1','A' union all
select 2,'李四','2','C' union all
select 3,'王五','1','B' union all
select 4,'黄六','3','D' union all
select 5,'朱八','2','C'go
SELECT
b.class,a.blood,COUNT(s.ID) AS num
FROM
(SELECT 'A'  AS blood UNION ALL
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D' )a CROSS JOIN  (SELECT  DISTINCT class  from student)b
LEFT JOIN student s ON a.blood=s.blood AND s.class=b.class
GROUP BY b.class,a.blood
go
drop table student

我们可以这样分析

由于要统计每个班级的血型及数量

看统计结果的前两列就可以知道是一个笛卡尔积的形式,三个班级与四种血型的乘积

所有班级在列表中都会出现.但是血型就不一定,搞不好所有的班级只有A.B.C,没有D血型,所以我们必须手动添加这四种血型(当然如果就3个班级你也可以手动添加)

所以手动生成两个表,里面各有班级和血型

第一步,生成blood列

SELECT 'A'  AS blood UNION ALL
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D'
作为一个表,我们可以查看一下这个表的内容
select * from (SELECT 'A'  AS blood UNION ALL
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D') as a
/*
blood
---
A
B
C
D
*/

第二部,生成class列

由于给定的表中已经都包含所有的班级,所以我们只需要筛选去除重复的班级

select distinct class from student
/*
class
---
1
2
3
*/

第三步,笛卡尔积生成结果集

(SELECTDISTINCT classfrom student) as b
CROSSJOIN
(SELECT'A'AS bloodUNIONALLSELECT'B'UNIONALLSELECT'C'UNIONALLSELECT'D') as a
查看结果select * from ....
/*
class blood
--- ----
1 A
1 B
1 C
1 D
2 A
2 B
2 C
2 D
3 A
3 B
3 C
3 D
*/

第四步,统计数量

格式已经跟统计结果的前两列,但是我们还缺少什么.对了,是统计的血型的数量.

我们要统计的是每个班的每种血型,所以我们就要表连接查询student中的符合条件的作为一列并入到新表中

记住这里不能用内连接

如果是内连接

SELECT
b.class,a.blood,COUNT(s.ID) AS num
FROM
(SELECT 'A'  AS blood UNION ALL
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D' )a CROSS JOIN  (SELECT  DISTINCT class  from student)b
JOIN student s ON a.blood=s.blood AND s.class=b.class
GROUP BY b.class,a.blood
结果为
/*
class blood num
----    --    ---
1       A      1
1       B      1
2       C      2
3       D      1
*/

(具体原因可以查看另一篇文章: left join 和 left outer join 的区别)

所以,这里必须用前三步生成的集合的左连接student中符合条件的.(这样就会包含左表有用的内容,右表没有的将用null补齐)

当然用student中符合条件的右连接前三步生成的集合也是一样的.

SELECT
b.class,a.blood,COUNT(s.ID) AS num
FROM
(SELECT 'A'  AS blood UNION ALL
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D' )a CROSS JOIN  (SELECT  DISTINCT class  from student)b
LEFT JOIN student s ON a.blood=s.blood AND s.class=b.class
GROUP BY b.class,a.blood

结果就会如题所示了.

讲完Roy的解法,那么小f的在5楼的解法

selectb.class,b.blood,COUNT(a.blood) as num
from  tb a
full join(select * from (select distinct class from tb)a ,(select  distinct blood from tb) b)b
ona.class=b.class
anda.blood=b.blood
group byb.class,b.blood

小f用原先表全连接,全连接就会列出分别所有匹配两个表中的数据并生成行

(select * from (select distinct class from tb)a ,(select  distinct blood from tb) b)b

直接生成了我们之前 前三步的表,也是用的笛卡尔积原理,这里由于原数据中A.B.C.D血型都有了,所以小f没有考虑过多.

全连接后直接筛选出结果.

SQL查询cross join 的用法(笛卡尔积)相关推荐

  1. SQL语句中JOIN的用法

    记录:257 写SQL最高境界:SELECT * FROM 表名.当然这是一句自嘲.探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟. 一.场景 把关系型数据库A中表TEST_ ...

  2. SQL中cross join,left join,right join ,full join,inner join 的区别

    http://blog.csdn.net/sgivee/article/details/5081350 SQL中cross join,left join,right join ,full join,i ...

  3. 【sql中关于join的用法总结】

    join的常见用法如下所示: left join right join join full join cross join left join: select * from a left join b ...

  4. SQL查询过滤Where子句用法

    大多数情况下,查询关注的是表中所有行的一个子集,需要用到Where过滤,本文主要介绍过滤的条件连接符(AND, OR, (),NOT),条件类型(相等条件.范围条件.成员条件.通配条件)以及当列名包含 ...

  5. 关于SQL数据库中cross join 和inner join用法上的区别?

    使用mysql创建两张表 表a 表b 可以使用下面的脚本创建表,并且添加测试数据: CREATE TABLE `a`  (   `name` varchar(10) CHARACTER SET utf ...

  6. SQL CROSS JOIN

    最近在讲到T-SQL查询的Join部分时,一下子没有想起来CROSS JOIN的用法,因为其实平常也确实基本不用到.特意找了一个例子,以供参考 CROSS JOIN又称为笛卡尔乘积,实际上是把两个表乘 ...

  7. sql join 示例_SQL CROSS JOIN与示例

    sql join 示例 In this article, we will learn the SQL CROSS JOIN concept and support our learnings with ...

  8. 使用笛卡尔积 cross join解决傻傻的问题

    select * from (( select invname from bd_invbasdoc where rownum <=5)cross join (select custname fr ...

  9. sql 查询上个月的数据_数据分析-SQL 进阶篇 多表查询

    知识点 一.表的加法 Union:删除表中的重复值 union al:包含表中所有内容,包括重复值 二.表的联结 联结:join 联结分为以下五种: 交叉联结(cross join)又称为笛卡尔积:将 ...

最新文章

  1. Spring MVC 过时了吗?
  2. Hadoop集群中增加与ElasticSearch连接的操作
  3. ORA-14452的出现原因解析及解决方法
  4. styled-components解决全局样式‘injectGlobal‘ 废除的问题
  5. 【C language】C语言二分法查找
  6. Academic English Reading Notes
  7. 机器人统治人类?别逗!现实中的机器人是这样的
  8. vue 数值 拼接字符串_【Vue原理】Compile - 白话版
  9. SAP License:孔乙己,一名ERP顾问
  10. IOS--UILabel的使用方法详细
  11. mysql怎么生成sql文件_sql如何生成sql文件
  12. sketch(一)--安装和介绍
  13. 行业认证标准:MISRA编码标准(MISRA C:2012和MISRA C++:2008)
  14. android room数据库embed,Android官方ORM数据库Room技术解决方案 @Embedded内嵌对象
  15. bazel 链接第三方动态库_谷歌携手OPPO共同开发CameraX技术,第三方拍照应用有福了...
  16. 深入浅出理解视频编码H.264结构
  17. c51语言主函数,51单片机的基本c51语言程序介绍
  18. Oracle Order by 按汉字拼音排序
  19. 毕业论文知网查重之应对办法
  20. 从《欲望都市》到《绝望主妇》 美剧的疯狂

热门文章

  1. 从哲学的角度来看面向对象中的主体客体思维
  2. Mathorcup数学建模竞赛第四届-【妈妈杯】A题:“2048”游戏的数学基础及其取胜策略研究(附赛题解析及MATLAB代码)
  3. git tag 打标签(我看过最透彻的文章)
  4. js实现表单及时验证功能 用户信息立即验证
  5. linux常用命令||
  6. 数据库码的概念,全码的例子与范式的联系
  7. java基于ssm的论坛贴子网站ssm论坛项目发帖子网站论坛系统论坛源码
  8. ann flann alglibB最近邻方法时效性探索
  9. 这是一则招聘贴——招聘区块链系统开发实习生
  10. 信息系统项目管理师备考资料-第三版(4)