多表查询
多表查询就是从多张表中查找所需数据,并且整合在一起显示出来。
多表查询有多种实现方式。例如:
内连接
外连接
子查询
内连接查询
简单写法
内连接查询使用比较运算符进行表间列数据的比较操作。并输出符合条件的结果。
mysql> desc City;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) |NO | | | |
| CountryCode | char(3) |NO | | | |
| District | char(20) |NO | | | |
| Population | int(11) | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> select id,City.name,City.Population,LifeExpectancy fromCity,Country where id<10 and City.CountryCode=Country.Code;
+----+----------------+------------+----------------+
| id | name |Population | LifeExpectancy |
+----+----------------+------------+----------------+
| 1 | Kabul | 1780000 | 45.9 |
| 2 | Qandahar | 237500 | 45.9 |
| 3 | Herat | 186800 | 45.9 |
| 4 | Mazar-e-Sharif | 127800 | 45.9 |
| 5 | Amsterdam | 731200 | 78.3 |
| 6 | Rotterdam | 593321 | 78.3 |
| 7 | Haag | 440900 | 78.3 |
| 8 | Utrecht | 234323 | 78.3 |
| 9 | Eindhoven | 201843 | 78.3 |
+----+----------------+------------+----------------+
9 rows in set (0.00 sec)
标准写法 (迁移数据的时候比较好用,例如从MySQL迁移到oracle,如果用上面MySQL风格的语法,迁移到oracle还需要做语法调整)
mysql> select id,City.name,City.Population,LifeExpectancy fromCity INNER JOIN Country on id<10 and City.CountryCode=Country.Code;
+----+----------------+------------+----------------+
| id | name |Population | LifeExpectancy |
+----+----------------+------------+----------------+
| 1 | Kabul | 1780000 | 45.9 |
| 2 | Qandahar | 237500 | 45.9 |
| 3 | Herat | 186800 | 45.9 |
| 4 | Mazar-e-Sharif | 127800 | 45.9 |
| 5 | Amsterdam | 731200 | 78.3 |
| 6 | Rotterdam | 593321 | 78.3 |
| 7 | Haag | 440900 | 78.3 |
| 8 | Utrecht | 234323 | 78.3 |
| 9 | Eindhoven | 201843 | 78.3 |
+----+----------------+------------+----------------+
9 rows in set (0.00 sec)
笛卡尔积(没有where导致,导致左边的表每一条数据都会匹配右边表的每一条数据。)
Inner join 左边的表称之为基准表,右边的表称之为连接过来的表。
mysql> select join1.id,name,city ,unit from join1,join2;
+------+-------+----------+-------+
| id | name | city | unit |
+------+-------+----------+-------+
| 1 | Tube | Shanghai | IT |
| 2 | Kevin | Shanghai |IT |
| 3 | Mark | Shanghai | IT |
| 1 | Tube | Shanghai | IT |
| 2 | Kevin | Shanghai |IT |
| 3 | Mark | Shanghai | IT |
| 1 | Tube | Shanghai | IT |
| 2 | Kevin | Shanghai |IT |
| 3 | Mark | Shanghai | IT |
| 1 | Tube | Beijing | Sales |
| 2 | Kevin | Beijing | Sales |
| 3 | Mark | Beijing | Sales |
+------+-------+----------+-------+
12 rows in set (0.06 sec)
外连接查询
左连接查询
mysql> select id,City.name,City.Population,LifeExpectancy fromCity LEFT OUTER JOIN Country on id<10and City.CountryCode=Country.Code LIMIT 10;
+----+----------------+------------+----------------+
| id | name |Population | LifeExpectancy |
+----+----------------+------------+----------------+
| 1 | Kabul | 1780000 | 45.9 |
| 2 | Qandahar | 237500 | 45.9 |
| 3 | Herat | 186800 | 45.9 |
| 4 | Mazar-e-Sharif | 127800 | 45.9 |
| 5 | Amsterdam | 731200 | 78.3 |
| 6 | Rotterdam | 593321 | 78.3 |
| 7 | Haag | 440900 | 78.3 |
| 8 | Utrecht | 234323 | 78.3 |
| 9 | Eindhoven | 201843 | 78.3 |
| 10 | Tilburg | 193238 | NULL |
+----+----------------+------------+----------------+
10 rows in set (0.04 sec)
左右表连接的区别是:以谁为准。
mysql> select join1.id,name,city ,unit from join1 LEFT OUTER JOINjoin2 ON join1.id=join2.id;
+------+-------+----------+------+
| id | name | city | unit |
+------+-------+----------+------+
| 1 | Tube | Shanghai | IT |
| 2 | Kevin | Shanghai |IT |
| 3 | Mark | Shanghai | IT |
+------+-------+----------+------+
3 rows in set (0.00 sec)
右连接查询
mysql> select join1.id,name,city ,unit from join1 RIGHT OUTERJOIN join2 ON join1.id=join2.id;
+------+-------+----------+-------+
| id | name | city | unit |
+------+-------+----------+-------+
| 1 | Tube | Shanghai | IT |
| 2 | Kevin | Shanghai |IT |
| 3 | Mark | Shanghai | IT |
| NULL | NULL | Beijing | Sales |
+------+-------+----------+-------+
4 rows in set (0.00 sec)
转载于:https://blog.51cto.com/sunshinesnail/1736478