视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Mysql中的join操作
2020-11-09 20:34:17 责编:小采
文档


 join的类型

1.  内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。

2.  外联结:分为外左联结和外右联结。

案例背景

create table java (name varchar(255));
insert into java values ('java1'),('java2'),('blue'); 
create table mysql (name varchar(255));
insert into mysql values ('mysql1'),('mysql2'),('blue');

内联结

select * from java,mysql where java.name=mysql.name;
SELECT * FROM java JOIN mysql ON java.name=mysql.name;
SELECT * FROM java INNER JOIN mysql ON java.name=mysql.name;
SELECT * FROM java CROSS JOIN mysql ON java.name=mysql.name;
SELECT * FROM java STRAIGHT_JOIN mysql ON java.name=mysql.name;

这四个语句都是内联结,返回结果都是

+------+------+
| name | name |
+------+------+
| blue | blue |
+------+------+
  • table_reference条目中的每个逗号都看作相当于一个内部联合
  • 默认的JOIN都是INNER JOIN
  • CROSS JOIN从语法上说与INNER JOIN等同
  • STRAIGHT_JOIN与JOIN相同。除了有一点不一样,左表会在右表之前被读取。STRAIGH_JOIN可以被用于这样的情况,即联合优化符以错误的顺序排列表。
  • 内联结的语法如下:

    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

    外联结

    左联结

    SELECT * FROM java LEFT JOIN mysql ON java.name=mysql.name;

    结果是

    +-------+------+
    | name | name |
    +-------+------+
    | java1 | NULL |
    | java2 | NULL |
    | blue | blue |
    +-------+------+

    所以从上面结果看出,因为Java表中的java1和java2记录的name没有在MySQL表中有对应name,因此为空,但java 所有的列栏仍有java1和java2记录,mysql表所有列栏为NULL。而剩下的blue的那条记录就是java表和mysql表内连接的结果。

    如果对于在LEFT JOIN中的ON或USING部分中的右表没有匹配的记录,则所有列被设置为NULL的一个行被用于右表。如果一个表在其它表中没有对应部分,您可以使用这种方法在这种表中查找记录:

    SELECT * FROM java LEFT JOIN mysql ON java.name=mysql.name WHERE mysql.name IS NULL;

    该sql找出在java的人,但是不在mysql里的人,这里明显是人员'java1'和'java2'符合要求。

    右联结

    SELECT * FROM java RIGHT JOIN mysql ON java.name=mysql.name;

    返回结果是

    +------+--------+
    | name | name |
    +------+--------+
    | NULL | mysql1 |
    | NULL | mysql2 |
    | blue | blue |
    +------+--------+

    右联结和左联接结果类似,只是这次是mysql表保存所有的结果集。

    外联结的语法

    join_table:| 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

    USING(column_list)子句

    用于为一系列的列进行命名,这些列必须同时在两个表中存在

    SELECT java.*,mysql.* FROM java LEFT JOIN mysql USING (name);

    结果返回

    +-------+------+
    | name | name |
    +-------+------+
    | java1 | NULL |
    | java2 | NULL |
    | blue | blue |
    +-------+------+

    联结的运算顺序

    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)

    括号对于join的顺序的影响

    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;
    --应该这么写
    SELECT t1.id,t2.id,t3.id FROM (t1,t2) LEFT JOIN t3 ON (t3.id=t1.id) WHERE t1.id=t2.id;

    在这里括号是相当重要的,因此以后在写这样的查询的时候我们不要忘记了多写几个括号,至少这样能避免很多错误

    以上所述是小编给大家介绍的Mysql join操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    您可能感兴趣的文章:

  • MySQL left join操作中on和where放置条件的区别介绍
  • mysql使用from与join两表查询的区别总结
  • mysql多个left join连接查询用法分析
  • MySQL优化之使用连接(join)代替子查询
  • Mysql连接join查询原理知识点
  • 下载本文
    显示全文
    专题