SQL Server数据库 -- 索引与视图

news2024/12/28 19:29:32

文章目录

  • 一、索引
    • 聚集索引
    • 非聚集索引
  • 二、视图
  • 三、自定义函数
    • 标量函数
    • 表值函数
  • 四、游标
  • 五、总结

前言

在学习完创建库表、查询等知识点后,为了更加方便优化数据库的存储和内容,我们需要学习一系列的方法例如索引与视图等等,从而使我们更加熟练和使用数据库,突破表面,触摸内部!


一、索引

1、索引简介

      索引是加快数据查询效率的一种有效方法,因为建立索引可以改变数据的搜索结构。多数情况下索引是建立在基础表上的,但也可以建立在视图上。

      在数据库中建立索引是为了提高数据的查询速度,与书本前面的目录或书后面的术语表类似。利用目录或属于快速查找所需信息,而无需翻阅整本书。

但是使用索引也是有代价的:

      首先,索引在数据库中占有一定的存储空间。其次,在对数据进行插入、修改、删除操作时,为了使索引与数据保持一致,还需要对索引进行相应的维护,而维护是需要时间成本的。

2、聚集索引      

      聚集索引对数据按索引关键词进行物理排序,像一颗B树(平衡树)一样,最上层结点和中间层结点放置索引页码编号范围,最下层才放置数据。从上往下查找,直至找到相同的页码编号。

例如下图所示:

例如:查找E08的所有信息 

解析:首先看顶层,如果比E07小则选择左边,和E07相等或者大于E07则选择右边。E08比EE07大则看向右边!以此类推,E08比E10小则选择左边,最终看向E08所对应的所有信息!

      聚集索引的关键词:clustered index,用于给什么表的什么字段创建添加索引

现有学生表如下:

当创建表时有主键时会自动创建一个聚集索引,因此一般不需要我们再去创建聚集索引,

并且要求聚集索引只能由一个。

1.创建聚集索引

给student表中的id字段添加聚集索引

create clustered index index_id
on student(id)

2.查看聚集索引

select *from sys.indexes where name = 'index_id'

3.删除聚集索引

drop index index_id on student

 3、非聚集索引

      非聚集索引与书本后面的术语表差不多,但非聚集索引不对数据进行物理排序,并且非聚集索引的最后一层结点并不放数据。非聚集索引是可以定义多个的,SQL Server2017最多允许在一个表上建立999个非聚集索引。

      非聚集索引关键字:nonclustered index

1.创建非聚集索引

给student表中的id字段添加一个非聚集聚集索引index_id

create nonclustered index index_id
on student(id)

2.查看非聚集索引

select *from sys.indexes where name = 'index_id'

 

 3.删除非聚集索引

drop index index_id on student

4、聚集索引与非聚集索引的区别 

1、聚集索引按索引关键字进行物理排序,非聚集索引不对数据 进行物理排序。

2、聚集索引最后一层结点存放数据,非聚集索引最后一层结点不放置数据。


二、视图

1、视图简介

      视图是从数据库的基本表中选取出来的数据组成的逻辑窗口,是基本表部分行、部分列数据的组合。与基本表不同的是,视图是一个虚表,数据库中只存储视图的定义,而不存储视图的数据,这些数据仍存放在原来的基本表中。

      使用视图的好处:

1、视图数据会始终与基本表数据保持一致。

2、节省存储空间。当数据量非常大时,重复存储数据是非常耗费空间的。

2、视图语句

现有学生表如下:

 对上面的学生表进行操作!

1.创建视图

建立年龄在十八岁以上学生的学号、姓名、年龄的视图

create view is_student
as
select id,name,age from student
where age>18

 2.查看视图

select *from is_student

 

 3.删除视图

drop view is_student

三、自定义函数

      用户自定义函数可以扩展数据操作的功能,在概念上类似于一般的程序设计语言函数中定义的函数。SQL Server支持两类用户定义函数:标量函数和表值函数。标量函数只返回单个数据值,而表值函数是返回一个表。函数关键词:function

1、标量函数

      当调用标量函数时,必须提供最少由两部分组成的名称:函数所属架构名和函数名。只要类型一致,可在任何允许出现表达的SQL语句中调用标量函数。

现有学生表student如下:

1.创建标量函数

创建查询指定学生(学号)的所在系名称的标量函数  ->  输入学号得到学生所在系

create function myself(@sno char(9))
returns char(2)
as
begin
return (select dept from student where sno = @sno)
end

2.调用标量函数

查询学生学号为:202115005所在系名称

select dbo.myself(202115005)

 3.删除标量函数

删除标量函数myself

drop function dbo.myself

2、表值函数

      表值函数的使用方法与视图非常类似,需要将其放置在查询语句的from子句部分,其作用类似于带参数的视图。

现有学生表student如下:

1.创建表值函数

创建查询指定系的学生学号、姓名、性别和年龄  ->  输入系得到所有系内的学生信息

create function getnew(@dept char(2))
returns table
as
return(
	select *from student 
	where dept = @dept
)

 2.调用表值函数

查询CS系的所有学生信息

select *from dbo.getnew('CS')

3.删除表值函数

drop function dbo.getnew

四、游标

      由select语句返回的行集中包括所有满足条件子句的行,这一完整的行集被称为结果集。但有时候用户需要对结果集中的每一行或部分行进行单独的处理,而这在select结果集中无法实现。游标就是提供上述机制的结果集扩展,我们可以使用游标逐行处理结果集。游标的关键词为:cursor

1、游标的组成及特点

游标由两部分组成:游标结果集 和 游标当前行指针

游标具有如下特点:

1、允许定位结果集中的特定行

2、允许从结果集的当前位置检索一行或多行

3、支持对结果集中当前行数据的修改

4、为其他用户对显示在结果集中的数据的更改提供不同级别的可见性支持

 现有学生表student如下:

2、游标的用法

定义查询姓 ”王“的学生的姓名和所在系的游标,并输出游标结果 

1.创建游标

declare @sname char(10),@dept varchar(20)-- 声明存放结果集数据的变量
declare s1 cursor for  --创建游标
select sname,dept from student
where sname like '王%'

2.打开游标

open s1

3.提取行数据

fetch next from s1 into @sname,@dept --首先提取第一行数据
while @@FETCH_STATUS = 0  --通过检查判断是否还有可读取的值
begin
print 
@sname + @dept
fetch next from s1 into @sname,@dept --提取下一行数据
end

4.关闭和删除游标

close s1  --关闭游标
deallocate s1 --删除游标

整体代码如下:

declare @sname char(10),@dept varchar(20)-- 声明存放结果集数据的变量
declare s1 cursor for  --创建游标
select sname,dept from student
where sname like '王%'
open s1
fetch next from s1 into @sname,@dept --首先提取第一行数据
while @@FETCH_STATUS = 0  --通过检查判断是否还有可读取的值
begin
print 
@sname + @dept
fetch next from s1 into @sname,@dept --提取下一行数据
end
close s1  --关闭游标
deallocate s1 --删除游标

运行结果如下: 


五、总结

      本次主要介绍了索引与视图、函数和游标。各自的关键词分别为:index、view、function、cursor。它们都是为了方便和简化数据库的操作,索引是为了加快查询效率,视图是为了节省空间、函数能够根据输入显示输出结果、游标能够获取特定行数据。

      它们都是可以创建使用和删除的,灵活运用这些额外功能能够很大程度提高效率和空间,也是数据库进阶的必经之路,本次也只是简单列举了如何使用它们,更多复杂的功能还得继续往下学。

      如果这篇文章能够帮助到你,还请点个小赞支持一下!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快手头部主播合体,二驴祁天道直播首秀销售额破亿

2023年刚刚过半,直播江湖突然生变。 快手头部娱乐主播「二驴」与快手户外主播第一人「祁天道」宣布“合体”,两者加总的粉丝量接近1亿,又一个“超级网红IP”诞生。 ▲图源:二驴的、祁天道快手截图 从白手起家的草根,…

语义检索系统【四】:基于ERNIE-Gram的Pair-wise和基于RocketQA的CrossEncoder训练的单塔模型实现数据精排

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

启动Flink显示初始化状态怎么解决?

启动Flink显示初始化状态怎么解决? Flink On Yarn模式 问题 flnk任务在跑的过程中, 有时候任务停掉了 ,不过我有 定时任务,可以把失败的flink任务拉起来,但是因为最新的checkpoint做失败了,导致脚本无法拉…

【leetcode经典简单题】自食用||删除链表中倒数第k个结点

step by step. 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出&a…

C# Blazor 学习笔记(8):row/col布局开发

文章目录 前言相关文章代码row和col组件B_rowB_col结构 使用 前言 可能是我用的element ui和 uView这种第三方组件用的太多了。我上来就希望能使用这些组件。但是目前Blazor目前的生态其实并不完善,所以很多组件要我们自己写。 我们对组件的要求是 我们在组件化一共…

人工智能科研经验——人工智能顶会审稿人科研方法分享

人工智能顶会审稿人科研方法分享 前言 1、本教程主要记录人工智能科研方面的经验积累。 Question:科研是什么? Anwser:科研是【进行观察—>定义问题—>研究问题—>发展假设—>设计实验—>收集和分析结果—>构建结论—>进…

微服务架构的模式介绍

1.微服务架构模式方案 用Scale Cube方法设计应用架构,将应用服务按功能拆分成一组相互协作的服务。每个服务负责一组特定、相关的功能。每个服务可以有自己独立的数据库,从而保证与其他服务解耦。 1.1 聚合器微服务设计模式 聚合器调用多个服务实现应用程…

74HC245芯片的用途

双 P 沟道增强型 MOS 管---D74HC245 目录 双 P 沟道增强型 MOS 管---D74HC245 概述与特点 主要特性 应用领域 管脚定义 管脚定义说明 逻辑框图 直流电气参数 直流特性 交流特性 封装 概述与特点 � 概述 D74HC245 是一种三态输出、八路信号收发器,主要应用…

【安装Tomcat,web站点部署】

Tomcat部署 第一种安装 yum install tomcat.noarch -y yum install tomcat-webapps.noarch -y #启动脚本 [rootlocalhost ~]# systemctl start tomcat这时可以通过IP地址端口访问 第二种安装 点击此处找到apache-tomcat-8.5.70.tar.gz 官网下载JDK #先安装JDK [rootlocalh…

Android安卓实战项目(5)---完整的健身APP基于安卓(源码在文末)可用于比赛项目或者作业参考中

Android安卓实战项目(5)—完整的健身APP(源码在文末🐕🐕🐕)可用于比赛项目 一.项目运行介绍 1.大致浏览 【bilibili视频】 https://www.bilibili.com/video/BV1uX4y177iR/? (1&…

MySQL语法2

DQL语句介绍 DQL是数据查询语言,用来查询数据库中表的记录 DQL-基本查询语句 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVIMG 分组后条件列表 ORDER BY 排列字段列表 LIMIT 分页参数 讲解过程:基本查询、条件查询…

Dockerfile构建apache镜像

创建工作目录 [rootlocalhost ~]# mkdir tomcat [rootlocalhost ~]# cd tomcat/ 编写配置文件 [rootlocalhost tomcat]# cat Dockerfile #基于的基础镜像 FROM centos:7 #镜像作者信息 MAINTAINER liu <wewed163.com> #安装相关依赖包 RUN yum install -y wget net-…

SpringBoot之logback-spring.xml详细配置

《logback官网》 各种指导文件&#xff0c;有空自己去看&#xff0c;比如&#xff1a;我们需要调整的是布局&#xff0c;直接看Layouts。 pom.xml <!-- 环境配置 --><profiles><profile><id>dev</id><properties><spring.profiles.a…

提交项目纳品数据时,生成目录结构树文档readme.txt方法

之前在日企工作时&#xff0c;学到了一个生成目录结构树的方法。最近&#xff0c;我提交了项目纳品压缩包给客户&#xff0c;在里面附带了一个 "readme.txt" 文档&#xff0c;其中包含了整个项目的目录结构。客户对这个方法十分赞赏&#xff0c;分享一下方法。 在提交…

一文讲清多线程与多线程同步

1 多线程 1.1 线程的概念 十多年前&#xff0c;主流观点主张在可能的情况下优先选择多进程而非多线程&#xff0c;如今&#xff0c;多线程编程已经成为编程领域的事实标准。多线程技术在很大程度上改善了程序的性能和响应能力&#xff0c;使其能够更加高效地利用系统资源&…

Python删除txt文件中特定字符

这个问题居然csdn没一个人写&#xff01;我的半天时间都浪费在这破玩意上&#xff0c;但是说白了是因为我太菜&#xff0c;毁灭吧&#xff01; 我要搞关键点检测&#xff0c;但是问题在于我的关键点个数每张图不一样&#xff0c;就导致我转出来的txt后面关键点不够了他就被补了…

类中静态代码块、实例代码块、创建实例的执行顺序——阿里面试题

原题代码&#xff1a; package com.example.demo3;public class InitializeDemo {private static int k 1;private static InitializeDemo t1 new InitializeDemo("t1");private static InitializeDemo t2 new InitializeDemo("t1");private stati…

【蓝图】p45,多个角色控制权切换

p45&#xff0c;多个角色控制权切换 p45&#xff0c;多个角色控制权切换创建新玩家方法1方法2 控制权切换MultiGate按顺序指向一系列的蓝图引脚possess&#xff08;控制&#xff09; 切换时摄像机过渡效果Set View Target with Blend(使用混合设置视图目标)折叠到宏&#xff0c…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)【二】

文章目录 SSM--基础环境搭建【二】项目介绍项目功能/界面● SSM 整合项目界面 项目全局配置web.xmlSpringMVC 配置 SSM–基础环境搭建【二】 项目介绍 项目功能/界面 ● SSM 整合项目界面 项目全局配置web.xml 配置furns_ssm\src\main\webapp\WEB-INF\web.xml , 和项目全局…

【搜索】DFS迭代加深

目录 迭代加深例题加成序列题意思路代码 迭代加深 搜索时可能会遇到这样一种情况&#xff1a; 明明答案就在第一层&#xff01;但是因为DFS的缘故浪费很多时间 迭代加深就是用来解决这个问题的算法 定义一个 max_depth &#xff0c;每次搜索时&#xff0c;超过这一层就全部剪…