一、前言
作为一个致力于JavaWeb开发工程师来说,数据库的CRUD乃是最为基本的个人修养。尤其是各种查询语句,交叉连接、内连接、外连接(左外连接、右外连接、全外连接)这都是需要熟练掌握运用。接下来的文章里,就来透析这些连接的运用以及注意事项。
二、主题
(一)交叉连接
交叉连接是将查询的所有行进行组合,假如用两个表进行交叉连接。连接查询出来的结果就是表一中所有的记录与表二中所有记录的组成的一条新纪录,而有趣的是连接后的结果集是为两个表的记录数的乘积。下面来看下交叉连接的sql语法格式
- 在旧式的sql语句中,交叉连接语句格式为: SELECT [目标列表表达式] FROM [表名1], [表名2]
- 在ANSI SQL-92中,交叉连接的语法格式为: SELECT [目标列表表达式] FROM [表名1] CROSS JOIN [表名2] (强烈推荐)
这两种表达方式效果相同,下面看下实际操作:
图中users(用户信息表) time_userlogin(用户的登录记录表)
可以看到通过交叉连接的结果集是两张表记录数的乘积,所以查询出来的内容在实战项目中并没有多大意义。所以一般都很少使用,作为了解就ok。
(二)内连接
内连接是查询多条满足查询条件的记录数。根据不同的连接条件运算符分为两种:等值连接查询 和 非等值连接查询,连接条件是指明表与表之间按照什么条件进行连接。
语法格式:
- SELECT [目标列表表达式] FROM [表名1],[表名2] WHERE <连接条件>
- SELECT [目标列表表达式] FROM [表名1] JOIN [表名2] ON <连接条件>
一般我们都知道使用第一种没有JOIN方式,两种方式的效果一样。下面我们分别演示下执行效果,表还是上面说到的用户表和用户的登录记录表
这是第一种语法格式执行的两张连表查询
通过加入join关键字,实现第二种两张表连接查询,以上都是两张标的等值连接查询,下面我们来实现如何非等值连接查询:
为了演示如何非等值连接查询,我在用户表(users)中加入了一条U_LoginCount字段,非等值连接查询也就是查询条件为非等号的比较运算符。
(三)左外连接
左外链接就是在内连接查询的基础上左表中的所有记录与右表中的所有记录进行组合,结果集中除了返回内连接的记录外,还在查询结果中左表不符合条件的记录,并在右边相应的字段上显示null。下面是sql的语法格式:
- SELECT [目标列表表达式] FROM [表名1] LEFT JOIN [表名2] ON <连接条件>
左外连接就在内连接的基础上多了一个LEFT关键字来描述查询结果是左外连接,下面是查询演示
因为内连接的查询结果集是满足连接条件的记录,所以就有些需求需要在其中一张表的信息不存在时使用外连接。
(四)右外连接
右外连接与左外连接相差无几,从语法角度来看就是将LEFT变为了RIGHT。在查询结果集上来看,是左边的表中的内容存在与右边的内容不必配在左边的相应字段显示为null。
- SELECT [目标列表表达式] FROM [表名1] RIGHT JOIN [表名2] ON <连接条件>
下面直接展示查询效果,掌握了左外连接右边的也很好理解
(五)全外连接
全外连接就是将两个表进行组合,结果集中除返回内连接的记录外,还在查询结果中返回两张表中不符合条件的记录,并在左表或者是右表中显示为null.
查询语法:
- SELECT [目标列表表达式] FROM [表名1] FULL JOIN [表名2] ON <连接条件>
这语法大体都是一样的,就是在上面的基础上把相应的关键词改了。
三、总结
查询中查询语句都相差无几,只要掌握好其中这五种查询语句。基本上能应付实战中大部分查询需求,此外还有两个听得比较少但也是很好用的方法(合并结果集和嵌套查询)。在这里就不在做过多的叙述,大家感兴趣的可以自行百度一下。还有多表查询的问题,上面的查询都是两表联查。三表四表的查询基本上和两表都差不多,并没有很大的区别。掌握好了单表,多表查起来也会得心应手。最后,世上万物都无十全十美,文章也有讲的不全错误的地方。欢迎发现问题的大佬,积极指正。写出来不容易,点个赞吧!谢谢支持