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为内部结果集的别名

原文发布于微信公众号 - 数据库SQL(SQLdba)

原文发表时间:2018-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰同学骚年

《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

  数据库在物理上由数据文件和事务日志文件组成,每个数据库必须至少有一个数据文件和一个日志文件。

795
来自专栏简书专栏

mysql必知必会2

语法:delete from {1} where {2} 第一对大括号替换为表名,第二对大括号替换为查询条件。 注意:删除语句一定要写删除条件,否则整张表删...

842
来自专栏小白客

学习SQL【10】-SQL高级处理

所谓高级处理,从用户的角度来讲,就是那些对数值进行排序,计算销售总额等我们熟悉的处理;从SQL的角度来讲,就是近几年才添加的新功能,这些新功能使得SQL的工作范...

3405
来自专栏熊二哥

那些年我们写过的T-SQL(上篇)

在当今这个多种不同数据库混用,各种不同语言不同框架融合的年代(一切为了降低成本并高效的提供服务),知识点多如牛毛。虽然大部分SQL脚本可以使用标准SQL来写,但...

18610
来自专栏数说戏聊

09-10章 汇总分组数据第9章

如果需要汇总数据而不是检索,SQL 提供专用函数,可用于检索数据,以便分析和报表生成。这种类型的检索例子有:

731
来自专栏杨建荣的学习笔记

怎样突破表名30个字符的限制(r2笔记51天)

根据oracle的规范,对象的长度最大为30位,也就是说,在平时的使用中如果碰到表名长度大于30位,首先oracle是不答应的,它会提示idnetifier t...

2636
来自专栏杨建荣的学习笔记

MySQL中的NULL和空串比较 (r9笔记第52天)

今天接到一个MySQL工单,是执行几条SQL语句。我一看就感觉这语句比较有意思。 语句大体是这样的: update app_code_value set cha...

3094
来自专栏Web项目聚集地

Oracle知识点总结(一)

这里用1,也是为了方便,当然如果数据量较大的话,也可以提高速度,因为写count(*)的话会所有列扫描,这里用1的话或者用字段名的话,只扫描你写的那个列其实1就...

721
来自专栏程序猿

使用联接和子查询来查询数据

--Chapter 3 使用联接和子查询来查询数据 --内容提要 go /* (一)、使用联接查询数据 1. 内联接 2. 外联接 3...

2776
来自专栏james大数据架构

你真的会玩SQL吗?EXISTS和IN之间的区别

你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真...

1926

扫码关注云+社区