请教大家一个有些SQL里面INNER JOIN的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教大家一个有些SQL里面INNER JOIN的问题相关的知识,希望对你有一定的参考价值。

如题,数据库里面有一个名为Category和Film的表,其中Category表下面的Category字段存储电影的类别名,CategoryId则是类别名的对应编号,具体如下,有一个查询要求如下,列出所有电影类名为Historical的电影的电影名,发布时间及评分,书上给出的一个SQL答案是:
SELECT FilmName, YearReleased, Rating
FROM Films JOIN Category
ON Films.CategoryId = Category.CategoryId
WHERE Category.CategoryId = 6; //A
可是我总感觉A行应该写成WHERE Category.Category='Historical',我运行过了,换成我的这个语句执行结果是一样的。
另外第二个问题是ON关键字后面所跟的是不是也是一个条件,还是Films.CategoryId=Category.CategoryId这个语句是一个赋值表达式?SQL里面对等号和赋值符号的使用太模糊了,有时真的不知道在说什么

参考技术A 1. Category.CategoryId = 6 和 Category.Category='Historical' 结果一致,那说明
这2个都能唯一识别,是同一行的数据,就比如说你的身份证号代表你一样,6 就代表了 'Historical'

2. 此语法是内连接的写法,等价于:
SELECT FilmName, YearReleased, Rating
FROM Films, Category
WHERE Category.CategoryId = 6 and Films.CategoryId = Category.CategoryId

所以Films.CategoryId=Category.CategoryId 是连接条件,不是 赋值
;
参考技术B 其实 就是在Category table 中‘Historical 对应的Categoryid是6, 所以在where condition下使用 Category.CategoryId = 6 和使用 Category.Category='Historical' 是等价的。
on 后面是join的条件。
还有这里的join 其实就是inner join。inner join的inner 可以省略。追问

可是题目的要求是列出所有电影类名为Historical的电影的电影名,发布时间及评分并不是根据电影类名ID来列出所有的相关信息啊

SQL表连接查询(inner join(join)full joinleft joinright join)

下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

  • JOIN: 如果表中有至少一个匹配,则返回行(join=inner join)
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行
  • cross join:笛卡尔积,N*M

 

前提条件:假设有两个表,一个是学生表,一个是学生成绩表。

 

 表的数据有:

 

  

一、内连接-inner jion :

最常见的连接查询可能是这样,查出学生的名字和成绩:

select s.name,m.mark from student s,mark m where s.id=m.studentid

上面就是我们最常见的inner join,即内连接,把符合student.id=mark.studentid 条件的元组才选出来,也可以写成:

select s.name,m.mark from student s inner join mark m on s.id=m.studentid

符合条件的只有两条结果,查出结果为:

 

二、左连接-left join:

左连接是把左边的表的元组全部选出来:

select s.name,m.mark from student s left join mark m on s.id=m.studentid

上面语句就是把左边的表,即student表中的元组全部选出,尽管有些分数表是没数据的,也选了出来,选出的结果为:

 

三、右连接-right join:

右连接就是把右边表的数据全部取出,不管左边的表是否有匹配的数据:

select s.name,m.mark from student s right join mark m on s.id=m.studentid

上面的语句就是把mark分数表的数据全部取出来,不管student表中是否有数据匹配,如下图所示:

 

四、全连接-full join:

把左右两个表的数据都取出来,不管是否匹配:

select s.name,m.mark from student s full join mark m on s.id=m.studentid

如下图所示,学生表和成绩表的数据都取了出来:

 

 

五、笛卡儿积-cross join:

select s.name,m.mark from student s cross join mark m 

如下图所示,学生表和成绩表的数据都取了出来:

 

比较常用的是第一种,内连接,而且是用这种写法:

select s.name,m.mark from student s,mark m where s.id=m.studentid

以上是关于请教大家一个有些SQL里面INNER JOIN的问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL中inner joinouter join和cross join的区别

SQL中inner joinouter join和cross join的区别

SQL中inner joinouter join和cross join的区别

SQL中inner joinouter join和cross join的区别

JPQL 的 INNER JOIN 问题(即使 SQL 请求正在运行)

Sql inner join