- 建立表
CREATE TABLE `a_table` (
`a_id` int(11) DEFAULT NULL,
`a_name` varchar(10) DEFAULT NULL,
`a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `b_table` (
`b_id` int(11) DEFAULT NULL,
`b_name` varchar(10) DEFAULT NULL,
`b_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 插入数据
INSERT INTO a_table (a_id,a_name,a_part) VALUES (1,'老潘','总裁部');
INSERT INTO a_table (a_id,a_name,a_part) VALUES (2,'老王','秘书部');
INSERT INTO a_table (a_id,a_name,a_part) VALUES (3,'老张','设计部');
INSERT INTO a_table (a_id,a_name,a_part) VALUES (4,'老李','运营部');
INSERT INTO b_table (b_id,b_name,b_part) VALUES (2,'老王','秘书部');
INSERT INTO b_table (b_id,b_name,b_part) VALUES (3,'老张','设计部');
INSERT INTO b_table (b_id,b_name,b_part) VALUES (5,'老刘','人事部');
INSERT INTO b_table (b_id,b_name,b_part) VALUES (6,'老黄','生产部');
- 不加任何条件查询会出现笛卡尔乘积
select 字段1,字段2... from 表1,表2... [where 条件]
注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积
mysql> SELECT * FROM a_table,b_table;
+------+--------+--------+------+--------+--------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+--------+------+--------+--------+
| 1 | 老潘 | 总裁部 | 2 | 老王 | 秘书部 |
| 2 | 老王 | 秘书部 | 2 | 老王 | 秘书部 |
| 3 | 老张 | 设计部 | 2 | 老王 | 秘书部 |
| 4 | 老李 | 运营部 | 2 | 老王 | 秘书部 |
| 1 | 老潘 | 总裁部 | 3 | 老张 | 设计部 |
| 2 | 老王 | 秘书部 | 3 | 老张 | 设计部 |
| 3 | 老张 | 设计部 | 3 | 老张 | 设计部 |
| 4 | 老李 | 运营部 | 3 | 老张 | 设计部 |
| 1 | 老潘 | 总裁部 | 5 | 老刘 | 人事部 |
| 2 | 老王 | 秘书部 | 5 | 老刘 | 人事部 |
| 3 | 老张 | 设计部 | 5 | 老刘 | 人事部 |
| 4 | 老李 | 运营部 | 5 | 老刘 | 人事部 |
| 1 | 老潘 | 总裁部 | 6 | 老黄 | 生产部 |
| 2 | 老王 | 秘书部 | 6 | 老黄 | 生产部 |
| 3 | 老张 | 设计部 | 6 | 老黄 | 生产部 |
| 4 | 老李 | 运营部 | 6 | 老黄 | 生产部 |
+------+--------+--------+------+--------+--------+
16 rows in set (0.12 sec)
- 内连接
在MySQL FROM 子句中使用关键字 INNER JOIN 连接两张表,并使用 ON 子句来设置连接条件。内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。
SELECT <列名1,列名2 …>
FROM <表名1> INNER JOIN <表名2> [ ON子句]
mysql> SELECT * FROM a_table a INNER JOIN b_table b ON a.a_id = b.b_id;
+------+--------+--------+------+--------+--------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+--------+------+--------+--------+
| 2 | 老王 | 秘书部 | 2 | 老王 | 秘书部 |
| 3 | 老张 | 设计部 | 3 | 老张 | 设计部 |
+------+--------+--------+------+--------+--------+
2 rows in set (0.10 sec)
- 左连接
mysql> SELECT * FROM a_table AS a INNER JOIN b_table AS b ON a.a_id = b.b_id;
+------+--------+--------+------+--------+--------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+--------+------+--------+--------+
| 2 | 老王 | 秘书部 | 2 | 老王 | 秘书部 |
| 3 | 老张 | 设计部 | 3 | 老张 | 设计部 |
+------+--------+--------+------+--------+--------+
2 rows in set (0.09 sec)
- 右连接
mysql> SELECT * FROM a_table AS a RIGHT JOIN b_table AS b ON a.a_id=b.b_id;
+------+--------+--------+------+--------+--------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+--------+------+--------+--------+
| 2 | 老王 | 秘书部 | 2 | 老王 | 秘书部 |
| 3 | 老张 | 设计部 | 3 | 老张 | 设计部 |
| NULL | NULL | NULL | 5 | 老刘 | 人事部 |
| NULL | NULL | NULL | 6 | 老黄 | 生产部 |
+------+--------+--------+------+--------+--------+
4 rows in set (0.10 sec)