所谓的内连接操作就是在表关系的笛卡尔积中,保留表关系中所有匹配的数据记录,然后去掉不匹配的数据记录。内连接操作的执行,是先生成笛卡尔积,再在其中按照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;