sql中的几种连接类型
一、连接类型简介
在sql中单表查询的几率相对来说比较少,随着数据库的日益复杂,多表关联的情况越来越多,在多表关联的情况下存在多种关联的类型,
1、自关联(join或inner join)
2、左外关联(left join或left outer join)
3、右外关联(right join或right outer join)
4、全关联(full join)
二、各种关联的使用
为了更形象的说明这几种连接类型的使用场景及用法,下面以学生表(student)和学生选课表(course)表来演示,其表结构及数据如下图,
上面是两张表的结构及数据。
1、自关联
有时需要得到完整的数据,我们需要关联两个或两个以上的表,这时候便用到了自关联,其中自关联可以有下面两种写法,其一,
select s.s_id,s_name,c.c_name from student s,course c where s.s_id=c.s_id
运行上面的语句得到的结果如下,
其二的sql语句写法如下,
select s.s_id,s_name,c.c_name from student s join course c on s.s_id=c.s_id;
运行上面的语句得到的结果如下,
从上面的结果,可以看到两种写法的结果是一样的,同时也可以得出这样一个结论:自关联过滤出的数据必须满足在左表和右表都符合条件,这里的条件只的s.s_id=c.s_id,也就是说s_id必须同时存在于两个表中才会出现在结果中。
那么针对上面的两种写法哪种更好,这里认为哪种最好,适合的就是最好的。
对于自关联来说,有个重要的问题需要注意那就是笛卡尔积,自关联如果忘记写关联条件就会出现笛卡尔积的情况 ,关于笛卡尔积的情况,可以自查资料,这里以第二种sql写法演示笛卡儿积的出现,
select s.s_id,s_name,c.c_name from student s join course c ;
结果如下,
写法即未加过滤条件(未加on或where条件),这样出来的结果为两个表中的数据行数的乘积,即4X5=20行,这就是笛卡儿积。
2、左外关联/右外关联
左外关联和右外关联其实可以看作同一种写法,在使用上可以相互转化。左外关联即以左表为基本表,会展示所有的左表中的数据,如果在右表中没有匹配的数据便为null,右外关联刚好相反,
左外关联,
select s.s_id,s_name,c.c_name from student s left join course c
on s.s_id=c.s_id;
运行结果如下,
可以看到结果数据集只有4行即为左表中的数据,但可以看到c_name列为null,这是因为在右表中没有匹配的s_id为1004的记录,所以此列为null。
右关联
select s.s_id,s_name,c.c_name,c.s_id as c_s_id from student s right join course c
on s.s_id=c.s_id;
运行的结果如下,
可以看出结果集为5行数据,即为右表中的数据,以右表为基本表。结果中的为null的数据列是因为在左表中没有匹配的记录,所以为null。
3、全关联
全关联是只要其中某个表存在匹配的记录,便会返回行。
这里是mysql的环境,暂无法给出实例。
有不当之处请指正,感谢!
由于这里的环境是mysql,mysql不支持full join的方式,这里暂不给出实例。
sql中的几种连接类型的更多相关文章
- SQL中的四种连接方式
转自:http://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html 联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指 ...
- SQL中的5种聚集函数
作为一个刚毕业进入这行的菜鸟,婶婶的觉的那种大神.大牛到底是怎样炼成的啊,我这小菜鸟感觉这TMD要学的东西这多啊,然后就给自己定了许多许多要学习的东西,可是有人又不停地给你灌输:东西不在多而要精通!我 ...
- .net连接sql server的几种连接字符串的写法
.net连接sql server的几种连接字符串的写法 1, 混合验证模式登录 server=电脑名 或 电脑IP;database=数据库名;uid=数据库登录名;password=数据库登录密码 ...
- Java中的两种异常类型及其区别?
Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...
- Sort merge join、Nested loops、Hash join(三种连接类型)
目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed ...
- SQL中字符串截取、连接、替换等函数的用法
一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...
- SQL 中的日期和时间类型
在我们SQL中一般支持三种数据类型. date:日历日期,包括年(四位),月和日. time: 一天中的时间,包括小时,分和秒.可以用变量time(p)来表示秒的小数点后的数字位数(默认是0). 通过 ...
- SQL语句的四种连接
SQL的四种连接查询 内连接 inner join 或者 join 外连接 左连接 left join 或者 left outer join 右连接 right join 或者 right ou ...
- 【SQL】SQL中笛卡尔积、内连接、外连接的数据演示
SQL的查询语句中,常使用到内连接.外连接,以及连接的基础--笛卡尔积运算. 在简单的SQL中,也许我们还分辨清楚数据如何连接,一旦查询复杂了,脑子也犯浆糊了,迷迷糊糊的. 本文,简单以数据形式记录连 ...
随机推荐
- Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】
任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...
- protected internal 和internal 区别
private:只能在本类中使用protected:在本类中及其子类中可以使用 可以跨程序集 internal:同一命名空间(程序集)中的类可以使用 限定的是只有在同一个程序集中才可以访问,可以跨 ...
- python2.7 安装Django
目前Django最新版是2.0,不支持Python2,在使用pip 安装的时候会报错,pip默认安装的是最新的稳定版本 使用pip指定安装的版本:pip install django==1.11.4 ...
- 关于最新版AFNetworking(3.0)上传多张图片的问题
最新版的AF已经废弃了很多以前的类,所以很多以前的方法都不能用了,当然最主要还是为了适应ipV6所做的更改.楼主最近正在写多张图片上传,碰到了一些问题,解决之后直接封装了一个方法,废话有点多了,上代码 ...
- AngularJS 表单验证小结
注:本文所述的表单验证即AngularJS自带的表单验证,无需引入第三方的插件 一.常用的验证特性标签 1.非空 为input加入一个required属性即可,例如: <input type=& ...
- CSS技巧之向下箭头
思路:使用◇符号(可在输入法的软键盘找到该符号),使用定位选择位置,并隐藏溢出的上半部分细点:1.使用i标签的楷体属性把◇变大2.给i只有◇符号一半的高度,并隐藏溢出,正常显示一个向上箭头3.对s使用 ...
- Oracle的分析函数
Oracle的分析函数row_number(),rank(),dense_rank()的用法与区别 比如查询工资排名第7的员工信息,可以用分析函数来做. --查询工资排名第7的员工信息select * ...
- Centos7单网卡带VLAN多IP配置
1.需要使用到vconfig软件,首先yum安装vconfig: 使用指令yum install vconfig:(若是本机找不到vconfig安装包,可以通过其他centos7安装yum-utils ...
- 面试:Hbase和Hive的区别
区别: 1. Hive是一个构建在Hadoop基础设施之上的数据仓库,通过HQL查询存放在HDFS上的数据,不能交互查询.HBase是一种Key/Value系统,它运行在HDFS之上,可以交互查询. ...
- Linux3.5—视屏模块学习与分析
插入USB摄像头后,我看到了识别出的一些信息,在内核源码中搜到了相关信息: 搜索之后,在uvc_driver.c 帮助文档:linux-3.5/Documentation/video4linux/v4 ...