昨天博主去vivo日常实习面试了,作为处女面,只能说深刻意识到了自己的不足,接着加油吧!
内连接查询的是两张表中交集的部分,分为隐式内连接和显示内连接。
隐式内连接:
select 字段名 from 表1, 表2, …… where 条件
这里的条件一般就是去除无效的笛卡尔积。
显示内连接:
select 字段名 from 表1 inner join 表2 on 条件
这里的条件一般也是去除无效的笛卡尔积。
两者的区别主要在于语法上的实现不同,并且显示内连接更符合现在的编写规范。
对比如下:
select emp.name, dept.name from emp, dept where emp.dept_id = dept.id
select emp.name, dept.name from emp inner join dept on emp.dept_id = dept.id
两者实现的功能是一样的。
分为左外连接和右外连接。如果用集合的方式去演示的话,左外连接是A,右外连接是B,同时可以查询到A∩B。
左外连接与右外连接(上下语句)
select 字段名 from 表1 left outer join 表2 on 条件
select 字段名 from 表1 right outer join 表2 on 条件
这里的outer可以省略。
注意:left就是通过左边查右边的交集,right是通过右边查左边的交集。在工程上一般使用left(左外),因为右外可以转换成左外。只需要把右外的两张表掉个个就行了。
顾名思义,就是一张表自己连接自己,这种连接可以是内连接外连接,可以是左外、右外。
那么什么情况下要用到自连接呢?
比如一个企业有四个员工ABCD,A是B和C的领导,B是D的领导,但同时ABCD都是一个企业的员工。也就是说在一张表中,ABCD既作为员工存在,又可能作为领导存在,运用单表查询是查不出对应的复杂关系的。
因为自连接可以是内连接可以是外连接,所以要根据不同的情况去选择不同的语法。
比如:
select a.name, b.name from emp a, emp b where a.managerid = b.id
这条语句的意思就是在emp表中查询员工的姓名和对应领导的姓名。
下面做个比较:
select a.name, b.name from emp a left join emp b on a.managerid = b.id
这条语句和上面的语句区别在哪里呢?
不难看出来,一个是内连接,一个是左外连接。但是在具体的情况里好像并没有什么不同呀?
实则不然,内连接是查询两张数据表的交集部分,在这个情况下,只能查询出有领导的员工而不能查询出无领导的员工。而外连接就可以解决这个问题,比如一个公司的老板是没有所属领导的,通过内连接会忽略老板,但是通过外连接就能查询出老板的信息了。
很简单的理解一下,就是把查询出来的结果合并到一起。
select 字段名 from 表名 where 条件
union [all]
select 字段名 from 表名 where 条件
all可加可不加,加了的话是不会去重的,意思就是重复查询的数据会直接保留,但是如果不加all,就会自动去重。
对于单张表来说,和单表查询的where条件语句没有太大区别,就是查询的数据顺序不太一样。
注意:如果查询的列数不一致会报错哦!