北京SEO

MySQL连接left join,right join,inner join语句用法

2019/10/10/17:36:18  阅读:1711  来源:谷歌SEO算法  标签: SEO知识

在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问,国内关于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中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。其实大家回忆高等教育出版社出版的《数据库系统概论》书中讲到关系代数那章(就是将笛卡儿积和投影那章)的内容,相信不难理解这些联结功能的内涵。

MySQL左连接left join:

一个简单的连接和一个MySQL左连接是不同的。一个MySQL LEFT JOIN提供了额外的考虑到在左边的表。

如果做了LEFT JOIN,得到的所有记录以同样的方式相匹配,此外,得到一个额外的记录每个不匹配的记录,在左表中的联接 - 从而保证了每一个作者得到关联(本例子中):

实例,试试下面的例子就明白了LEFT JOIN:

  1. root@host#mysql-uroot-ppassword;
  2. Enterpassword:*******
  3. mysql>useTUTORIALS;
  4. Databasechanged
  5. mysql>SELECTa.tutorial_id,a.tutorial_author,b.tutorial_count
  6. ->FROMtutorials_tblaLEFTJOINtcount_tblb
  7. ->ONa.tutorial_author=b.tutorial_author;
  8. +-------------+-----------------+----------------+
  9. |tutorial_id|tutorial_author|tutorial_count|
  10. +-------------+-----------------+----------------+
  11. |1|JohnPoul|1|
  12. |2|AbdulS|NULL|
  13. |3|Sanjay|1|
  14. +-------------+-----------------+----------------+
  15. 3rowsinset(0.02sec)

需要做更多的实践才能熟悉JOINS,这是一个复杂的概念,在MySQL/SQL将变得更加清晰.

mysql 全连接 join full

以使用多个表中的单一SQL查询。在MySQL中联接(join)行为是指两个或多个表到一个表中可以使用连接在SELECT,UPDATE和DELETE语句中加入MySQL表。我们将看到一个例子LEFT JOIN简单的MySQL连接。

在命令提示符使用联接:假设我们两个表的教程tcount_tbl和tutorials_tbl的完整列表如下.

例子,试试下面的例子:

  1. root@host#mysql-uroot-ppassword;
  2. Enterpassword:*******
  3. mysql>useTUTORIALS;
  4. Databasechanged
  5. mysql>SELECT*FROMtcount_tbl;
  6. +-----------------+----------------+
  7. |tutorial_author|tutorial_count|
  8. +-----------------+----------------+
  9. |mahran|20|
  10. |mahnaz|NULL|
  11. |Jen|NULL|
  12. |Gill|20|
  13. |JohnPoul|1|
  14. |Sanjay|1|
  15. +-----------------+----------------+
  16. 6rowsinset(0.01sec)
  17. mysql>SELECT*fromtutorials_tbl;
  18. +-------------+----------------+-----------------+-----------------+
  19. |tutorial_id|tutorial_title|tutorial_author|submission_date|
  20. +-------------+----------------+-----------------+-----------------+
  21. |1|LearnPHP|JohnPoul|2007-05-24|
  22. |2|LearnMySQL|AbdulS|2007-05-24|
  23. |3|JAVATutorial|Sanjay|2007-05-06|
  24. +-------------+----------------+-----------------+-----------------+
  25. 3rowsinset(0.00sec)
  26. mysql>

现在,加入这两个表我们可以编写一个SQL查询,这个查询会选择所有的作者从表tutorials_tbl,从tcount_tbl会拿起相应数量的教程.

  1. mysql>SELECTa.tutorial_id,a.tutorial_author,b.tutorial_count
  2. ->FROMtutorials_tbla,tcount_tblb
  3. ->WHEREa.tutorial_author=b.tutorial_author;
  4. +-------------+-----------------+----------------+
  5. |tutorial_id|tutorial_author|tutorial_count|
  6. +-------------+-----------------+----------------+
  7. |1|JohnPoul|1|
  8. |3|Sanjay|1|
  9. +-------------+-----------------+----------------+
  10. 2rowsinset(0.01sec)
  11. mysql>

补充一文章,下面是例子分析,表A记录如下:

  1. aIDaNum
  2. 1a20050111
  3. 2a20050112
  4. 3a20050113
  5. 4a20050114
  6. 5a20050115

表B记录如下:

  1. bIDbName
  2. 12006032401
  3. 22006032402
  4. 32006032403
  5. 42006032404
  6. 82006032408

创建这两个表SQL语句如下:

  1. CREATETABLEa
  2. aIDint(1)AUTO_INCREMENTPRIMARYKEY,
  3. aNumchar(20)
  4. )
  5. CREATETABLEb(
  6. bIDint(1)NOTNULLAUTO_INCREMENTPRIMARYKEY,
  7. bNamechar(20)
  8. )
  9. INSERTINTOa
  10. VALUES(1,'a20050111'),(2,'a20050112'),(3,'a20050113'),(4,'a20050114'),(5,'a20050115');
  11. INSERTINTOb
  12. VALUES(1,'2006032401'),(2,'2006032402'),(3,'2006032403'),(4,'2006032404'),(8,'2006032408');

实验如下:

1.left join(左联接),sql语句如下:

  1. SELECT*FROMa
  2. LEFTJOINb
  3. ONa.aID=b.bID
  4. //结果如下:
  5. aIDaNumbIDbName
  6. 1a2005011112006032401
  7. 2a2005011222006032402
  8. 3a2005011332006032403
  9. 4a2005011442006032404
  10. 5a20050115NULLNULL
  11. (所影响的行数为5行)

结果说明:left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.

换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).

B表记录不足的地方均为NULL.

2.right join(右联接),sql语句如下:

  1. SELECT*FROMa
  2. RIGHTJOINGb
  3. ONa.aID=b.bID
  4. --结果如下://phpfensi.com
  5. aIDaNumbIDbName
  6. 1a2005011112006032401
  7. 2a2005011222006032402
  8. 3a2005011332006032403
  9. 4a2005011442006032404
  10. NULLNULL82006032408
  11. --(所影响的行数为5行)

结果说明:仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join(相等联接或内联接),sql语句如下:

  1. SELECT*FROMa
  2. INNERJOINb
  3. ONa.aID=b.bID
  4. --等同于以下SQL句:
  5. SELECT*
  6. FROMa,b
  7. WHEREa.aID=b.bID
  8. --结果如下:
  9. aIDaNumbIDbName
  10. 1a2005011112006032401
  11. 2a2005011222006032402
  12. 3a2005011332006032403
  13. 4a2005011442006032404

结果说明:很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录,使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即

使在第二个(右边)表中并没有相符值的记录.

语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2

说明:table1, table2参数用于指定要将记录组合的表的名称。

field1,field2参数指定被联接的字段的名称,且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的.

名称:compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。

如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误.

广告内容

MySQL连接left join,right join,inner join语句用法 MySQL连接left join,right join,inner join语句用法 MySQL连接left join,right join,inner join语句用法

相关阅读

热门评论

互联网十八般武艺 互联网十八般武艺

互联网十八般武艺

总篇数179

精选文章

RMAN中catalog和nocatalog区别介绍 小技巧:为Linux下的文件分配多个权限 zimbra8.5.1安装第三方签名ssl证书的步骤 解决mysql不能远程连接数据库方法 windows服务器mysql增量备份批处理数据库 mysql中slow query log慢日志查询分析 JavaScript跨域问题总结 Linux下负载均衡软件LVS配置(VS/DR)教程 mysql中权限参数说明 MYSQL(错误1053)无法正常启动

SEO最新算法