MySQL中的join和inner join和left join左连接right join右连接用法

MySQL中join的使用方式有多种:

内连接(inner join)默认的使用方式。例如:

表customer:

CREATE TABLE `customer` (
  `cid` varchar(32) NOT NULL DEFAULT '',
  `name` varchar(10) NOT NULL DEFAULT '',
  `gender` char(1) DEFAULT 'M',
  `address` varchar(20) DEFAULT '山东',
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

随便添加一些数据:

INSERT INTO `customer` VALUES ('001','张三','M','河南'),('002','李四','M','河南'),('003','王五','M','河南'),('004','赵六','M','河南'),('005','马九','M',NULL),('006','王石','M','山东');

表orders:

CREATE TABLE `orders` (
  `oid` varchar(32) NOT NULL,
  `productName` varchar(20) NOT NULL,
  `cid` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

为orders表添加数据:

INSERT INTO `orders` VALUES ('1001','航空母舰','001'),('1002','轰炸机','001'),('1003','无人机','001'),('1004','电视','002'),('1005','洗衣机','002'),('1006','电脑','003'),('1009','没毛线','0000');

请仔细看,这两张表并没有进行外键的关联设置。

准备好数据后,下面演示join的基本用法。

select * from customer join orders;

查询结果:

+-----+--------+--------+---------+------+--------------+------+
| cid | name   | gender | address | oid  | productName  | cid  |
+-----+--------+--------+---------+------+--------------+------+
| 001 | 张三   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 002 | 李四   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 003 | 王五   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 004 | 赵六   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 005 | 马九   | M      | NULL    | 1001 | 航空母舰     | 001  |
| 006 | 王石   | M      | 山东    | 1001 | 航空母舰     | 001  |
| 001 | 张三   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 002 | 李四   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 003 | 王五   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 004 | 赵六   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 005 | 马九   | M      | NULL    | 1002 | 轰炸机       | 001  |
| 006 | 王石   | M      | 山东    | 1002 | 轰炸机       | 001  |
| 001 | 张三   | M      | 河南    | 1003 | 无人机       | 001  |
| 002 | 李四   | M      | 河南    | 1003 | 无人机       | 001  |
| 003 | 王五   | M      | 河南    | 1003 | 无人机       | 001  |
| 004 | 赵六   | M      | 河南    | 1003 | 无人机       | 001  |
| 005 | 马九   | M      | NULL    | 1003 | 无人机       | 001  |
| 006 | 王石   | M      | 山东    | 1003 | 无人机       | 001  |
| 001 | 张三   | M      | 河南    | 1004 | 电视         | 002  |
| 002 | 李四   | M      | 河南    | 1004 | 电视         | 002  |
| 003 | 王五   | M      | 河南    | 1004 | 电视         | 002  |
| 004 | 赵六   | M      | 河南    | 1004 | 电视         | 002  |
| 005 | 马九   | M      | NULL    | 1004 | 电视         | 002  |
| 006 | 王石   | M      | 山东    | 1004 | 电视         | 002  |
| 001 | 张三   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 002 | 李四   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 003 | 王五   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 004 | 赵六   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 005 | 马九   | M      | NULL    | 1005 | 洗衣机       | 002  |
| 006 | 王石   | M      | 山东    | 1005 | 洗衣机       | 002  |
| 001 | 张三   | M      | 河南    | 1006 | 电脑         | 003  |
| 002 | 李四   | M      | 河南    | 1006 | 电脑         | 003  |
| 003 | 王五   | M      | 河南    | 1006 | 电脑         | 003  |
| 004 | 赵六   | M      | 河南    | 1006 | 电脑         | 003  |
| 005 | 马九   | M      | NULL    | 1006 | 电脑         | 003  |
| 006 | 王石   | M      | 山东    | 1006 | 电脑         | 003  |
| 001 | 张三   | M      | 河南    | 1009 | 没毛线       | 0000 |
| 002 | 李四   | M      | 河南    | 1009 | 没毛线       | 0000 |
| 003 | 王五   | M      | 河南    | 1009 | 没毛线       | 0000 |
| 004 | 赵六   | M      | 河南    | 1009 | 没毛线       | 0000 |
| 005 | 马九   | M      | NULL    | 1009 | 没毛线       | 0000 |
| 006 | 王石   | M      | 山东    | 1009 | 没毛线       | 0000 |
+-----+--------+--------+---------+------+--------------+------+

使用  inner join

select * from customer inner join orders;
+-----+--------+--------+---------+------+--------------+------+
| cid | name   | gender | address | oid  | productName  | cid  |
+-----+--------+--------+---------+------+--------------+------+
| 001 | 张三   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 002 | 李四   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 003 | 王五   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 004 | 赵六   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 005 | 马九   | M      | NULL    | 1001 | 航空母舰     | 001  |
| 006 | 王石   | M      | 山东    | 1001 | 航空母舰     | 001  |
| 001 | 张三   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 002 | 李四   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 003 | 王五   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 004 | 赵六   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 005 | 马九   | M      | NULL    | 1002 | 轰炸机       | 001  |
| 006 | 王石   | M      | 山东    | 1002 | 轰炸机       | 001  |
| 001 | 张三   | M      | 河南    | 1003 | 无人机       | 001  |
| 002 | 李四   | M      | 河南    | 1003 | 无人机       | 001  |
| 003 | 王五   | M      | 河南    | 1003 | 无人机       | 001  |
| 004 | 赵六   | M      | 河南    | 1003 | 无人机       | 001  |
| 005 | 马九   | M      | NULL    | 1003 | 无人机       | 001  |
| 006 | 王石   | M      | 山东    | 1003 | 无人机       | 001  |
| 001 | 张三   | M      | 河南    | 1004 | 电视         | 002  |
| 002 | 李四   | M      | 河南    | 1004 | 电视         | 002  |
| 003 | 王五   | M      | 河南    | 1004 | 电视         | 002  |
| 004 | 赵六   | M      | 河南    | 1004 | 电视         | 002  |
| 005 | 马九   | M      | NULL    | 1004 | 电视         | 002  |
| 006 | 王石   | M      | 山东    | 1004 | 电视         | 002  |
| 001 | 张三   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 002 | 李四   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 003 | 王五   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 004 | 赵六   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 005 | 马九   | M      | NULL    | 1005 | 洗衣机       | 002  |
| 006 | 王石   | M      | 山东    | 1005 | 洗衣机       | 002  |
| 001 | 张三   | M      | 河南    | 1006 | 电脑         | 003  |
| 002 | 李四   | M      | 河南    | 1006 | 电脑         | 003  |
| 003 | 王五   | M      | 河南    | 1006 | 电脑         | 003  |
| 004 | 赵六   | M      | 河南    | 1006 | 电脑         | 003  |
| 005 | 马九   | M      | NULL    | 1006 | 电脑         | 003  |
| 006 | 王石   | M      | 山东    | 1006 | 电脑         | 003  |
| 001 | 张三   | M      | 河南    | 1009 | 没毛线       | 0000 |
| 002 | 李四   | M      | 河南    | 1009 | 没毛线       | 0000 |
| 003 | 王五   | M      | 河南    | 1009 | 没毛线       | 0000 |
| 004 | 赵六   | M      | 河南    | 1009 | 没毛线       | 0000 |
| 005 | 马九   | M      | NULL    | 1009 | 没毛线       | 0000 |
| 006 | 王石   | M      | 山东    | 1009 | 没毛线       | 0000 |
+-----+--------+--------+---------+------+--------------+------+
42 rows in set (0.00 sec)
 

结果不变,说明使用join和inner join没有区别。这就是内连接。相当于笛卡尔积。

customer表有六条记录,orders表有7条记录,内连接的结果就是6乘以7,得出42条记录。

上面的jie结论是select * from customer join orders;的查询结果和select * from customer inner join orders;查询结果一致。

细心的读者会fa发现,查询语句后面没有跟where语句。

假如有这样一个需求:

查询哪些客户订购了商品。订购了哪些商品。

这个时候,可以有多个解决方法。

1.  多表查询

      select c.name as 购买商品的人,o.productName 所购买的商品 from customer c,orders o where c.cid = o.cid;

查询结果:

-------------------+--------------------+
| 购买商品的人       | 所购买的商品       |
+--------------------+--------------------+
| 张三               | 航空母舰           |
| 张三               | 轰炸机             |
| 张三               | 无人机             |
| 李四               | 电视               |
| 李四               | 洗衣机             |
| 王五               | 电脑               |
+--------------------+--------------------

代码剖析:c.name中的c是customer这张表名称的别名。c.name as 购买商品的人  这句话表示把c.name用 “购买商品的人替换”,目的是便于查看数据,一目了然,见名知意。

2. 连接查询方法。

select c.name as 购买商品的人,o.productName 所购买的商品 from customer c inner join orders o where c.cid = o.cid;
+--------------------+--------------------+
| 购买商品的人       | 所购买的商品       |
+--------------------+--------------------+
| 张三               | 航空母舰           |
| 张三               | 轰炸机             |
| 张三               | 无人机             |
| 李四               | 电视               |
| 李四               | 洗衣机             |
| 王五               | 电脑               |
+--------------------+--------------------+

可能ni你还有更好更多的查询方式,此处就不在一一列举了。

左连接:

sql语句:

 select * from customer c left join orders o on c.cid = o.cid;

运行结果:

select * from customer c left join orders o on c.cid = o.cid;
+-----+--------+--------+---------+------+--------------+------+
| cid | name   | gender | address | oid  | productName  | cid  |
+-----+--------+--------+---------+------+--------------+------+
| 001 | 张三   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 001 | 张三   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 001 | 张三   | M      | 河南    | 1003 | 无人机       | 001  |
| 002 | 李四   | M      | 河南    | 1004 | 电视         | 002  |
| 002 | 李四   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 003 | 王五   | M      | 河南    | 1006 | 电脑         | 003  |
| 004 | 赵六   | M      | 河南    | NULL | NULL         | NULL |
| 005 | 马九   | M      | NULL    | NULL | NULL         | NULL |
| 006 | 王石   | M      | 山东    | NULL | NULL         | NULL |
+-----+--------+--------+---------+------+--------------+------+

赵六,马九,王石三位用户没有购买商品。在进行左连接时,会把customer表的所有数据显示出来,而对应的orders表的数据部分,比如这个例子中的orders表字段oid,productName,cid这三个字段在赵六,马九,王石这三个人的对应地方是没有数据的,此时就用null进行填充。

这就是左连接。做连接时,左表字段有数据,右表存在数据为null情况。

右连接:

sql语句:

select * from customer c right join orders o  on c.cid = o.cid; 

查询结果:

+------+--------+--------+---------+------+--------------+------+
| cid  | name   | gender | address | oid  | productName  | cid  |
+------+--------+--------+---------+------+--------------+------+
| 001  | 张三   | M      | 河南    | 1001 | 航空母舰     | 001  |
| 001  | 张三   | M      | 河南    | 1002 | 轰炸机       | 001  |
| 001  | 张三   | M      | 河南    | 1003 | 无人机       | 001  |
| 002  | 李四   | M      | 河南    | 1004 | 电视         | 002  |
| 002  | 李四   | M      | 河南    | 1005 | 洗衣机       | 002  |
| 003  | 王五   | M      | 河南    | 1006 | 电脑         | 003  |
| NULL | NULL   | NULL   | NULL    | 1009 | 没毛线       | 0000 |
+------+--------+--------+---------+------+--------------+------+、

观察发现,在对应的oid为1009的数据一栏。customer表的所有字段值都有null,这就是右连接。会把右表中的所有数据都显示出来。左表会有null值填充。

关于更多join的使用

猜你喜欢

转载自blog.csdn.net/jin2111843364/article/details/81100587