SQL中的表连接及子查询
一、表连接
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中的表连接及子查询相关推荐
- OceanBase SQL 执行计划解读(二)──── 表连接和子查询
前文<OceanBase SQL 执行计划解读(一)>介绍了单表查询中基本的执行计划解读,本文主要介绍简单的表连接和子查询相关的执行计划. 本文假设你对常用的表连接算法已有了解,包括:嵌套 ...
- ylb:SQL 表的高级查询-多表连接和子查询
ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...
- 02-SQL语句给表起别名SQL中的表连接
什么情况下需要给表起别名? 1.表名比较长 2.当需要在多个表中进行查询并把查询内容同时输出的时候 3.当需要进行表连接的时候(其实和2一个意思,一般情况下多个表进行连接主要目的就是为了从多个表中查询 ...
- SQL中关于EXISTS的嵌套子查询问题
SQL中关于EXISTS的嵌套子查询问题 SQL语句中,没有蕴含式和全程量词,所以这个时候,我们可以用离散数学的理论,将命题变化,然后使用EXISTS语句来查询,确实有点难以理解,下面我举一个例子来解 ...
- MS sql server 基础知识回顾(二)-表连接和子查询
五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...
- mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...
- 数据库学习笔记6--MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- 4,表查询语法,表连接,子查询
数据库基础四: 今日内容: 一:单表查询语法 from 找表 where 第一次筛选 group by 分组 having 二次筛选 distinct 去重(数据一模一样时去重复的,在from之前使用 ...
- mysql用if判断关联的表_mysql表连接,子查询以及if判断
创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2 ...
- SQL中关联表并使用子表的COUNT和SUM函数作为扩展字段
场景 主表wms_receive_order, 表wms_receive_order_details是其详情表. 详情表的receive_id字段与主表 的id字段相关联. 现在要查出主表的部分信息以 ...
最新文章
- 数据结构和算法:(3)3.1线性表的顺序存储结构
- 开发日记-20190806 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 20
- 记-python中socket服务器设置中的setsockopt
- 从《爱莉克斯》说起,聊聊当前 VR 游戏设计的“困境”与“尝试”
- 10月15日 第一天申请成功
- vue + vue-router + vue-resource 基于vue-cli脚手架 ---笔记
- 还你一个干净清爽的Windows系统--win7重装小记
- 【Swift】iOS UICollectionView 计算 Cell 大小的陷阱
- python之路---15 装饰器
- Android自定义View【实战教程】1⃣️----attrs.xml详解
- 1月16日新经济智库大会聚焦数字经济,议程、直播全收藏
- Android 刷机脚本工具箱
- 全国计算机二级office题库
- Silvaco TCAD仿真2——Silvaco TCAD 档名
- 火狐怎么导入旧的火狐数据_如何与Firefox分手
- android游戏工作心得体会,幼儿园游戏的心得体会(精选6篇)
- python wgs84坐标转换_python WGS84和ECEF坐标的转换
- SSLOJ 1323.交流
- dateframe取某列数据_DataFrame数据选取全攻略
- 学习笔记,神经网络和反向传播