MySQL的联结(Join)语法
1.内联结、外联结、左联结、右联结的含义及区别:
在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问,可以来信咨询:陈朋奕 chenpengyi#gmail.com),国内关于MySQL联结查询的资料十分少,相信大家在看了本文后会对MySQL联结语法有相当清晰的了解,也不会被Oracle的外联结的(“+”号)弄得糊涂了。
在SQL标准中规划的(Join)联结大致分为下面四种:
1. 内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
2. 外联结:分为外左联结和外右联结。
左联结A、B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表A的全部记录。
右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:
Select A.name B.name From A Left Join B On A.id=B.id
和Select A.name B.name From B Right Join A on B.id=A.id执行后的结果是一样的。
3.全联结:将两个表中存在联结关系的字段的所有记录取出形成记录集的联结(这个不需要记忆,只要是查询中提到了的表的字段都会取出,无论是否符合联结条件,因此意义不大)。
4.无联结:不用解释了吧,就是没有使用联结功能呗,也有自联结的说法。
这里我有个比较简便的记忆方法,内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。其实大家回忆高等教育出版社出版的《数据库系统概论》书中讲到关系代数那章(就是将笛卡儿积和投影那章)的内容,相信不难理解这些联结功能的内涵。
2. MySQL联结(Join)的语法
MySQL支持Select和某些Update和Delete情况下的Join语法,具体语法上的细节有:
table_references:
table_reference [, table_reference] …
table_reference:
table_factor
| join_table
table_factor:
tbl_name [[AS] alias]
[{USE|IGNORE|FORCE} INDEX (key_list)]
| ( table_references )
| { OJ table_reference LEFT OUTER JOIN table_reference
ON conditional_expr }
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference STRAIGHT_JOIN table_factor
| table_reference STRAIGHT_JOIN table_factor ON condition
| table_reference LEFT [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [LEFT [OUTER]] JOIN table_factor
| table_reference RIGHT [OUTER] JOIN table_reference join_condition
| table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor
join_condition:
ON conditional_expr | USING (column_list)
上面的用法摘自权威资料,不过大家看了是否有点晕呢?呵呵,应该问题主要还在于table_reference是什么,table_factor又是什么?这里的table_reference其实就是表的引用的意思,因为在MySQL看来,联结就是一种对表的引用,因此把需要联结的表定义为table_reference,同时在SQL Standard中也是如此看待的。而table_factor则是MySQL对这个引用的功能上的增强和扩充,使得引用的表可以是括号内的一系列表,如下面例子中的JOIN后面括号:
SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
这个语句的执行结果和下面语句其实是一样的:
SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
这两个例子不仅让我们了解了MySQL中table_factor和table_reference含义,同时能理解一点CROSS JOIN的用法,我要补充的是在MySQL现有版本中CROSS JOIN的作用和INNER JOIN是一样的(虽然在SQL Standard中是不一样的,然而在MySQL中他们的区别仅仅是INNER JOIN需要附加ON参数的语句,而CROSS JOIN不需要)。
既然说到了ON语句,那就解释一下吧,ON语句其实和WHERE语句功能大致相当,只是这里的ON语句是专门针对联结表的,ON语句后面的条件的要求和书写方式和WHERE语句的要求是一样的,大家基本上可以把ON当作WHERE用。
大家也许也看到了OJ table_reference LEFT OUTER JOIN table_reference这个句子,这不是MySQL的标准写法,只是为了和ODBC的SQL语法兼容而设定的,我很少用,Java的人更是不会用,所以也不多解释了。
那下面就具体讲讲简单的JOIN的用法了。首先我们假设有2个表A和B,他们的表结构和字段分别为:
表A:
ID
|
Name
|
1
|
Tim
|
2
|
Jimmy
|
3
|
John
|
4
|
Tom
|
表B:
ID
|
Hobby
|
1
|
Football
|
2
|
Basketball
|
2
|
Tennis
|
4
|
Soccer
|
1. 内联结:
Select A.Name B.Hobby from A, B where A.id = B.id,这是隐式的内联结,查询的结果是:
Name
|
Hobby
|
Tim
|
Football
|
Jimmy
|
Basketball
|
Jimmy
|
Tennis
|
Tom
|
Soccer
|
它的作用和 Select A.Name from A INNER JOIN B ON A.id = B.id是一样的。这里的INNER JOIN换成CROSS JOIN也是可以的。
2. 外左联结
Select A.Name from A Left JOIN B ON A.id = B.id,典型的外左联结,这样查询得到的结果将会是保留所有A表中联结字段的记录,若无与其相对应的B表中的字段记录则留空,结果如下:
Name
|
Hobby
|
Tim
|
Football
|
Jimmy
|
Basketball,Tennis
|
John
|
|
相关推荐
inner join,也称为等值连接,返回两个表中联结字段相等的行。即,inner join 只返回两个表中匹配的记录。例如: SELECT * FROM `xs` INNER JOIN `cj` ON xs.id = cj.id 该语句将返回 xs 和 cj 两个表中 id 字段...
内联结的几种语法形式包括: 1. `SELECT * FROM java, mysql WHERE java.name = mysql.name;` 2. `SELECT * FROM java JOIN mysql ON java.name = mysql.name;` 3. `SELECT * FROM java INNER JOIN mysql ON java....
10. 连接查询:`JOIN`语句用于将多个表的数据联结在一起,如`INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN`, `FULL OUTER JOIN`。 "MYSQL_EMP_DEPT_TABLES_练习题.txt"提供了90多道与"emp"和"dept"表相关的练习题,这些...
- 如“SELECT * FROM CUSTOMER, ORDERS”为交叉连接的例子,而“SELECT c.* FROM CUSTOMER c INNER JOIN ORDERS o ON c.ID = o.CUSTOMER_ID”为内连接的例子,这显示了如何基于联结条件合并数据。 文档的内容虽然...
- **右外连接(Right Join)**:返回右表的所有行,即使在左表中没有匹配,左表的缺失值用NULL填充。 举例来说,`SELECT student.Name, class.Class FROM students, classes WHERE student.Name='YangGuo' AND ...
外联结分为左外联结(LEFT JOIN)和右外联结(RIGHT JOIN),它们都会返回所有左表/右表中的记录,即使右表/左表中没有匹配的记录也会返回。 1. **左外联结**:`SELECT * FROM table1 LEFT JOIN table2 ON table1....
继续回顾MySql的多表查询之1999语法 #二,SQL1999语法 语法: SELECT 查询列表 FROM 表1 别名 【连接类型】 JOIN 表2 别名 ON 链接条件 【WHERE 筛选条件】 【GROUP BY 分组】 【HAVING 筛选条件】 【ORDER ...
1. LEFT JOIN语法:在MySQL中,LEFT JOIN用于从左表(主查询表)返回所有的行,即使右表(联结表)中没有匹配的行。这使得我们可以选择左表中所有的记录,并根据与右表的匹配情况来决定是否添加右表中的记录。若右表...
- **右外联结(RIGHT JOIN)**:返回右表的所有行和左表中匹配的行,如果左表没有匹配,则用NULL填充。 - **全外联结(FULL OUTER JOIN)**:返回左表和右表的所有行。 3. **分组与聚合**: 使用GROUP BY子句...
常见的联结类型包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。 5. **子查询**:即嵌套在其他SQL语句中的查询。一个SELECT语句中可以包含一个或多个子查询,子查询可以返回单个值、一组值或一组行。 6. **...
它允许用户对数据库进行创建、修改、删除和查询操作,支持基本的SELECT语句、JOIN操作、聚合函数、子查询以及复杂的WHERE子句。 ### 数据查询 在SQL中,`SELECT`语句是最常用的操作,用于从表中检索数据。例如,...
此外,联结(JOIN)的概念也是SQL中非常关键的一部分,它允许你合并来自多个表的数据。 子查询是SQL中的另一个重要主题,它可以嵌套在其他查询中,用于获取更复杂的查询结果。游标则提供了逐行处理查询结果的能力,...
同时,这也能让你熟悉不同数据库系统(如MySQL、PostgreSQL等)的语法差异。记住,理论学习与实际操作相结合是掌握SQL的最佳途径。不断地练习和应用这些知识,你将能熟练地运用SQL解决实际问题。