失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Oracle - 【连接1】广义笛卡儿积+一般连接+自连接

Oracle - 【连接1】广义笛卡儿积+一般连接+自连接

时间:2024-05-14 18:14:37

相关推荐

Oracle - 【连接1】广义笛卡儿积+一般连接+自连接

SQL语句基本执行顺序:

FROM...

JOIN...ON...

WHERE...

SELECT...

DISTINCT...(列名)

ORDER BY...(ASC/DESC)

一:广义笛卡儿积(无条件连接)

例1:求学生表和课程表的广义笛卡尔积

SELECT * FROM STUDENT, COURSE;

解析:

学生表的每一条记录都要和课程表的所有记录进行连接,产生一条新的

记录,且两张表的所有字段都出现在返回结果中

二:一般连接(有条件连接)

0.注意事项:

之所以叫有条件连接,是在广义笛卡尔积的基础上通过给定的条件对合成结果进一步进行筛选/限定:

SQL语法:AAAJOINBBBON AAA.name=BBB.name

1.两个表的连接

例3-31:(连接查询与表的别名) 求选修了课程的学生的学生姓名、课程号和成绩。

SELECT S1.SNAME,O,S2.SCORE FROM STUDENT S1 JOIN SCORE S2ON S1.SNO = S2.SNO;

解析:

将Student表和Score表按照两个表共有属性列SNO将其连起来,这里连起来使用的是两个表的别名S1和S2,这里的别名在SQL语句的开头也有使用。

2.三个表的连接

例3-30:(连接查询) 求选修了课程001且成绩在70分以下或成绩在90分以上的学生的姓名、课程名称和成绩。

SELECT S1.SNAME,AME,S2.SCORE FROM STUDENT S1 JOIN (COURSE C JOIN SCORE S2ON O=O)ON S1.SNO=S2.SNOWHERE O='001' AND S2.SCORE NOT BETWEEN 70 AND 90;

解析:

由上图可以看出:三个表中没有同一个属性列,这里我们首先将其中的两个表连接为一个整体(语句的红色部分)再与第三个表Student(S1)进行连接;

3.表的别名(from后声明,声明后的别名可在本条语句的任何位置使用)

三:自连接

例3-32:(自身连接查询) 求年龄大于 ’李丽’ 的所有学生的姓名、系和年龄。

SELECT S2.SNAME,S2.SDEPT,S2.SAGE FROM STUDENT S1 JOIN STUDENT S2ON S1.SNO!=S2.SNOWHERES1.SNAME='李丽'ANDS2.SAGE>S1.SAGE;

解析:

将一个表通过别名与自己进行连接,将其中的一个表S2作为数据的查询表另一个作为比较表

(可按照开头的SQL语句执行顺序进行分析)

上面的例3-32也可以通过子查询的方式求解:

SELECT SNAME,SDEPT,SAGE FROM STUDENT WHERE SAGE>(SELECT SAGE FROM STUDENT WHERE SNAME='李丽');

如果觉得《Oracle - 【连接1】广义笛卡儿积+一般连接+自连接》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。