内连接(INNER)

所谓的内连接操作就是在表关系的笛卡尔积中,保留表关系中所有匹配的数据记录,然后去掉不匹配的数据记录。内连接操作的执行,是先生成笛卡尔积,再在其中按照on过滤条件进行数据的匹配操作。所以内连接的运算量也是非常大的。
内连接按照匹配条件可分为等值连接、自然连接(natural join)、不等值连接。

在设计内连接查询时,强调几点:
 表之间一定要有连接字段。
 查询结果的多个列来源于不同的表,需要在列名称前加 表名称作为前缀。
 为了简化书写,可以给表指定别名,格式为:SELECT … FROM 表名 表别名
表的别名和原表名之间要加空格分开。

在from子句中使用[Inner] join:
select 字段1, 字段2, …,字段n From 连接表1 [as 表别名1] [Inner] join 连接表2 [as 表别名2] on 连接条件;
Ø 在连接语句中只写join,而不写是哪类连接时,默认为是内连接(INNER JOIN) 。 即内连接的inner关键字可以省略。若不写匹配条件时,默认为是自然连接
Ø 连接条件on子句不可省略,否则结果出错或是交叉连接。
Ø 如果on子句中的条件的列是同名的列,可写为using(列名)。比如“on a.学号=b.学号”可写为“using(学号)”。
Ø 内连接操作中指定的过滤条件写在on子句中和where子句中没有任何区别。故where过滤条件可以与on合并,都写到on子句中。或者在on子句之后再用where子句写出筛选条件。

2语法形式:select 字段1,字段2,,,字段n from 连接表1 [as表别名1],连接表2 [as表别名2] where 连接条件;
在from子句中利用逗号分隔多个表,在where 子句中设置连接条件。
Ø 此写法不用写[Inner] join. 直接在from子句中列出所有表,表名之间用逗号分隔。
Ø 此写法没有join, 故不能出现on子句。也不能用using(sno)写法。
Ø 内连接操作结果集的筛选条件也写在where子句中。只写一个where,多个条件用and或or连接。
Ø 此写法中不可没有where,否则如果在此方案中不写where子句时,则结果为cross join.。
Ø 在较高版本的mysql中已经不用此语句!

内连接的等值连接 (INNER JOIN)
当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询,得到存放在多个表中的记录数据。
所谓表中相同意义的字段,是指在多个表中字段名不一定相同,但取值的含义相同,这是表之间实现连接查询的前提。
等号=或安全等号<=>,根据每个表共有列的列 值匹配两个表中的行,其查询结果仅包含符合查询条件和连接 条件的行。即查询结果为两个表的交集。
SELECT tableA.select_list, tableB.select_list FROM tableA INNER JOIN tableB
ON tableA.Key1 = tableB.Key2;

自然连接 (natural join)
所谓内连接查询的自然连接(natural join)操作就是在表关系的笛卡尔积中,首先根据表关系中所有相同名称的字段且值都相同的记录自动进行匹配,然后去掉重复的字段。
自然连接(natural join )相当于inner join 与using 的组合。

自然连接的特点:
1.会自动判断相同名称的字段,自动进行记录匹配。
2.可以指定新关系中包含的字段,但不能设定进行记录匹配时的条件。
3.自动进行记录匹配的共同字段必只出现一次。
注:同样外连接中有natural left join 与natural right join .natural left join 相当于leftjoin 与using 的组合,natural right join 相当于right join 与using 的组合。

自然连接(natural join )的SQL语句:
select 字段名1,字段名n from 连接表1 [as表别名1] natural jonn 连接表2 [as表别名2];
上面的自然连接语句相当于如下内连接语句:
select 字段名1,字段名n from 连接表1 [as表别名1] inner join 连接表2 [as表别名2]
On表1.字段=表2.同名字段; 相当于using (同名字段)

三表等值连接查询
当多个表中两两之间存在相同意义的字段时,便可以通过这些字段对多表进行连接查询,得到存放在多个表中的记录数据。
所谓表中相同意义的字段,是指在多个表中字段名不一定相同,但取值的含义相同,这是表之间实现连接查询的前提。
三表连接查询使用情况:
Ø 对于三个表:表 A、表 B和表 C ,如果A与B没有共同内容的字段,不能建立直接的联系,而它们都与C有共同内容的字段,此时可以用C作为桥梁,将A与B建立连接。
Ø 查询的内容来自三个表。三个表 A、 B和 C 的连接,需要有两个连接语句join。

内连接的不等值连接示意图
所谓不等值连接操作就是表关系的笛卡尔积中,设置带“!=”或“<>”、“<”、“>”、“<=”、“>=”等的条件,选择所匹配字段值不相等的记录。在实际中的应用场景很少。

用inner join的写法的优点
1.不仅可以按照实际需求实现到left join(左外联)或right join(右外联)的自由转化,而且注明了结合时的顺序, 特别是支持了SQL优化的方便。
2. 当某个字段可以为null的时候,第二种查询方法得出的值其实是不完全的。比如说A、B、C三表连接时,当table C 的连接字段并非必填的时候,可以出现null值,只能通过左外连接(left join)来实现我们需要的效果。即此时连接后某人可以只有前两列的值,而其余列的值是null.

自连接,是表与自己的连接。自连接查询是一种特殊的多表查询。
在from子句中使用Cross join: select s., t. from student s cross join student t;
在表自己与自己做交叉连接时,必须要给表指定别名。
SQL语法 2: select s., t. from student s, student t;

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Mysql数据库中左连接left join、右连接right join和内连接inner join的介绍和演示: 1. 左连接left join 左连接left join会返回左表中所有的记录,以及右表中符合条件的记录。如果右表中没有符合条件的记录,则返回NULL。 语法: ``` SELECT * FROM a_table LEFT JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有学生的姓名和成绩,如果学生没有成绩,则成绩为NULL。 ```sql SELECT students.name, scores.score FROM students LEFT JOIN scores ON students.id = scores.id; ``` 2. 右连接right join 右连接right join会返回右表中所有的记录,以及左表中符合条件的记录。如果左表中没有符合条件的记录,则返回NULL。 语法: ``` SELECT * FROM a_table RIGHT JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有成绩和对应的学生姓名,如果成绩表中没有对应的学生,则姓名为NULL。 ```sql SELECT students.name, scores.score FROM students RIGHT JOIN scores ON students.id = scores.id; ``` 3. 内连接inner join 内连接inner join会返回左右表中都符合条件的记录。 语法: ``` SELECT * FROM a_table INNER JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有有成绩的学生的姓名和成绩。 ```sql SELECT students.name, scores.score FROM students INNER JOIN scores ON students.id = scores.id; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值