注册 登录
MySQL基础教程

第一章: 环境搭建,安装MySQL

第二章: 掌握数据库的核心概念

第三章: MySQL服务与Show命令

第四章: 创建数据库与数据表

第五章: MySQL增查改删

第六章: 在Python中操作MySQL

首页 > MySQL基础教程 > 第五章: MySQL增查改删 > 5.7节: SELECT连接查询

5.7节: SELECT连接查询

薯条老师 2021-12-03 17:25:03 158524 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师的线下Python,Java小班周末班已经开课了,培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Java后端开发。授课详情请点击:http://chipscoco.com/?cate=6

5.7.1 SELECT的连接查询

所谓连接查询,是指根据一个或多个列,进行多表之间的关联查询。MySQL中的连接查询主要分为交叉连接查询,内连接查询和外连接查询。
SQL语法1:

SELECT expr FROM tbl CROSS JOIN tbl;

使用cross join进行交叉连接查询,交叉连接查询会产生笛卡尔积。
SQL语法2:

SELECT expr FROM  tbl_left INNER JOIN tbl_right ON tbl_left.col_name=tbl_right.col_name;

使用inner join来进行内连接(inner关键字可以省略)查询,on关键字用来定义表之间的关联表达式, 当关联匹配的列名相同时,可以使用using(col_name)的语法进行简化。e.g.:

select A.name, B.count from goods as A inner join orders using(id);

SQL语法3:

SELECT expr FROM tbl_left LEFT | RIGHT JOIN tbl_right ON tbl_left.column=tbl_right.column;

使用left join 或right join来进行外连接查询。在内连接查询中,只会显示匹配到的结果。在外连接查询中,会显示所有匹配的以及未匹配的结果。左外连接是指以左表为基准表,查询时会返回左表中的所有记录,右表中没有匹配到的结果会显示为NULL。右外连接与左外连接是一样的原理,只不过是以右边的表作为基准表。

5.7.2 SELEC连接查询实例

(1) 先在订单表中插入几条测试记录

mysql> insert into orders(sum, gid) values(50, 1),(84, 2),(76, 5);
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0

读者需注意,订单表中的gid列是外键,引用的是主表商品表中的主键id。在进行连接查询时,可根据gid和id列进行关联。

(2) 使用交叉连接查询商品表和订单表

交叉连接会产生笛卡尔积,在实际开发中除非你明确必须这样做,否则应避免使用交叉连接进行查询。

什么是笛卡尔积?举个简单的例子,左表有100条记录,右表也有100条记录,那么在进行交叉连接时,左表的一条记录会对应到右表的100条记录,在查询结束后,一共会查询到10000条记录。

mysql> select A.name, A.price, B.sum from goods as A cross join orders as B;
+--------------+-------+-----+
| name         | price | sum |
+--------------+-------+-----+
| 黑人牙膏     |    25 |  76 |
| 黑人牙膏     |    25 |  84 |
| 黑人牙膏     |    25 |  50 |
| 云南白药     |    28 |  76 |
| 云南白药     |    28 |  84 |
| 云南白药     |    28 |  50 |
| 青岛啤酒     |     7 |  76 |
| 青岛啤酒     |     7 |  84 |
| 青岛啤酒     |     7 |  50 |
| 湖南辣条     |    38 |  76 |
| 湖南辣条     |    38 |  84 |
| 湖南辣条     |    38 |  50 |
| 云南白药     |    19 |  76 |
| 云南白药     |    19 |  84 |
| 云南白药     |    19 |  50 |
| 云南白药     |    19 |  76 |
| 云南白药     |    19 |  84 |
| 云南白药     |    19 |  50 |
| 云南白药     |    23 |  76 |
| 云南白药     |    23 |  84 |
| 云南白药     |    23 |  50 |
| 青岛啤酒     |    21 |  76 |
| 青岛啤酒     |    21 |  84 |
| 青岛啤酒     |    21 |  50 |
+--------------+-------+-----+
24 rows in set (0.00 sec)

(3) 使用内连接查询商品表和订单表

mysql> select A.name, A.price, B.sum from goods as A inner join orders as B on A.id=B.gid;
+--------------+-------+-----+
| name         | price | sum |
+--------------+-------+-----+
| 黑人牙膏     |    25 |  50 |
| 云南白药     |    28 |  84 |
| 湖南辣条     |    38 |  76 |
+--------------+-------+--
---+
3 rows in set (0.00 sec)

(4) 使用左外连接查询商品表和订单表

mysql> select A.name, A.price, B.sum from goods as A left outer join orders as B on A.id=B.gid;
+--------------+-------+------+
| name         | price | sum  |
+--------------+-------+------+
| 黑人牙膏     |    25 |   50 |
| 云南白药     |    28 |   84 |
| 青岛啤酒     |     7 | NULL |
| 湖南辣条     |    38 |   76 |
| 云南白药     |    19 | NULL |
| 云南白药     |    19 | NULL |
| 云南白药     |    23 | NULL |
| 青岛啤酒     |    21 | NULL |
+--------------+-------+------+
8 rows in set (0.00 sec)

(5) 使用右外连接查询商品表和订单表

mysql> select A.name, A.price, B.sum from goods as A right outer join orders as B on A.id=B.gid;
+--------------+-------+-----+
| name         | price | sum |
+--------------+-------+-----+
| 黑人牙膏     |    25 |  50 |
| 云南白药     |    28 |  84 |
| 湖南辣条     |    38 |  76 |
+--------------+-------+-----+
3 rows in set (0.00 sec)

5.7.3 高薪就业班

(1) Python后端工程师高薪就业班,月薪10K-15K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪10K-20K, 免费领取课程大纲
(4) Python大数据工程师就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取学习资料:





欢迎 发表评论:

请登录

忘记密码我要注册

注册账号

已有账号?请登录