一个sql自学网站的整理笔记
LEFT JOIN保留A的所有行,不管有没有能匹配上B(元组记录不匹配连接条件上在输出时表现为null)
反过来 RIGHT JOIN则保留所有B里的行。
最后FULL JOIN 不管有没有匹配上,同时保留A和B里的所有行
运用题目理解一下:
用两个新的表雇员表 Employees 和 办公室表 Buildings.
注意:有一些办公室是新的,还没有雇员.
题目:找到所有办公室里的所有角色(包含没有雇员的),并做唯一输出(DISTINCT)
分析:题目中,主表是办公室,要求输出符合条件的角色
主表是哪个很关键,因为这对应left join,right join用法
SELECT distinct role ,Building_name FROM //要求包含没有雇员,employees中的building都是有雇员的不能用,因此这里用Building_nameBuildings left join employees//这里employees 中的元组若符合连接条件则输出记录,同时要保留主表Buildings的所有行ON building_name =building//连接条件
总结:从题目中,辨别出查询要求后,要明确查询的字段,不同字段对应不同查询要求。
例如:此题包含没有雇员的,那么employees中的building都是有雇员的,不能用来当作查询字段,所以用SELECT distinct role ,Building_name FROM Buildings
查询结果:
题目2:找到还没有雇员的办公室
分析:确定主表办公室,可以先连接起来,再从输出要求出发一步步修改
思考过程:
1、先连接两个表
SELECT *FROM Buildings left join employeeson Building_name = Building
输出结果
2、先连接两个表后,从上图分析,根据连接条件Building_name = Building,Buildings 表中有些办公室的Building_name 连接不到employees表的Building(即有些办公室没雇员),存在两种办公室无雇员的记录。
由于主表是办公室Buildings,要保留办公室的所有行,所以employees表仍然与这两种办公室记录相连,但这两条数据的building 就会显示为null了
SELECT *FROM Buildings left join employeeson Building_name = Buildingwhere building is null
输出结果
3、再使用distinct 去重,按题目要求输出Building_name字段
SELECT distinct Building_nameFROM Buildings left join employeeson Building_name = Buildingwhere building is null
结果:
最后:
欢迎大家阅读,本人萌新还在学数据库,写的博客难免有错误或者疏忽的地方,还望各位同志在评论区多多指点,欢迎各位在评论区的留言或指导,在此表示感激不尽。