SQL Server学习笔记
SQL Server学习笔记

SQL Server学习笔记

111
0

数据类型



入门

create database mydata;
use mydata;

-- 创建表
create table stu(
name varchar(20),
age int,
score decimal(10,2)
)

create table tea(
id int primary key,
name varchar(20),
score decimal(10,2)
)

-- 创建表后添加列名
alter table stu add id int primary key;

-- 修改某一列的列名
exec sp_rename 'stu.age','age1','column';

-- 删除某一个列名
alter table stu drop column age1;

-- 修改列的类型
alter table stu alter column name varchar(20) not null;

-- 查看表所有的约束
exec sp_helpconstraint @objname=stu;

-- 给列名添加主键(必须是非空字段)
alter table teacher add constraint pk_tea primary key (id);

-- 删除主键约束
alter table teacher drop constraint pk_tea;


select * from stu;

连接查询

内连接

1、内连接: inner join
通过等值连接实现内连接查询,用 = 或 <> 之类的运算符
select d.info,s.code from student s, desc d where s.code = d.st_code
select * from student s inner join desc d on(s.code = d.st_code)
image-20230228120025111

外连接

1、左连接: left join(左表相关联的记录)
select * from student s left join desc d on(s.code = d.st_code)
选出左表存在的记录
2、右连接: right join(右表相关联的记录)
select * from student s right join desc d on(s.code = d.st_code)
image-20230228115112660
3、全连接: full join(两张表所有的记录)
select * from student s full join desc d on(s.code = d.st_code)
image-20230228115614964
3、交叉连接: cross join(两张表所有的结果,会产生笛卡尔积)
select * from student cross join desc
4、子查询
select * from student ,chs where s.id in (chs.scode)

行号

row_number() over(order by 字段)
前几个:top n
select row_number() over(order by id) row from stu
select top 1 * from stu

模糊查询

-- 左模糊
select * from student where name like '%张'

-- 右模糊
select * from student where name like '三%'

-- 模糊查询
select * from student where name like '%张三%'

分组、排序查询

-- 分组查询
select * from student group by sex

-- 排序查询
select * from student order by [asc,desc]

常用函数

-- 求和 sum
select sum(score) from student;

-- 平均数 avg
select avg(score) from student;

-- 数量 count
select count(score) from student;

-- 最大值 max
select max(score) from student;

-- 最小值 min
select min(score) from student;

去重

distinct 字段

类型转换

cast(函数(字段) as decimal(n,y) )

视图

1、创建
create view 视图名称 as select 语句
2、删除
if (exists (select * from sys.objects where name = 'v_stu'))
drop view v_stu

备份表

select * into 新表 from 旧表

修改

1、批量修改
update stu set score = (select score from st_back sk where sk.id = stu.id)

U9C前台显示字段

image-20230301191131937


触发器

DML触发器

after 触发器 和 instead of 触发器:
after 触发器(insert、update、delete触发器)内的语句是在**操作执行之后(已经作用在表上)**才触发执行的
instead of 触发器 并不会执行操作,那个操作仿佛就是一个触发的命令,有了这个命令,instead of 触发器触发了,就会执行触发器内的语句;若触发器内只有像 raiserror 、print之类的不含操作性的语句,那该操作并不会真正的执行,但在触发器内可以通过 inserted 或 deleted 表中获取到本该执行该操作而形成的数据。
inserted表和deleted表存放的信息:
修改操作
inserted表
deleted表
增加(INSERT)记录
存放新增的记录
删除(DELETE)记录
存放被删除的记录
修改(UPDATE)记录
存放更新后的记录
存放更新前的记录
创建触发器
语法:
GO
create trigger trigger_name
on 表名
[WITH ENCRYPTION]
for [DELETE, INSERT, UPDATE]
as
T-SQL语句

WITH ENCRYPTION表示加密触发器定义的SQL文本
DELETE, INSERT, UPDATE指定触发器的类型
创建insert触发器
--创建insert触发器
create trigger trig_insert
on student
for insert
as
begin
if object_id(N'student_sum',N'U') is null--判断student_sum表是否存在
create table student_sum(stuCount int default(0));--创建存储学生人数的student_sum表
declare @stuNumber int;
select @stuNumber = count(*)from student;
if not exists (select * from student_sum)--判断表中是否有记录
insert into student_sum values(0);
update student_sum set stuCount =@stuNumber; --把更新后总的学生数插入到student_sum表中
end
修改触发器
-- 修改触发器语法
ALTER TRIGGER trigger_name
ON -- 表名
FOR [DELETE][,][INSERT][,][UPDATE]
AS
sql_statement;
删除触发器
--语法格式:
DROP TRIGGER [ trigger_name ] [ ,...n ]
参数:
trigger: 要删除的触发器名称
n:表示可以删除多个触发器的占位符

DDL触发器

create trigger tr_DDL on database
for DROP_TABLE,ALTER_TABLE
as
begin
print '别想着删库!好好打你的代码'
rollback -- 回滚
end

事务

定义事务:begin [tran|transaction] transacction_name
回滚事务:rollback [tran|transaction] transacction_name
提交事务:commit [tran|transaction] update_0

杂七杂八

定义变量
declare @var int
set @var = 10 -- 赋值
select @var -- 使用
go 关键字
相当于是重新开了一个查询窗口,会清除所有的变量
charindex 函数
charindex(参数1,参数2)
参数1:被查找的字符串
参数2:要查找的字符串
查找字符串,返回字符串的位置
begin...end
定义一个语句块,如果说语句是句子,那他就是段落
判断表是否存在
-- 方法一
if object_id(N'student_sum',N'U') is null

-- 方法二
if Exists(select top 1 * from sysObjects where id=object_id(N'UserInfos') and xtype='U')

-- 临时表
if object_id(N'tempdb..#TempUsers',N'U') is not null
判断数据库是否存在
if exists(select * from master..sysdatabases where name = 'database_name')
自定义异常
begin

set @outstr = 'customer exception';
-- 抛出自定义的异常,在最后的catch块中统一处理异常
RAISERROR (66666, -- Message id.
16, -- Severity,
1 -- State,
) ;
end;

begin catch
if @@ERROR=66666 begin -- 通过@@ERROR的值来判断是否是自定义的异常
set @outstr = @outstr + '---------------- customer exception';
end;
return;
end catch;
raiserror(Message id, Severity, State )
1. Message id : 异常的唯一标识,且这个值会被赋值给SQLServer的系统变量@@Error。

自定义异常的Message Id建议使用50000以后的,因为50000以内的会被系统异常占用。

2. Severity : 异常的级别。 可输入1—19的数值。1—10之间不会被catch捕获。19以后是非常严重的级别。
3. State : 如果输入负值或大于255 的值会生成错误,产生错误则会中断数据库的连接
SQL Server学习笔记
温小白
本站文章除特别声明外,均采用BY-NC-SA许可协议。转载请注明出处!
登录以开始回复
暂无回复。
目录