右外连接(右连接)
全连接
2.3、笛卡尔积现象
当两张表进行连接查询时,没有任何条件的限制,如下:
select (字段1),(字段2) from (表1),(表2);
以上查询语句会导致出现"笛卡尔积现象"
当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是
两张表条数的乘积,这种现象被称为:笛卡尔积现象。(笛卡尔发现的,这是
一个数学现象。)
2.4、避免笛卡尔积现象
连接时加条件,满足这个条件的记录被筛选出来!
select 表1.(字段1),表2.(字段2)
from (表1),(表2)
where 表1.(部门表) = 表2.(部门表);
以上的连接条件是 表1 跟 表2 的部门相同,获取两表同一部门的字段数据,可以避免出现笛卡尔积现象
最终查询的结果条数是正确的条数,但是匹配的过程中,匹配的次数并没有减少,还是跟没有条件
的比较的次数一样,只不过进行了四选一进行了筛选。匹配次数并没有减少。
注意:
通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的
连接次数。
2.5、内连接之等值连接
例:查询某公司的员工名称与部门名称
SQL92语法:
select
e.(员工名称),d.(部门名称)
from
(员工所在部门表) e,(部门表) d
where
e.(员工部门) = d.(部门); // 条件是等量关系,所以被称为等值连接。
注意:取别名很重要,增加效率
sql92的缺点:
结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
SQL99语法:
select
e.(员工名称),d.(部门名称)
from
(员工所在部门表) e
inner join
(部门表) d
on
e.(员工部门) = d.(部门表); // 条件是等量关系,所以被称为等值连接。
inner关键字可以省略(带着inner可读性会更好,一眼就能看出来是内连接)
sql99优点:
表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where
SQL99语法:
select
…
from
a
join
b
on
a和b的连接条件
where
筛选条件
2.6、内连接之非等值连接
例:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?
select
e.(工名),e.(薪资),s.(薪资等级)
from
(员工表) e
inner join
(薪资等级表) s
on
e.(员工薪资) between s.(最低薪资) and s.(最高薪资);
// 条件不是一个等量关系,称为非等值连接。
2.7、内连接之自连接
例:查询员工的上级领导,要求显示员工名和对应的领导名?
自连接:
把一张表看作两张表来查询
员工表李包含了 领导的员工编号 与 每个员工的 上级领导编号
把一张员工表看作两张表,使用别名区分
第一张:(员工表) a 员工
第二章:(员工表) b 领导表
select
a.(名称) as ‘员工名’,b.(名称) as ‘领导名’;
from
(员工表) a
inner join
(员工表) b
on
a.(员工领导编号) = b.(领导的员工编号);
重点技巧:
一张表看做两张表。
2.8、外连接
外连接(右外连接):
select
e.(名称),d.(名称)
from
(员工表) e
right outer join // outer 是可以省略的,带着可读性强。
(部门表) d
on
e.(员工表部门) = d.(部门表部门);
right代表什么:
表示将join关键字右边的这张表看成主表,主要是为了将
这张表的数据全部查询出来,捎带着关联查询左边的表。
在外连接当中,两张表连接,产生了主次关系。
外连接(左外连接):
select
e.(名称),d.(名称)
from
(员工表) e
left outer join // outer 是可以省略的,带着可读性强。
(部门表) d
on
e.(员工表部门) = d.(部门表部门);
总结:
带有right的是右外连接,又叫做右连接。
带有left的是左外连接,又叫做左连接。
任何一个右连接都有左连接的写法。
任何一个左连接都有右连接的写法。
2.9、三,四张表连接
语法:
select
…
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
right join
d
on
a和d的连接条件
一条SQL中内连接和外连接可以混合。都可以出现!
3、子查询
3.1、什么是子查询
select语句中嵌套select语句,被嵌套的select语句称为子查询。
3.2、子查询都可以出现在哪里
select
…(select).
from
…(select).
where
…(select).
可以出现在 select 后面
可以出现在 from 后面
可以出现在 where 后面
3.3、where 子句中的子查询
例:找出比最低工资高的员工姓名和工资?以下错误案例:
select
(姓名),(工资)
from
(员工表)
where
(工资) > min(工资);
以上是错误的,因为在 where 子句中不能直接使用分组函数,可以使用子查询
先分析题目:
第一步:查询最低工资是多少
select min(工资) from (表);
第二步:找出>最低工资的
select (姓名),(工资) from (员工表) where (工资) > (第一步的结果)//最低工资
第三步:合并
select
(姓名),(工资)
from
(员工表)
where
(工资) > (select min(工资) from (员工表)); // > 最低工资
3.4、from 子句中的子查询
注意:
from后面的子查询,可以将子查询的查询结果当做一张临时表。(技巧)
例:找出每个岗位的平均工资的薪资等级。
第一步:找出每个岗位的平均工资(按照岗位分组求平均值)
select
(岗位),avg((工资))
from
(员工表)
group by
(岗位); //按照岗位分组
第二步:把以上的查询结果就当做一张真实存在的表t。
select * from salgrade;//工资等级 s表
第三步:t表和s表进行表连接,
条件:t表avg(工资) between s.(最低工资) and s.(最高工资);
select
t.*,s.(等级)
from
(select (岗位),avg(工资) as avgsal from (员工表) group by (岗位)) t // 别名 t
join
(工资等级表) s
on
t.avgasl between s.(最低工资) and s.(最高工资);
3.5、select 后面出现的子查询(了解)
例:找出每个员工员工名称,部门编号,部门名称
select
e.(员工姓名),e.(部门编号),
(select d.(部门名称) from (部门表) d
where e.部门编号 = d.(部门编号)) as dname
from
(员工表) e;
以上 select 出现子查询查出了 部门名称
以下错误案例:
select
e.(员工姓名),e.(部门编号),
(select (部门名称) from (部门表)) as dname
from
(员工表) e;
注意:
对于select后面的子查询来说,这个子查询只能一次返回1条结果,
多于1条,就会报错
4,union 合并查询结果集
例:查询工作岗位是MANAGER和SALESMAN的员工
平常写法:
select
(姓名),(岗位)
from
(员工表)
where
(岗位) = ‘MANAGER’ or (岗位) = ‘SALESMAN’;
//或者
select
(姓名),(岗位)
from
(员工表)
where
(岗位) in(‘MANAGER’,‘SALESMAN’);
使用 union 合并查询
select (姓名),(岗位) from (员工表) where (岗位) = ‘MANAGER’
union
select (姓名),(岗位) from (员工表) where (岗位) = ‘SALESMAN’;
相比较:
union的效率要高一些。对于表连接来说,每连接一次新 表,
则匹配的次数满足笛卡尔积,成倍的翻。。。
但是union可以减少匹配的次数。在减少匹配次数的情况下,
还可以完成两个结果集的拼接。
匹配次数:
a 连接 b 连接 c
a 10条记录
b 10条记录
c 10条记录
匹配次数是:1000
a 连接 b一个结果:10 * 10 --> 100次
a 连接 c一个结果:10 * 10 --> 100次
使用union的话是:100次 + 100次 = 200次。
(union把乘法变成了加法运算)
union注意事项:
1、union在进行结果集合并的时候,要求两个结果集的列数相同。以下错误案例:
select (姓名),(岗位) from (员工表) where (岗位) = ‘MANAGER’
union
select (姓名) from (员工表) where (岗位) = ‘SALESMAN’;
2、结果集合并时列和列的数据类型也要一致。
在MySQL里面可以,oracle 语法比较严格,不可以
5、limit(重要)
5.1、limit作用
作用:
将查询结果集的一部分取出来。通常使用在分页查询当中。
例如:
百度默认:一页显示10条记录。
分页的作用:
为了提高用户的体验,因为一次全部都查出来,用户体验差。
分页可以一页一页翻页看。(类似百度的页数)
5.2、limit的用法
完整用法:
limit startIndex, length
//startIndex是起始下标,length是长度。
//起始下标从0开始。
缺省用法:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们
目录:
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
Java面试核心知识点
已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-bRmv3tdl-1711710347346)]
[外链图片转存中…(img-RSfc9x9X-1711710347346)]
[外链图片转存中…(img-hF2d4QTC-1711710347347)]
[外链图片转存中…(img-OZl8P70M-1711710347348)]
[外链图片转存中…(img-f4khq7DH-1711710347348)]
[外链图片转存中…(img-6HbsNs9K-1711710347349)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-WspAAbOo-1711710347349)]
最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们
目录:
[外链图片转存中…(img-HeKMCfX7-1711710347350)]
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
[外链图片转存中…(img-4NUkZ7E8-1711710347350)]
Java面试核心知识点
已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了
[外链图片转存中…(img-pHudXCkx-1711710347350)]