C/C++语言基础知识总结-Mysql join 连接查询

一、连接查询:

是将两个查询(或表)的每一行,以“两两横同对接”的方式,所得到的所有行的结果,即一个表中的某行,跟另一个表中的某行。进行“横向对接”,得到一个新行。

连接查询包括以下这些不同形式,连接方式:
交叉连接、内连接、外连接(分:左外连接,右外连接)

连接查询语法:

select * from 表名 [连接方式] join 表名 [on 连接条件] where ...; 

测试数据:

mysql> select * from test;
+----+--------+------+------+
| id | name   | sex  | age  |
+----+--------+------+------+
|  1 | name1  | 女   |   15 |
|  2 | name1  | 女   |   15 |
|  4 | name2  | 男   |   30 |
|  5 | name50 | 男   |   12 |
+----+--------+------+------+

mysql> select * from user;
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | name1 |   18 |
|  2 | name2 |   15 |
|  3 | name3 |   20 |
|  4 | name4 |   30 |
+----+-------+------+ 

C/C++语言基础知识总结-Mysql join 连接查询_第1张图片
资料视频免费获取:https://jq.qq.com/?_wv=1027&k=jUsaRsWY,学习直通车
交叉连接 (cross join):

  • 1、交叉连接其实可以认为是连接查询的“完全版本”, 即所有行都无条件地都连接起来。
  • 2、关键字 “cross” 可以省略;
  • 3、交叉连接又称为“笛卡尔积”,通常应用价值不大

语法形式:

  • select * from 表名, 表名;
  • select * from 表名 join 表名;
  • select * from 表名 cross join 表名;
规范的交叉连接写法
mysql> select * from test cross join user;
+----+--------+------+------+----+-------+------+
| id | name   | sex  | age  | id | name  | age  |
+----+--------+------+------+----+-------+------+
|  1 | name1  | 女   |   15 |  1 | name1 |   18 |
|  2 | name1  | 女   |   15 |  1 | name1 |   18 |
|  4 | name2  | 男   |   30 |  1 | name1 |   18 |
|  5 | name50 | 男   |   12 |  1 | name1 |   18 |
|  1 | name1  | 女   |   15 |  2 | name2 |   15 |
|  2 | name1  | 女   |   15 |  2 | name2 |   15 |
|  4 | name2  | 男   |   30 |  2 | name2 |   15 |
|  5 | name50 | 男   |   12 |  2 | name2 |   15 |
|  1 | name1  | 女   |   15 |  3 | name3 |   20 |
|  2 | name1  | 女   |   15 |  3 | name3 |   20 |
|  4 | name2  | 男   |   30 |  3 | name3 |   20 |
|  5 | name50 | 男   |   12 |  3 | name3 |   20 |
|  1 | name1  | 女   |   15 |  4 | name4 |   30 |
|  2 | name1  | 女   |   15 |  4 | name4 |   30 |
|  4 | name2  | 男   |   30 |  4 | name4 |   30 |
|  5 | name50 | 男   |   12 |  4 | name4 |   30 |
+----+--------+------+------+----+-------+------+

直接使用 join 进行连接,相当于 cross join,默认就是 交叉连接
mysql> select * from test join user;
查询结果跟上面一致!!!

还可以直接 from 表,表... 也相当于是交叉连接
mysql> select * from test, user;
查询结果跟上面一致!!! 

内连接 (inner join)

  • 1、内连接其实是交叉连接的基础上,再通过 on 条件而筛选出来的部分数据。
  • 2、关键字 “inner” 可以省略,但建议写上,真正有意义的是 on 连接条件。
  • 3、内连接是应用最广泛的一种连接查询,其本质是根据条件筛选出“有意义的数据”。
    语法形式:
  • select * from 表名 join 表名 on 连接条件;
  • select * from 表名 inner join 表名 on 连接条件;
查出两个表中 name 字段相等的数据
mysql> select * from test inner join user on test.name=user.name;
+----+-------+------+------+----+-------+------+
| id | name  | sex  | age  | id | name  | age  |
+----+-------+------+------+----+-------+------+
|  1 | name1 | 女   |   15 |  1 | name1 |   18 |
|  2 | name1 | 女   |   15 |  1 | name1 |   18 |
|  4 | name2 | 男   |   30 |  2 | name2 |   15 |
+----+-------+------+------+----+-------+------+

查出两个表中 name 字段相等的数据,通过 as 给表取个别名进行使用
mysql> select * from test as t inner join user as u on t.name=u.name;
查询结果跟上面一致!!!

查出两个表中 name 字段相等,test 表中 age>15,user 表中 age>10 的数据
如果使用表中有重复的字段,那么就需要通过 [表名.字段名] 来使用,例如 age :
mysql> select * from test inner join user on test.name=user.name where test.age>15 and user.age>10;
+----+-------+------+------+----+-------+------+
| id | name  | sex  | age  | id | name  | age  |
+----+-------+------+------+----+-------+------+
|  4 | name2 | 男   |   30 |  2 | name2 |   15 |
+----+-------+------+------+----+-------+------+

查出两个表中 name 字段相等,且 sex='男' 的数据。
如果使用表中没有重复的字段,那么可以通过 [表名.字段名] 或者直接使用 [字段名] 使用,例如 sex :
mysql> select * from test as t inner join user as u on t.name=u.name where t.sex='男';
mysql> select * from test as t inner join user as u on t.name=u.name where sex='男';
+----+-------+------+------+----+-------+------+
| id | name  | sex  | age  | id | name  | age  |
+----+-------+------+------+----+-------+------+
|  4 | name2 | 男   |   30 |  2 | name2 |   15 |
+----+-------+------+------+----+-------+------+ 

外连接 - 左外连接 (left join)

  • 1、左外连接其实是保证左边表的数据都能够取出的一种连接 。
  • 2、左外连接其实是在内连接的基础上,再加上左边表中所有不能满足条件的数据
  • 3、关键字 “outer" 可以省略。

语法形式:
select * from 表名 left [outer] join on 连接条件 where …;

以左边的表为基准,保证左边表的数据全部显示,匹配不到的数据为 NULL
mysql> select * from test left join user on test.name=user.name;
+----+--------+------+------+------+-------+------+
| id | name   | sex  | age  | id   | name  | age  |
+----+--------+------+------+------+-------+------+
|  1 | name1  | 女   |   15 |    1 | name1 |   18 |
|  2 | name1  | 女   |   15 |    1 | name1 |   18 |
|  4 | name2  | 男   |   30 |    2 | name2 |   15 |
|  5 | name50 | 男   |   12 | NULL | NULL  | NULL |
+----+--------+------+------+------+-------+------+ 

外连接 - 右外连接 (right join)

  • 1、右外连接其实是保证右边表的数据都能够取出的一种连接 。
  • 2、右外连接其实是在内连接的基础上,再加上右边表中所有不能满足条件的数据
  • 3、关键字 “outer" 可以省略。

语法形式:
select * from 表名 right [outer] join on 连接条件 where …;

以右边的表为基准,保证右边表的数据全部显示,匹配不到的数据为 NULL
mysql> select * from test right join user on test.name=user.name;
+------+-------+------+------+----+-------+------+
| id   | name  | sex  | age  | id | name  | age  |
+------+-------+------+------+----+-------+------+
|    1 | name1 | 女   |   15 |  1 | name1 |   18 |
|    2 | name1 | 女   |   15 |  1 | name1 |   18 |
|    4 | name2 | 男   |   30 |  2 | name2 |   15 |
| NULL | NULL  | NULL | NULL |  3 | name3 |   20 |
| NULL | NULL  | NULL | NULL |  4 | name4 |   30 |
+------+-------+------+------+----+-------+------+ 

你可能感兴趣的:(零基础,程序员,mysql,mysql优化,c++)