-
第一范式:表中每个字段都不能洅分
第二范式:满足第一范式并且表中的非主键字段都依赖于主键字段。
第三范式:满足第二范式并且表中的非主键字段必须不传递依賴于主键字段 事务具有四大特性:一致性、原子性、隔离性、持久性。
数据库事务是指:几个SQL语句要么全部执行成功,要么全部执行夨败比如银行转账就是事务的典型场景。
视图实际上是在数据库中通过Select查询语句从多张表中提取的多个表字段所组成的虚拟表
l 视图并鈈占据物理空间,所以通过视图查询出的记录并非保存在视图中而是保存在原表中。
l 通过视图可以对指定用户隐藏相应的表字段起到保护数据的作用。
l 在满足一定条件时可以通过视图对原表中的记录进行增删改操作。
l 创建视图时只能使用单条select查询语句。 索引是对数據库表中一列或多列的值进行排序的一种结构使用索引可快速访问数据库表中的特定信息。
l 索引分为:聚集索引、非聚集索引、唯一索引等
l 一张表可以有多个唯一索引和非聚集索引,但最多只能有一个聚集索引
l 索引可以包含多列。
l 合理的创建索引能够提升查询语句的執行效率但降低了新增、删除操作的速度,同时也会消耗一定的数据库物理空间 存储过程是一个预编译的SQL语句,优点是允许模块化的設计就是说只需创建一次,以后在该程序中就可以调用多次如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快 触发器昰一中特殊的存储过程,主要是通过事件来触发而被执行的它可以强化约束,来维护数据的完整性和一致性可以跟踪数据库内的操作從而不允许未经许可的更新和变化。可以联级运算如,某表上的触发器上包含对另一个表的数据操作而该操作又会导致该表触发器被觸发。 32 // 执行出错事务回滚
[3]. 批量执行SQL,以事务方式
2. 判断表、存储过程等的存在性
在登陆界面输入相关的信息:
服务器类型:数据库引擎
服務器名称:我们可以输入IP地址 计算机名称。如果是访问本机的SQL sqlserver增加字段服务并且没有改变默认端口号的话只需要输入一个点 ” . ”,它僦代表本机的SQL sqlserver增加字段正式版的服务端(体验版是.SQLEXPRESS)
1、 用windows身份验证(也就是用本机管理员来登陆,不需要输入用户名密码的)
4、 取消”强制实施密码策略”
5、 在“状态”选项卡中,对“是否允许连接到数据引擎”和“登陆”分别选择“授予”和“启动”
6、 点击确定关閉sa 用户的属性窗口
7、 右键点击服务器根节点,选择属性打开“服务器属性”弹窗
8、 选择“安全性”选项卡,设置“服务器身份验证”为“SQL sqlserver增加字段和Windows身份验证”
9、 确定并关闭“服务器属性”弹窗,然后在SQL sqlserver增加字段配置管理器中重启数据服务端再用sql sqlserver增加字段 帐户密码来登陆即可。
左侧目录中我们可以创建数据库数据表。
左上角的新建查询按钮可以打开一个输入与执行SQL语句的窗口。在此窗口中我们可鉯通过按F5键或点击“执行”来运行SQL语句 在输入多条SQL语句的情况下,可以选中需要执行的代码然后按F5来只执行被选中的部分。
sqlcmd命令行管悝工具
通过纯指令的方式来管理SQL sqlserver增加字段数据库服务端
开始菜单à 运行à输入cmd打开命令行窗口à输入sqlcmd /? 查看sqlcmd命令的帮助信息。
在该命令行丅我们可以通过sql语句来操作数据库
最后,必须输入go才会开始执行SQL语句exit退出sqlcmd命令行状态。
很多时候我们需要修改数据表字段结构比如添加字段、修改字段类型和字段名,但是SQL sqlserver增加字段默认情况下会阻止我们对数据表结构的修改所以我们需要更改SQL sqlserver增加字段的设置参数。
笁具菜单à 选项à 打开”选项”弹窗中的”Designers”选项卡à取消”阻止保存要求重新创建表的更改”前面的选中状态。
查询指定的数据值是否茬第一个值和第二个值的范围内 |
模糊查询,可以使用通配符 %用来表示任意个任意字符, _ 下划线用来表示一个字符 |
是指从一个集合中詓逐一匹配,只要数据值在集合中能找到相同的项where条件就成立了。 |
用来判断一个子查询是否有结果当子查询返回了至少一个结果时,where條件成立 |
将指定字段中的相同的值进行分组。值相同的只显示一行
在sql sqlserver增加字段 中所显示的字段列表中,不能使用group by后面没有出现过的字段名除非使用聚合函数。
清除并返回结果中重复的值
省略字段名按表的字段顺序来插入数据
注意:这种方式必须按照表的字段顺序(除叻主键ID)来排列语句中的字段值,并且所有字段都必须填写值
1、 一次性插入5条学生数据并且不写字段名。
3、 查询出所有姓王的同学(用LIKE模糊查询)
5、 统计各班分别有多少名学生
6、 分别统计男生与女生的年龄总合。
7、 找到年龄最大的女生
8、 修改id为3的学生姓名为”李小虫”
同时查询多张数据表并将这些数据表以一定的逻辑关系进行连接,让它们显示的结果类似于一张数据表
它根据一个或几个相同的字段将记录匹配在一起,将这两张表中的数据一起查询出来
内部连接的特点是,只显示有关联的数据但是没有关系的数据是不会被显示出来的。
哆表连接的使用别名省略as
我们可以通过as关键字来给数据表定义一个别名,而且通过这个别名调用表中的字段
注意:只要定义了别名,僦必须使用别名原表的名字就不能再用了。
而且as关键字是可以省略的:
补充:内部连接的INNER JOIN可以简化为JOIN 效果是一样的。
内部连接有一定嘚排他性第二张表是对第一张表的补充,如果第一张表不需要第二张表中的某些数据那么第二张表中不被需要的数据就不会被显示出來。
如果使用LEFT就是显示左表中的所有数据如果使用Right就是显示右表中的所有数据
用于显示所连接的所有表的所有数据,即使这条数据没有任何关联关系
1、 先重做上课时讲的例子。
2b、 用一条select语句查询某个用户的购清单上的所有产品
2c、 用一条select语句查询得到某个用户的购清单仩的所有产品的总价。
3b、查询某一场电影的所有坐位上的客户的信息
3c、查询某一场电影的所有坐位上的客户的信息,并且显示空坐位
(如何判断一个字段的值为NULL值:
3d、查询某一个客户看过的所有电影的名称。
它是指一个select查询语句并不是直接从数据表中来得到数据,而昰从另外一个查询语句的结果集中来进行查询
其中,在from关键字的后面并不是数据表而是select语句。
交叉连接在本质上也可以看做是一种內连接。只显示有一关联的数据
使用两个或两个以上查询合并后只返回一个结果集
得到班上年龄大于20和所有男生的合集
前提每条select语句返囙的字段列表的个数和顺序必须是一致的。
union联合后的结果自动去除掉多个select结果中的重复数据如果需要重复显示这些重复数据,我们可以使用union all关键字:
多数情况下我们使用的是数据表或数据库的简写形式实际上SQL sqlserver增加字段中的数据表有4层命名约定。
[数据服务器名.[数据库名.[模式名.]]] 对象名
数据库服务器名:默认是指当前已登陆的这个数据服务器
数据库名:默认是指在客户端左上角的下拉列表中已选择的数据库洺,或用use 指令指定数据库
SQL sqlserver增加字段对象可以拥有两种模式名。
第一种模式:该对象拥有的权限的用户
第二种模式:默认dbo,允许多个登陸用户共享的一种访问模式
模式所代表的就是访问权限,通常我们使用默认的dbo模式
新创建的数据库,除了创建者、系统管理员、数据庫所有者以外其他人都无法访问。
用在两个地方:一是定义数据库文件的位置二是定义数据日志库文件的位置。
PRIMARY 关键字用于指定多个數据库文件中的主文件
NAME 指定文件的实例名称。也就是在数据库的逻辑名(非物理文件名)
SIZE 数据库大小,可以在数字后面用KB或GB表示数据库的夶小
用于处理排序和字母大小写等问题
将已存在的一些数据库文件附加到当前服务器上。当前这个文件必须是数据库的一部分。
为sql sqlserver增加字段数据库文件添加安全层
用这种方式我们可以在指定的硬盘或U盘路径之下创建数据库。
注意:如果需要对数据库文件进行复制、剪切或删除操作
以类似查询语句的结果集的方式返回数据库的大小、拥有者、创建日期、文件路径等信息。
创建表之前确定是否已经选择當前数据库
[字段名 as 计算列表达式]必赢手机登录网址
指该字段在没有输入值的情况下默认使用的值。
默认情况下每条记录自动增加1
就是指对这个表进行复制的时候,ID主键的值是重新排列还是延用之前的ID
是指将一个表中的数据复制到另一个表中时,如果产生ID重复情况下應用如何处理。
用于处理排序和字母大小写等问题
对字段中输入的数据进行规则的限制。
可以创建一个本身没有任何数据的列这个列嘚值由其他列来动态的生成。
这里我们就定义了一个计算列总价=单价*数量
1、不能计算主键、外键、唯一键
2、只能引用当前数据表中的字段
对插入表的数据进行限制
如果数据库由多个部分组成,我们可以指定数据表存储在哪个部分
与ON的作用类似,但是它只有在表中有Text或Image类型的字段时才有效
创建一个产品销售表,字段如下:pid、pname(产品名称)、pPrice(产品价格)、pNum(产品销售数量)、pCount(产品销售总价= pPrice* pNum)用CREATE语句创建这个数据表。
注意:不能变小只能增大它的容量。
最常见的操作就是修改数据表名和表中的字段
ADD --这个关键字代表添加删除数据库对象,比如:刪除数据表、视图、存储过程、触发器
DROP语句可以同时删除多张数据表
其中用户电话的默认值是
电影的默认时间是当前系统时间
每个表的id嘟必须是自增的主键
存储了数据库的核心对象信息,没有这个数据库Sql sqlserver增加字段就不能正常运行
提供了SQL sqlserver增加字段的代表服务中要执行的任務和调试计划
被SQL sqlserver增加字段用于数据库模板信息的存储
用来存放一些临时信息,重启数据库服务端时它存储的信息会被清空。
如果我们需偠将它移动位置的话就需要首先分离数据库:
右击数据库图标弹出菜单à任务à分离à弹出分离数据库窗口à选中”删除连接”à确定
这样峩们就可以复制和剪切数据库了。
用于将已经分离的数据库文件mdf、ndf(数据库辅助文件)、ldf 添加到数据库服务端中进行运行
右击“数据库”à在弹出菜单中选择”附加”à在“附加数据库”窗口中点击添加 à 选择mdf文件à确定à确定
相对于分离数据库,备份的时候我们不需要停止数據库的运行备份可以在用户正在使用数据库的状态下进行。在指定数据库的右键菜单中à任务à备份à在“目录-备份到”区域中指定数据庫备份的路径(默认路径是在sql sqlserver增加字段的安装目录下如果需要改变备份路径,需要先删除默认路径再点击添加)
右击“数据库”à在弹出菜单中选择”还原数据库”à在“还原数据库”窗口中指定 ”设备源” à点击”设备源”后的 ”…” 按钮à添加à选择备份文件à确定à选中数据库前方的对勾à选择目标数据库下拉列表à确定
数据库备份文件的扩展名是bak
约束就是添加一种限制,为字段或表添加限制以确保數据符合用户制定的规则。
域约束用来处理一个或多个字段
比如:商品价格不能为负数。
当用户插入一行数据时只要有一字段不符合約束条件,那么整条记录都无法插入
它用来针对行进行约束。
比如:要求每个学生的姓名、电话、地址都不能出现重复
同样的值不能茬其行出现。
某一字段的值必须包含于(当前表或其他表的)其他字段值的范围内。
主键、外键、替换键、倒置键
确保主键的值是唯一的
洳何给一张没有主键的表添加主键
就是为了确保数据的准确性,比如:确保每一条论坛贴子的发贴人都是真正存在于用户表的
1、确定需偠被限制的数据表。
2、进入被限制的数据表的“设计”视图在空白处点击右键菜单中的“关系”项。
3、点击添加按钮新建一个约束
4、選中新添加的约束,在右侧的“表和列规范”后面有一个按钮”…”点它打开外键关系编辑窗口。
5、选中相应的表的相应字段即可
当兩张表之间添加了外键之后,它所建立的约束对这两张表的行为都是具有约束作用的:
1、 外键引用表不能添加主键表中不存在的值。
2、 主键表中不能删除已经被外键表引用的主键
通常外键在外键引用表上添加
首先要区别哪张表是主键表(是指用已经存在的值作为约束范圍),哪张表是外键表(是指添加数据时被约束必须符合范围的那张表)
创建外键的时候,通常是在外键表上创建的
2、 对这两张表添加外键约束,班级表是主键表、学生表是外键引用表
3、 在学生表中添加一个不存在的班级试一下。
4、 在班级表中删除一个已经被引用的癍级试一下
通过SQL语句来创建外键
在创建数据表的同时对某个字段添加外键
其中,FOREIGN KEY REFERENCES之后的表名(字段名)就是表示字段与哪张表的哪个字段建竝外键关系
查询一张表中的外键信息
在已存在的数据表中添加外键
--指定与哪张表的哪个字段建立外键关系就是约束一个张表中的某个字段的值必须符合另一个字段的已存在的值的范围。
比如说现有一张员工表员工表中字段如下(员工id、员工姓名、上级领导id),在此我们鈳以约束“上级领导id)”必须属于“员工id”的范围内
注意:创建自引用的方法与创建外键的方法一样,区别是表名与字段都是当前表中嘚
同样用ALTER语句也可以添加自引用
--指定与哪个字段建立自引用关系当我们更改数据记录的时候,能够同时操作两张表中的有关联的数据
┅般而言添加数据不需要级联操作,只有删除和修改的时候有可能因为破坏了外键约束而造成两个表之间数据的错误因此就需要同步的修改或删除两个表之间的数据。
在创建数据库的同时添加外键与级联动作
比如:现创建一张工资表与员工表并建立级联关系就是说当员笁信息被删除的时候,其工资记录一起被删除
--当主键列的相关数据被删除后,外键列的相关数据也一起被删除NO ACTION就是指不执行任何执行默认值。
CASCADE建立级联删除关系在此处就是删除员工的同时,删除另一张表中该员工的相关记录
创建一个班级表,并与学生表建立级联关系要求删除班级的时候,这个表中的学生信息也同时被删除
就是约定一个字段中的值不能重复,每一个值都是唯一的
在创建数据表嘚时候添加唯一约束
注意:唯一约束与唯一索引达到的效果是一样的。
在已存在的表中添加唯一约束
通过用户自已定义的条件来对一个或鍺多个字段进行约束
对已存在的数据表添加check约束
--说明这是一个CHECK约束注意:添加CHECK约束的时候,数据表中现在的数据必须要满足约束条件
CHECK約束条件示例
限制字段age的数据范围为0到250 |
限制字段PhoneNum 值必须为电话座机号 |
限制字段的值为多个可选值之一,比如:学历(初中、高中、大专、夲科、研究生、博士) |
限制一个字段的值必须小于另外一个字段比如年龄必须大于工龄。 |
限制性别只能输入“男”或“女”
有时我们需偠暂时停止或禁用约束
--这里要指定约束的名字 --这里要指定约束的名字规则与check约束是非常类似的,它们的区别是规则只能限制一个字段,但昰规则定义一次可以多次使用。
就比如:年龄不能为负数这个规则可以应用于客户表、员工表、学生表。
创建规则并将其应用到指定嘚字段
--把自定义的规则绑定到字段 --‘规则名’’表名.字段名’索引是一个排列、排序的方式,索引之后的结果就是目录
比如:新华字典,它就有种三种索引排序方式:拼音、扩偏旁部首按笔画。
比如:对于新华字典来说其最主要的、物理上的实际排列方式就是拼音顺序
聚集索引就是数据的最主最的排列方式,对于数据表而言自增主键id就是聚集索引。
一张数据表只能有一个聚集索引
比如:对于新華字典来说,它有两种补充性的排列方式按偏旁部首、按笔画。
非聚集索引是指非物理上的实际排列方式的逻辑目录顺序的索引。
对於数据表而言创建了主键之后,其他的索引都是非聚集索引
一张表中最多可以添加249个非聚集索引。
右击指定数据表弹出右键菜单 à ‘設计’ à 在编辑表结构界面空白处没点击右键 à “索引/键” à点击“添加”来创建新的索引 à 在“列”选项中选择对哪一个字段进行排序以什么方式排序。
是提高数据查询的性能和效率
比如:我们按照用户年龄创建了索引。
执行用户年龄的查询操作时性能会有很大的提升。
在一个字段中 不能存在重复的相同的数据。强制约束一个字段中的值不能重复
在一个字段中,可以存在相同的数据
通过右击指定数据表弹出右键菜单à “设计” à在编辑表结构界面空白处点击右键 à “索引/键” à“添加”或选中指定的索引à选择列à 右侧“是唯┅的”这一项上选择“是”à确定。
这样就可以在一个指定字段之上添加唯一索引了。
是指一个索引只针对一个字段进行排序
是指一个索引依据多个字段进行排序。其排序方式:第一个索引排序之后对其中的值相同重复的数据,再按照第二个字段来排序
通过右击指定數据表弹出右键菜单à “设计” à在编辑表结构界面空白处点击右键 à “索引/键” à“添加”或选中指定的索引à点击“列”之后的小按钮à在弹出窗口中添加多个“列名”。
当我们在查询时使用order by或 group by的时候,sql的执行效率会大大提高
查看一张数据表中的所有索引的相关信息
在峩们数据库中实际上存在很多的物理表。而视图就是根据物理表的查询结果来生成的一张虚拟的数据表。
现有一个实际存在数据表student
然后根据student 中所有年龄大于20岁的学生来生成一张虚拟表也就是视图。
在数据库下的“视图”节点上点右键菜单 à “新建视图” à 在添加表中选Φ需要的数据表 à 在视图的设计界面写入SQL语句比如:
就是由一个或多个物理表通过条件查询语句组成的视图,理论上所有用select语句查询出嘚结果集都可以用来生成视图
并且,我们对视图中的数据进行修改时会直接影响到其原来的物理数据表
只要我们为一个视图创建了聚集索引,那么我们就将这个视图叫做索引视图
相当于给视图添加了一个主键,然后系统会为索引视图创建缓存因此索引视图的性能要高于标准视图。
这种视图可以在一台或多台数据库服务器上连接一组相关的数据表以达到像是在操作一个数据表的效果。这是实现分布式数据库的一种方式
1、方便重新排列物理表的数据,和操作源数据表一样
2、对于复杂的sql查询语句而言,只需要写一次就可以将结果苼成一个永久性的视图。
3、安全性高只让特定的用户访问部分字段列,或部分数据
1、性能不高,查询耗时耗费资源
2、对于由复杂的select語句生成的视图而言,修改视图中的数据时有可能会错误
因此,视图通常只能应用于小型或对性能要求不高的项目上
视图的操作和表嘚操作非常类似
实际上就是修改生成视图的select语句
1、 用一条insert语句一次性插入十条以上学生信息,并且省略字段名
3、 用一条select语句查询出所有姓王的同学(用LIKE模糊查询)。
5、 对学生姓名添加唯一索引
6、 创建视图将学生表、班级表、教师表连接为一个视图。以学生表为主表
7、 查询這个视图,显示所有男生的姓名、年龄、班号、教师姓名
存储过程是一系列SQL代码集,相当于是将我们输入的多条SQL语句保存为一个函数
創建不带参数的存储过程
创建带输入参数的存储过程
创建带默认值的输入参数的存储过程
带有默认值参数,可以不输入具体的参数值在鈈输入值使用默认值。
[@参数名1 数据类型=默认值 ]…创建带输出参数的存储过程
--定义输出变量@result它的值会被自动输出创建一个存储过程,传入┅个员工的日工资、要扣除的罚金、本月工作天数用OUTPUT返回本月实际工资。
2、传入一个id参数根据这个id来查询相应的学生掌握记录,并返囙这个学生的姓名、年龄、电话
3、传入一个age参数,根据这个age参数来返回所有年龄大于该年龄的学生记录
说明:decimal(8,3) 表示存储了一个8位数字,小数位数是3位
每字符1字节,最大可以存储8000字节 |
每字符1字节最大可以存储8000字节 |
每字符1字节,最大可以存储2GB |
每字符2字节最大可以存储4000芓节 |
每字符2字节,最大可以存储4000字节 |
每字符2字节最大可以存储2GB |
T-SQL变量根据使用范围我们可以划分为:全局变量(系统变量)和局部变量(用户变量)
在整个SQL sqlserver增加字段中都能访问到的变量,通常用来表示SQL sqlserver增加字段的系统参数
全局变量只能访问,不能赋值
上一次执行insert语句后插入的数據记录的id
作用域:仅限于在一个批处理(指同一批次执行的代码)内有效。
1、在循环语句中记录循环的次数或者用于控制循环的条件
2、控制流程语句的走向。
3、存储函数或存储过程的返回值
声明一个或多个变量,示例:
一次只能对一个变量进行赋值
它用于显示变量的值或者对变量进行赋值。
可以一次对多个变量进行赋值
如果select 后面是赋值语句的话,则不会显示变量的值
如果select 后面是变量的话,则显示變量的值
多行注释 /* 被注释的内容 */
单行注释 -- 被注释的内容
= 等号 ,与其他编辑语言一样将右边的值赋值到左边。
&按位逻辑与、|按位逻辑或、^按拉逻辑异或、~按拉逻辑非
代表开始运行GO之后的语句属于另一个批次的代码。
执行报错这是因为用户定义的局部变量只能够在同一個批次中有效,而go指令将代码分隔成了两个批次
在一个或多个条件的判断下控制流程的走向。可以配合and、or等逻辑运算符来
两段代码中呮会执行一段
当条件为true时执行循环代码,当条件为false时退出循环
让当前程序执行的顺序发生改变跳转到指定的标记处。
相当于swith就是以一個变量的值来决定执行程序的哪一个部分。
示例1根据数据表中记录的性别来显示男女。
示例3按照学生的年龄来判断是否成年
从上面例孓中我们可以看出,CASE语句能够在select查询数据表的时候通过条件来判断相应字段的值,并按条件自定义返回结果
1、 定义三个int型的变量,求朂大值662
2、用create创建一个学生表(sid、姓名sname、年龄sage、性别ssex、成绩score ),要求在select查询时显示对成绩的评价,40以下差60分以下较差、80以下合格、100或以下優秀。
3、创建一个存储过程该存储过程实现输入1或0,查询上题数据表中的所有男生或女生的平均分
4、使用循环向上题的数据表中添加數据记录,姓名使用张1、张2…..年龄,成绩是随机数生成的
5、写一个存储过程,要求返回如下数值
1、1、2、3、5、8、13、21…………………数列的个数可以随意指定。
6、写一个存储过程四个传入参数,一个输出参数数据表的字段如下:(学生姓名 varchar(10)、性别 bit、出生年月 datetime 、成绩集合 varchar(1000) 、返回值:新增学生记录的id int output)。将传入的值作为一条记录插入到数据表中
前三个传入参数分别为学生姓名、性别、出生年月,第四个参数varchar玳表学生的成绩集合拼接成的字符串如:“2:85,3:90,5:66”表示学科ID为2的科目成绩是85,学科ID为3的科目成绩是90以此类推。第五个参数为新增成功后的那条学生记录的ID实际上就是返回的输出参数。
7、实现单表分页的存储过程输入表名、pageSize、pageIndex
提示:拼接并执行一条字符串形式的sql语句:
当峩们执行程序出现错误的时候,一般都会报错并且停止执行。但是如果在try语句的范围内出错的话程序会继续运行,并且将错误信息在catch語句范围内进行处理
只有当try中的语句发生错误的情况下,才会去执行CATCH中的语句
从存储过程、批处理中无条件退出
当T-SQL执行到waitfor语句时,程序会进入等待状态等侍指定时间之后,程序再继续执行后面的语句
round(浮点数,位数) 保留指定位数的小数最后一位四舍五入
FLOOR(浮点数) 向下取整,舍弃小数部分保留整数
Sign() 用于判断一个数值的正负,返回值只有三个(1、0、-1),如
正数返回1、负数返回-1、零返回0
str() 将数字转换为字符串语法:str(数值,字符串长度,小数位数)比如:select '圆周率是' str(3.,3)
charIndex 返回子字符串在另一个字符串中第一次出现的位置语法:
substring(字符串,开始位置截取长度) 截取字符串,示例:
convert( 目标数据类型(长度) , 需要被转换的数据或字段名 )示例:
返回表中的字段的长度,示例:
返回指定字段的列名 , 这个表是鉯id的形式传入的
得到一张表中的所有字段的信息
得到一张表的字段的总数
得到数据的实际长度,示例:
将光标移动到函数之上按下F1键僦可以打开联机丛书并显示该函数的相关文档。
判断日期数据是否合法是返回1,否返回0
很多时候在需要为日期类型的字段添加当前时間为默认值的时候需要使用到该函数。
当表达式1的值不为空时返回表达式1的值。
如果表达式1的值为null空时返回表达式2的值。
判断是否为匼理的数值即使这个数值以字符串的形式存在。
1、现有字符串如下:”2:80,3:91,4:75”其中,逗号用于分隔不同的科目和成绩。其中1:语文,2:数学,3:渶语4:物理。将类似这样的数据存放在学生数据表中然后,建立一个存储过程输入学生id,返回这个学生的各科成绩(每列的名称必須是科目名)、各科总分,所有科目的平均分
(假设这4门都是选修课,也就是说有些人可能有4个成绩有些人可能只有一个成绩)
) --得箌存放成绩的字符串当用户执行某种操作之后,会被自动激动的存储过程就叫做触发器。触发器的执行取决于sqlsqlserver增加字段执行的某种操作而不是由用户直接调用的。
当用户执行某种操作完成以后才会被触发的触发器。
当用户执行某种操作开始之前被触发的触发器,这種触发器可以阻止或用指定的操作来替换原来的操作
1、数据操纵语言DML触发器,是指触发器所在数据表中发生了insert、update、delete操作时触发
2、数据萣义语言DDL触发器,这类触发器是指当服务器或数据中执行了create、alter、drop语句时被触发
3、登录触发器:是指当用户登录sql sqlserver增加字段时触发。
1、 在sql sqlserver增加字段 2008中DML触发器通过使用两张逻辑表DELETED和INSERTED。这两张是建立在数据服务器的内存中的我们只有只读取权限。DELETED和INSERTED表的字段结构和触发器所在嘚表的结构是一样的触发器执行增删改操作后,这两张中的记录也会被同时更新
2、 触发器可以通过数据表中的相关表实现级联操作,鈳以使用比约束更复杂的级联操作也可以实现比约束更复杂的约束。
3、 触发器的功能很强大可以实现很多复杂的操作,但是过多使用觸发器会造成数据库性能的下降和程序维护的困难
注意:DML触发器是针对某张表的某类型操作而触发的。
注:当我们针对同一张表的同一操作定义了多个触发器的时候这多个触发器会被同时触发。
查看当前数据库有多少个触发器
--实际上就是读取了系统数据表因为触发器嘚内容就是存放在系统数据库中的。在学生表中定义一个insert触发器当插入一条数据的时候,检测插入的这个学生的数据是否大于25岁如果夶于删除这条数据并提示,该学生超过了招生年龄
当我们在数据库中执行增删改操作的时候,系统会在sql sqlserver增加字段服务器的内存中修改两張临时表Deleted和Inserted临时表
假如我们现在需要开发一个校园图书管理系统,每个同学前去借书都会生成一个借书记录
1、首先学生数据表中需要┅个sNum学号字段
2、创建借书记录表,其中借书记录需要与学号相关联(不是id)
--当学生毕业以后,假设学生表中的学生记录就需要被删除掉借书记录也需要同时被删除掉。
--从deleted临时表中找到刚才被删除的那个学生的学号 --然后删除所有这个学号名下借书记录通常发生在相关联芓段的值发生了改变。
--当学生的学号发生发生改变的时候借书记录表中的学号也要同时改变,以保证数据仍然与这学生相关联
--同时更噺借书记录表中的学号
--将借书记录表中的学号改为修改之后的学号
--找到借书记录表与更新前的学号相同的记录
在执行触发器的update操作的时候,Deleted和inserted这两张表会以更新的一瞬间先将更新之前记录放入Deleted表中,然后将更新后的记录放入inserted表中因此我们就可以通过读取这两张表的内容,得到所更新记录的原值和新值以及这张记录的id 。
用上例中的表假设毕业年龄22,判断年龄字段发生更新其值更新为大于等于22的时候,就自动判断这个学生已经毕业了因此删除这个学生的学生表和借书表中的相关数据记录。
1、 如何判断你更新的是年龄字段
2、 如何明確刚刚被修改的是哪一条记录。我们可以通过上述两条代码得到更新前后的年龄和所更新记录的id。
--需要变量:修改后的年龄、学号、id表變量与我们之前在其他语言之中见到的二维数组是有很多相似之外的,但是我们可以像操作数据表一样来操作它只需要记住一点,那僦是表变量是存在于内存中的它的执行效率高,但是它像变量一样有作用域和生存周期
用于短期存储数据据的表,它使用的是系统的tempdb數据库
在能用表变量的时候,就尽可能的使用表变量实用不允许的情况下,再使用临时表因为临时表对系统的开销比较大。
但是当臨时数据量很大时才建议使用临时表。
示例3从数据表中读取数据存入表变量:
创建一个表变量用于存放彩票号码,有两字段(idnum char(8))。
用于隨机函数生成50个彩票号码存入这个表变量中。然后显示出所有的彩票号码
它非常类似于存储过程或者js中的function,通常而言它都是配合select语句來进行使用的它的用法很像针对某个字段进行操作的聚合函数。
示例1定义一个函数将bit类型值转化为男或女:
它的可以起到简化查询语呴的作用,避免编写重复的语句
同时要注意,它还可以返回表
1、 在查询学生数据的时候根据学生年龄,来显示学生表中的每个学生是否已成年通过自定函数实现。
2、 在查询学生数据的时候根据学生的地址,来判断其中是否包含“重庆”两个字包含显示”本地学生”,不包含则显示“外地学生”通过自定函数实现。
3、 针对student表用用户自定义函数,实现每页为10条的分页传入参数是页数pageIndex,传出参数昰存放了每页数据的结果集
当数据库在查询的那一瞬间,它实际上是将数据记录有序的一行行取出来那么游标在这个过程中的作用,僦是表示当前正在读取的是第几行
在sql sqlserver增加字段中游标的生命周期,由个5部分组成
可以理解成在数据集上的指针,我们可以控制这个指針来一条条的将数据集遍历出来或者也可以仅仅用于得到特定的行,所以游标必须定义在select语句查询的数据集之上
定义游标的时候,我們要游标类型和游标变量对于游标变量来说,就是按照t-sql的变量的规则来定义的
我们可以在定义时先对游标变量赋值,或者定义完之后洅赋值
用于定义游标的作用域,LOCAL是指游标可以在当前批处理、函数或存储过程中使用GLOBAL是指游标对于当前数据连接来说在全局有效。
open myCursou2 --局蔀游标当批处理执行完之后就不存在了FORWARD_ONLY只能一行一行的前进而不能后退或跳过中间的行。
SCROLL定义的游标可以在数据集的任何方向的任何位置移动
游标需要打开才能够使用
将游标得到的数据传入局部变量
我们可以INTO关键字,将游标中的select语句查询后的值存入局部变量
游标每次執行只返回一条数据。
通过循环(配合游标)来遍历数据表
--其中@@FETCH_STATUS代表上一条游标语句执行后的状态,它的返回值有三个:
FETCH 语句失败或行鈈在结果集中 |
游标使用完后需要关闭。
1、 游标对性能的耗费非常严重的
2、 用完游标之后一定要关闭和释放。
3、 尽量不要在数据量较大嘚时候使用游标
5、 使用游标经常会比直接select 查询慢2-3倍,如果数据量较大这个比例还会增加如果可以用其他方法解决的问题尽量避免使用遊标,它只是最后的一种选择
1、通过游标和循环,查询学生表中的奇数行的数据
2、通过游标和存储过程来实现对学生表的分页功能。
仳如你去银行转账你从帐户A转5000元到帐户B,实际上这就要分两步来操作第一步,帐户A上扣除5000元第二步,在帐户B上存入5000元如果第一步巳完成,但是由于某些原因导致第二步没有正确执行的话就会造成很严重的损失。
因此我们就需要一种机制,来确保第一条语句执行の后第二条语句也会执行。但是实际情况下我们不可能100%确保这一点。因此退而求其次用一种机制来确保,如果第二条语句没有正确執行的话那么我们就撤消第一条语句所执行的操作,这种机制就叫做事务
可以形象的将其理解为操作软件时的历史记录。
事务需要明確的开始和结束点就比如指定在哪一步开始记录“历史记录”,然后在哪一步停止历史记录
COMMIT TRAN 提交事务,保存你所执行的操作让其不鈳逆转。
ROLLBACK TRAN 回滚事务撤消你曾经执行的操作。
SAVE TRAN 保存标记符保存点,就是将你的操作在此存档允许将事务回滚到你当前保存的操作位置。
表示一个事务单元开始在此之后没有提交的所有语句都属于事务的一部分。
提交事条也就是事务的终点,当执行了commit tran之后我们所执荇的操作就落实保存。
回滚事务在没有保存点的情况下,回滚到事务最初没有执行操作时的状态在有保存点的情况下,可以回滚到保存点
创建保存点,以便我们在事务回滚的时候引用它
注意:当我们回滚事务的时候,保存点会自动被清除即使用户保存了多个保存點,执行ROLLBACK时也会被全部清空
如果此时还需要保存点的话,只能重新创建 SAVE TRAN了
当我们开启事务之后,我们操作的实际上都是缓存中的数据只有当提交事务的时候,操作才会写入日志
--在事务中操作SQL语句 --此处用来判断是否有出错,没错时@@ERROR的值为零 --有错时就将错误编号进行累加 exec jfdsa --执行一个不存在的存储过程来人为制造错误 print '有错误事务开始回滚'1、模拟提款机,实现一个银行转账的例子创建帐户表account表(id、accName、accNum、money),实現从一个帐户转5000块到另外一个帐户如果出现错误,则事务回滚没有错误则完成转帐。
本文由必赢官网发布于,转载请注明出处: