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
|
|
Tom
|
Soccer
|
所以从上面结果看出,因为A表中的John记录的ID没有在B表中有对应ID,因此为空,但Name栏仍有John记录。
3. 外右联结
如果把上面查询改成外右联结:Select A.Name from A Right JOIN B ON A.id = B.id,则结果将会是:
Name
|
Hobby
|
Tim
|
Football
|
Jimmy
|
Basketball
|
Jimmy
|
Tennis
|
Tom
|
Soccer
|
这样的结果都是我们可以从外左联结的结果中猜到的了。
说到这里大家是否对联结查询了解多了?这个原本看来高深的概念一下子就理解了,恍然大悟了吧(呵呵,开玩笑了)?最后给大家讲讲MySQL联结查询中的某些参数的作用:
1.USING (column_list):其作用是为了方便书写联结的多对应关系,大部分情况下USING语句可以用ON语句来代替,如下面例子:
a LEFT JOIN b USING (c1,c2,c3),其作用相当于下面语句
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
只是用ON来代替会书写比较麻烦而已。
2.NATURAL [LEFT] JOIN:这个句子的作用相当于INNER JOIN,或者是在USING子句中包含了联结的表中所有字段的Left JOIN(左联结)。
3.STRAIGHT_JOIN:由于默认情况下MySQL在进行表的联结的时候会先读入左表,当使用了这个参数后MySQL将会先读入右表,这是个MySQL的内置优化参数,大家应该在特定情况下使用,譬如已经确认右表中的记录数量少,在筛选后能大大提高查询速度。
最后要说的就是,在MySQL5.0以后,运算顺序得到了重视,所以对多表的联结查询可能会错误以子联结查询的方式进行。譬如你需要进行多表联结,因此你输入了下面的联结查询:
SELECT t1.id,t2.id,t3.id
FROM t1,t2
LEFT JOIN t3 ON (t3.id=t1.id)
WHERE t1.id=t2.id;
但是MySQL并不是这样执行的,其后台的真正执行方式是下面的语句:
SELECT t1.id,t2.id,t3.id
FROM t1,( t2 LEFT JOIN t3 ON (t3.id=t1.id) )
WHERE t1.id=t2.id;
这并不是我们想要的效果,所以我们需要这样输入:
SELECT t1.id,t2.id,t3.id
FROM (t1,t2)
LEFT JOIN t3 ON (t3.id=t1.id)
WHERE t1.id=t2.id;
在这里括号是相当重要的,因此以后在写这样的查询的时候我们不要忘记了多写几个括号,至少这样能避免很多错误(因为这样的错误是很难被开发人员发现的)。如果对上面内容有疑问可以来信查询:陈朋奕 chenpengyi#gmail.com,转载请注明出处及作者。
相关推荐
Mysql 之 inner join, left join, right join 详解 Mysql 中的连接查询是指从两个或多个表中检索数据的操作。其中,inner join、left join 和 right join 是三种最常用的连接查询方式。本文将详细解释这三种连接...
10. 连接查询:`JOIN`语句用于将多个表的数据联结在一起,如`INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN`, `FULL OUTER JOIN`。 "MYSQL_EMP_DEPT_TABLES_练习题.txt"提供了90多道与"emp"和"dept"表相关的练习题,这些...
内联结的几种语法形式包括: 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....
- 如“SELECT * FROM CUSTOMER, ORDERS”为交叉连接的例子,而“SELECT c.* FROM CUSTOMER c INNER JOIN ORDERS o ON c.ID = o.CUSTOMER_ID”为内连接的例子,这显示了如何基于联结条件合并数据。 文档的内容虽然...
外联结分为左外联结(LEFT JOIN)和右外联结(RIGHT JOIN),它们都会返回所有左表/右表中的记录,即使右表/左表中没有匹配的记录也会返回。 1. **左外联结**:`SELECT * FROM table1 LEFT JOIN table2 ON table1....
- **交叉联结(Cross Join)**:两个表的每一行都与其他表的所有行组合,形成笛卡尔积。 - **内连接(Inner Join)**:基于ON条件返回两个表中匹配的行。 - **外连接**: - **左外连接(Left Join)**:返回左表的...
1. LEFT JOIN语法:在MySQL中,LEFT JOIN用于从左表(主查询表)返回所有的行,即使右表(联结表)中没有匹配的行。这使得我们可以选择左表中所有的记录,并根据与右表的匹配情况来决定是否添加右表中的记录。若右表...
继续回顾MySql的多表查询之1999语法 #二,SQL1999语法 语法: SELECT 查询列表 FROM 表1 别名 【连接类型】 JOIN 表2 别名 ON 链接条件 【WHERE 筛选条件】 【GROUP BY 分组】 【HAVING 筛选条件】 【ORDER ...
- **右外联结(RIGHT JOIN)**:返回右表的所有行和左表中匹配的行,如果左表没有匹配,则用NULL填充。 - **全外联结(FULL OUTER JOIN)**:返回左表和右表的所有行。 3. **分组与聚合**: 使用GROUP BY子句...
常见的联结类型包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。 5. **子查询**:即嵌套在其他SQL语句中的查询。一个SELECT语句中可以包含一个或多个子查询,子查询可以返回单个值、一组值或一组行。 6. **...
此外,联结(JOIN)的概念也是SQL中非常关键的一部分,它允许你合并来自多个表的数据。 子查询是SQL中的另一个重要主题,它可以嵌套在其他查询中,用于获取更复杂的查询结果。游标则提供了逐行处理查询结果的能力,...
它允许用户对数据库进行创建、修改、删除和查询操作,支持基本的SELECT语句、JOIN操作、聚合函数、子查询以及复杂的WHERE子句。 ### 数据查询 在SQL中,`SELECT`语句是最常用的操作,用于从表中检索数据。例如,...
同时,这也能让你熟悉不同数据库系统(如MySQL、PostgreSQL等)的语法差异。记住,理论学习与实际操作相结合是掌握SQL的最佳途径。不断地练习和应用这些知识,你将能熟练地运用SQL解决实际问题。