1.mysq连接详解(内外连接,左右连接)
1.内连接
select * from emp,dept;
笛卡尔积 垃圾:把表里面所有的数据查询出来,会造成大量的数据垃圾。
解决方法:使用内连接(关联字段查询)
select * from emp,dept where emp.dep_id = dept.did;
Microsoft Windows [版本 10.0.19044.2130]
(c) Microsoft Corporation。保留所有权利。
C:\Users\31943>mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 33
Server version: 5.7.17-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| day02 |
| itheima_admin |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> use day02;
Database changed
mysql> select * from emp,dept;
+----+--------+--------+--------+------------+--------+-----+--------+
| id | NAME | gender | salary | join_date | dep_id | did | dname |
+----+--------+--------+--------+------------+--------+-----+--------+
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 1 | 研发部 |
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 2 | 市场部 |
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 3 | 财务部 |
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 4 | 销售部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 1 | 研发部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 2 | 市场部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 3 | 财务部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 4 | 销售部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 1 | 研发部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 2 | 市场部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 3 | 财务部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 4 | 销售部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 1 | 研发部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 2 | 市场部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 3 | 财务部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 4 | 销售部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 1 | 研发部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 2 | 市场部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 3 | 财务部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 4 | 销售部 |
| 6 | 小白龙 | 男 | 2500 | 2011-02-14 | NULL | 1 | 研发部 |
| 6 | 小白龙 | 男 | 2500 | 2011-02-14 | NULL | 2 | 市场部 |
| 6 | 小白龙 | 男 | 2500 | 2011-02-14 | NULL | 3 | 财务部 |
| 6 | 小白龙 | 男 | 2500 | 2011-02-14 | NULL | 4 | 销售部 |
+----+--------+--------+--------+------------+--------+-----+--------+
24 rows in set (0.00 sec)
mysql> select * from emp,dept where emp.dep_id = dept.did;
+----+--------+--------+--------+------------+--------+-----+--------+
| id | NAME | gender | salary | join_date | dep_id | did | dname |
+----+--------+--------+--------+------------+--------+-----+--------+
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 1 | 研发部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 2 | 市场部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 2 | 市场部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 3 | 财务部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 1 | 研发部 |
+----+--------+--------+--------+------------+--------+-----+--------+
5 rows in set (0.00 sec)
mysql> select * from emp inner join dept on emp.dep_id = dept.did;
+----+--------+--------+--------+------------+--------+-----+--------+
| id | NAME | gender | salary | join_date | dep_id | did | dname |
+----+--------+--------+--------+------------+--------+-----+--------+
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 1 | 研发部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 2 | 市场部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 2 | 市场部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 3 | 财务部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 1 | 研发部 |
+----+--------+--------+--------+------------+--------+-----+--------+
5 rows in set (0.00 sec)
mysql> select emp.name,emp.salary,dept.dname from emp inner join dept on emp.dep_id = dept.did;
+--------+--------+--------+
| name | salary | dname |
+--------+--------+--------+
| 孙悟空 | 7200 | 研发部 |
| 猪八戒 | 3600 | 市场部 |
| 唐僧 | 9000 | 市场部 |
| 白骨精 | 5000 | 财务部 |
| 蜘蛛精 | 4500 | 研发部 |
+--------+--------+--------+
5 rows in set (0.00 sec)
mysql>
2.外连接查询
左外连接:相当于查询A表所有数据和交集部分数据
右外连接:相当于查询B表所有数据和交集部分数据
左连接
left 主表[表1] join [表2]
mysql> select * from emp left join dept on emp.dep_id = dept.did;
+----+--------+--------+--------+------------+--------+------+--------+
| id | NAME | gender | salary | join_date | dep_id | did | dname |
+----+--------+--------+--------+------------+--------+------+--------+
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 1 | 研发部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 1 | 研发部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 2 | 市场部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 2 | 市场部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 3 | 财务部 |
| 6 | 小白龙 | 男 | 2500 | 2011-02-14 | NULL | NULL | NULL |
+----+--------+--------+--------+------------+--------+------+--------+
6 rows in set (0.00 sec)
右连接
right [表1] join 主表[表2]
mysql> select * from emp right join dept on emp.dep_id = dept.did;
+------+--------+--------+--------+------------+--------+-----+--------+
| id | NAME | gender | salary | join_date | dep_id | did | dname |
+------+--------+--------+--------+------------+--------+-----+--------+
| 1 | 孙悟空 | 男 | 7200 | 2013-02-24 | 1 | 1 | 研发部 |
| 2 | 猪八戒 | 男 | 3600 | 2010-12-02 | 2 | 2 | 市场部 |
| 3 | 唐僧 | 男 | 9000 | 2008-08-08 | 2 | 2 | 市场部 |
| 4 | 白骨精 | 女 | 5000 | 2015-10-07 | 3 | 3 | 财务部 |
| 5 | 蜘蛛精 | 女 | 4500 | 2011-03-14 | 1 | 1 | 研发部 |
| NULL | NULL | NULL | NULL | NULL | NULL | 4 | 销售部 |
+------+--------+--------+--------+------------+--------+-----+--------+
6 rows in set (0.00 sec)
总结:从数据上来看,其实左连接和右连接是互补的,也就是连接性偏向问题,左连接以左表为主表,和右表对应的字段中,左表必须全部查询到,右边没有