数据库相关知识点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、索引无法命中是什么情况
  • 二、什么是存储过程
  • 三、什么是事务
  • 四、自定义函数


前言

简单记录一下数据库方面接触到的知识点


提示:以下是本篇文章正文内容,下面案例可供参考

一、索引无法命中是什么情况

1. where语句包含or时,可能导致索引失效
使用or并不一定会导致索引失效,需要看or两边的条件是否会命中相同的索引
2. where语句中索引列使用了负向查询,可能会导致索引失效
负向查询包括:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等
3. 在索引列上使用内置函数,一定会导致索引失效
4. 隐式类型转换导致的索引失效
5. 对索引进行运算一定会导致索引失效
6. like 通配符可能会导致索引失效
like查询以%开头时,会导致索引失效 (将%移到后面 就不会导致索引失效)

参考链接:https://blog.csdn.net/qq_37312838/article/details/108885982

二、什么是存储过程

  1. 定义:存储过程是一组完成特定功能的SQL语句集,经编译后存储在数据库中。
  2. 存储过程的优点:
    ① 效率高 存储过程只有在创建时进行编译,以后每次调用都不需要再重新编译。而一般sql语句,每次执行都会重新编译一次,所以使用存储过程可以提高数据库执行速度
    ② 当数据库进行复杂操作时(如:对多个表进行update,insert,query,delete等),可将此复杂操作用存储存储封装起来,与数据库提供的事务处理结合一起使用,避免了一条一条sql语句执行和数据库的多次连接
    ③ 降低网络流量 存储过程编译好后,存储在数据库中,远程调用时,不需要传输大量的字符串
    ④ 复用性高 存储过程可以重复使用,降低开发人员开发量
    ⑤ 安全性高 可设置特定用户可以使用指定的存储过程
  3. 存储过程的缺点:
    ① 可维护性和可读性比较差 如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了
    ② 可移植性差 由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。
  4. 存储过程创建语句
    ① 无参存储过程
      CREATE PROC(或者写PROCEDURE) pro_test
      AS
      	select * from Tabel1 where 1=1
      GO
      EXEC pr_stuscore //执行存储过程
    
    ② 有参存储过程
    CREATE PROCEDURE pr_StuScoreInfo2
    	@sid char(10),
    	@name char(4)
    AS
    	SELECT smajor,student.s_id,sname,ssex,cname,grade   from student,course,grade
    	WHERE student .s_id=grade.s_id and course.c_id=grade.c_id and
    	@sid=student.s_id and @name=cname
    GO
    

参考链接:
https://blog.csdn.net/qq_33412610/article/details/74784395
https://blog.csdn.net/xiaojxs/article/details/117460468
存储过程语句:https://blog.csdn.net/a19097991483/article/details/107618763

三、什么是事务

  1. 定义:数据库事务是指,作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果操作完成,事务提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务进行回滚,该事务所有操作的影响都将取消。
  2. 事务的特点:
    ① 原子性(Atomicity) 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
    ② 一致性(Consistency) 事务在完成时,必须使所有的数据都保持一致状态。
    ③ 隔离性(Isolation) 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
    ④ 持久性(Durability) 事务完成之后,它对于系统的影响是永久性的。
  3. 事务的类型
    ①. 隐式事务是指每一条数据操作语句都自动地成为一个事务,事务的开始是隐式的,事务的结束有明确的标记。
    ②. 显式事务是指有显式的开始和结束标记的事务,每个事务都有显式的开始和结束标记。
    ③. 自动事务是系统自动默认的,开始和结束不用标记。
  4. 数据库事务一致性的破坏:
    ① 事务的并发执行
    ② 事务故障或系统故障
    数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。并发控制技术保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。
    参考:
    https://blog.csdn.net/APULSABLE/article/details/89260079
    https://www.zhihu.com/question/417671612/answer/1438469039
  5. 事务的并发问题
    ① 脏读
    当一个事务读取到另一个事务未提交的更新数据时称为脏读,这是并发问题中常见的一种
    ② 不可重复读
    当事务对一行数据进行重复读取时,得到的数据不同时 出现数据不一致的问题;不可重复读所产生的并发问题类似于脏读;
    ③ 幻读
    一个事务读取到另一个事务已提交的新插入的数据
  6. 事务的隔离级别
    在SQL Server数据库给出的解决并发问题的方案是采取有效的隔离机制,隔离机制的实现,要使用到锁
    SQL Server数据库提供了4中隔离机制
    ① READ UNCOMMITTED
    该级别不会隔离数据,即事务正在使用的数据,其他事务也能同时对数据进行修改和删除。使用READ UNCOMMITTED 级别运行的事务不会发出共享锁来防止其他事务读取或更改数据。
    ② READ COMMITTED
    该级别能设定不能读取其他事务正在修改但未提交的数据,这样就不会出现脏读的问题;其他的事务能在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻读;使用READ COMMITTED隔离读取事务,事务中的数据仍有可能被修改,但已被修改过的数据将一直被锁定,直到事务结束;READ COMMITED 是SQL Server数据库中的默认事务隔离级别。
    ③ REPEATABLE READ
    该级别的隔离能指定语句不能读取已被其他事务修改但未提交的行,并指定其他事务都不能修改当前事务正在读取的数据,直到当前事务结束;该事务中每一条语句读取到的每一个数据都设置共享锁,共享锁直到事务完成,这样能防止其他事务修改当前读取的任何行。
    ④ SERIALIABLE
    这是 SQL Server 中隔离级别最高的,它将所需要使用到的全部数据都进行锁定,这个事务在使用时,别的事务完全不允许添加、删除和修改数据;SERIALIZABLE 等级的隔离事务的并发性最低,但若同一数据要被多个事务使用,就需要让事务进行排队等待。

4 种隔离级别对并发问题的解决方案如下表
数据库相关知识点_第1张图片
注意: 虽则隔离级别的提高,能更有效地防止数据的不一致性;但,这回降低事务的开关处理能力,会影响多用户访问

四、自定义函数

  1. 定义:自定义函数是指用户定义的函数,与内置函数差不多

  2. 自定义函数的类型
    SQL Server中根据函数返回值形式的不同将用户自定义函数分为三种类型:
    标量函数 内联表值函数 多语句表值函数(内联表值函数和多语句函数又统称为表值函数)
    注意:SQL Server 自定义函数必须具有返回值
    ① 标量函数:返回的是一个数据类型值
    标量函数返回一个确定类型的标量值,其返回值类型为除TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP和TABLE类型外的其它数据类型。函数体语句定义在BEGIN-END语句内。在 RETURNS 子句中定义返回值的数据类型,并且函数的最后一条语句必须为Return语句
    例:

    -- 创建标量函数,统计指定班级的学生人数
    create function Func_TitleSum(@ClassName varchar(20)) -- 函数需要输入参数,在括号里面写上输入参数以及参数的类型
    returns int -- 标量函数返回一个值,返回类型是int
    as
    begin
       daclare @num int
       select @num = count(*) from dbo.StudentInfo
       where ClassID = (
       	select ID from dbo.ClassInfo
       	where ClassName = @ClassName
       	)
       return @num
    end
    -- 调用函数
    daclare @name varchar(20) = '5班'
    select dbo.Func_TitleSum(@name)
    

    标量函数调用时,要加上dbo
    ② 内联表值函数 返回的是一个table 只能包含一个 select 语句,返回单个查询结果,没有相关联的返回变量,也没有函数体
    内联表值型函数以表的形式返回一个返回值,即它返回的是一个表。内联表值型函数没有由BEGIN-END 语句括起来的函数体。其返回的表是由一个位于 RETURN 子句中的 SELECT 命令从数据库中筛选出来。内联表值型函数功能相当于一个参数化的视图
    例:

    create function 函数名(输入参数 参数类型,···)
    returns table
    as
    return (···)
    
     -- 创建内联表值函数,用来查询指定班级的学生信息
    create function FselStudent(@classname varchar(20))
    returns table -- 返回一个表
    as
    return (
    	select StuNum,StuName
        from dbo.StudentInfo
        where ClassID = (
        	select ClssID from dbo.DepInfo
            where ClassName = @classname
        )
    )
    -- 调用
    declare @d varchar(20) = '5班'
    select * from FSelStudent(@d)
    

    ③ 多语句表值函数 可以包含多个 select 语句,存在函数体,可以在 select 语句的 from 子句中使用多语句表值函数

    多语句表值函数可以看作标量函数和内联表值函数的结合体。它的返回值是一个表,但它和标量型函数一样有一个用 BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。由此可见,它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值函数的不足
    例:

    create function 函数名(输入参数 参数类型,···)
    returns @返回变量 table  -- 返回变量是一个表
    (返回字段 字段类型, ···)
    as
    begin
    	insert @返回变量  -- 往变量里面插入数据
    	函数体(select 查询语句)
    	return
    end
    
    -- 创建多语句表值函数,用来查询指定教师任教的课程名称、实践课时、理论课时和总课时
    	create function FSelCourse(@teachName varchar(20))
    	returns @teach_Course table  -- @teach_Course 指定返回的表名
    	(
    		课程名称 varchar(80),
    	    理论学时 int,
    	    实践学时 int,
    	    总学时 int
    	)
    	as
    	begin
    		insert @teach_Course
    		select CourseInfoName,COurseInfoRstPer,CourseInfoPraPer,COurseInfoRstPer+CourseInfoPraPer
    		from dbo.CourseInfo c join dbo.TeachInfo a join dbo.TeachCourse b
    		on a.TeachInfoID = b.TeachInfoID
    		on c.CourseInfoID = b.CourseInfoID
    		where TeachInfoName = @teachName
    		return
    	end
    	-- 调用
    	select * from FSelCourse('朱志奇')
    

    参考:https://blog.csdn.net/qq_18854761/article/details/121349426
    https://blog.csdn.net/realoser/article/details/121529445
    MySql 自定义函数语法

  3. 自定义函数注意事项
    ① 自定义函数属于用户级别,只有当前客户端对应的数据库中可以使用
    ② 可以在不同数据库下看到函数,但是不可以调用
    ③ 自定义函数通常是为了将多行代码集合到一起解决一个重复性的问题
    ④ 函数必须规范返回值,那么在函数内部不能使用select指令,select一旦执行就会的到一个结果集 result set

你可能感兴趣的:(数据库,数据库)