当前位置: 首页 > news >正文

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

文章目录

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

前言

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


一、索引

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。它们都是为了方便和简化数据库的操作,索引是为了加快查询效率,视图是为了节省空间、函数能够根据输入显示输出结果、游标能够获取特定行数据。

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

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

相关文章:

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

文章目录 一、索引 聚集索引非聚集索引二、视图三、自定义函数 标量函数表值函数四、游标五、总结 前言 在学习完创建库表、查询等知识点后,为了更加方便优化数据库的存储和内容,我们需要学习一系列的方法例如索引与视图等等,从而使我们更加…...

2023 java web面试秘籍

目录 第一章:Java Web基础知识1.介绍3.Java Web基本概念 4.常见面试问题第二章:Java Web核心概念和技术1.介绍3.Servlet和JSP4.Web安全5.常见面试问题 第三章:Java Web高级概念和技术1.介绍3.Spring框架4.安全性5.常见面试问题 第四章&#x…...

2023-08-05力扣今日二题

链接&#xff1a; 剑指 Offer 18. 删除链表的节点 题意&#xff1a; 如题 解&#xff1a; 基础链表操作 实际代码&#xff1a; #include<iostream> using namespace std; struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {} }; Li…...

stl_list类(使用+实现)(C++)

list 一、list-简单介绍二、list的常用接口1.常见构造2.iterator的使用3.Capacity和Element access4.Modifiers5.list的迭代器失效 三、list实现四、vector 和 list 对比五、迭代器1.迭代器的实现2.迭代器的分类&#xff08;按照功能分类&#xff09;3.反向迭代器(1)、包装逻辑…...

利用hfish反控境外攻击源主机

导师给了7个网络安全课题选题&#xff0c;本想和他聊了下思路&#xff0c;他一挥手让我先做出点东西再来聊就把我打发走了…… 正好前段时间阿里云到校做推广&#xff0c;用优惠卷薅了一台云服务器&#xff0c;装了hfish先看下情况 没想到才装上没两天数据库就爆了&#xff0…...

4、Rocketmq之存储原理

CommitLog ~ MappedFileQueue ~ MappedFile集合...

在线原型设计工具有好用的吗?就是这10个

随着设计工作的不断发展&#xff0c;原型设计在设计工作中越来越重要&#xff0c;而在线原型设计工具在减轻了设计师工作负担的同时也提高了设计师的工作效率&#xff0c;今天本文将为大家推荐10个能在线使用的原型设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 …...

Vc - Qt - QPainter translate

QPainter的translate()函数是用来对绘制坐标系统进行平移操作的方法。它可以将绘制的原点&#xff08;坐标轴的起始点&#xff09;在水平和垂直方向上进行平移。以下是一个使用QPainter的translate()方法进行坐标平移的示例代码&#xff1a; QPainter painter(this);// 绘制一个…...

Spark Catalog详解

前言 旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行批量删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗? 我:你应该静下心来好好把spark基础知识进行全面学习。 实习生:难道spark有这功能,而我没有学习过?咋弄啊? 我:…...

【Spring专题】手写简易Spring容器过程分析

前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程&#xff0c;所以&#xff0c;本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…...

fastadmin自定义键值组件Fieldlist

需求场景&#xff1a; 后台设置前端的固定话费充值金额。编辑时要求能够增删改&#xff0c;给到前端的数据&#xff0c;是要根据金额正序排列&#xff0c;用fastadmin的键值组件(Fieldlist)&#xff0c;使用Art-Template模板语法自定义模板。 最终效果如下图所示&#xff1a; …...

yolov2检测网数据集标注_labelme使用_json2txt格式转换

yolov2检测网数据集标注_labelme使用_json2txt格式转换 一、安装Anaconda二、创建labelme虚拟环境三、使用labelme标注健康非健康猫狗数据3.1 打开数据集所在文件夹3.2 进行标注数据集3.3 json2txt3.4 按文件目录和训练测试数据集重分配 四、数据喂给服务器网络参考链接 一、安…...

C/C++面试总结

一、关键字static、const、extern、volatile作用 1、const 1.修饰常量 用const修饰的变量是不可变的&#xff0c;修饰后的变量只能使用&#xff0c;不能修改。 2.修饰指针 如果const位于*的左侧&#xff0c;eg&#xff1a;const int* a&#xff0c;则const就是用来修饰指针…...

Python爬虫的Selenium(学习于b站尚硅谷)

目录 一、Selenium  1.为什么要学习Selenium  &#xff08;1&#xff09;什么是Selenium  &#xff08;2&#xff09;为什么使用selenium?  &#xff08;3&#xff09;代码演示 2. selenium的基本使用  &#xff08;1&#xff09;如何安装selenium  &#xff08;2…...

springboot 对接 minio 分布式文件系统

1. minio介绍 Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口&#xff0c;可以看做是是S3的开源版本&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象…...

前端小练习:案例4.3D图片旋转展示(旋转木马)

一.效果预览图 二.实现思路 1.实现旋转木马效果的第一步是先准备好自己需要的图片&#xff0c;创建html文件 2.旋转木马的实现&#xff0c;关键点在3D形变和关键帧动画。 3.步骤&#xff0c;定义一个div使其居中&#xff0c;&#xff0c;把图片放进div盒子里&#xff0c;因为图…...

Linux这17个操作技巧是每个运维工程师应知必会的吧?

今天跟大家分享17个linux运维中常用的操作技巧&#xff01;掌握好这些技巧&#xff0c;或许某一天能够让老板给你涨工资&#xff01; 1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录&#xff1a; find . -name “*.tar” -exec mv {}./backup/ ; ❝ 注解&#xff1…...

音视频基础:分辨率、码率、帧率之间关系

基础 人类视觉系统 分辨率 像素&#xff1a; 是指由图像的小方格组成的&#xff0c;这些小方块都有一个明确的位置和被分配的色彩数值&#xff0c;小方格颜色和位置就决定该图像所呈现出来的样子&#xff1b;可以将像素视为整个图像中不可分割的单位或者是元素&#xff1b;像素…...

Java基础八 - HTTP相关/Cookie/Session/网络攻击

一、 反射/序列化/拷贝 1. 反射 //反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力 //在Yaml数据驱动自动化框架比较适用&#xff0c;能获取到当前的类名及方法名 import java.lang.reflect.*;public class ReflectionExample {public static void main(Str…...

【车道线】TwinLiteNet 复现过程全纪录

码字不易&#xff0c;喜欢的请点赞收藏&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 论文全文翻译&#xff1a;【freespace】TwinLiteNet: An Efficient and Lightweight Model for Driveable Area and Lane Segmentation_莫克_Cheney的博客-CSDN博客 目录…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...