本文主要介绍了关于MySQL关联表查询的相关信息,通过示例代码进行了非常详细的介绍,对大家学习或使用MySQL有一定的参考价值。有需要的话一起学吧。
MySql会使用关联表查询,初学者可能很难理解。下面这篇文章就给大家详细介绍一下MySQL关联表查询的相关内容,分享出来供大家参考。下面不多说了。我们来看看详细的介绍。
关系数据库,表之间有各种引用和关联。这些关联是通过匹配主键和外键形成的。所以在取数据的时候,在大的情况下,单个表是满足不了需求的,需要将其他表加入到查询中来获取额外的数据,这就是JOIN关键字完成的操作。
MySQL JOIN、CROSS JOIN和INNER JOIN在语法和功能上是完全相同的,可以互换,而在SQL standard中,INNER JOIN需要与ON语句相匹配。
在多表联合查询中,可以省略join关键字,用逗号分隔多个表。此时,默认情况下,它将被视为内部连接。举个例子,
选择表1。*,
表2。*
从表1中,
表2;
相当于:
选择表1。*,
表2。*
来自表1
内部联接表2;
但是这种由逗号隐式指定的形式的关联表的优先级低于由关键字直接指定的(INNER JOIN,CROSS JOIN,LEFT JOIN)。因此,t1,t2 JOIN t3将被解释为(t1,(t2 JOIN t3))而不是((t1,t2) JOIN t3)。
需要注意的是
,逗号形式与其他关联关键字组合时,指定关联条件时会报错,如on condition。ON指定的关联表条件的语法与WHERE相同,后者可接受的所有表达式都可以用于on。两者看起来功能差不多。ON一般用于指定表连接的条件,即表如何连接,而WHERE用于过滤结果。
当左连接在右表中不满足on或USING指定的条件时,它将在结果中显示为NULL。
选择left_tbl。*
从LEFT _ TBL LEFT JOIN right _ TBL ON LEFT _ TBL . id=right _ TBL . id
其中right_tbl.id为空;
这种方法可以很容易地过滤掉右表中不符合条件的记录。
在表连接查询时,可以为每个参与表指定一个别名,便于在其他表达式中引用。有两种方式,一种是通过AS关键字tbl_name作为alias_name,另一种是直接在别名后面跟表名tbl_name alias_name。
选择t1.name,t2.salary
在t1.name=t2.name上,从雇员作为t1内部联接信息作为T2;
选择t1.name,t2.salary
从t1.name=t2.name上的雇员t1内部联接信息T2;
查询语句中的子查询必须使用别名,以便可以在其他表达式中引用。
SELECT * FROM(选择1,2,3)作为t1;
USING(join_column_list)语句指定两个表中包含的列,查询时只比较这里指定的列。
使用(c1,c2,c3)的左连接b
NATURAL [LEFT]联接以及INNER JOIN和LEFT JOIN相当于使用指定表中的所有列。
右连接与左连接类似,只是最终结果基于右表,左表中的不符合在结果中呈现为NULL。为了便于不同数据库之间的迁移,建议始终使用左连接。
一些连接示例:
SELECT *从表1,表2;
SELECT * FROM table1 . id=table 2 . id上的table 1内部联接table2
SELECT * FROM table1左连接table1.id=table2.id上的table2
SELECT * FROM table 1 LEFT JOIN table 2 USING(id);
SELECT * FROM table 1 LEFT JOIN table 2 ON table 1 . id=table 2 . id
table2.id=table3.id上的左连接table3
自然连接的结果中不会有重复的列。因为它类似于使用,所以使用中没有复杂的列。
考虑下面的例子:
创建表t1 (i INT,j INT);
创建表t2 (k INT,j INT);
插入t1值(1,1);
插入t2值(1,1);
SELECT * FROM t1自然联接T2;
SELECT * FROM t1 JOIN t2使用(j);
查询结果:
- - -
| j | i | k |
- - -
| 1 | 1 | 1 |
- - -
- - -
| j | i | k |
- - -
| 1 | 1 | 1 |
- - -
因此,同名的列只出现一次,而且都是那些值相同的记录。
在两个表中插入一条新记录,使它们的J不同,然后测试。
mysql插入到t1值(2,2);
查询正常,1行受影响(0.00秒)
mysql插入到t2值(2,3);
查询正常,1行受影响(0.00秒)
mysql select * from t1自然联接T2;
- - -
| j | i | k |
- - -
| 2 | 2 | 1 |
- - -
集合中的1行(0.00秒)
当使用和ON作为条件时,其他限制的联合条件相同,可以相互转换。但是SELECT *返回结果的时候还是有区别的。前者仅返回USING中指定的列中的合并结果,而后者用于表中的所有列。
使用(c1,c2,c3)的左连接b
a.c1=b.c1和a.c2=b.c2和a.c3=b.c3上的左连接b
在使用的情况下返回:
联合(a.c1,b.c1),联合(a.c2,b.c2),联合(a.c3,b.c3)
在返回时:
a.c1,a.c2,a.c3,b.c1,b.c2,b.c3
ON语句只能引用其操作表中的表。
创建表t1(i1 INT);
创建表T2(I2 INT);
创建表T3(i3 INT);
对于上表,以下查询将报告一个错误:
MySQL SELECT * FROM t1 JOIN T2 ON(i1=i3)JOIN T3;
错误1054(42s 22):“on子句”中的未知列“i3”
以下查询可以:
MySQL SELECT * FROM t1 JOIN T2 JOIN T3 ON(i1=i3);
空集(0.00秒)
此时t3在on语句的运行范围内。
相关资源
MySQL 8.0参考手册-13.2.10.2连接语法
MySQL 8.0参考手册-13.2.10.3联盟语法
总结
这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。谢谢你的支持。