分享

INNER / LEFT / RIGHT / CROSS / FULL JOIN

 322yangxinxing 2012-02-15
INNER / LEFT / RIGHT / CROSS / FULL JOIN
2011-08-20 21:03

通用测试表
-- 学生表
CREATE TABLE student (
  SNO    INT,
  SNAME  VARCHAR(10),
  ICNO   INT
);

-- 食堂IC卡表
CREATE TABLE IC (
  ICNO     INT,
  ICNAME   VARCHAR(10),
  ICMoney  INT
);

INSERT INTO student
  SELECT 1, '张三', 1 UNION ALL
  SELECT 2, '李四', 2 UNION ALL
  SELECT 3, '王五', NULL;

INSERT INTO IC
  SELECT 1, '张三', 500 UNION ALL
  SELECT 2, '李四', 250 UNION ALL
  SELECT 3, '赵老师', 600;

 


INNER JOIN
Oracle 、SQL Server、MySQL 基本上无差别,仅仅演示一种数据库结果:
(INNER 可省略)
mysql> SELECT
    ->   student.SNO,
    ->   student.SNAME,
    ->   IC.ICNAME,
    ->   IC.ICMoney
    -> FROM
    ->   student
    ->     JOIN  IC
    ->       ON (student.ICNO = IC.ICNO);
+------+-------+--------+---------+
| SNO  | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
|    1 | 张三  | 张三   |     500 |
|    2 | 李四  | 李四   |     250 |
+------+-------+--------+---------+
2 rows in set (0.00 sec)

 


LEFT OUTER JOIN
Oracle 、SQL Server、MySQL 基本上无差别,仅仅演示一种数据库结果:
(OUTER 可省略)
mysql> SELECT
    ->   student.SNO,
    ->   student.SNAME,
    ->   IC.ICNAME,
    ->   IC.ICMoney
    -> FROM
    ->   student
    ->     LEFT JOIN   IC
    ->       ON (student.ICNO = IC.ICNO);
+------+-------+--------+---------+
| SNO  | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
|    1 | 张三  | 张三   |     500 |
|    2 | 李四  | 李四   |     250 |
|    3 | 王五  | NULL   |    NULL |
+------+-------+--------+---------+
3 rows in set (0.00 sec)


RIGHT OUTER JOIN
Oracle 、SQL Server、MySQL 基本上无差别,仅仅演示一种数据库结果:
(OUTER 可省略)
mysql> SELECT
    ->   student.SNO,
    ->   student.SNAME,
    ->   IC.ICNAME,
    ->   IC.ICMoney
    -> FROM
    ->   student
    ->     RIGHT JOIN  IC
    ->       ON (student.ICNO = IC.ICNO);
+------+-------+--------+---------+
| SNO  | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
|    1 | 张三  | 张三   |     500 |
|    2 | 李四  | 李四   |     250 |
| NULL | NULL  | 赵老师 |     600 |
+------+-------+--------+---------+
3 rows in set (0.00 sec)

 

CROSS JOIN
Oracle 、SQL Server、MySQL 基本上无差别,仅仅演示一种数据库结果:

mysql> SELECT
    ->   student.SNO,
    ->   student.SNAME,
    ->   IC.ICNAME,
    ->   IC.ICMoney
    -> FROM
    ->   student
    ->     CROSS JOIN   IC;
+------+-------+--------+---------+
| SNO  | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
|    1 | 张三  | 张三   |     500 |
|    2 | 李四  | 张三   |     500 |
|    3 | 王五  | 张三   |     500 |
|    1 | 张三  | 李四   |     250 |
|    2 | 李四  | 李四   |     250 |
|    3 | 王五  | 李四   |     250 |
|    1 | 张三  | 赵老师 |     600 |
|    2 | 李四  | 赵老师 |     600 |
|    3 | 王五  | 赵老师 |     600 |
+------+-------+--------+---------+
9 rows in set (0.08 sec)

 


FULL JOIN

Oracle / SQL Server 支持 Full JOIN
(OUTER 可省略)

1> SELECT
2>   student.SNO,
3>   student.SNAME,
4>   IC.ICNAME,
5>   IC.ICMoney
6> FROM
7>   student
8>     FULL JOIN   IC
9>       ON (student.ICNO = IC.ICNO);
10> go
SNO         SNAME      ICNAME     ICMoney
----------- ---------- ---------- -----------
          1 张三         张三                 500
          2 李四         李四                 250
          3 王五         NULL              NULL
       NULL NULL       赵老师                600

(4 行受影响)

 

MySQL 好像是不支持

mysql> SELECT
    ->   student.SNO,
    ->   student.SNAME,
    ->   IC.ICNAME,
    ->   IC.ICMoney
    -> FROM
    ->   student
    ->     FULL JOIN IC
    ->       ON (student.ICNO = IC.ICNO);
ERROR 1054 (42S22): Unknown column 'student.SNO' in 'field list'

 

变通着,修改为

LEFT JOIN  +   UNION  +  RIGHT JOIN 的方式。

mysql> SELECT
    ->   student.SNO,
    ->   student.SNAME,
    ->   IC.ICNAME,
    ->   IC.ICMoney
    -> FROM
    ->   student
    ->     LEFT JOIN IC
    ->       ON (student.ICNO = IC.ICNO)
    -> UNION
    -> SELECT
    ->   student.SNO,
    ->   student.SNAME,
    ->   IC.ICNAME,
    ->   IC.ICMoney
    -> FROM
    ->   student
    ->     RIGHT JOIN IC
    ->       ON (student.ICNO = IC.ICNO);
+------+-------+--------+---------+
| SNO  | SNAME | ICNAME | ICMoney |
+------+-------+--------+---------+
|    1 | 张三  | 张三   |     500 |
|    2 | 李四  | 李四   |     250 |
|    3 | 王五  | NULL   |    NULL |
| NULL | NULL  | 赵老师 |     600 |
+------+-------+--------+---------+
4 rows in set (0.01 sec)
 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多