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

使用mysql创建两张表

表a

 

表b

 

 

可以使用下面的脚本创建表,并且添加测试数据:

CREATE TABLE `a`  (
  `name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of a
-- ----------------------------
INSERT INTO `a` VALUES ('张三', '男');
INSERT INTO `a` VALUES ('李四', '女');

SET FOREIGN_KEY_CHECKS = 1;

 

CREATE TABLE `b`  (
  `name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(2) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of b
-- ----------------------------
INSERT INTO `b` VALUES ('李四', 30);
INSERT INTO `b` VALUES ('王五', 23);

SET FOREIGN_KEY_CHECKS = 1;


JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录。

LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。

RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。

注意:mysql不支持Full join,不过可以通过UNION 关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL join。

1)全外连接
select a.name,a.sex,b.name,b.age from a full outer join b on a.name=b.name

在mysql中是无法执行的,mysql 不支持full join,可以换成下面这种union连接左右连接,即 left join + right join这种方式。

select * from a left outer join b 
on a.name = b.name 
union 
select * from a right outer join b 
on a.name = b.name

结果如下,
name sex name age
张三 男 NULL NULL
李四 女 李四 30
NULL NULL 王五 23

2)左链接
select a.name,a.sex,b.name,b.age
from a left outer join b on a.name=b.name
结果如下
name sex name age
张三 男 NULL NULL
李四 女 李四 30


3)右连接
select a.name,a.sex,b.name,b.age
from a right outer join b on a.name=b.name
结果如下
name sex name age
李四 女 李四 30
NULL NULL 王五 23

4)内联
select a.name,a.sex,b.name,b.age
from a inner join b on a.name=b.name
结果如下
name sex name age
李四 女 李四 30

5)交叉

cross join 后面加on 是错误的,不要加on
错误的:select a.name,a.sex,b.name,b.age from a cross join b on a.name=b.name;  

正确的:select a.name,a.sex,b.name,b.age from a cross join b; 
结果如下
name sex name age
张三 男 李四 30
李四 女 王五 23
张三 男 王五 23
李四 女 李四 30

在 MySQL 中(仅限于 MySQL) CROSS JOIN 与 INNER JOIN 的表现是一样的,在不指定 ON 条件得到的结果都是笛卡尔积,反之取得两个表完全匹配的结果。INNER JOIN 与 CROSS JOIN 可以省略 INNER 或 CROSS 关键字,因此下面的 SQL 效果是一样的。

select a.name,a.sex,b.name,b.age
from a cross join b;
select a.name,a.sex,b.name,b.age
from a inner join b;
select a.name,a.sex,b.name,b.age
from a join b;

select a.name,a.sex,b.name,b.age
from a cross join b on a.name=b.name;
select a.name,a.sex,b.name,b.age
from a inner join b on a.name=b.name;
select a.name,a.sex,b.name,b.age
from a join b on a.name=b.name;

-- sql server 只能用cross join
正确用法:select a.name,a.sex,b.name,b.age from a cross join b;
错误用法:select a.name,a.sex,b.name,b.age from a inner join b; 
错误用法:select a.name,a.sex,b.name,b.age from a join b;

转载于:https://www.cnblogs.com/supermarrio/p/10429146.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS实现段落首行缩进、1.5倍行距、左右对齐

.text-content { font-size: 15px; text-indent: 30px; /*段落首行缩进,text-indent的值为font-size的2倍,相当于缩进2个汉字*/ line-height: 22px; /*line-height的值为font-size的1.5倍,即1.5倍行距,使用line-heig…

hash()函数的实现

输入参数都是字符串。 6种hash函数的实现以及使用方式&#xff1a; template<class T> size_t BKDRHash(const T * str) // 该效率最高 { register size_t hash 0; while (size_t ch (size_t)*str) { hash hash * 131 ch; // 也可以乘以31、1…

把数组排成最小的数

题目&#xff1a;输入一个正整数数组&#xff0c;将它们连接起来排成一个数&#xff0c;输出能排出的所有数字中最小的一个。 举例&#xff1a;输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法&#xff0c;并证明该算法。 答&#xff1a;算法如下&…

【转】 vi常用操作

linux vi命令使用 功能最强大的编辑器——vi vi是所有UNIX系统都会提供的屏幕编辑器&#xff0c;它提供了一个视窗设备&#xff0c;通过它可以编辑文件。当然&#xff0c;对UNIX系统略有所知的人&#xff0c;或多或少都觉得vi超级难用&#xff0c;但vi是最基本的编辑器&#x…

tail的使用

最近找了下tail命令的使用方式&#xff0c;先总结下&#xff1a; tail -f filename 等同于--followdescriptor&#xff0c;根据文件描述符进行追踪&#xff0c;当文件改名或被删除后或者执行ctrlc后&#xff0c;停止追踪 例如&#xff1a;tail -f log/filename.txt ---该…

VS 使用 :新建项目

1.文件位置不放C盘 转载于:https://www.cnblogs.com/duanshouchang/p/10431829.html

C++基础知识友元friend、友元函数和友元类

为了在类之间进行数据共享时&#xff0c;提高效率&#xff0c;C引入了友元的概念。友元主要有三个方面的应用&#xff1a; 将普通函数声明为类的友元函数&#xff1b;将一个类声明为其他类的友元类&#xff1b;将一个类中的成员函数声明为其他类的友元函数。 下面分别介绍。 1、…

Expression Studio 3在windows7下安装失败

Expression Studio 3在windows7下安装失败 Microsoft刚刚发布了Expression Studio 3&#xff0c;我也刚刚下载下来&#xff0c;不过安装就出了问题 双击ExpressionStudio_Trial_en.exe开始解压&#xff0c;开始后就没有了响应&#xff0c;再双击&#xff0c;再解压&#xff0c;…

搞定Linux Shell文本处理工具,看完这篇集锦就够了(转)

Linux Shell是一种基本功&#xff0c;由于怪异的语法加之较差的可读性&#xff0c;通常被Python等脚本代替。既然是基本功&#xff0c;那就需要掌握&#xff0c;毕竟学习Shell脚本的过程中&#xff0c;还是能了解到很多Linux系统的内容。 Linux脚本大师不是人人都可以达到的&a…

出考研初试成绩之后

再次诈尸更新 特殊时期,只憋出来了点压抑的东西来. 考研 考研成绩出来之后就一直没有时间也没有心情写些什么了, 成绩并不好, 可以说是很差了, 好处也有, 就是不用对哪个学校再抱有幻想, 可以专心找工作了.   据说今年的计算机考研人数猛增, 分数也给抬到很高的位置, 以我政治…

Activit系列之---Activity的生命周期

Activity的生命周期 Hello,巴友们好&#xff0c;小菜我又来发博文啦。上篇文章给大家简单的介绍了一下Activity&#xff0c;以及如何创建一个最简单的Activity并且在上面显示hello android! 我们知道要创建一个自己的Activity就必须继承Activity这个类&#xff0c;并且实现它的…

C C++面试常问简答题(1)

1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存&#xff0c;new调用构造函数。malloc与free是C/C语言的标准库函数&#xff0c;new/delete是C的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言&#xff0c…

CSS hack:针对IE6,IE7,IE8,IE9,firefox显示不同效果

区别不同浏览器的CSS hack写法&#xff1a; 区别IE6与其它浏览器&#xff1a; background:orange;_background:blue; 区别IE6与IE7&#xff1a; background:green !important;background:blue; 区别IE6、IE7与FF&#xff1a; background:orange; *background:green…

CAP定理以及证明

历史 这个定理起源于柏克莱加州大学University of California, Berkeley的计算机科学家埃里克布鲁尔在2000年的分布式计算原则研讨会&#xff08;Symposium on Principles of Distributed Computing&#xff08;PODC&#xff09;&#xff09;上提出的一个猜想。 在2002年&…

java线程自带队列的使用以及线程阻塞

java线程&#xff0c;设置队列的大小实现队列阻塞 public class QueueThreads {private static int nThreads 4;//Runtime.getRuntime().availableProcessors() * 2 1;private static BlockingQueue<Runnable> queue new ArrayBlockingQueue<Runnable>(4);//队列…

init/inittab

一、什么是init  init是Linux系统操作中不可缺少的程序之一。 是一个由内核启动的用户级进程。  内核启动&#xff08;已经被载入内存&#xff0c;开始运行&#xff0c;并已初始化所有的设备驱动程序和数据结构等&#xff09;之后&#xff0c;就通过启动一个用户级程序init…

ASP.NET下QueryString不同字符编码间强制转换的解决方案

正常的情况下&#xff0c;现在asp.net的网站很多都直接使用UTF8来进行页面编码的&#xff0c;这与Javascript、缺省网站的编码是相同的&#xff0c;但是也有相当一部分采用GB2312。对于GB2312的网站如果直接用javascript进行ajax数据提交&#xff0c;例如&#xff1a;http://ww…

C C++面试常问简答题(2)

51.h头文件中的ifndef/define/endif 的作用&#xff1f; 答&#xff1a;防止该头文件被重复引用。 52.&#xff03;i nclude<file.h> 与 &#xff03;i nclude "file.h"的区别&#xff1f; 答&#xff1a;前者是从Standard Library的路径寻找和引用file.h&…

GDB 调试指南

大家好&#xff0c; 好久没给大家带来原创干货了&#xff0c;导致很多新来的小伙伴以为我这个号就是个机构号&#xff0c;其实不是&#xff0c;这个是个人号&#xff0c;背后的小编我是一个有血有肉有情怀的人&#xff0c;不管怎么样&#xff0c;我的目的是尽量带给大家优质的干…

ASP.NET MVC3 异步刷新

ASP.NET MVC3 异步刷新2011-08-13 09:51:53标签&#xff1a;MVC3 异步刷新 休闲 N Layer 职场原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://leelei.blog.51cto.com/856755/638408好久没…