一、表连接

SQL Server支持多种连接包括:内连接,左连接,右连接,交叉连接,全外连接。

每种连接类型指定SQL Server如何使用一个表中的数据来选择另一个表中的行

1.内连接

内连接是查询出两个表相关联的部分。

select select_list
from T1
inner join T2 on join_predicate

内连接关键字:inner join ......on......,on后面跟查询条件。from后面跟的表为主表,inner join后面跟的表为副表。(后面的左连接,右连接,交叉连接,自连接也同样适用)

2.左连接

left join子句用于查询多个表的数据。它返回左表中的所有行和右表中的匹配行,如果右表中找不到匹配行,则返回NULL值

selectselect_list
fromT1
left join T2 onjoin_predicate

关键字:left join.....on......

3.右连接

selectselect_list
fromT1
left join T2 onjoin_predicate

关键字:right join.....on......

4.交叉连接

cross join连接两个或多个不相关的表

以下是两个表的SQL Server join的语法cross join将第一个表中的每一行与第二个表中的每一行连接起来。换句话说,交叉连接返回两个表中行的笛卡尔积。与inner join或left join不同,交叉连接不会再连接的表之间建立关系

SELECTselect_list
FROMT1
CROSS JOIN T2

5.自连接

自连接不在五大连接之内。自连接用于将表连接到自身(同一个表)。它对于查询分层数据或比较同一个表中的行很有用。

自连接使用内连接或左连接子句。由于使用自连接的查询引用同一个表。因此表别名用于为查询中的表分配不同的名称。

如果在不使用表别名的情况下多次引用同一个表,则会出现错误

SELECTselect_list
FROM T t1
[inner|left] join T t2 onjoin_predicate;

6.全外连接

关键字:full outer join

当左表或右表中存在匹配项时,该命令将返回所有的行

select * from pm.projects p
full outer join pm.members m
on p.id=m.project_id

原本两个表有关联,但是名称不一样

进行全外链接后得到

约等于左连接和右连接进行合并,关联不上的都给null值

二、子查询

1.子查询

select * from sales.orders
where customer_id in(
select customer_id from sales.customers
where city='New York' ) 

子查询时嵌套在另一个语句中如:(select,insert,update或delete)中的查询

2.嵌套子查询

子查询可以嵌套在另一个子查询中,SQL Server最多支持32个嵌套级别

--查找价格高于'上海永久','凤凰'品牌的所有产品的平均定价的产品
select * from production.products
where list_price >(
select avg(list_price)
from production.products
where brand_id in (selectbrand_idfromproduction.brandswherebrand_name in('上海永久','凤凰')
)
)

最终的出的结果如下图所示,共161条数据

3.相关子查询

相关子查询是外部查询的值的【子查询】。换句话说,它取决于外部有查询的值,由于这种依赖性,相关子查询不能作为简单的子查询独立执行

此外,对外部查询评估的每一行重复执行一次相关子查询

相关子查询也称为重复子查询

---示例查找价格等于其类别的最高价格的产品
---子查询
select * from production.products p1
inner join(select category_id,max(list_price)max_pricefrom production.productsgroup by category_id)p2on p1.category_id=p2.category_idand p1.list_price=p2.max_price---相关子查询
select p1.* from production.products p1
where p1.list_price in(select max(list_price)max_pricefrom production.products p2where p1.category_id=p2.category_idgroup by category_id
)
select p1.* from production.products p1
order by category_id

4.Exists运算符

Exists运算符是一个逻辑运算符,用于检查子查询是否放回任何行,如果子查询返回一行或多行,则Exists运算符返回true以下是SQL Server Exists运算符的语法:

Exists(subquery)

在此语法中,子查询仅是Select语句。子查询返回行后,Exists运算符返回true并立即停止处理

请注意,即使子查询返回Null值,Exists运算符也会计算为true

select * fromproduction.products p1
where exists(select * fromproduction.products p2wherep1.category_id = p2.category_idand p1.list_price>8000)

5.any运算符

--查找其他品牌价格大于‘优米优品牌的任意产品的价格的产品’
select * fromproduction.products
wherelist_price>any
(select list_price from production.productswherebrand_id =9)
andbrand_id!=9
order by list_price

某个值大于any()指大于any中任意一个值,有可能大于最小值,有可能大于最大值

6.all运算符

--查找其他品牌价格大于‘优米优’品牌任何产品的价格的产品
select * fromproduction.products
wherelist_price>all
(selectlist_price from production.products where brand_id=9)
andbrand_id!=9
order by list_price

当要求的数据大于all时是大于最大值,小于all时是最小值

SQL中的表连接及子查询相关推荐

  1. OceanBase SQL 执行计划解读(二)──── 表连接和子查询

    前文<OceanBase SQL 执行计划解读(一)>介绍了单表查询中基本的执行计划解读,本文主要介绍简单的表连接和子查询相关的执行计划. 本文假设你对常用的表连接算法已有了解,包括:嵌套 ...

  2. ylb:SQL 表的高级查询-多表连接和子查询

    ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...

  3. 02-SQL语句给表起别名SQL中的表连接

    什么情况下需要给表起别名? 1.表名比较长 2.当需要在多个表中进行查询并把查询内容同时输出的时候 3.当需要进行表连接的时候(其实和2一个意思,一般情况下多个表进行连接主要目的就是为了从多个表中查询 ...

  4. SQL中关于EXISTS的嵌套子查询问题

    SQL中关于EXISTS的嵌套子查询问题 SQL语句中,没有蕴含式和全程量词,所以这个时候,我们可以用离散数学的理论,将命题变化,然后使用EXISTS语句来查询,确实有点难以理解,下面我举一个例子来解 ...

  5. MS sql server 基础知识回顾(二)-表连接和子查询

    五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...

  6. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

  7. 数据库学习笔记6--MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  8. 4,表查询语法,表连接,子查询

    数据库基础四: 今日内容: 一:单表查询语法 from 找表 where 第一次筛选 group by 分组 having 二次筛选 distinct 去重(数据一模一样时去重复的,在from之前使用 ...

  9. mysql用if判断关联的表_mysql表连接,子查询以及if判断

    创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2 ...

  10. SQL中关联表并使用子表的COUNT和SUM函数作为扩展字段

    场景 主表wms_receive_order, 表wms_receive_order_details是其详情表. 详情表的receive_id字段与主表 的id字段相关联. 现在要查出主表的部分信息以 ...

最新文章

  1. 数据结构和算法:(3)3.1线性表的顺序存储结构
  2. 开发日记-20190806 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 20
  3. 记-python中socket服务器设置中的setsockopt
  4. 从《爱莉克斯》说起,聊聊当前 VR 游戏设计的“困境”与“尝试”
  5. 10月15日 第一天申请成功
  6. vue + vue-router + vue-resource 基于vue-cli脚手架 ---笔记
  7. 还你一个干净清爽的Windows系统--win7重装小记
  8. 【Swift】iOS UICollectionView 计算 Cell 大小的陷阱
  9. python之路---15 装饰器
  10. Android自定义View【实战教程】1⃣️----attrs.xml详解
  11. 1月16日新经济智库大会聚焦数字经济,议程、直播全收藏
  12. Android 刷机脚本工具箱
  13. 全国计算机二级office题库
  14. Silvaco TCAD仿真2——Silvaco TCAD 档名
  15. 火狐怎么导入旧的火狐数据_如何与Firefox分手
  16. android游戏工作心得体会,幼儿园游戏的心得体会(精选6篇)
  17. python wgs84坐标转换_python WGS84和ECEF坐标的转换
  18. SSLOJ 1323.交流
  19. dateframe取某列数据_DataFrame数据选取全攻略
  20. 学习笔记,神经网络和反向传播

热门文章

  1. 张家界3天旅游攻略(带你的想象给我游玩一遍)
  2. oracle10g没有行列转换函数的替代方法(转)
  3. Android进程分类与管理
  4. Handler的理解、用法以及运行机制原理
  5. VS 由于找不到ucrtbased.dll,无法继续执行代码。
  6. 那些年的 Hello World (HTML)
  7. ATOM Z3000 家族整理之基本信息(一) V2.0版
  8. Servlet-JSP-课堂笔记
  9. 微信美团服务器异常怎么回事,美团行为存在异常怎么解决?美团账号异常怎么回事...
  10. c++ map查找key