SQL基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL基础相关的知识,希望对你有一定的参考价值。

注意:以下涉及具体语法的均基于T-SQL
本文为个人读书笔记,若存在错误之处望不吝指出:>
1、 基本概念
SQL
SQL 是用于访问和处理数据库的标准计算机语言;
全称为结构化查询语言(Structured Query Language), 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言;
SQL仅仅是一种最基本的标准,许多DBMS厂商开发了自己的SQL版本,但为了与ANSI标准兼容,对ANSI SQL中最基本的命令均作了实现,除此之外还扩展了各自的一些命令(专有扩展),这也是SQL Server、Oracle、mysql等的SQL语法大同小异的原因所在。
T-SQL
全称Transact-SQL,是SQL Server 专有的SQL扩展
PL-SQL
全称Procedural Language-SQL,Oracel 的专有SQL 扩展
事务
事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除。事务具有4个性质(ACID), 4种隔离级别.
存储过程
SQL 语句和可选控制流语句的预编译集合。以一个名称存储并作为一个单元处理。 它们存储在 SQL 数据库中,并可以通过来自应用程序的一个调用而运行。
触发器
当修改指定表中的数据时执行的存储过程,是无需(也不能)显示调用,可自动执行的特殊的存储过程。
级联操作
对于在表之间强制引用完整性的关系,在更新(更改和删除)主表中的记录时对相关表中的所有相关记录进行的一种更新。级联操作有 4 种选项(NO ACTION, CASCADE, SET NULL, SET DEFAULT,) ,默认为NO ACTION(即级联关闭),因此如若不想自己写触发器,在创建外键约束时需要指定合适的级联选项(开启级联)。级联通过在子表中定义外键约束时定义到父表上。
 
2、触发器和级联操作
       触发器和级联操作的作用都是为了维护实体的参照完整性。
Ⅰ 执行时机与顺序(源自SQL SERVER 2012联机丛书)
  • 首先执行由原始 DELETE 或 UPDATE 直接导致的所有级联引用操作。

  • 如果为受影响的表定义了任何 AFTER 触发器,则在执行完所有级联操作后激发这些触发器。 这些触发器将按与级联操作相反的顺序激发。 如果单个表中存在多个触发器,它们将按随机顺序激发,除非专门为表指定了第一个或最后一个触发器。 此顺序是使用 sp_settriggerorder 指定的。

  • 如果多个级联链源自作为 UPDATE 或 DELETE 操作的直接目标的表,则这些链激发各自的触发器的顺序是不定的。 但是,只有当一条链激发其所有的触发器之后,另一条链才开始激发。

  • 不管是否影响任何行,作为 UPDATE 或 DELETE 操作的直接目标的表上的 AFTER 触发器都会激发。 在这种情况下,级联操作不会影响其他表。

  • 如果上面的任一触发器对其他表执行 UPDATE 或 DELETE 操作,这些操作将启动辅助级联链。 在激发所有主链上的所有触发器后,会分别为每个 UPDATE 或 DELETE 操作处理这些辅助链。 可能会为后续的 UPDATE 或 DELETE 操作递归重复此过程。

  • 在触发器内执行 CREATE、ALTER、DELETE 或其他数据定义语言 (DDL) 操作可能会导致 DDL 触发器激发。 之后,就可能会执行启动其他级联链和触发器的 DELETE 或 UPDATE 操作。

  • 如果任何特定的级联引用操作链中产生错误,都将引发错误并且不会在该链中激发任何 AFTER 触发器,而创建该链的 DELETE 或 UPDATE 操作将回滚。

  • 具有 INSTEAD OF 触发器的表不能同时具有指定级联操作的 REFERENCES 子句。 但是,级联操作目标表的 AFTER 触发器可对另一个表或视图执行 INSERT、UPDATE 或 DELETE 语句,这将激发为该对象定义的 INSTEAD OF 触发器。

Ⅱ 区别
     (1)级联建立在外键约束基础上,外键是数据强制完整性约束,可保证数据的参照完整性;
             而触发器不依赖于外键约束,要保证数据参照完整性,必须自己写代码执行相应逻辑。
     (2)触发器在执行时可自定义逻辑,因此比单纯的级联操作更加灵活。
     (2)级联操作只能响应父表的更新、删除操作,而触发器则可以响应更新+删除+插入操作;
     (3)级联操作的执行时机永远是在父表原始delete或update语句之后,子表After 触发器(被影响的子表不得定义instead of 触发器)之前,而触发器的执行时机既可以在真正delete/update操作之前,也可以在delete/update操作完成之后。
 
      总结: 触发器比级联操作更灵活;
              使用外键约束时最好不要再定义触发器;
              使用触发器时主表最好不要包含外键;
              没有特殊的业务逻辑不要使用触发器。
 
Ⅲ 注意事项
      INSTEAD OF DELETE/UPDATE  触发器与级联操作互斥。指定不同级联选项时对触发器的限制如下:
     (1) CASCADE: 不能定义 INSTEAD OF DELETE/UPDATE触发器
     (2) SET NULL/SET DEFAULT: 不能定义 IMSTEAD OF UPDATE触发器
      
     原因:级联操作执行的时机就是在对父表进行删除或更新之前对相关子表进行预先删除或更新
 
3、事务、存储过程、函数、触发器三者之间的关系与区别是什么?
Ⅰ 事务与后三者
     事务是所有数据库操作的形式,增删改查都是以事务的形式对数据库进行操作的。事务对于后三者而言既是基本形式,又是组成部分,因为后三者或多或少都使用了事务。
Ⅱ 存储过程和函数
     存储过程和函数比较类似,因为它们都是SQL语句和控制流语句的集合,用于执行某一逻辑过程。但它们有所区别:
     (1) 层级结构方面:存储过程是面向业务层的,用于执行某一组业务逻辑;
                                函数是面向具体问题的,是专门用于解决或计算特定类型的问题(如求和、求平均),因此函数的针对性更强,主要扮演通用工具的角色;
     (2) 返回值方面:存储过程可以有0-N个返回值,返回值的形式可以通过return语句或输出参数;函数只能有0-1个返回值,并且只能通过return语句返回值;
     (3) 调用方面: 存储过程一般是由应用程序将其作为一个独立的单元直接调用,而函数是作为SQL语句的一部分被间接调用的。
Ⅲ 触发器和存储过程
      触发器是特殊的存储过程,其特殊之处在于:触发器是在对某一表进行更新操作时(或之后)自动执行的,而存储过程的执行需要事务调用
 
 
4、Microsoft SQL Server 支持可编程性的手段有哪些?
     (1)存储过程。     可以实现复杂的业务逻辑,或者充当函数角色;可返回多个值。
     (2)函数。           基于表内部行列进行细粒度计算或查找操作,直接被事务或存储过程调用。
     (3)触发器。        一般定义在父表上,实现表之间的级联操作,是将对某一表的更新操作传播到其他关联表的桥梁。
     (4)...





以上是关于SQL基础的主要内容,如果未能解决你的问题,请参考以下文章

SQL基础教程的内容简介

T-SQL基础03.子查询

详解SQL集合运算

SQL集合运算

理解SQL查询的底层原理

基础很重要~~04.表表达式-上篇