SQL的几种连接查询

简介: SQL的几种连接查询

引言


小编最近在公司一有时间就练练sql语句,因为小编的SQL语句太差了,因为小编不论是在现在的项目中还是前的项目中都是使用的EF,不怎么使用原生的sql语句,这就导致sql能力是越来越差啊,但是sql是一个程序员的基本素质, 所以不得不常常的练一练啊。下面就简单的总结一下四种常见的连接查询。


概念介绍


1、内联接:典型的联接运算,使用像 =  或 <> 之类的比较运算符),包括相等联接和自然联接,内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。


2、外联接:外联接可以是左向外联接、右向外联接或完整外部联接。


1)、LEFT JOIN 或者 LEFT OUTER JOIN


左向外联接的结果集包括 LEFT OUTER 关键字左边的表的所有的行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。


2)RIGHT JOIN 或者 RIGHT OUTER JOIN


和上面的 左联接正好相反,它是以 RIGHT JOIN右边的表为基准,包含右边表的所有的行,如果右边的行在左边的表中没有匹配的行,则在相关联的结果集行中右表的所有选择列表列均为空值。


3)FULL  JOIN 或 FULL OUTER JOIN


完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。


示例分析


左表为book表,右边为student表,其中book.studentCode与student.code 有关系

20160802214533551.png

内联接

SELECT a.*,b.* FROM contract.Student AS a INNER JOIN dbo.Book AS b ON b.studentCode = a.code


20160802214953307.png


左联接

SELECT a.*,b.* FROM contract.Student AS a LEFT JOIN dbo.Book AS b ON b.studentCode =


20160802215110731.png

右连接

SELECT a.*,b.* FROM contract.Student AS a RIGHT JOIN dbo.Book AS b ON b.studentCode = a.c


20160802215246056.png

全连接

 

SELECT a.*,b.* FROM contract.Student AS a FULL JOIN dbo.Book AS b ON b.studentCode = a


20160802215424244.png

以上是介绍的几种常用的连接查询,其实我们在调试程序跟踪数据的时候,这些查询语句还是非常常用的,如果这些东西不能很熟练的写出来是一件非常尴尬的事情,尤其是老大在你后面站着的时候。


PS:其实在EF中也是存在join关键字的,下面给大家分享一段代码

db.CapitalContract.Where(p => p.VersionEndTime == null
                    && (string.IsNullOrEmpty(condition.ContractName) ? true : p.ContractName.Contains(condition.ContractName))
                    && (string.IsNullOrEmpty(condition.ContractNumber) ? true : p.ContractNumber.Contains(condition.ContractNumber))
                    && (string.IsNullOrEmpty(condition.ContractTypeName) ? true : p.ContractTypeName.Contains(condition.ContractTypeName))
                    && (condition.SearchStartTime == null ? true : p.VersionStartTime >= condition.SearchStartTime)
                    && (condition.SearchEndTime == null ? true : p.VersionStartTime <= condition.SearchEndTime)).Join(
                        db.CapitalContractApplication.Where(q => q.FormStatusCode == ((int)FormStatusEnum.结束).ToString()
                        && q.FormTypeCode == ((int)FormTypeEnum.合同订立).ToString()
                        && q.ProjectCode == condition.ProjectCode
                        && q.VersionEndTime == null),
                        p => p.FormCode,
                        q => q.Code,
                        (p, q) => p),

上面代码是小编在项目中写的一段用EF实现两个表连接查询,在EF中关于join的说法非常的多,在这默认的是inner join的实现,对于这方面的知识读者自行bing就可以了。


小结


关于sql语句的学习,我们只有多写多用才是王道,这样我们才能很快很准确的写出一些查询语句,虽然我们在项目中不用sql语句,但是我们在数据库中查询数据的时候可无法避免,尤其是数据库中数据量非常大的时候,更是考验我们sql的基本素质了,所以这个东西需要我们好好练习!

目录
相关文章
|
6天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
17 0
sql语句加正则 简化查询
|
6天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
17 0
|
5天前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
|
6天前
|
SQL Java 关系型数据库
Mybatis多表关联查询与动态SQL(下)
Mybatis多表关联查询与动态SQL
18 0
|
6天前
|
SQL Java 数据库连接
Mybatis多表关联查询与动态SQL(上)
Mybatis多表关联查询与动态SQL
10 0
|
6天前
|
SQL Java 数据库连接
JDBC的连接参数的设置导致rowid自动添加到sql
JDBC的连接参数的设置导致rowid自动添加到sql
14 1
|
2天前
|
SQL 关系型数据库 MySQL
查询mysql版本sql - 蓝易云
执行这个命令后,MySQL将返回当前正在运行的版本信息。
34 0
|
6天前
|
SQL 分布式计算 DataWorks
实时数仓 Hologres产品使用合集之查询分区表的生命周期(即之前设置的'auto_partitioning.num_retention'值)的SQL语句,可以使用什么查询
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
19 0
|
6天前
|
SQL 前端开发
基于jeecgboot复杂sql查询的列表自定义列实现
基于jeecgboot复杂sql查询的列表自定义列实现
11 0
|
6天前
|
SQL 数据库
SQL数据库基础语法-查询语句
SQL数据库基础语法-查询语句