zoukankan      html  css  js  c++  java
  • MySQL之左、右、内关联类型解析

    下面是例子分析

    表A记录如下:

    id name

    2 jack

    4 hello

    9 heihei

    3 world

    1 dream

    表B记录如下:

    id name

    2 miaomiao

    4 yanyan

    7 jack

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

    create table a (

    id varchar(10),

    name varchar(30)

    );

    INSERT INTO `a` VALUES ('2', 'jack');

    INSERT INTO `a` VALUES ('4', 'hello');

    INSERT INTO `a` VALUES ('9', 'heihei');

    INSERT INTO `a` VALUES ('3', 'world');

    INSERT INTO `a` VALUES ('1', 'dream');

    create table b (

    id varchar(10),

    name varchar(30)

    );

    INSERT INTO `b` VALUES ('2', 'miaomiao');

    INSERT INTO `b` VALUES ('4', 'yanyan');

    INSERT INTO `b` VALUES ('7', 'jack');


    实验如下:

    1.left join(左联接)

    sql语句如下:

    SELECT * FROM a

    LEFT JOIN b

    ON a.id=b.id

    结果如下:

    mysql> select * from a left join b on a.id = b.id;

    +------+--------+------+----------+

    | id | name | id | name |

    +------+--------+------+----------+

    | 2 | jack | 2 | miaomiao |

    | 4 | hello | 4 | yanyan |

    | 9 | heihei | NULL | NULL |

    | 3 | world | NULL | NULL |

    | 1 | dream | NULL | NULL |

    +------+--------+------+----------+

    5 rows in set (0.73 sec)

    结果说明:

    left join是以A表的记录为基础的,A[主表]可以看成左表,B[副表]可以看成右表,left join是以左表为准的.

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

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


    2.right join(右联接)

    sql语句如下:

    SELECT * FROM a

    RIGHT JOING b

    ON a.id = b.id

    结果如下:

    mysql> select * from a right join b on a.id = b.id;

    +------+-------+------+----------+

    | id | name | id | name |

    +------+-------+------+----------+

    | 2 | jack | 2 | miaomiao |

    | 4 | hello | 4 | yanyan |

    | NULL | NULL | 7 | jack |

    +------+-------+------+----------+

    3 rows in set (0.00 sec)

    结果说明:

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


    3.inner join(相等联接或内联接)

    sql语句如下:

    mysql> select * from a inner join b on a.id = b.id;

    +------+-------+------+----------+

    | id | name | id | name |

    +------+-------+------+----------+

    | 2 | jack | 2 | miaomiao |

    | 4 | hello | 4 | yanyan |

    +------+-------+------+----------+

    2 rows in set (0.00 sec)

    结果说明:

    很明显,这里只显示出了 a.id = b.id的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

    LEFT JOIN操作用于在任何的 FROM 子句中


    没有where条件等价于完全关联,反之则为内部关联。其约束是先ON 再 WHERE ,这里一定要注意的是:条件是放在ON里还是WHERE里,放的位置不同结果可能完全不一样的,WHERE 后面所有字段都是用来进一步过滤的。

    副表的约束条件尽量在ON里写,因为ON关联后再约束副表的话可能丢东西。主表的约束基本上写在ON或WHERE里都行。

    2017-2-14 个人体会:

    a left join b 

    id   a.mid1    b.time          b.mid2

    1  55412        2013-12-09 13:55:02    55412
    2  1840517    2015-12-07 18:42:03    1840517
    3  2227947    2017-02-09 17:20:25    2227947
    4  2495599    2016-11-30 19:17:47    2495599

    只放在on后面过滤  2月1日之前数据,结果为:

    id   a.mid1    b.time          b.mid2

    1  55412        2013-12-09 13:55:02    55412
    2  1840517    2015-12-07 18:42:03    1840517
    3  2227947    null           null
    4  2495599    2016-11-30 19:17:47    2495599

    只放在where后面过滤  2月1日之前数据,结果为:

    id   a.mid1    b.time          b.mid2

    1  55412        2013-12-09 13:55:02    55412
    2  1840517    2015-12-07 18:42:03    1840517
    3  2495599    2016-11-30 19:17:47    2495599

    总结:on后面不会减少结果记录数,只是主表匹配不上,则从表设为null,where是直接减少(或不显示)记录

  • 相关阅读:
    C++总结
    KMP算法
    理解I/O Completion Port(完成端口)
    [转载]Windows网络编程系列教程之四:Select模型
    [转载]理解 I/O Completion Port (IOCP完成端口)
    [转载]IOCP模型的总结
    发个IOCP的C++例子
    说说网络通信模型
    几个网络模型的示例代码(BlockingModel、OverlappedModel、WSAEventSelect、CompletionRoutine)..c++
    关于Socket 多线程 的一篇好文章
  • 原文地址:https://www.cnblogs.com/chuxin/p/2414199.html
Copyright © 2011-2022 走看看