时间:2020-10-10来源:www.pcxitongcheng.com作者:电脑系统城
连接查询:
是将两个查询(或表)的每一行,以“两两横同对接”的方式,所得到的所有行的结果,即一个表中的某行,跟另一个表中的某行。进行“横向对接”,得到一个新行。
连接查询包括以下这些不同形式,连接方式:
交叉连接、内连接、外连接(分:左外连接,右外连接)
连接查询语法:
select * from 表名 [连接方式] join 表名 [on 连接条件] where ...;
测试数据:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 | + ----+-------+------+ |
交叉连接 (cross join)
1、交叉连接其实可以认为是连接查询的“完全版本”, 即所有行都无条件地都连接起来。
2、关键字 “cross” 可以省略;
3、交叉连接又称为“笛卡尔积”,通常应用价值不大
语法形式:
select * from 表名, 表名;
select * from 表名 join 表名;
select * from 表名 cross join 表名;
规范的交叉连接写法
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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,默认就是 交叉连接
?1 | mysql> select * from test join user ; |
查询结果跟上面一致!!!
还可以直接 from 表,表... 也相当于是交叉连接
?1 | mysql> select * from test, user ; |
查询结果跟上面一致!!!
内连接 (inner join)
1、内连接其实是交叉连接的基础上,再通过 on 条件而筛选出来的部分数据。
2、关键字 "inner" 可以省略,但建议写上,真正有意义的是 on 连接条件。
3、内连接是应用最广泛的一种连接查询,其本质是根据条件筛选出“有意义的数据”。
语法形式:
select * from 表名 join 表名 on 连接条件;
select * from 表名 inner join 表名 on 连接条件;
查出两个表中 name 字段相等的数据
?1 2 3 4 5 6 7 8 |
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 给表取个别名进行使用
?1 | mysql> select * from test as t inner join user as u on t. name =u. name ; |
查询结果跟上面一致!!!
查出两个表中 name 字段相等,test 表中 age>15,user 表中 age>10 的数据
如果使用表中有重复的字段,那么就需要通过 [表名.字段名] 来使用,例如 age :
?1 2 3 4 5 6 |
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 :
?1 2 3 4 5 6 7 |
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
?1 2 3 4 5 6 7 8 9 |
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
?1 2 3 4 5 6 7 8 9 10 |
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 join连接查询的语法与示例的文章就介绍到这了,
2023-10-31
Oracle如何编写一个sqlldr实例2023-10-31
Oracle的SQLLDR用法简介2023-10-31
Oracle中的高效SQL编写PARALLEL解析1.Oracle数据库系统结构概述 2.Oracle数据库存储结构 物理存储结构 控制文件 数据文件 重做日志文件 归档日志文件 Oracle数据库逻辑结构 数据块(Data Block) (盘)区(Extent) 段(Segment) 表空间(Tablespace) 本地管...
2023-10-31
windows下的Oracle19c 一、官网下载Oracle19c数据库 二、安装Oracle数据库 1.解压安装包 2.运行setup.exe安装 三、配置 四、安装完Oracle数据库,给scott用户解锁 1.解决Oracle数据库中没有scott账户的问题 2.给scott...
2023-10-31