SQL Server基础SQL脚本之内外连接、交叉连接;函数、子查询
时间:2022-05-03
本文章向大家介绍SQL Server基础SQL脚本之内外连接、交叉连接;函数、子查询,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代码大概200行左右 本系列,几乎都是代码,记得当时写的时候用的是微软的官方实例数据库AdventureWorks_Data.mdf、AdventureWorks_Log.ldf来运行的。 下载链接:链接: https://pan.baidu.com/s/1pMdLz6N 密码: xvhu 或者回复“AdventureWorks”来获取链接。
use AdventureWorks --切换到AdventureWorks数据库
--创建Student表和Marks表,用于操作各种联接
create table Student --创建学生表,里面包含两列,学号和姓名
(
RollNo char(4),
Name varchar(20)
)
insert into Student values --向Student表中插入5行记录
('S001','Allen'),
('S002','Jhon'),
('S003','David'),
('S004','Stefen'),
('S005','Steve')
create table Marks --创建成绩表,里面包含三列,学号,RDMBS和Math
(
RollNo char(4),
RDBMS int,
Math int
)
insert into Marks values --向成绩表中插入三行记录
('S001',98,76),
('S002',67,64),
('S003',76,96)
select * from Student
select * from Marks
--1. 内联接 INNTER JOIN- 显示满足公共列中联接条件的行 inner可加可不加
--问题:查询有考试成绩的学生的学号,姓名,RDBMS成绩和Math成绩
-----练习:已知
select * from HumanResources.Employee
select * from HumanResources.EmployeeAddress
go
--显示:EmployeeID, Title, AddressID 的匹配信息 ----inner join
--给表名一个别名
--2. 外联接 - 显示包含一个表中的所有行以及另外一个表中匹配行的结果集,不匹配的用NULL值填充
--(1)左外联接 - 返回LEFT OUTER JOIN 左侧的表的所有行,以及右侧指定的表的匹配行,若右边找不到匹配项,显示NULL值
--(2)右外联接 - 返回RIGHT OUTER JOIN 右侧的表的所有行,以及左侧指定的表的匹配行,若左边找不到匹配项,显示NULL值
--(3)完整外联接 - 左外联接和右外联接的组合,返回两个表中所有匹配的行和不匹配的行,匹配记录只显示一次
--3. 交叉联接(Cross Join) Product运算,将一个表中的每一行与另一个表中的
--------------------
create table Course --创建Course表,里面包含一列CourseName
(CourseName varchar(10))
insert into Course values --向Course表中插入两行记录
('English'),
('C Language')
select * from Student
select * from Course
--要求显示结果为每个学生都修一遍Course表中的所有课程
--4. 等值联接 --使用=号联接表的内联接
--练习:查询员工的员工编号,所属部门名称和工资 联接多个表
select * from HumanResources.Employee
select * from HumanResources.EmployeeDepartmentHistory
select * from HumanResources.Department
--5. 自联接 - 同一个表当成两张表使用,一个表中的一行联接另一个表中的一行
select * from HumanResources.Employee
select a.EmployeeID,a.Title,a.ManagerID,b.Title from
--查询员工的编号,职位,其主管的员工编号和其主管的职位
HumanResources.Employee a join HumanResources.Employee b on a.ManagerID=b.EmployeeID
--根据其主管的员工编号找到对应的职位
select a.EmployeeID,a.Title,a.ManagerID,b.Title from
--查询员工的编号,职位,其主管的员工编号和其主管的职位
HumanResources.Employee a , HumanResources.Employee b where a.ManagerID=b.EmployeeID --根据其主管的员工编号找到对应的职位
---------------------- (二)、使用子查询查询数据----------------------------
--子查询:将一个select的查询结果作为另外一个select查询的输入/条件,查询里面的查询
--1. 使用比较运算符,IN和EXISTS关键字
--比较运算符,以=号为主
select * from HumanResources.Employee
--问题:查询和员工编号为1的员工职位(Title)相同的员工的信息
--IN 多个值
--问题:查询和员工编号为1,3,4的员工的职位相同的员工的信息
--EXISTS关键字-检查一组记录是否存在,返回True或False
--if exists(select * from databases where name='UDB') drop database UDB
------------------
select * from HumanResources.Employee
select * from HumanResources.EmployeeDepartmentHistory
--2. 使用修改过的比较运算符 ALL,ANY
--问题:查询
--查询RDBMS成绩高于S002或者高于S003的学生的信息
select * from Marks
go
--查询RDBMS成绩高于S002并且高于S003的学生的信息
--3. 使用聚合函数
--问题:查询RDBMS成绩最高的学生的学号和RDBMS成绩
--4. 使用嵌套子查询 --子查询里面可以包含一个或多个子查询,这样叫做嵌套子查询
--问题:查询工资最高的员工的编号 HumanResources.EmployeePayHistory
select * from HumanResources.EmployeePayHistory
--问题:查询工资最高的员工所在的部门编号
select * from HumanResources.EmployeeDepartmentHistory
--5. 使用关联子查询 - 根据外部查询作为评估依据的查询
--问题:查询每个部门最早加入的员工的信息
select * from HumanResources.EmployeeDepartmentHistory a
where StartDate=
(
select min(StartDate) from HumanResources.EmployeeDepartmentHistory
where DepartmentID=a.DepartmentID
)
--6. APPLY运算符 --合并两个查询的结果集,
---------------------------------------------
create table Depositor --创建Depositor表,存储储蓄用户信息,表中有两列,客户姓名和储蓄账户
(
"客户姓名" varchar(20),
"储蓄账户" char(3)
)
insert into Depositor values --向Depositor表中插入两条记录
('Allen','D01'),
('David','D02')
create table Borrower --创建Borrower表,存储贷款用户信息,表中有两列,客户姓名和贷款账户
(
"客户姓名" varchar(20),
"贷款账户" char(3)
)
insert into Borrower values --向Borrower表中插入两行记录
('Amy','B11'),
('David','B12')
--------------------------------------
select * from Depositor
select * from Borrower
--CROSS APPLY - 返回外部结果集中与内部结果集匹配的行
select a.客户姓名,a.储蓄账户,br.贷款账户 from Depositor a --外部结果集
cross apply
(select * from Borrower b where b.客户姓名=a.客户姓名) br --br为内部结果集的别名
--OUTER APPLY - 返回外部结果集中所有的行,即使内部结果集中没有找到此行
select a.客户姓名,a.储蓄账户,br.贷款账户 from Depositor a --外部结果集
outer apply
(select * from Borrower b where b.客户姓名=a.客户姓名) br --br为内部结果集的别名
- Angular+servlet java实现前后端数据交互
- servlet容器tomcat和jetty的简单使用
- activiti学习笔记(一) 获取流程配置实例
- ofbiz 服务引擎(一) controller中服务的调用解析
- ofbiz实体引擎(九) 多租户
- SparkStreaming入门
- 拒绝重复造轮子,用composer搞自己的框架(2)
- 拒绝重复造轮子,用composer搞自己的框架(1)
- 我的第一次ChIP-seq实践
- SparkStreaming窗口操作
- 史上最全Git使用手册
- 我所理解的 PHP Trait
- 算法 | 数据结构常见的八大排序算法
- 高通量数据下载还能这样操作?
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- css属性为 { flex: 1 }时表示的意思
- Android studio 实现手机扫描二维码功能
- Nginx 平滑升级与回滚
- Android实现通用筛选栏
- Android实现关机后数据不会丢失问题
- Canvas 进阶(五)实现图片滤镜效果
- 将IP地址字符串分割成数组
- android监听器实例代码
- (火狐)Selenium WebDriver测试 NotADirectoryError: [WinError 267] 目录名称无效。
- 浅析Android高斯模糊实现方案
- Android 自定义验证码输入框的实例代码(支持粘贴连续性)
- _countof和sizeof
- Flutter适配深色模式的方法(DarkMode)
- RecyclerView+SnapHelper实现无限循环筛选控件
- 详解Android 8.1.0 Service 中 弹出 Dialog的方法