sqlserver练习----涉及多个表的连接查询

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: sqlserver练习----涉及多个表的连接查询

等值联接


多表查询语句中的连接条件使用的是等号,例:Student.Sno=SC.Sno


例:


Student

image.png


image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png

SC:


image.png

查询每个学生及其选修课程的情况


select Student.*,SC.*
from Student,SC
where Student.Sno=SC.Sno;

查询选修2号课程且成绩在88分以上的所有学生的学号和姓名


select Student.Sno,Sname
from Student,SC
where Student.Sno=SC.Sno
and SC.Cno='2'
and SC.Grade>'88';

对于”select Student.Sno,Sname“,Sno在两张表都出现了,所以必须加上表名或者别名前缀,Sname只在Student表中出现,引用时可以去掉。


等值连接和自然连接的区别:


1.自然连接一定是等值连接,但等值连接不一定是自然连接。


例如在数据库中:


S:

image.png


image.png

R:


image.png

等值连接(S.A=R.C)

image.png

等值连接(S.B=R.B)


image.png

自然连接


image.png

2.等值连接要求相等的分量,不一定是公共属性;而自然连接要求相等的分量必须是公共属性。


3.等值连接不把重复的属性除去;而自然连接要把重复的属性除去。所以等值连接将目标列重复的属性列去掉,就是自然连接


注:


两个关系R和S在做自然联接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组(悬挂元组)在操作时被舍弃了,这些被舍弃的元组称为悬浮元组,又称为悬挂元组。


例如:S中的5,9     R中的7,2


补充:


半连接:关系R和S的半连接是R和S的自然连接在关系R的属性集上的投影


关系R


image.png

关系S


image.png


image.png


image.png



image.png


非等值联接:多表查询语句中的连接条件不是使用等号


例如:下面的between..and...,就表示员工表(emp)中员工的工资,不能超过职级表(jg)中的最高工资,不能低于其最低工资。


SELECT emp.employee_id, emp.last_name, jg.grade_level

FROM employees emp, job_grades jg

WHERE emp.salary BETWEEN jg.lowest_sal AND jg.highest_sal;

自身连接(自连接)


一个表与其自己进行连接,由于属性名都是同名属性,因此需要给表起别名前缀


SPJ表:



检索至少使用了零件编号为P3,P5的工程编号JNO


法一:使用where

select distinct X.JNO
from SPJ AS X,SPJ AS Y
WHERE X.JNO=Y.JNO
AND X.PNO='P3'
AND Y.PNO='P5';

法二:使用 inner join ....on(也可以使用join.....on)


select distinct X.JNO
from SPJ X inner join SPJ Y
on X.JNO=Y.JNO
where X.PNO='P3'
and Y.PNO='P5';

外连接:(left/right/full)outer join...on

还是用开头的例子:


Student:


image.png

SC:


image.png


left outer join....on


左外连接,LEFT OUTER JOIN,告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表的不匹配行,即将左边表的悬浮元组保存在结果关系中,而其他属性填上空值。左外连接实际上可以表示为:


左外连接 = 内连接 + 左边表中失配的元组

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student LEFT OUTER JOIN SC
ON (Student.Sno=SC.Sno);


right outer join..on


右外连接(RIGHT OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)右边表的不匹配行,即将右边表中的悬浮元组保留下来,而在其他属性上填入空值。右外连接实际上可以表示为:


右外连接 = 内连接 + 右边表中失配的元组


full outer join..on


全外连接,FULL OUTER JOIN,告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表和右边表的不匹配行,即把两张表的悬浮元组都保留下来,其他属性填为空值。全外连接实际上可以表示为:


全外连接 = 内连接 + 左边表中失配的元组 + 右边表中失配的元组。



这个例子展现的关系不明显,在举一个例子:


关系R:


image.png

关系S:


image.png

左外连接:


image.png

右外连接:

image.png


全外连接:


image.png


外部并:


两个关系R和S在做并操作时,构成的新关系属性由R和S的所有属性组成(公共属性只取一次),新关系的元组由属于R或属于S的元组构成,同时元组在新增加的属性上填空值。


image.png

交叉连接CROSS JOIN


结果包含所有连接表中的所有可能的行组合,交叉连接返回的是两个表的笛卡尔积


例:

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student CROSS JOIN SC

将会返回所有可能的组合



如果加上“where (Student.Sno=SC.Sno);”


select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade

from Student  cross JOIN SC

where (Student.Sno=SC.Sno);

结果:



我们发现,将cross join换成“,”(逗号)效果相同


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
1月前
|
SQL
sql server链接查询
sql server链接查询
|
1月前
|
SQL
sql server简单查询
sql server简单查询
|
9天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
6天前
|
SQL 存储 关系型数据库
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)
ArcGIS Engine连接ArcSDE SQL Server(获得所有SDE图层)
|
1月前
|
SQL Java 网络安全
实时计算 Flink版操作报错合集之SQLserver表没有主键,同步的时候报错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
43 1
|
23天前
|
SQL 数据库 索引
sql server 跨数据库查询
在 SQL Server 中,跨数据库查询是指在一个数据库查询中访问另一个数据库的数据。这通常是在同一 SQL Server 实例上的不同数据库之间进行的。跨数据库查询在很多场景下都很有用,比如数据整
|
1月前
|
SQL Kubernetes 数据库
实时计算 Flink版操作报错合集之查询sqlserver ,全量阶段出现报错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
32 0
|
1月前
|
SQL 缓存 Java
实时计算 Flink版产品使用合集之flink-connector-mysql-cdc 和 flink-connector-sqlserver-cdc 这两个CDC连接器只能选择其中一个使用吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
163 0
|
1月前
|
SQL 数据库
sql server高级查询,看这篇文章就够了
sql server高级查询,看这篇文章就够了