SQL入门详解(下)

书接上回

7、多表查询的精髓是: 根据关联条件把多张表变成一张表, 然后进行"单表"查询.

1) 交叉查询

        格式: select * from 表A, 表B;

select * from hero, kongfu;     -- 会产生大量的 脏数据, 实际开发不用.

2) 连接查询

        场景1: 内连接, 查询结果: 表的交集

格式1: 显式内连接.  select * from A inner join B on 关联条件 where ...;
select * from hero h inner join kongfu kf on h.kongfu_id = kf.kid;
select * from hero h join kongfu kf on h.kongfu_id = kf.kid;        # inner 可以省略不写

        场景2: 外连接.

格式1: 左外连接.  select * from A left outer join B on 关联条件 where ...;
      结果: 左表全集 + 交集
select * from hero h left outer join kongfu kf on h.kongfu_id = kf.kid;
select * from hero h left join kongfu kf on h.kongfu_id = kf.kid;    # outer可以省略

格式2: 右外连接.  结果: 右表全集 + 交集
select * from hero h right join kongfu kf on h.kongfu_id = kf.kid;    # outer可以省略

三、窗口函数       

1、概述:

        入门阶段的窗口函数主要是: row_number(), rank(), dense_rank(), 主要是用来做: 排名的.

        简单来说,窗口函数 = 给表 新增1列, 至于新增的一列是什么内容, 取决于你的窗口函数是怎么写的.

2、格式:

       开窗函数 over(partition by 分组字段 order by 排序字段 asc | desc)

       格式解释:

       开窗口函数:  这里指的是 row_number(), rank(), dense_rank()等

                over():    固定格式, 里边写的是: 分组, 排序的相关操作.

                partition by:   类似于group by, 做分组的.

                order by:       (局部)排序的, 即: 组内排序.

    细节:

        1. row_number(), rank(), dense_rank()主要区别就是 遇到相同数据了, 如何处理, 具体如下:

            例如: 数据为, 100, 90, 90, 80

            则:

                row_number():   1, 2, 3, 4

                rank():         1, 2, 2, 4

                dense_rank():   1, 2, 2, 3

        ( 窗口函数是MySQL8.X的新特性)

3、应用案例

        对employee表中按照deptid进行分组,并对每一组的员工按照薪资进行排名:分组排名.

select
    *,
    row_number() over(partition by deptid order by salary desc) as rn,
    rank() over(partition by deptid order by salary desc) as rk,
    dense_rank() over(partition by deptid order by salary desc) as dr
from employee;

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server存储过程是一种存储在数据库中的预编译的SQL脚本,能够被多次执行。它能实现复杂的数据库操作,并提供了很多优势,例如提高性能、减少网络流量以及提高代码重用性等。 下面以一个简单的入门例子来解释SQL Server存储过程的使用。 假设我们有一个名为"students"的表格,其中包含学生的ID、姓名和分数等字段。我们要创建一个存储过程,用于计算所有学生的平均分数。 首先,我们要创建一个存储过程,可以使用以下语法: ```sql CREATE PROCEDURE CalculateAverageScore AS BEGIN -- 存储过程的逻辑代码在这里 END ``` 在存储过程中,我们需要编写SQL查询语句来计算平均分数。这可以通过使用SELECT语句和聚合函数来实现,例如: ```sql CREATE PROCEDURE CalculateAverageScore AS BEGIN SELECT AVG(Score) AS AverageScore FROM students END ``` 在上面的例子中,我们使用AVG函数计算了所有学生的平均分数,并将结果命名为"AverageScore"。 创建存储过程后,我们可以通过执行以下语句来调用存储过程并获取结果: ```sql EXEC CalculateAverageScore ``` 通过执行以上语句,我们会得到一个结果集,其中包含计算出的平均分数。 总结来说,SQL Server存储过程是预编译的SQL脚本,用于实现复杂的数据库操作。它可以提高性能、减少网络流量并提高代码重用性。创建存储过程的语法包括使用CREATE PROCEDURE语句和编写逻辑代码。要调用存储过程,可以使用EXEC语句。以上是一个简单的存储过程例子,用于计算学生的平均分数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值