From 9ae05e013545492895be5cd6d8a12f984a48cb12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=A2=E8=BF=87=E5=BB=BA?= <168718453@qq.com> Date: Tue, 11 Oct 2022 20:18:34 +0800 Subject: [PATCH] =?UTF-8?q?02=E5=8D=A2=E5=9B=BD=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\350\247\246\345\217\221\345\231\250.sql" | 82 +++++++++ .../10.6\345\207\275\346\225\260.sql" | 164 ++++++++++++++++++ .../10.7\345\255\230\345\202\250.sql" | 86 +++++++++ ...2\350\241\250\347\272\246\346\235\237.sql" | 112 ++++++++++++ .../9.16\346\237\245\350\257\242.sql" | 62 +++++++ ...9\345\255\220\346\237\245\350\257\242.sql" | 62 +++++++ ...4\345\255\220\346\237\245\350\257\242.sql" | 69 ++++++++ .../9.22\345\217\230\351\207\217.sql" | 86 +++++++++ .../9.23\347\264\242\345\274\225.sql" | 30 ++++ .../9.26\350\247\206\345\233\276.sql" | 59 +++++++ ...2\350\241\214\350\275\254\345\210\227.sql" | 163 +++++++++++++++++ .../9.30\346\270\270\346\240\207.sql" | 121 +++++++++++++ .../10.06\345\207\275\346\225\260.md" | 54 ++++++ ...30\345\202\250\350\277\207\347\250\213.md" | 104 +++++++++++ ...10\350\247\246\345\217\221\345\231\250.md" | 112 ++++++++++++ ...72\350\241\250\347\272\246\346\235\237.md" | 24 +++ ...00\345\215\225\346\237\245\350\257\242.md" | 104 +++++++++++ ...45\344\270\200\347\202\271\347\202\271.md" | 78 +++++++++ ...63\350\201\224\346\237\245\350\257\242.md" | 7 + ...73\350\276\221\346\216\247\345\210\266.md" | 72 ++++++++ .../9.23\345\217\230\351\207\217.md" | 55 ++++++ ...76\345\217\212\347\264\242\345\274\225.md" | 101 +++++++++++ ...51\345\217\212\346\270\270\346\240\207.md" | 125 +++++++++++++ ...14\345\222\214\345\256\236\347\211\251.md" | 73 ++++++++ ...41\345\217\212\346\270\270\346\240\207.md" | 145 ++++++++++++++++ 25 files changed, 2150 insertions(+) create mode 100644 "\344\275\234\344\270\232/10.10\350\247\246\345\217\221\345\231\250.sql" create mode 100644 "\344\275\234\344\270\232/10.6\345\207\275\346\225\260.sql" create mode 100644 "\344\275\234\344\270\232/10.7\345\255\230\345\202\250.sql" create mode 100644 "\344\275\234\344\270\232/9.15\345\273\272\350\241\250\347\272\246\346\235\237.sql" create mode 100644 "\344\275\234\344\270\232/9.16\346\237\245\350\257\242.sql" create mode 100644 "\344\275\234\344\270\232/9.19\345\255\220\346\237\245\350\257\242.sql" create mode 100644 "\344\275\234\344\270\232/9.21\345\205\263\350\201\224\345\255\220\346\237\245\350\257\242.sql" create mode 100644 "\344\275\234\344\270\232/9.22\345\217\230\351\207\217.sql" create mode 100644 "\344\275\234\344\270\232/9.23\347\264\242\345\274\225.sql" create mode 100644 "\344\275\234\344\270\232/9.26\350\247\206\345\233\276.sql" create mode 100644 "\344\275\234\344\270\232/9.28\344\272\213\345\212\241\345\217\212\350\241\214\350\275\254\345\210\227.sql" create mode 100644 "\344\275\234\344\270\232/9.30\346\270\270\346\240\207.sql" create mode 100644 "\347\254\224\350\256\260/10.06\345\207\275\346\225\260.md" create mode 100644 "\347\254\224\350\256\260/10.07\345\255\230\345\202\250\350\277\207\347\250\213.md" create mode 100644 "\347\254\224\350\256\260/10.10\350\247\246\345\217\221\345\231\250.md" create mode 100644 "\347\254\224\350\256\260/9.15\345\273\272\350\241\250\347\272\246\346\235\237.md" create mode 100644 "\347\254\224\350\256\260/9.16\347\256\200\345\215\225\346\237\245\350\257\242.md" create mode 100644 "\347\254\224\350\256\260/9.19\345\255\220\346\237\245\350\257\242\347\250\215\345\276\256\346\267\261\345\205\245\344\270\200\347\202\271\347\202\271.md" create mode 100644 "\347\254\224\350\256\260/9.21\345\255\220\345\205\263\350\201\224\346\237\245\350\257\242.md" create mode 100644 "\347\254\224\350\256\260/9.22\345\217\230\351\207\217\345\222\214\351\200\273\350\276\221\346\216\247\345\210\266.md" create mode 100644 "\347\254\224\350\256\260/9.23\345\217\230\351\207\217.md" create mode 100644 "\347\254\224\350\256\260/9.26\350\247\206\345\233\276\345\217\212\347\264\242\345\274\225.md" create mode 100644 "\347\254\224\350\256\260/9.28\345\256\236\347\211\251\345\217\212\346\270\270\346\240\207.md" create mode 100644 "\347\254\224\350\256\260/9.29\350\241\214\350\275\254\345\210\227\345\217\212\345\210\227\350\275\254\350\241\214\345\222\214\345\256\236\347\211\251.md" create mode 100644 "\347\254\224\350\256\260/9.30\344\272\213\345\212\241\345\217\212\346\270\270\346\240\207.md" diff --git "a/\344\275\234\344\270\232/10.10\350\247\246\345\217\221\345\231\250.sql" "b/\344\275\234\344\270\232/10.10\350\247\246\345\217\221\345\231\250.sql" new file mode 100644 index 0000000..5405f4c --- /dev/null +++ "b/\344\275\234\344\270\232/10.10\350\247\246\345\217\221\345\231\250.sql" @@ -0,0 +1,82 @@ +--部门 +create DATABASE haha +use haha +create table Department +( + DepartmentId varchar(10) primary key , --主键,自动增长 + DepartmentName nvarchar(50), --部门名称 +) +--人员信息 +create table People +( + PeopleId int primary key identity(1,1), --主键,自动增长 + DepartmentId varchar(10), --部门编号,外键,与部门表关联 + PeopleName nvarchar(20), --人员姓名 + PeopleSex nvarchar(2), --人员性别 + PeopleSalary money, --薪水 +) +insert into Department(DepartmentId,DepartmentName) +values('001','总经办') +insert into Department(DepartmentId,DepartmentName) +values('002','市场部') +insert into Department(DepartmentId,DepartmentName) +values('003','人事部') +insert into Department(DepartmentId,DepartmentName) +values('004','财务部') + +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('001','刘备','男',8000) +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('001','关羽','男',5000) +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('002','张飞','男',3000) + + +--(1)假设有部门表和员工表,在添加员工的时候,该员工的部门编号如果在部门表中找不到,则自动添加部门信息,部门名称为"新部门"。 +select * from People +select * from Department +create trigger xingbumen +on people for insert +as +declare @Did varchar(5) +select @Did=DepartmentId from inserted +--@@ROWCOUNT获取受影响行数 +if(@@ROWCOUNT>0) +begin +insert into Department values(@Did,'新部门') +end + +go +insert into people(DepartmentId,PeopleName,PeopleSex,PeopleSalary) values('006','曹操','男',5000) + +delete from Department where DepartmentId='006' +drop trigger xingbumen + +--(2)触发器实现,删除一个部门的时候将部门下所有员工全部删除。 +create trigger shanchu +on Department for delete +as +declare @Deid varchar(5) +select @Deid=DepartmentId from deleted +delete from people where DepartmentId=@Deid + +go + +delete from Department where DepartmentId='006' + + +--(4)修改一个部门编号之后,将该部门下所有员工的部门编号同步进行修改 +create trigger xuigai +on Department for update +as +declare @qian varchar(5) +declare @hou varchar(5) +select @qian=DepartmentId from deleted +select @hou=DepartmentId from inserted +update people set DepartmentId=@hou where DepartmentId=@qian + + +go +update Department set DepartmentId='007' where DepartmentId='002' +select * from People +select * from Department \ No newline at end of file diff --git "a/\344\275\234\344\270\232/10.6\345\207\275\346\225\260.sql" "b/\344\275\234\344\270\232/10.6\345\207\275\346\225\260.sql" new file mode 100644 index 0000000..e92faad --- /dev/null +++ "b/\344\275\234\344\270\232/10.6\345\207\275\346\225\260.sql" @@ -0,0 +1,164 @@ +--(1)编写一个函数求该银行的金额总和 +use BankTest +go +create function func_GetBankMoneyByAccId() +returns money +as +begin + declare @SumBankMoney money + select @SumBankMoney =(select sum(CardMoney ) from BankCard) + return @SumBankMoney +end +go + + +select dbo.func_GetBankMoneyByAccId() as 银行金额总和 + + +--(2)传入账户编号,返回账户真实姓名 +go +create function func_GetInfoByAcco_Id(@id int) +returns varchar(40) +as +begin + declare @name varchar(40) + select @name = (select RealName from AccountInfo where AccountId = @id) + return @name +end +go + +select dbo.func_GetInfoByAcco_Id( 2 ) as 姓名 + + +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 + +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): + +go +create function func_GetCardExchangeByOpenTimeAndEndTime(@OpenTime smalldatetime,@EndTime smalldatetime) +returns @ExchangTable table( + Name varchar(30), + CardNo varchar(50), + MoneyInBank money, + MoneyOutBank money, + ExchangeTime smalldatetime +) +as +begin + insert into @ExchangTable + select A.RealName,CE.CardNo,CE.MoneyInBank,CE.MoneyOutBank,CE.ExchangeTime from CardExchange CE + join BankCard B on B.CardNo = CE.CardNo + join AccountInfo A on A.AccountId = B.AccountId + where A.OpenTime = @OpenTime and CE.ExchangeTime = @EndTime + return +end +go + +select * from func_GetCardExchangeByOpenTimeAndEndTime('2022-09-19 22:37:00','2022-09-19 22:37:00') + + + + +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,根据银行卡余额显示银行卡等级 30万以下为 +--“普通用户”,30万及以上为"VIP用户",分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when +select B.CardNo,AccountCode,RealName,CardMoney, +( + case when CardMoney<300000 then '普通用户' + else 'VIP用户' + end +)用户等级, +( + case when CardState=1 then '正常' + when CardState=2 then '挂失' + when CardState=3 then '冻结' else '注销' + end +)银行卡状态 +from BankCard B +join AccountInfo A on A.AccountId = B.AccountId + + +--方案二:将等级和状态用函数实现 +--查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,根据银行卡余额显示银行卡等级 30万以下为 +--“普通用户”,30万及以上为"VIP用户",分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 +go +create function fun_GetBankInfoByCardNo(@CardNo varchar(30)) +returns @BankInfo table( + CardNo varchar(30), + AccountCode varchar(30), + Name varchar(30), + CardMoney money, + UserLevel varchar(30), + BankCardStatus varchar(30) +) +as +begin + insert into @BankInfo + select B.CardNo,AccountCode,RealName,CardMoney, + ( + case when CardMoney<300000 then '普通用户' + else 'VIP用户' + end + )UserLevel, + ( + case when CardState=1 then '正常' + when CardState=2 then '挂失' + when CardState=3 then '冻结' else '注销' + end + )BankCardStatus + from BankCard B + join AccountInfo A on A.AccountId = B.AccountId + where CardNo = @CardNo + return +end +go + +select * from fun_GetBankInfoByCardNo('6225547854125656') + + +select * from AccountInfo +select * from CardExchange +select * from BankCard + + +--(5)表格。。。。。。。。。。。 +create table Emp +( + EmpId int primary key identity(1,2), --自动编号 + empName varchar(20), --姓名 + empSex varchar(4), --性别 + empBirth smalldatetime --生日 +) +insert into Emp(empName,empSex,empBirth) values('刘备','男','2008-5-8') +insert into Emp(empName,empSex,empBirth) values('关羽','男','1998-10-10') +insert into Emp(empName,empSex,empBirth) values('张飞','男','1999-7-5') +insert into Emp(empName,empSex,empBirth) values('赵云','男','2003-12-12') +insert into Emp(empName,empSex,empBirth) values('马超','男','2003-1-5') +insert into Emp(empName,empSex,empBirth) values('黄忠','男','1988-8-4') +insert into Emp(empName,empSex,empBirth) values('魏延','男','1998-5-2') +insert into Emp(empName,empSex,empBirth) values('简雍','男','1992-2-20') +insert into Emp(empName,empSex,empBirth) values('诸葛亮','男','1993-3-1') +insert into Emp(empName,empSex,empBirth) values('徐庶','男','1994-8-5') + +--编写函数,根据出生日期求年龄,年龄求实岁,例如: + +--? 生日为2000-5-5,当前为2018-5-4,年龄为17岁 +--? 生日为2000-5-5,当前为2018-5-6,年龄为18岁 + +select * from Emp +go +create function fun_GetAgeByBirth(@id int,@NowTime datetime) +returns int +as +begin + declare @BirthTime datetime + declare @age int + select @BirthTime = (select empBirth from Emp where EmpId = @id) + select @age = DATEDIFF(YY,@BirthTime,@NowTime) + select @age = case when DATEDIFF(DD,DATEADD(YY,@age,@BirthTime),@NowTime)<0 then @age-1 else @age end + return @age +end +go + +select dbo.fun_GetAgeByBirth(9,GETDATE()) as 年龄 diff --git "a/\344\275\234\344\270\232/10.7\345\255\230\345\202\250.sql" "b/\344\275\234\344\270\232/10.7\345\255\230\345\202\250.sql" new file mode 100644 index 0000000..fd3eb9b --- /dev/null +++ "b/\344\275\234\344\270\232/10.7\345\255\230\345\202\250.sql" @@ -0,0 +1,86 @@ +use BankTest +go +--1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 +-- 没有输入参数,输出参数 procedure +go +create procedure proc_GetMinMoney +as +begin + select CardNo,RealName,CardMoney from AccountInfo A join BankCard B on A.AccountId = B.AccountId + where CardMoney = (select MIN(CardMoney) from BankCard) +end + +exec proc_GetMinMoney +go +select * from BankCard + + +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 +go +create procedure proc_GetCardNoByInMoney +@CardNo varchar(30), +@Money money +as +begin + update BankCard set CardMoney += @Money where CardNo = @CardNo +end + + +exec proc_GetCardNoByInMoney '6225125478544587',1000 + + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 +go +create procedure proc_GetCardNoByOutMoney +@CardNo varchar(30), +@Money money +as +begin + update BankCard set CardMoney -= @Money where CardNo = @CardNo + if(@@ERROR <> 0) + print -1 + else + print 1 +end + +exec proc_GetCardNoByOutMoney '6225125478544587',1000 + + +--4. **查询出某时间段的银行存取款信息以及存款总金额**,取款总金额,传入开始时间,结束时间,显示存取款交易信息的同时,返回存款总金额,取款总金额。 +select * from CardExchange +go +create proc proc_GetCardExchangeByTime +@OpenTime smalldatetime, +@EndTime smalldatetime, +@suminMoney money output, +@sumoutMoney money output +as +begin + select @suminMoney = SUM(MoneyInBank),@sumoutMoney = SUM(MoneyOutBank) from CardExchange + where ExchangeTime between @OpenTime and @EndTime +end + +go +declare @OpenTime smalldatetime= '2022-09-19 22:37:00' , @EndTime smalldatetime = '2022-09-29 09:47:00' +declare @suminMoney money,@sumoutMoney money + +exec proc_GetCardExchangeByTime @OpenTime,@EndTime,@suminMoney output,@sumoutMoney output +select @suminMoney,@sumoutMoney + + + + + + + +--5. **密码升级**,传入用户名和密码,如果用户名密码正确,并且密码长度<8,自动升级成8位密码 + +--(提示:随机生成 0-9 的整数: float(rand()*10)) rand():随机生成0.0-1.0的小数 float:向下取整) +select * from AccountInfo +alter table AccountInfo add [pawssword] int +insert into AccountInfo values( + 123456, + 123456, + 123456, + 123456 +) \ No newline at end of file diff --git "a/\344\275\234\344\270\232/9.15\345\273\272\350\241\250\347\272\246\346\235\237.sql" "b/\344\275\234\344\270\232/9.15\345\273\272\350\241\250\347\272\246\346\235\237.sql" new file mode 100644 index 0000000..d295265 --- /dev/null +++ "b/\344\275\234\344\270\232/9.15\345\273\272\350\241\250\347\272\246\346\235\237.sql" @@ -0,0 +1,112 @@ +USE [DBTEST] +GO +/****** Object: Table [dbo].[sectionInfo] Script Date: 2022/9/16 12:57:15 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_PADDING ON +GO +CREATE TABLE [dbo].[sectionInfo]( + [sectionID] [int] IDENTITY(1,1) NOT NULL, + [sectionName] [varchar](10) NOT NULL, +PRIMARY KEY CLUSTERED +( + [sectionID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +GO +SET ANSI_PADDING OFF +GO +/****** Object: Table [dbo].[userInfo] Script Date: 2022/9/16 12:57:15 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_PADDING ON +GO +CREATE TABLE [dbo].[userInfo]( + [userNo] [int] IDENTITY(1,1) NOT NULL, + [userName] [varchar](10) NOT NULL, + [userSex] [varchar](2) NOT NULL DEFAULT ('男'), + [userAge] [int] NOT NULL, + [userAddress] [varchar](50) NULL DEFAULT ('湖北'), + [userSection] [int] NULL, +PRIMARY KEY CLUSTERED +( + [userNo] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +GO +SET ANSI_PADDING OFF +GO +/****** Object: Table [dbo].[workInfo] Script Date: 2022/9/16 12:57:15 ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_PADDING ON +GO +CREATE TABLE [dbo].[workInfo]( + [workId] [int] IDENTITY(11001,1) NOT NULL, + [userId] [int] NOT NULL, + [workTime] [datetime] NOT NULL, + [workDescription] [varchar](40) NOT NULL, +PRIMARY KEY CLUSTERED +( + [workId] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +GO +SET ANSI_PADDING OFF +GO +SET IDENTITY_INSERT [dbo].[sectionInfo] ON + +INSERT [dbo].[sectionInfo] ([sectionID], [sectionName]) VALUES (1, N'测试部门') +INSERT [dbo].[sectionInfo] ([sectionID], [sectionName]) VALUES (2, N'实施部门') +INSERT [dbo].[sectionInfo] ([sectionID], [sectionName]) VALUES (3, N'前端部门') +INSERT [dbo].[sectionInfo] ([sectionID], [sectionName]) VALUES (4, N'后端部门') +INSERT [dbo].[sectionInfo] ([sectionID], [sectionName]) VALUES (5, N'销售部门') +SET IDENTITY_INSERT [dbo].[sectionInfo] OFF +SET IDENTITY_INSERT [dbo].[userInfo] ON + +INSERT [dbo].[userInfo] ([userNo], [userName], [userSex], [userAge], [userAddress], [userSection]) VALUES (3, N'张三00', N'男', 20, N'湖北', 4) +INSERT [dbo].[userInfo] ([userNo], [userName], [userSex], [userAge], [userAddress], [userSection]) VALUES (4, N'李四00', N'男', 19, N'湖北', 3) +INSERT [dbo].[userInfo] ([userNo], [userName], [userSex], [userAge], [userAddress], [userSection]) VALUES (5, N'王五00', N'男', 19, N'湖北', 1) +INSERT [dbo].[userInfo] ([userNo], [userName], [userSex], [userAge], [userAddress], [userSection]) VALUES (6, N'刘力00', N'男', 21, N'湖北', 5) +INSERT [dbo].[userInfo] ([userNo], [userName], [userSex], [userAge], [userAddress], [userSection]) VALUES (7, N'刘六00', N'男', 20, N'湖北', 2) +SET IDENTITY_INSERT [dbo].[userInfo] OFF +SET IDENTITY_INSERT [dbo].[workInfo] ON + +INSERT [dbo].[workInfo] ([workId], [userId], [workTime], [workDescription]) VALUES (11002, 5, CAST(N'2022-09-16 12:47:52.573' AS DateTime), N'迟到') +INSERT [dbo].[workInfo] ([workId], [userId], [workTime], [workDescription]) VALUES (11003, 7, CAST(N'2022-09-16 12:47:52.573' AS DateTime), N'迟到') +INSERT [dbo].[workInfo] ([workId], [userId], [workTime], [workDescription]) VALUES (11004, 6, CAST(N'2022-09-16 12:48:31.070' AS DateTime), N'迟到') +INSERT [dbo].[workInfo] ([workId], [userId], [workTime], [workDescription]) VALUES (11005, 3, CAST(N'2022-09-16 12:48:31.070' AS DateTime), N'迟到') +INSERT [dbo].[workInfo] ([workId], [userId], [workTime], [workDescription]) VALUES (11006, 6, CAST(N'2022-09-16 12:48:44.780' AS DateTime), N'迟到') +SET IDENTITY_INSERT [dbo].[workInfo] OFF +SET ANSI_PADDING ON + +GO +/****** Object: Index [UQ__userInfo__66DCF95CAB92CC6D] Script Date: 2022/9/16 12:57:15 ******/ +ALTER TABLE [dbo].[userInfo] ADD UNIQUE NONCLUSTERED +( + [userName] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +GO +ALTER TABLE [dbo].[userInfo] WITH CHECK ADD FOREIGN KEY([userSection]) +REFERENCES [dbo].[sectionInfo] ([sectionID]) +GO +ALTER TABLE [dbo].[workInfo] WITH CHECK ADD FOREIGN KEY([userId]) +REFERENCES [dbo].[userInfo] ([userNo]) +GO +ALTER TABLE [dbo].[userInfo] WITH CHECK ADD CHECK (([userAge]>=(1) AND [userAge]<=(100))) +GO +ALTER TABLE [dbo].[userInfo] WITH CHECK ADD CHECK ((len([userName])>=(4))) +GO +ALTER TABLE [dbo].[userInfo] WITH CHECK ADD CHECK (([userSex]='男' OR [userSex]='女')) +GO +ALTER TABLE [dbo].[workInfo] WITH CHECK ADD CHECK (([workDescription]='迟到' OR [workDescription]='早退' OR [workDescription]='病假' OR [workDescription]='事假' OR [workDescription]='迟到')) +GO \ No newline at end of file diff --git "a/\344\275\234\344\270\232/9.16\346\237\245\350\257\242.sql" "b/\344\275\234\344\270\232/9.16\346\237\245\350\257\242.sql" new file mode 100644 index 0000000..d5aeeb7 --- /dev/null +++ "b/\344\275\234\344\270\232/9.16\346\237\245\350\257\242.sql" @@ -0,0 +1,62 @@ +--1. 查询出武汉地区所有的员工信息,要求显示部门名称以及员工的详细资料 +select D.DepartmentName,P.* from People P +join Department D on D.DepartmentId = P.DepartmentId +where P.PeopleAddress = '武汉'; + + +--2. 查询出武汉地区所有的员工信息,要求显示部门名称,职级名称以及员工的详细资料 +select D.DepartmentName,R.RankName,P.* from People P +join Department D on D.DepartmentId = P.DepartmentId +join [Rank] R on R.RankId = P.RankId +where P.PeopleAddress = '武汉'; + + +--3. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资。 +select D.DepartmentName 部门,count(PeopleName)员工人数,SUM(PeopleSalary)员工工资总和,round(AVG(PeopleSalary),2)平均工资,MAX(PeopleSalary)最高工资,min(PeopleSalary)最低工资 from People +join Department D on D.DepartmentId = People.DepartmentId +group by D.DepartmentName + +--4. 根据部门分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资,平均工资在10000 以下的不参与统计,并且根据平均工资降序排列。 +select D.DepartmentName 部门,count(PeopleName)员工人数,SUM(PeopleSalary)员工工资总和,round(AVG(PeopleSalary),2)平均工资,MAX(PeopleSalary)最高工资,min(PeopleSalary)最低工资 from People +join Department D on D.DepartmentId = People.DepartmentId +where People.PeopleSalary >= 10000 +group by D.DepartmentName +order by 平均工资 desc + + +--5. 根据部门名称,然后根据职位名称,分组统计员工人数,员工工资总和,平均工资,最高工资和最低工资 +select D.DepartmentName,R.RankName,count(PeopleName)员工人数,SUM(PeopleSalary)员工工资总和,round(AVG(PeopleSalary),2)平均工资,MAX(PeopleSalary)最高工资,min(PeopleSalary)最低工资 from People P +join Department D on D.DepartmentId = P.DepartmentId +join [Rank] R on R.RankId = P.RankId +group by D.DepartmentName,R.RankName + + +--6.查询出巨蟹 6.22--7.22 的员工信息 +select * from People +where month(PeopleBirth) between 6 and 7 ; + + +--7.查询所有员工信息,添加一列显示属相(鼠,牛,虎,兔,龙,蛇,马,羊,猴,鸡,狗,猪) +select *,( +CASE convert(int,year(PeopleBirth))%12 +WHEN '0' then '猴' +WHEN '1' then '鸡' +WHEN '2' then '狗' +WHEN '3' then '猪' +WHEN '4' then '鼠' +WHEN '5' then '牛' +WHEN '6' then '虎' +WHEN '7' then '兔' +WHEN '8' then '龙' +WHEN '9' then '蛇' +WHEN '10' then '马' +WHEN '11' then '羊' +end)生肖 +from People + +select *,REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(year(PeopleBirth)%12 ,10,'马'),11,'羊'),9,'蛇'),8,'龙'),7,'兔'),6,'虎') ,5,'牛'),4,'鼠'),3,'猪'),2,'狗'),1,'鸡'),0,'猴')生肖 from People + + + + +select *,replace(PeopleSalary,9000,'九千') from People \ No newline at end of file diff --git "a/\344\275\234\344\270\232/9.19\345\255\220\346\237\245\350\257\242.sql" "b/\344\275\234\344\270\232/9.19\345\255\220\346\237\245\350\257\242.sql" new file mode 100644 index 0000000..1c57909 --- /dev/null +++ "b/\344\275\234\344\270\232/9.19\345\255\220\346\237\245\350\257\242.sql" @@ -0,0 +1,62 @@ +--1. 关羽的银行卡号为"6225547858741263",查询出余额比关羽多的银行卡信息,显示卡号,身份证,姓名,余额。 +select BankCard.CardNo,a.AccountCode,a.RealName,BankCard.CardMoney from BankCard +join AccountInfo A on a.AccountId = BankCard.AccountId +where CardMoney>( + select CardMoney from BankCard where CardNo = '6225547858741263' +) + +--2. 从所有账户信息中查询出余额最高的交易明细(存钱取钱信息)。 +select * from CardExchange where CardNo = ( + select top 1 CardNo from CardExchange order by MoneyInBank desc +) + +--3. 查询有取款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 + +select B.CardNo 卡号,A.AccountCode 身份证,A.RealName 姓名,B.CardMoney 余额 from AccountInfo A +join BankCard B on A.AccountId = B.AccountId +where B.CardNo in ( select CardNo from CardExchange where MoneyOutBank <> 0) + + +--4. 查询出没有存款记录的银行卡及账户信息,显示卡号,身份证,姓名,余额。 +select B.CardNo 卡号,A.AccountCode 身份证,A.RealName 姓名,B.CardMoney 余额 from AccountInfo A +join (select * from BankCard where CardNo not in ( + select CardNo from CardExchange where MoneyInBank <>0 + ) +)B on A.AccountId = B.AccountId + + +--5. 关羽的银行卡号为"6225547858741263",查询当天是否有收到转账。 +if exists( + select * from CardTransfer where CardNoIn = '6225547858741263' + and CONVERT(varchar(15),TransferTime,20) = CONVERT(varchar(15),getdate(),20) +) + print '有' +else + print '没有' + + +--6. 查询出交易次数(存款取款操作)最多的银行卡账户信息,显示:卡号,身份证,姓名,余额,交易次数。 + +select top 1 B.CardNo 卡号,A.AccountCode 身份证,A.RealName 姓名,B.CardMoney 余额,temp.交易次数 from AccountInfo A +join BankCard B on B.AccountId = A.AccountId +join ( + select CardNo,COUNT(CardNo)交易次数 from CardExchange + group by CardNo +)temp on temp.CardNo = B.CardNo +order by temp.交易次数 desc + + +--7. 查询出没有转账交易记录的银行卡账户信息,显示卡号,身份证,姓名,余额。 +select B.CardNo 卡号,A.AccountCode 身份证,A.RealName 姓名,B.CardMoney 余额 from AccountInfo A +join BankCard B on A.AccountId = B.AccountId +where B.CardNo not in ( + select CardNoOut from CardTransfer +)and B.CardNo not in ( + select CardNoIn from CardTransfer +) + + + + + +Gitee — 基于 Git 的代码托管和研发协作平台 diff --git "a/\344\275\234\344\270\232/9.21\345\205\263\350\201\224\345\255\220\346\237\245\350\257\242.sql" "b/\344\275\234\344\270\232/9.21\345\205\263\350\201\224\345\255\220\346\237\245\350\257\242.sql" new file mode 100644 index 0000000..167073c --- /dev/null +++ "b/\344\275\234\344\270\232/9.21\345\205\263\350\201\224\345\255\220\346\237\245\350\257\242.sql" @@ -0,0 +1,69 @@ +select +student.Sname 姓名, +(select score from SC sc1 where cid = '01' and Student.SId = sc1.SId)数学 , +(select score from SC sc2 where cid = '02' and Student.SId = sc2.SId)语文, +(select score from SC sc3 where cid = '03' and Student.SId = sc3.SId)英语, +temp.平均成绩 +from Student +join (select sid,CONVERT(decimal(10,2),AVG(score)) 平均成绩 from sc group by sid)temp +on Student.sid = temp.sid +order by temp.平均成绩 desc + + + + +--14. 查询各科成绩最高分、最低分和平均分: + +--以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 + +--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 + +--要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 +select sc.CId, + (select Cname from Course where Course.CId = sc.CId)课程, + max(score)最高分,MIN(score)最低分,CONVERT(decimal(10,2),AVG(score))平均分,COUNT(*) 选修人数, + CONVERT(decimal(10,2),CONVERT(decimal(10,2),sum(CASE when score >=60 then 1 else 0 end))/CONVERT(decimal(10,2),COUNT(*))) 及格率, + CONVERT(decimal(10,2),CONVERT(decimal(10,2),sum(CASE when score >=70 and score < 80 then 1 else 0 end))/CONVERT(decimal(10,2),COUNT(*)))中等率, + CONVERT(decimal(10,2),CONVERT(decimal(10,2),sum(CASE when score >=80 and score < 90 then 1 else 0 end))/CONVERT(decimal(10,2),COUNT(*)))优良率, + CONVERT(decimal(10,2),CONVERT(decimal(10,2),sum(CASE when score >=90 then 1 else 0 end))/CONVERT(decimal(10,2),COUNT(*)))优秀率 +from SC +group by sc.CId +order by 选修人数 desc,sc.cid asc + +--15. 按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 + + select student.SId,sc01.[01成绩],sc01.[01顺序],sc02.[02成绩],sc02.[02顺序],sc03.[03成绩],sc03.[03顺序] + from student + left join (select SId,score'01成绩' ,ROW_NUMBER() over( order by score desc ) as '01顺序' from sc where cid = '01')sc01 + on student.SId = sc01.SId + left join ( select SId,score'02成绩' ,ROW_NUMBER() over( order by score desc ) as '02顺序'from sc where cid = '02')sc02 + on student.SId = sc02.SId + left join ( select SId,score'03成绩' ,ROW_NUMBER() over( order by score desc ) as '03顺序'from sc where cid = '03')sc03 + on student.SId = sc03.SId + order by SId + + +--15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次 + select student.SId,sc01.[01成绩],sc01.[01顺序],sc02.[02成绩],sc02.[02顺序],sc03.[03成绩],sc03.[03顺序] + from student + left join (select SId,score'01成绩' ,DENSE_RANK() over( order by score desc ) as '01顺序' from sc where cid = '01')sc01 + on student.SId = sc01.SId + left join ( select SId,score'02成绩' ,DENSE_RANK() over( order by score desc ) as '02顺序'from sc where cid = '02')sc02 + on student.SId = sc02.SId + left join ( select SId,score'03成绩' ,DENSE_RANK() over( order by score desc ) as '03顺序'from sc where cid = '03')sc03 + on student.SId = sc03.SId + order by SId + + +--16. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺 +select SId,SUM(score)总成绩,rank() over(order by SUM(score) desc)排名 +from SC +group by SId + + + + +--******************************16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺 +select SId,SUM(score)总成绩,ROW_NUMBER() over(order by SUM(score) desc)排名 +from SC +group by SId diff --git "a/\344\275\234\344\270\232/9.22\345\217\230\351\207\217.sql" "b/\344\275\234\344\270\232/9.22\345\217\230\351\207\217.sql" new file mode 100644 index 0000000..31e9ccb --- /dev/null +++ "b/\344\275\234\344\270\232/9.22\345\217\230\351\207\217.sql" @@ -0,0 +1,86 @@ +use BankTest +go +--1. 为赵云此人进行开户开卡操作,赵云身份证:420107199904054233 +select * from AccountInfo +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199904054233','13843819438','赵云',GETDATE()) + + +--2. 需要求出张飞的银行卡卡号和余额,张飞身份证:420107199602034138 (1.使用连接查询,2.使用变量) +declare @accountcode varchar(30) +select @accountcode = AccountCode from AccountInfo where AccountCode = '420107199602034138' +select @accountcode 银行卡卡号,B.CardMoney from BankCard B +join AccountInfo A on A.AccountId = B.AccountId where A.AccountCode = @accountcode + +select * from AccountInfo + + +--#### 逻辑控制 + +--##### 条件分支if-else + +--? 3.某用户银行卡号为“6225547854125656”,该用户执行取钱操作,取钱5000元,余额充足则进行取钱操作, +--并提示"取钱成功",否则提示“余额不足”。 +declare @cardMoney int +select @cardMoney = (select CardMoney from BankCard where CardNo = '6225547854125656') +if (@cardMoney-5000 > 0 ) + begin + print'取钱成功' + update BankCard set CardMoney = @cardMoney - 5000 where CardNo = '6225547854125656' + insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) values('6225547854125656',0,5000,getdate()); + end +else + begin + print'取钱失败' + end + + + + + + +--##### 条件分支:case-when + +--? 4.查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,并且根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", + +----显示列分别为卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +select CardNo 卡号,AccountCode 身份证,RealName 姓名, CardMoney 余额, +case + when CardMoney>300000 then 'VIP客户' + else '普通用户' +end 用户等级, +case + when CardState=1 then '正常' + when CardState=2 then '挂失' + when CardState=3 then '冻结' + else '注销' +end 银行卡状态状态 +from BankCard +inner join AccountInfo on AccountInfo.AccountId = BankCard.AccountId + +--##### **while** + +--? 5.循环打印1-10。 +declare @a int = 0 + while @a < 10 + begin + set @a = @a + 1 + print @a + end + + +--? 6.打印99乘法表 +declare @i int = 1 +while(@i<=9) +begin + declare @j int =1 + declare @b varchar(250) = '' + while(@j<=@i) + begin + set @b = @b+cast(@j as varchar(1))+'*'+cast(@i as varchar(1))+'='+cast(@i*@j as varchar(40))+CHAR(9) + set @j += 1 + end + print @b + set @i += 1 +end \ No newline at end of file diff --git "a/\344\275\234\344\270\232/9.23\347\264\242\345\274\225.sql" "b/\344\275\234\344\270\232/9.23\347\264\242\345\274\225.sql" new file mode 100644 index 0000000..8987646 --- /dev/null +++ "b/\344\275\234\344\270\232/9.23\347\264\242\345\274\225.sql" @@ -0,0 +1,30 @@ +--使用STUDENTS数据库 +--1.创建tb_student(name)索引 填充因子设为50 +use STUDENTS +go +create index IX_Name on tb_student(name) +with( + fillfactor = 50 +) + + +--2.创建tb_record(borrow_time,return_time) 使用索引查询没还书的同学并且让没还书的同学将图书归还 +create index IX_InBook on tb_record(borrow_time,return_time) +with( + fillfactor = 50 +) +select * from tb_record with(index=IX_InBook) where return_time is null +update tb_record set return_time = GETDATE() where rid in ( + select rid from tb_record with(index=IX_InBook) where return_time is null +) + + + +--3.增加新列id() 创建聚集索引tb_book(id) +select * from tb_book + alter table tb_book add id nvarchar(50) + go + create index IX_id on tb_book(id) + + + drop index IX_RealName on AccountInfo \ No newline at end of file diff --git "a/\344\275\234\344\270\232/9.26\350\247\206\345\233\276.sql" "b/\344\275\234\344\270\232/9.26\350\247\206\345\233\276.sql" new file mode 100644 index 0000000..e2f1e2c --- /dev/null +++ "b/\344\275\234\344\270\232/9.26\350\247\206\345\233\276.sql" @@ -0,0 +1,59 @@ +use BankTest +go +--1)编写视图实现查询出所有银行卡账户信息,显示卡号,身份证,姓名,余额。 + +select AccountCode,AccountPhone,RealName,CardMoney from AccountInfo +join BankCard on AccountInfo.AccountId = BankCard.AccountId + +go +create view V_UserInfo(显示卡号,身份证,姓名,余额) +as +select AccountCode,AccountPhone,RealName,CardMoney from AccountInfo +join BankCard on AccountInfo.AccountId = BankCard.AccountId +go + +select * from V_UserInfo + + + + + +--2)行转列常用做法: group by + sum(case when) /+count(case when) 数据分析+ over (paritition by, order by) +create table Securities( + id int primary key identity(1025001,1), + [year] int, + [month] int, + amonth decimal(10,1) +) +insert into Securities +values +(1991,1,1.1), +(1991,2,1.2), +(1991,3,1.3), +(1991,4,1.4), +(1992,1,2.1), +(1992,2,2.2), +(1992,3,2.3), +(1992,4,2.4) + +select [year], +max(case when [month]=1 then amonth else 0 end) m1, +max(case when [month]=2 then amonth else 0 end) m2, +max(case when [month]=3 then amonth else 0 end) m3, +max(case when [month]=4 then amonth else 0 end )m4 +from Securities +group by [year] + +--***************************使用pivot +select * from Securities +pivot( + sum([amonth]) + for [month] in ([1],[2],[3],[4] ) +)as TT + + + +select * from Securities + +-- 实现行转列:pivot +-- 列转行:union \ No newline at end of file diff --git "a/\344\275\234\344\270\232/9.28\344\272\213\345\212\241\345\217\212\350\241\214\350\275\254\345\210\227.sql" "b/\344\275\234\344\270\232/9.28\344\272\213\345\212\241\345\217\212\350\241\214\350\275\254\345\210\227.sql" new file mode 100644 index 0000000..e40df38 --- /dev/null +++ "b/\344\275\234\344\270\232/9.28\344\272\213\345\212\241\345\217\212\350\241\214\350\275\254\345\210\227.sql" @@ -0,0 +1,163 @@ +use BankTest +go + +-- 设置账户余额必须>=0 +alter table BankCard add constraint CK_Money check(CardMoney >= 0 ) + + +--方法1 +--使用@@error判断 +--事务开始 +begin transaction A + +-- 取款变量 +declare @OutMongy int = 6000 +-- 用户id +declare @accountId int = (select AccountId from AccountInfo where RealName = '刘备') +-- 用户卡号 +declare @CardNo varchar(20) = (select CardNo from BankCard where AccountId = @accountId) +-- 报错代码 +declare @myerr int = 0 + +-- 取款 +update BankCard set CardMoney -= @OutMongy where AccountId = @accountId +set @myerr += @@error +save tran B + +-- 生成取款记录 +insert into CardExchange values(@CardNo,0,@OutMongy,getdate()) + +-- 事务提交 +if( @@ERROR = 0 ) + begin + commit transaction A + end +else + begin + commit transaction B + end + +select * from CardExchange +select * from BankCard + + +--方法2: +----begin try +---- --事务的开始:begin tran +---- --sql语句 +---- commit --提交 +----end try + +----begin catch --捕获错误,如果某条语句执行错误,将被捕获 +---- rollback tran +----end +go +begin try + begin tran + declare @MoneyOut int = 0 + declare @AccountId int = (select AccountId from AccountInfo where RealName = '刘备') + declare @CardNo varchar(20) = (select CardNo from BankCard where AccountId = @AccountId) + --错误代码 + declare @myerr int = 0 + + update BankCard set CardMoney -= 6000 where AccountId = @AccountId + set @myerr += @@ERROR + insert into CardExchange values(@CardNo,0,@MoneyOut,GETDATE()) + commit +end try + +begin catch + rollback tran +end catch + +go + + +--2.刘备向张飞转账1000元,(添加check约束,设置账户余额必须>=0) +-- 设置账户余额必须>=0 在第一题中已经写有 + +select * from BankCard +select * from CardTransfer + + + +---事务开始 begin tran +begin try + begin tran + -- 转账金额 + declare @TransferMoney int = 1000 + -- 转出卡号 与 用户名 + declare @IdOut int = (select AccountId from AccountInfo where RealName = '刘备') + declare @CardNoOut varchar(20) = (select CardNo from BankCard where AccountId = @IdOut) + -- 转入卡号 与 用户名 + declare @idIn int = (select AccountId from AccountInfo where RealName = '张飞') + declare @CardNoIn varchar(20) = (select CardNo from BankCard where AccountId = @idIn) + -- 报错代码 + declare @myerr int = 0 + --2.刘备向张飞转账1000元 + update BankCard set CardMoney -= @TransferMoney where CardNo = @CardNoOut + set @myerr += @@error + update BankCard set CardMoney +=@TransferMoney where CardNo = @CardNoIn + + insert into CardTransfer values(@CardNoOut,@CardNoIn,@TransferMoney,GETDATE()) + commit +end try + +begin catch + rollback tran +end catch + + + +-------------------------------------------列转行 + + + +CREATE TABLE grades1 ( + -- id int NOT NULL , + name varchar(20) DEFAULT NULL, + subject varchar(20) DEFAULT NULL, + score int DEFAULT NULL, + +) + +INSERT INTO grades1 VALUES ( 'lyy', '英语', 100); +INSERT INTO grades1 VALUES ( 'lyy', '数学', 98); +INSERT INTO grades1 VALUES ( 'lyy', '语文', 97); +INSERT INTO grades1 VALUES ( 'gss', '英语', 89); +INSERT INTO grades1 VALUES ( 'gss', '数学', 88); +INSERT INTO grades1 VALUES ( 'gss', '语文', 87); +INSERT INTO grades1 VALUES ( 'liming', '英语', 79); +INSERT INTO grades1 VALUES ( 'liming', '数学', 77); +INSERT INTO grades1 VALUES ( 'liming', '语文', 75); + +select * from grades1 +--列转行 +select score from grades1 where name = 'lyy' +union +select score from grades1 where name = 'gss' +union +select score from grades1 where name = 'liming' + + +------------------------------------------------------------------------------- +select [subject], +max(case when name = 'lyy' then score else 0 end) lyy, +max(case when name = 'gss' then score else 0 end) gss, +max(case when name = 'liming' then score else 0 end) liming +from grades1 +group by [subject] + + + +select * from grades1 +pivot( + sum(score) + for name in ([lyy],[gss],[liming]) +)a + + + + + +drop table grades1 \ No newline at end of file diff --git "a/\344\275\234\344\270\232/9.30\346\270\270\346\240\207.sql" "b/\344\275\234\344\270\232/9.30\346\270\270\346\240\207.sql" new file mode 100644 index 0000000..90aa024 --- /dev/null +++ "b/\344\275\234\344\270\232/9.30\346\270\270\346\240\207.sql" @@ -0,0 +1,121 @@ +--例3:使用游标实现加薪操作 +use test_trigger +select * from People + + + --- 1.声明游标 + -- 1.1滚动游标 (scroll) +declare cur_UpdateSalaryById cursor scroll +for select PeopleId from People + + -- 2.打开游标 +open cur_UpdateSalaryById + -- 3 使用游标 + --声明变量来接受游标放回的值 与 存放加薪值 +declare @id int +declare @money money = 1000 + -- 注意事项: 使用变量存储游标值的格式 fetch ... from 游标名 into 变量名 +fetch first from cur_UpdateSalaryById into @id + --@@fetch_status = 0 : 还有下一行 -1: 提取失败 -2:提取空白行 + -- 每人都加薪1000 +while(@@fetch_status = 0) + begin + update People set PeopleSalary += @money where PeopleId = @id + print cast(@id as varchar(12)) + char(9) + cast(@money as varchar(20)) + fetch next from cur_UpdateSalaryById into @id + end + + -- 4.关闭游标 +close cur_UpdateSalaryById + + -- 5.释放变量 +deallocate cur_UpdateSalaryById + + + + + + +--例4:使用游标删除不达标员工 market(销售字段) +go + select * from People + alter table People add market varchar(20) +update People set market = '1000' where PeopleId = 1 +update People set market = '1500' where PeopleId = 2 +update People set market = '2000' where PeopleId = 6 + + +declare cur_DropMarketById cursor scroll +for select PeopleId from People + +open cur_DropMarketById + +declare @id int +declare @Mk varchar(20) = '' +fetch first from cur_DropMarketById into @id + +while(@@FETCH_STATUS = 0) + begin + set @Mk = (select market from People where PeopleId = @id) + if(@Mk <= 1000) + delete from People where PeopleId = @id + else + fetch next from cur_DropMarketById into @id + end +close cur_DropMarketById +deallocate cur_DropMarketById + +-- 第三题 +-- **************************************************************************************** +go +create table A( + id int primary key, + Province varchar(20), + City varchar(20) +) + +create table B( + id int primary key, + Province varchar(20), + City varchar(20) +) + +insert into A values(1,'福建','厦门') +insert into A values(2,'广东','广州') +insert into A values(3,'福建','龙岩') +insert into A values(4,'云南','昆明') + +insert into B values(1,'江西','南昌') +insert into B values(3,'江苏','南京') +insert into B values(5,'湖北','武汉') +insert into B values(7,'湖南','长沙') + +--要求:使用游标 实现:如果A表与B表中ID字段值相同,那么将B表中的省份,城市 修改成与A表中的城市一致(连表) +select * from A +select * from B + + +declare cur_tempid cursor scroll +for select A.* from A join B on B.id = A.id + +open cur_tempid + + +declare @id int +declare @Province varchar(20) +declare @City varchar(20) + +fetch first from cur_tempid into @id,@Province,@City + + +while(@@FETCH_STATUS = 0) + begin + update B set Province = @Province where id = @id + update B set City = @City where id = @id + fetch next from cur_tempid into @id,@Province,@City + end + + +close cur_tempid + +deallocate cur_tempid \ No newline at end of file diff --git "a/\347\254\224\350\256\260/10.06\345\207\275\346\225\260.md" "b/\347\254\224\350\256\260/10.06\345\207\275\346\225\260.md" new file mode 100644 index 0000000..a90a730 --- /dev/null +++ "b/\347\254\224\350\256\260/10.06\345\207\275\346\225\260.md" @@ -0,0 +1,54 @@ +BEGIN + + function_body --鍑芥暟浣 + + RETURN 琛ㄨ揪寮; --蹇呴』瑕佹湁鐨 + +END +``` + +瀹氫箟鍑芥暟瑕佹眰瀹炵幇: + +瀹炵幇涓や釜鍊肩殑鍔犲拰 + +浣跨敤鍑芥暟姹傛煇闂ㄨ鐨勫钩鍧囨垚缁 + + + +#### 琛ㄥ煎嚱鏁 + +璇硶缁撴瀯: + +```sql +create function 鍚嶇О + +([{@鍙傛暟鍚嶇О 鍙傛暟绫诲瀷[=榛樿鍊糫}[,n]]) + +returns @灞閮ㄥ彉閲 table锛堝弬鏁板悕 鍙傛暟绫诲瀷锛 + +[with encryption] + +[as] + +begin + +鍑芥暟浣 + +return 鍑芥暟杩斿洖鍊 + +end +``` + + + +鍒犻櫎鑷畾涔夊嚱鏁 + +```sql +DROP function 鍑芥暟鍚 +``` + + + + + + diff --git "a/\347\254\224\350\256\260/10.07\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/\347\254\224\350\256\260/10.07\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000..6731bac --- /dev/null +++ "b/\347\254\224\350\256\260/10.07\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,104 @@ +浠涔堟槸瀛樺偍杩囩▼ +瀛樺偍杩囩▼鏄缂栬瘧SQL璇彞闆嗗悎锛岃繖浜涜鍙ュ瓨鍌ㄥ湪涓涓悕绉帮紙瀛樺偍杩囩▼鐨勫悕绉帮級涓嬪苟浣滀负鍗曞厓鏉ュ鐞嗐傚瓨鍌ㄨ繃绋嬩唬鏇夸簡浼犵粺鐨勯愭潯鎵цSQL璇彞鐨勬柟寮忥紝涓涓瓨鍌ㄨ繃绋嬩腑鍙互鍖呭惈鏌ヨ銆佹彃鍏ャ佸垹闄ゃ佹洿鏂扮瓑鎿嶇旱鐨勪竴绯诲垪SQL璇彞锛屽綋杩欎釜瀛樺偍杩囩▼琚皟鐢ㄦ墽琛屾椂锛岃繖浜涙搷浣滀篃浼氬悓鏃舵墽琛屻 + +灏佽濂 --> 璋冪敤 + +瀛樺偍杩囩▼鐨勫垎绫 +绯荤粺瀛樺偍杩囩▼ +绯荤粺瀛樺偍杩囩▼鏄敤鏉ョ鐞哠QL Server涓庢樉绀烘湁鍏虫暟鎹簱鍜岀敤鎴风殑淇℃伅鐨勫瓨鍌ㄨ繃绋嬨 + +甯歌鐨勭郴缁熷瓨鍌ㄨ繃绋嬫湁 + +sp_databases 鍒楀嚭鏈嶅姟涓婄殑鎵鏈夋暟鎹簱 +sp_helpdb --鎶ュ憡鏈夊叧鎸囧畾鏁版嵁搴撴垨鎵鏈夋暟鎹簱鐨勪俊鎭 +sp_renamedb 鏇存敼鏁版嵁搴撶殑鍚嶇О +sp_tables --杩斿洖褰撳墠鐜涓嬪彲鏌ヨ鐨勫璞$殑鍒楄〃 +sp_columns 杩斿洖鏌愪釜琛ㄥ垪鐨勪俊鎭 +sp_help --杩斿洖鏌愪釜琛ㄧ殑鎵鏈変俊鎭 +sp_helpconstraint 鏌ョ湅鏌愪釜琛ㄧ殑绾︽潫 +sp_helpindex --鏌ョ湅鏌愪釜琛ㄧ殑绱㈠紩 +sp_stored_procedures 鍒楀嚭褰撳墠鐜涓殑鎵鏈夊瓨鍌ㄨ繃绋 +sp_password --娣诲姞鎴栦慨鏀圭櫥褰曡处鎴风殑瀵嗙爜 +sp_rename 閲嶅懡鍚嶅瓨鍌ㄨ繃绋 +sp_helptext 鏄剧ず榛樿鍊硷紝鏈姞瀵嗙殑瀛樺偍杩囩▼銆佺敤鎴峰畾涔夌殑瀛樺偍杩囩▼銆佽Е鍙戝櫒鎴栬鍥剧殑瀹為檯鏂囨湰銆 +鑷畾涔夊瓨鍌ㄨ繃绋 +鍒涘缓瀛樺偍杩囩▼ + +1.娌℃湁杈撳叆鍙傛暟锛屾病鏈夎緭鍑哄弬鏁扮殑瀛樺偍杩囩▼銆 + +create proc <瀛樺偍杩囩▼鍚嶇О> +as + +go +缁冧範锛 瀹氫箟瀛樺偍杩囩▼鏌ヨ 骞撮緞鏈灏忕殑瀛︾敓淇℃伅 + +2.鏈夎緭鍏ュ弬鏁帮紝娌℃湁杈撳嚭鍙傛暟鐨勫瓨鍌ㄨ繃绋 + +create proc <瀛樺偍杩囩▼鍚嶇О> +<鍙橀噺1> <鏁版嵁绫诲瀷> +<鍙橀噺2> <鏁版嵁绫诲瀷> +... +as + +go +3.鏈夎緭鍏ュ弬鏁帮紝娌℃湁杈撳嚭鍙傛暟锛屼絾鏄湁杩斿洖鍊肩殑瀛樺偍杩囩▼锛堣繑鍥炲煎繀椤绘暣鏁帮級銆 + +create proc <瀛樺偍杩囩▼鍚嶇О> +<鍙橀噺1> <鏁版嵁绫诲瀷> +<鍙橀噺2> <鏁版嵁绫诲瀷> +... +as + +return 鏁存暟 +go +4.鏈夎緭鍏ュ弬鏁帮紝鏈夎緭鍑哄弬鏁扮殑瀛樺偍杩囩▼ & 涓涓彉閲忓叿澶囧悓鏃惰緭鍏ヨ緭鍑哄弬鏁扮殑瀛樺偍杩囩▼ + +create proc <瀛樺偍杩囩▼鍚嶇О> +<鍙橀噺1> <鏁版嵁绫诲瀷> output +<鍙橀噺2> <鏁版嵁绫诲瀷> output +... +as + +return 鏁存暟 +go +鎵ц瀛樺偍杩囩▼ + +--鏃犲弬 +exec <瀛樺偍杩囩▼鍚嶇О> +--甯﹀弬 +exec <瀛樺偍杩囩▼鍚嶇О> <褰㈠弬1>,<褰㈠弬2>,... +--甯﹀弬甯﹁繑鍥炲 +declare @鍙橀噺 +exec @鍙橀噺 = <瀛樺偍杩囩▼鍚嶇О> <褰㈠弬1>,<褰㈠弬2>,... +--鏈夎緭鍏ュ弬鏁帮紝鏈夎緭鍑哄弬鏁扮殑瀛樺偍杩囩▼ +declare @鍙橀噺 +exec <瀛樺偍杩囩▼鍚嶇О> <褰㈠弬1>,<褰㈠弬2>,@鍙橀噺 output +--涓涓彉閲忓悓鏃跺叿澶囪緭鍏ヨ緭鍑哄姛鑳 +declare @鍙橀噺 <鏁版嵁绫诲瀷> = 鍊 +exec <瀛樺偍杩囩▼鍚嶇О> <褰㈠弬1>,<褰㈠弬2>,@鍙橀噺 output +鍒犻櫎瀛樺偍杩囩▼ + +drop procedure <瀛樺偍杩囩▼鍚嶇О> +瀛樺偍杩囩▼鐨勪紭鐐 +鍏佽妯″潡鍖栫▼搴忚璁 + +鎵ц閫熷害鏇村揩 + +鍑忓皯缃戠粶娴侀氶噺 + +鎻愰珮绯荤粺瀹夊叏鎬 + +瀛樺偍杩囩▼涓庡嚱鏁扮殑鍖哄埆 +1.鍌ㄥ瓨杩囩▼鍙互鏈夎繑鍥炲间篃鍙互鏃犺繑鍥炲笺傚嚱鏁板繀椤绘湁杩斿洖鍊笺 + +2.瀛樺偍杩囩▼鐨勫疄鐜版瘮杈冨鏉傦紝鑰屽嚱鏁扮殑瀹炵幇姣旇緝鏈夐拡瀵规с + +3.鍌ㄥ瓨杩囩▼鍙互杈撳叆杈撳嚭鍙傛暟锛岃屽嚱鏁板彧鍙互杈撳叆鍙傛暟銆 + +4.杩囩▼鍏佽鍦ㄥ叾涓夋嫨浠ュ強DML璇彞锛岃屽嚱鏁板彧鍙互鍦ㄥ叾涓璼elect璇彞銆 + +5.鍙互鍦ㄥ瓨鍌ㄨ繃绋嬩腑璋冪敤鍑芥暟锛屼笉鍙互鍦ㄥ嚱鏁颁腑璋冪敤瀛樺偍杩囩▼銆 + +6.鍑芥暟鍙互浣滀负鏉′欢鍦ㄨ鍙ヤ腑浣跨敤锛屼絾鏄瓨鍌ㄨ繃绋嬩笉鍙互銆 + +Gitee 鈥 鍩轰簬 Git 鐨勪唬鐮佹墭绠″拰鐮斿彂鍗忎綔骞冲彴 diff --git "a/\347\254\224\350\256\260/10.10\350\247\246\345\217\221\345\231\250.md" "b/\347\254\224\350\256\260/10.10\350\247\246\345\217\221\345\231\250.md" new file mode 100644 index 0000000..8ffa3c4 --- /dev/null +++ "b/\347\254\224\350\256\260/10.10\350\247\246\345\217\221\345\231\250.md" @@ -0,0 +1,112 @@ + + +## 瑙﹀彂鍣紙trigger锛 + +#### 浠涔堟槸瑙﹀彂鍣細 insert --銆 涓绯诲垪闅忕潃鎻掑叆鎿嶄綔鑷姩鎵ц鐨剆ql璇彞闆嗗悎 + + **瑙﹀彂鍣**锛 trigger 锛夋槸浣滀负**瀵规暟鎹簱淇敼鐨勮繛甯︽晥鏋**鑰**鐢辩郴缁熻嚜鍔ㄦ墽琛**鐨勪竴鏉¤鍙ャ傚畠鏄竴绉嶇壒娈婄殑**瀛樺偍杩囩▼**銆備篃鏄竴涓**浜嬪姟**锛堝彲浠ュ洖婊氾級銆備负浜嗗畾涔変竴涓猍瑙﹀彂鍣╙(https://so.csdn.net/so/search?q=瑙﹀彂鍣&spm=1001.2101.3001.7020)锛屾垜浠繀椤伙細 + +- 鎸囨槑**浠涔堟椂鍊欐墽琛岃Е鍙戝櫒**銆傝繖琚媶鍒嗕负**寮曡捣瑙﹀彂鍣ㄨ妫娴嬬殑涓涓猏*浜嬩欢\***鍜**瑙﹀彂鍣ㄧ户缁墽琛屾墍蹇呴』婊¤冻鐨勪竴涓潯浠**銆 +- 鎸囨槑**褰撹Е鍙戝櫒鎵ц鏃舵墍閲囧彇鐨勫姩浣**銆 + + + +#### 瑙﹀彂鍣ㄥ垎绫 + +鍒嗕负 DML瑙﹀彂鍣 + +#### DML瑙﹀彂鍣 锛 澧炲垹鏀 + +##### after瑙﹀彂鍣細 澧炲垹鏀 涔嬪悗鎵ц鐨 + +after瑙﹀彂鍣ㄤ富瑕佺敤浜庯細insert锛寀pdate锛宒elete + +##### instead of 瑙﹀彂鍣 锛 澧炲垹鏀 涔嬪墠妫鏌ョ殑 + + + +#### 鍒涘缓瑙﹀彂鍣ㄧ殑璇彞 + +```sql +CREATE TRIGGER <瑙﹀彂鍣ㄥ悕绉> + +ON table_name +FOR [DELETE, INSERT, UPDATE] + +AS + + T-SQL璇彞 + +GO +--WITH ENCRYPTION琛ㄧず鍔犲瘑瑙﹀彂鍣ㄥ畾涔夌殑SQL鏂囨湰 + +--DELETE, INSERT, UPDATE鎸囧畾瑙﹀彂鍣ㄧ殑绫诲瀷 +``` + + + + + +#### 娴嬭瘯鏁版嵁 + +```sql +--閮ㄩ棬 +create table Department +( + DepartmentId varchar(10) primary key , --涓婚敭锛岃嚜鍔ㄥ闀 + DepartmentName nvarchar(50), --閮ㄩ棬鍚嶇О +) +--浜哄憳淇℃伅 +create table People +( + PeopleId int primary key identity(1,1), --涓婚敭,鑷姩澧為暱 + DepartmentId varchar(10), --閮ㄩ棬缂栧彿,澶栭敭,涓庨儴闂ㄨ〃鍏宠仈 + PeopleName nvarchar(20), --浜哄憳濮撳悕 + PeopleSex nvarchar(2), --浜哄憳鎬у埆 + PeopleSalary money, --钖按 +) +insert into Department(DepartmentId,DepartmentName) +values('001','鎬荤粡鍔') +insert into Department(DepartmentId,DepartmentName) +values('002','甯傚満閮') +insert into Department(DepartmentId,DepartmentName) +values('003','浜轰簨閮') +insert into Department(DepartmentId,DepartmentName) +values('004','璐㈠姟閮') + +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('001','鍒樺','鐢',8000) +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('001','鍏崇窘','鐢',5000) +insert into People(DepartmentId,PeopleName,PeopleSex,PeopleSalary) +values('002','寮犻','鐢',3000) +``` + +1.鍒涘缓瑙﹀彂鍣紝寰閮ㄩ棬琛ㄦ彃鍏ヤ竴鏉℃暟鎹('005','杞欢閮')锛岃緭鍑烘柊鎻掑叆閮ㄩ棬鐨刬d鍜岄儴闂ㄥ悕绉般 + +2.鍒涘缓瑙﹀彂鍣ㄥ疄鐜帮紝鍒犻櫎涓涓儴闂ㄦ椂锛堝競鍦洪儴锛夛紝灏嗚閮ㄩ棬涓嬬殑鍛樺伐涓璧峰垹闄ゃ(涓ゅ紶琛ㄦ棤澶栭敭鍏宠仈) + +3.鍒涘缓瑙﹀彂鍣ㄥ疄鐜帮紝褰撲慨鏀规煇鍛樺伐宸ヨ祫鍚庯紝杈撳嚭璇ラ泧鍛樼殑濮撳悕锛屾洿鏂板墠宸ヨ祫鍜屾洿鏂板悗宸ヨ祫 + +(娴嬭瘯鏁版嵁:灏001鐨勫伐璧勫姞2000) + +4.鍒涘缓瑙﹀彂鍣ㄥ疄鐜帮細褰撳悜鍛樺伐琛ㄤ腑鎻掑叆鏁版嵁鏃讹紝妫鏌ユ槸鍚︽湁璇ラ儴闂ㄥ瓨鍦紝濡傛灉鏈夊垯鎻掑叆锛屽鏋滄病鏈 + +鍒欐彁绀衡樿閮ㄩ棬涓嶅瓨鍦ㄢ + +娴嬭瘯鏁版嵁锛('004','澶т箶','濂',5000) ('009','瀛欑瓥','鐢',50000) + + + +## 鎬荤粨 + + 1.鎻掑叆鎿嶄綔锛圛nsert锛 +***\*inserted 琛╘****鏈夋暟鎹紝***\*deleted 琛╘****鏃犳暟鎹 + +2.鍒犻櫎鎿嶄綔锛圖elete锛 +***\*inserted 琛╘****鏃犳暟鎹紝***\*deleted 琛╘****鏈夋暟鎹 + +3.鏇存柊鎿嶄綔锛圲pdate锛 +***\*inserted 琛╘****鏈夋暟鎹紙鏂版暟鎹級锛***\*deleted 琛╘****鏈夋暟鎹紙鏃ф暟鎹級 + + diff --git "a/\347\254\224\350\256\260/9.15\345\273\272\350\241\250\347\272\246\346\235\237.md" "b/\347\254\224\350\256\260/9.15\345\273\272\350\241\250\347\272\246\346\235\237.md" new file mode 100644 index 0000000..3097558 --- /dev/null +++ "b/\347\254\224\350\256\260/9.15\345\273\272\350\241\250\347\272\246\346\235\237.md" @@ -0,0 +1,24 @@ +1.鍒涘缓鏁版嵁搴 +-- database 鏁版嵁搴 +-- 鏍煎紡 锛 +-- create database 琛ㄥ悕 +-- 浣跨敤褰撳墠鏁版嵁搴 锛 use 琛ㄥ悕 +2.鍒涘缓琛ㄦ牸 +-- 鏍煎紡锛 crate table 琛ㄥ悕锛 +-- 瀛楁鍚1 绫诲瀷 路路路路 +-- 锛 +3.浜斿ぇ绾︽潫 +澶栭敭 : foreign key锛堝彲鐪佺暐锛 references + +鍦ㄨ〃鏍间腑璁剧疆澶栭敭 + +-- 瀛楁鍚 绫诲瀷 foreign key references 涓婚敭琛ㄥ悕锛 寮曠敤瀛楁 锛 +-- 瀛楁鍚 绫诲瀷 references 涓婚敭琛ㄥ悕锛 寮曠敤瀛楁 锛 +涓婚敭锛歱rimary key + +鑷(鏍囪瘑鍒)锛 identity( 浠庣涓涓暟寮濮 , 鑷鏁 ) +榛樿锛 default + +鍞竴锛歶nique + +check妫鏌 \ No newline at end of file diff --git "a/\347\254\224\350\256\260/9.16\347\256\200\345\215\225\346\237\245\350\257\242.md" "b/\347\254\224\350\256\260/9.16\347\256\200\345\215\225\346\237\245\350\257\242.md" new file mode 100644 index 0000000..7353446 --- /dev/null +++ "b/\347\254\224\350\256\260/9.16\347\256\200\345\215\225\346\237\245\350\257\242.md" @@ -0,0 +1,104 @@ +鍩虹鏌ヨ + + +1. 鏌ヨ鎵鏈夎鎵鏈夊垪 +2. 鎸囧畾鍒楁煡璇紙濮撳悕锛屾у埆锛屾湀钖紝鐢佃瘽锛 +3. 鎸囧畾鍒楁煡璇,骞惰嚜瀹氫箟涓枃鍒楀悕锛堝鍚嶏紝鎬у埆锛屾湀钖紝鐢佃瘽锛 +4. 鏌ヨ鍏徃鍛樺伐鎵鍦ㄥ煄甯傦紙涓嶉渶瑕侀噸澶嶆暟鎹級 +5. 鍋囪宸ヨ祫鏅皟10%锛屾煡璇㈠師濮嬪伐璧勫拰璋冩暣鍚庣殑宸ヨ祫锛屾樉绀猴紙濮撳悕锛屾у埆锛屾湀钖紝鍔犺柂鍚庣殑鏈堣柂锛夛紙娣诲姞鍒楁煡璇級銆 + + +鏉′欢鏌ヨ 锛堣繍绠楃锛 +=锛氱瓑浜庯紝姣旇緝鏄惁鐩哥瓑鍙婅祴鍊 +!=锛氭瘮杈冧笉绛変簬 +>锛氭瘮杈冨ぇ浜 +<锛氭瘮杈冨皬浜 +>=锛氭瘮杈冨ぇ浜庣瓑浜 +<=锛氭瘮杈冨皬浜庣瓑浜 +IS NULL锛氭瘮杈冧负绌 +IS NOT NULL锛氭瘮杈冧笉涓虹┖ +in锛氭瘮杈冩槸鍚﹀湪鍏朵腑 +like锛氭ā绯婃煡璇 +BETWEEN...AND...锛氭瘮杈冩槸鍚﹀湪涓よ呬箣闂 50-100 BETWEEN 50 AND 100 +and锛氶昏緫涓庯紙涓や釜鏉′欢鍚屾椂鎴愮珛琛ㄨ揪寮忔垚绔嬶級 +or锛氶昏緫鎴栵紙涓や釜鏉′欢鏈変竴涓垚绔嬭〃杈惧紡鎴愮珛锛 +not锛氶昏緫闈烇紙鏉′欢鎴愮珛锛岃〃杈惧紡鍒欎笉鎴愮珛锛涙潯浠朵笉鎴愮珛锛岃〃杈惧紡鍒欐垚绔嬶級 +``` + + +鑱氬悎鍑芥暟 +count:姹傛暟閲 +max:姹傛渶澶у +min:姹傛渶灏忓 +sum:姹傚拰 +avg:姹傚钩鍧囧 +``` + +ROUND鍑芥暟鐢ㄦ硶锛 + +```sql +round(num,len,[type]) +鍏朵腑: +num琛ㄧず闇瑕佸鐞嗙殑鏁板瓧锛宭en琛ㄧず闇瑕佷繚鐣欑殑闀垮害锛宼ype澶勭悊绫诲瀷(0鏄粯璁ゅ间唬琛ㄥ洓鑸嶄簲鍏ワ紝闈0浠h〃鐩存帴鎴彇) +select ROUND(123.45454,3) --123.45500 +select ROUND(123.45454,3,1) --123.45400 + +CONVERT()涓嶤AST()鍑芥暟: + +```sql +--1.淇濈暀灏忔暟 +convert(decimal(13,2),12.45454) +cast(12.45454 as decimal(13,2)) +--2.寮哄埗杞崲绫诲瀷 + + +#### SQL涓父鐢ㄧ殑鏃堕棿鍑芥暟 + +```sql +select DATEDIFF(day, '2019-08-20', getDate()); --鑾峰彇鎸囧畾鏃堕棿鍗曚綅鐨勫樊鍊 +SELECT DATEADD(MINUTE,-5,GETDATE()) --鍔犲噺鏃堕棿,姝ゅ涓鸿幏鍙栦簲鍒嗛挓鍓嶇殑鏃堕棿,MINUTE 琛ㄧず鍒嗛挓锛屽彲涓 YEAR,MONTH,DAY,HOUR +select DATENAME(month, getDate()); --褰撳墠鏈堜唤 +select DATENAME(WEEKDAY, getDate()); --褰撳墠鏄熸湡鍑 +select DATEPART(month, getDate()); --褰撳墠鏈堜唤 +select DAY(getDate()); --杩斿洖褰撳墠鏃ユ湡澶╂暟 +select MONTH(getDate()); --杩斿洖褰撳墠鏃ユ湡鏈堟暟 +select YEAR(getDate()); --杩斿洖褰撳墠鏃ユ湡骞存暟 + +SELECT CONVERT(VARCHAR(22),GETDATE(),20) --2020-01-09 14:46:46 +SELECT CONVERT(VARCHAR(24),GETDATE(),21) --2020-01-09 14:46:55.91 +SELECT CONVERT(VARCHAR(22),GETDATE(),23) --2020-01-09 +SELECT CONVERT(VARCHAR(22),GETDATE(),24) --15:04:07 +Select CONVERT(varchar(20),GETDATE(),14) --15:05:49:330 + + + +| 鍚嶇О | 鏃ユ湡鍗曚綅 | 缂╁啓 | +| ------------ | ----------- | --------- | +| 骞 | year | yyyy 鎴杫y | +| 瀛e害 | quarter | qq,q | +| 鏈 | month | mm,m | +| 涓骞翠腑绗嚑澶 | dayofyear | dy,y | +| 鏃 | day | dd,d | +| 涓骞翠腑绗嚑鍛 | week | wk,ww | +| 鏄熸湡 | weekday | dw | +| 灏忔椂 | Hour | hh | +| 鍒嗛挓 | minute | mi,n | +| 绉 | second | ss,s | +| 姣 | millisecond | ms | + + +#### 鍒嗙粍鏌ヨ group by + +**鍏朵粬閾炬帴锛氬乏澶栬繛鎺ワ紝鍙冲閾炬帴锛岃嚜杩炴帴绛** + +(7) SELECT +(8) DISTINCT +(1) FROM +(3) JOIN +(2) ON +(4) WHERE +(5) GROUP BY +(6) HAVING +(9) ORDER BY +(10) LIMIT +``` \ No newline at end of file diff --git "a/\347\254\224\350\256\260/9.19\345\255\220\346\237\245\350\257\242\347\250\215\345\276\256\346\267\261\345\205\245\344\270\200\347\202\271\347\202\271.md" "b/\347\254\224\350\256\260/9.19\345\255\220\346\237\245\350\257\242\347\250\215\345\276\256\346\267\261\345\205\245\344\270\200\347\202\271\347\202\271.md" new file mode 100644 index 0000000..91e1ced --- /dev/null +++ "b/\347\254\224\350\256\260/9.19\345\255\220\346\237\245\350\257\242\347\250\215\345\276\256\346\267\261\345\205\245\344\270\200\347\202\271\347\202\271.md" @@ -0,0 +1,78 @@ +瀛愭煡璇 + +瀛愭煡璇㈢殑鐗圭偣 +1.浣跨敤鐏垫椿 + 1.1鍙互鎴愪负sql璇彞鐨勫涓儴鍒 + 1.2瀛愭煡璇綔涓烘煡璇㈡潯浠朵娇鐢 + 1.3瀛愭煡璇綔涓轰复鏃惰〃浣跨敤 + 1.4瀛愭煡璇綔涓轰复鏃跺垪浣跨敤 + 1.4.1闄嶄綆sql璇彞鐨勫鏉傚害锛屾彁楂榮ql璇彞鍙鎬 +##### 鎸夌粨鏋滃垎绫 + +###### 鏍囬噺瀛愭煡璇 锛 + +**閫氬父鍙互浣跨敤杩炴帴鏌ヨ鏇夸唬** + +鏍囬噺瀛愭煡璇㈡槸鎸囧瓙鏌ヨ杩斿洖鐨勬槸**鍗曚竴鍊**锛屽涓涓暟瀛楁垨涓涓瓧绗︿覆銆 + +###### 鍒楀瓙鏌ヨ + +**鍒楀瓙鏌ヨ鏄寚瀛愭煡璇㈣繑鍥炵殑缁撴灉闆嗘槸N琛1鍒**锛岃缁撴灉閫氬父鏉ヨ嚜瀵硅〃鏌愪釜瀛楁鐨勬煡璇㈢粨鏋滐紝甯n鍏抽敭瀛楃殑瀛愭煡璇㈡槸鏈甯哥敤鐨勪竴绫诲瓙鏌ヨ锛屽湪浣跨敤in鍏抽敭瀛楄繘琛屾煡璇㈡椂锛屽瓙鏌ヨ璇彞杩斿洖鐨勭粨鏋滃簲璇ユ槸涓涓暟鎹垪涓殑澶氫釜鍊硷紝濡傛灉浠呰繑鍥1涓暟鍊硷紝鍒欏彲鐢ㄦ爣閲忓瓙鏌ヨ浠f浛銆 + + +###### 琛屽瓙鏌ヨ + +琛屽瓙鏌ヨ鏄寚瀛愭煡璇㈣繑鍥炵殑缁撴灉闆嗘槸1琛孨鍒楋紝璇ュ瓙鏌ヨ鐨勭粨鏋滈氬父鏄琛ㄧ殑鏌愯鏁版嵁杩涜鏌ヨ鑰岃繑鍥炵殑缁撴灉闆嗐 + +###### 琛ㄥ瓙鏌ヨ(from瀛愭煡璇) + +琛ㄥ瓙鏌ヨ鏄寚瀛愭煡璇㈣繑鍥炴槸M琛孨鍒楃殑缁撴灉闆嗭紝鏌ヨ璇彞鍙祵濂楀湪FROM鍏 +閿瓧鍚庯紝涓旈渶瑕佸畾涔夊埆鍚嶃 + +##### 鎸変綅缃垎绫 + +###### exists瀛愭煡璇 + +鍏抽敭瀛桬XISTS鏋勯犲瓙鏌ヨ鏃讹紝褰撳瓙鏌ヨ鐨勭粨鏋滈泦涓嶄负绌烘椂锛屽垯EXISTS杩斿洖鐨勭粨鏋滀负TRUE锛屽灞傛煡璇㈣鍙ヨ繘琛屾煡璇紱褰撳瓙鏌ヨ鐨勭粨鏋滈泦涓虹┖鏃讹紝鍒橢XISTS杩斿洖鐨勭粨鏋滀负FALSE锛屽灞傛煡璇㈣鍙ヤ笉杩涜鏌ヨ銆 + +## 鎺掑簭鍑芥暟 + +**鎺掑簭鍑芥暟 OVER( [鍒嗙粍瀛愬彞] 鎺掑簭瀛愬彞[DESC][ASC] )** + +**鎺掑簭瀛愬彞 锛歄RDER BY 鎺掑簭鍒,鎺掑簭鍒椻** + +- ROW_NUMBER()鍑芥暟鐢熸垚鐨勬帓搴忔牴鎹帓搴忓瓙鍙ョ粰鍑**閫掑杩炵画鐨勫簭鍙**锛堢敤鏉ユ帓搴忕殑锛 +- RANK()鍑芥暟鐢熸垚鐨勬帓搴忔牴鎹帓搴忓瓙鍙ョ粰鍑**閫掑鐨勫簭鍙凤紝浣嗘槸瀛樺湪骞跺垪骞朵笖璺崇┖**锛堢敤鏉ユ帓搴忕殑锛 +- DENSE_RANK() 鍑芥暟鐢熸垚鐨勬帓搴忔牴鎹帓搴忓瓙鍙ョ粰鍑**閫掑鐨勫簭鍙凤紝浣嗘槸瀛樺湪骞跺垪涓嶈烦绌**锛堢敤鏉ユ帓搴忕殑锛 +鐩稿叧渚嬪瓙 +select StuName 濮撳悕,ROW_NUMBER() over(order by score desc) 鎺掑悕,score 鍒嗘暟 from StuScore +join stuinfo on StuInfo.StuID = StuScore.StuID +where subject = 'Java' + + +## 鍒嗛〉鏌ヨ + +#### 鍒嗛〉鏂规涓 + +**浣跨敤top鍒嗛〉** + +```sql +declare @PageSize int = 5 -- 姣忛〉5鏉 +declare @PageIndex int = 2 --绗2椤 +select top(@PageSize) * from Student +where Stuid not in (select top(@PageSize)*(@PageIndex-1)) StuId from Student +``` + + + +#### 鍒嗛〉鏂规浜 + +**浣跨敤row_number鍒嗛〉** + +```sql +declare @PageSize int = 5 +declare @PageIndex int = 3 +select * from +(select ROW_NUMBER() over(order by StuId) RowId,*from Student) as Temp +where RowId between (@PageIndex-1)*@PageSize+1 and @PageIndex*PageSize +``` diff --git "a/\347\254\224\350\256\260/9.21\345\255\220\345\205\263\350\201\224\346\237\245\350\257\242.md" "b/\347\254\224\350\256\260/9.21\345\255\220\345\205\263\350\201\224\346\237\245\350\257\242.md" new file mode 100644 index 0000000..b8542a2 --- /dev/null +++ "b/\347\254\224\350\256\260/9.21\345\255\220\345\205\263\350\201\224\346\237\245\350\257\242.md" @@ -0,0 +1,7 @@ +鍏宠仈瀛愭煡璇 +瑕佺偣 +浣跨敤SQL瀵瑰悓涓琛屾暟鎹繘琛屽垪闂存瘮杈冨緢绠鍗曪紝浣嗗涓嶅悓琛屾暟鎹繘琛岀殑姣旇緝鍗存病閭d箞绠鍗曘備娇鐢⊿QL杩涜琛岄棿姣旇緝鏃讹紝鍙娇鐢ㄧ殑涓绉嶄富瑕佹柟娉曟槸鍏宠仈瀛愭煡璇紝鐗瑰埆鏄笌鑷繛鎺ョ浉缁撳悎鐨勨滆嚜鍏宠仈瀛愭煡璇⑩濄 + +鍏充簬琛屼笌琛屼箣闂寸殑姣旇緝锛岃繕鏈変娇鐢ㄧ獥鍙e嚱鏁扮殑鏂规硶锛屽叾瀹炵幇鎯呭喌浼氬洜鍏蜂綋鐨勬暟鎹簱绯荤粺鑰屼笉鍚屻 +###鍏宠仈瀛愭煡璇㈠ぇ浣撲笂鍒嗕负鍑犵 1.宸﹀叧鑱旓紝鍙冲叧鑱旓紝鑷叧鑱 +鏈変竴浜涙柟娉曞彲浠ュ皢澶栭儴鏌ヨ鐨勫煎悎骞跺埌瀛愭煡璇㈢殑瀛愬彞涓傝繖浜涚被鍨嬬殑鏌ヨ绉颁负鍏宠仈瀛愭煡璇紝鍥犱负瀛愭煡璇㈢殑缁撴灉浠ユ煇绉嶅舰寮忚繛鎺ュ埌澶栭儴鏌ヨ涓殑鍊笺傚畠浠湁鏃剁О涓哄悓姝ユ煡璇 \ No newline at end of file diff --git "a/\347\254\224\350\256\260/9.22\345\217\230\351\207\217\345\222\214\351\200\273\350\276\221\346\216\247\345\210\266.md" "b/\347\254\224\350\256\260/9.22\345\217\230\351\207\217\345\222\214\351\200\273\350\276\221\346\216\247\345\210\266.md" new file mode 100644 index 0000000..5f6b3c3 --- /dev/null +++ "b/\347\254\224\350\256\260/9.22\345\217\230\351\207\217\345\222\214\351\200\273\350\276\221\346\216\247\345\210\266.md" @@ -0,0 +1,72 @@ +### 鍙橀噺 + +#### 灞閮ㄥ彉閲 + +灞閮ㄥ彉閲忓繀椤讳互鏍囪@浣滀负鍓嶇紑 锛屽@age +灞閮ㄥ彉閲忕殑浣跨敤鏄厛澹版槑锛屽啀璧嬪 +灞閮ㄥ彉閲忓彧鍦ㄥ畾涔夊畠鐨勫眬閮ㄨ寖鍥村唴鏈夋晥 + +澹版槑涓涓眬閮ㄥ彉閲忥細**declare @鍙橀噺鍚 鏁版嵁绫诲瀷** + +```sql +--渚嬶細 + declare @id int --澹版槑涓涓悕涓篿d鐨勬暣鍨嬪彉閲 + declare @name varchar(50) --澹版槑涓涓彲鍙橀暱搴︿负50鐨勫瓨鏀惧鍚嶇殑瀛楃涓插彉閲 + +璧嬪煎垎涓ょ锛 + +- set @鍙橀噺鍚 = 鍊 + +- select @鍙橀噺鍚 = 鍊 + +```sql +--渚: + select @id = 1001 + set @name = '鍛ㄦ槦鏄 +```set涓巗elect璧嬪肩殑鍖哄埆锛 + +set璧嬪肩粰鍙橀噺鎸囧畾鐨勫硷紝select涓鑸敤浜庤〃涓煡璇㈠嚭鐨勬暟鎹祴鍊肩粰鍙橀噺锛屽鏋滄煡璇㈢粨鏋滄湁澶氭潯锛屽彇鏈鍚庝竴鏉¤祴鍊肩粰鍙橀噺 + +鍏ㄥ眬鍙橀噺 + +鍏ㄥ眬鍙橀噺蹇呴』浠ユ爣璁癅@浣滀负鍓嶇紑锛屽@@version +鍏ㄥ眬鍙橀噺鐢**绯荤粺瀹氫箟鍜岀淮鎶**锛屾垜浠**鍙兘璇诲彇锛屼笉鑳戒慨鏀瑰叏灞鍙橀噺鐨勫** +鍏ㄥ眬鍙橀噺鍦ㄦ暣涓猄QL鐜涓嬮兘鍙互琚闂垨璋冪敤 + +#### 浣跨敤convert鍑芥暟 + +鈥 鐢变簬PRINT 鍛戒护鍚戝鎴风杩斿洖涓涓粨鏋滅殑瀛楃涓茬殑淇℃伅銆傚鏋滃彉閲忓间笉鏄瓧绗︿覆鐨勮瘽蹇呴』鍏堢敤鏁版嵁绫诲瀷杞崲鍑芥暟 CONVERT 灏嗗叾杞崲涓哄瓧绗︿覆銆 + +```sql +--鏄剧ず鑷姩缂栧彿 +print '褰撳墠鑷姩缂栧彿鐨勫:' + convert(varchar(10),@@IDENTITY) +``` + +**cast(瀛楁鍚 as 鏁版嵁绫诲瀷)** + +## 閫昏緫鎺у埗璇彞 + +#### if鏉′欢鍒嗘敮 + + +#### 寰幆鎺у埗璇彞 + +##### while锛氬彲浠ラ氳繃break鍜宑ontinue鎺у埗寰幆璇彞涓殑鎵ц銆 + +#### 閫昏緫鎺у埗璇彞 switch case + +##### case 澶氬垎鏀鍙 +## 鎵瑰鐞嗚鍙 + +go璇彞鐗圭偣: + +1. 绛夊緟go璇彞鍓嶇殑浠g爜鎵ц瀹屾垚鍚庯紝鍐嶆墽琛実o鍚庨潰鐨勪唬鐮併 +2. 鎵瑰鐞嗚鍙ョ殑缁撴潫鏍囧織銆 + +## 鎬荤粨 + +鍙橀噺鐨勪娇鐢ㄣ傝鍏堢敤DECLARE 鍏抽敭瀛楀0鏄庯紝鐒跺悗鐢⊿ET鎴朣ELECT璧嬪笺傚眬閮ㄥ彉閲忓墠蹇呴』鏈 鈥淍鈥 浣滃墠缂锛屽叏灞鍙橀噺蹇呴』鏈 鈥淍@鈥 浣滃墠缂銆 +鍙橀噺鐨勮緭鍑哄彲浠ョ敤锛歅RINT鎴朣ELECT璇彞銆 +閫昏緫鎺у埗璇彞鎻愪緵浜嗘潯浠舵搷浣滄墍闇鐨勯『搴忓拰閫昏緫銆 +浜嗚ВT-SQL缂栧啓宸ュ叿銆 +鎵瑰鐞嗗彲浠ユ彁楂樿鍙ユ墽琛岀殑鏁堢巼锛屼娇鐢ㄢ淕O鈥濅綔涓虹粨鏉熸爣蹇椼 diff --git "a/\347\254\224\350\256\260/9.23\345\217\230\351\207\217.md" "b/\347\254\224\350\256\260/9.23\345\217\230\351\207\217.md" new file mode 100644 index 0000000..e9e73de --- /dev/null +++ "b/\347\254\224\350\256\260/9.23\345\217\230\351\207\217.md" @@ -0,0 +1,55 @@ +SQL Server涓殑鍙橀噺灏辨槸涓涓弬鏁帮紝鍙互瀵硅繖涓弬鏁拌繘琛岃祴鍊笺 + +鍙橀噺鐨勫垎绫 + +鍙橀噺鍒嗕负灞閮ㄥ彉閲忓拰鍏ㄥ眬鍙橀噺锛屽眬閮ㄥ彉閲忕敤@鏉ユ爣璇嗭紝鍏ㄥ眬鍙橀噺鐢ˊ@鏉ユ爣璇嗭紙甯哥敤鐨勫叏灞鍙橀噺涓鑸兘鏄凡缁忓畾涔夊ソ鐨勶級 + +澹版槑鍙橀噺 + +鍙橀噺鍦ㄤ娇鐢ㄥ墠蹇呴』鍏堝0鏄庢墠鑳藉浣跨敤銆 + +鐢虫槑灞閮ㄥ彉閲忚娉 + +澹版槑鍙橀噺鐨勫叧閿瓧declare +瀹屾暣璇硶 +DECLARE @鍙橀噺鍚 鏁版嵁绫诲瀷锛 + +灞閮ㄥ彉閲忚祴鍊 + +澹版槑瀹屼簡鍙橀噺灏卞彲浠ョ粰鍙橀噺璧嬪间簡锛屽彉閲忚祴鍊兼湁涓ょ鏂瑰紡SET 鎴 SELECT + +璇硶 + +SET 鍙橀噺鍚=鍊 + +SELECT 鍙橀噺鍚1=鍊1,鍙橀噺鍚2=鍊2 + +浠庝笂闈㈢殑璇硶澶у鍙兘宸茬粡鐪嬪嚭涓ょ璧嬪兼柟寮忕殑鍖哄埆浜嗭紝SET鍙兘缁欎竴涓彉閲忚祴鍊硷紝SELECT 鍙互缁欏涓彉閲忚祴鍊笺 + +渚嬪 + +SET @A=3 +SELECT @A=瀛楁鍚1锛孈B=瀛楁鍚2 FROM TABLE + +鍏ㄥ眬鍙橀噺 + +鍏ㄥ眬鍙橀噺浣跨敤@@鏉ヨ〃绀猴紝涓鑸兘鏄郴缁熼瀹氫箟鐨勪竴浜涘叏灞鍙橀噺銆傚父鐢ㄧ殑鍏ㄥ眬鍙橀噺鏈 + +@@ERROR 鈥斺旀渶鍚庝竴涓猄QL閿欒鐨勯敊璇彿 + +@@IDENTITY 鈥斺撴渶鍚庝竴娆℃彃鍏ョ殑鏍囪瘑鍊 + +@@LANGUAGE 鈥斺撳綋鍓嶄娇鐢ㄧ殑璇█鐨勫悕绉 + +@@MAX_CONNECTIONS 鈥 鍙互鍒涘缓鐨勫悓鏃惰繛鎺ョ殑鏈澶ф暟鐩 + +@@ROWCOUNT 鈥-鍙椾笂涓涓猄QL璇彞褰卞搷鐨勮鏁 + +@@SERVERNAME 鈥-鏈湴鏈嶅姟鍣ㄧ殑鍚嶇О + +@@TRANSCOUNT 鈥斺撳綋鍓嶈繛鎺ユ墦寮鐨勪簨鐗╂暟 + +@@VERSION 鈥斺揝QL Server鐨勭増鏈俊鎭 +鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺 +鐗堟潈澹版槑锛氭湰鏂囦负CSDN鍗氫富銆孲QL鏁版嵁搴撳紑鍙戙嶇殑鍘熷垱鏂囩珷锛岄伒寰狢C 4.0 BY-SA鐗堟潈鍗忚锛岃浆杞借闄勪笂鍘熸枃鍑哄閾炬帴鍙婃湰澹版槑銆 +鍘熸枃閾炬帴锛歨ttps://blog.csdn.net/liyue071714118/article/details/119833994 \ No newline at end of file diff --git "a/\347\254\224\350\256\260/9.26\350\247\206\345\233\276\345\217\212\347\264\242\345\274\225.md" "b/\347\254\224\350\256\260/9.26\350\247\206\345\233\276\345\217\212\347\264\242\345\274\225.md" new file mode 100644 index 0000000..91d7c73 --- /dev/null +++ "b/\347\254\224\350\256\260/9.26\350\247\206\345\233\276\345\217\212\347\264\242\345\274\225.md" @@ -0,0 +1,101 @@ +**寤虹珛绱㈠紩鐨勪綔鐢ㄥ涓**: + +- 鎻愰珮鏌ヨ閫熷害 + +- 淇濊瘉鏁版嵁璁板綍鐨勫敮涓鎬 + +- 鏌ヨ浼樺寲闈犵储寮曡捣浣滅敤 + +- 鎻愰珮order by, group by 鎵ц閫熷害 + +#### 绱㈠紩鍒嗙被 + +**绱㈠紩涓昏鍒嗕负涓ょ被**锛 + +- **鑱氶泦绱㈠紩(clustered)**:鏍规嵁鏁版嵁琛岀殑閿煎湪琛ㄦ垨瑙嗗浘涓殑鎺掑簭瀛樺偍杩欎簺鏁版嵁琛岋紝姣忎釜琛ㄥ彧鏈変竴涓仛闆嗙储寮曘 +-鑱氶泦绱㈠紩鏄竴绉嶅纾佺洏涓婂疄闄呮暟鎹噸鏂扮粍缁囦互鎸夋寚瀹氱殑涓鍒楁垨澶氬垪鍊兼帓搴(绫讳技瀛楀吀涓殑鎷奸煶绱㈠紩)(鐗╃悊瀛樺偍椤哄簭)銆 + + +- **闈炶仛闆嗙储寮 (nonclusterted)**:鍏锋湁鐙珛浜庢暟鎹鐨勭粨鏋勶紝鍖呭惈闈炶仛闆嗙储寮曢敭鍊硷紝涓旀瘡涓敭鍊奸」閮芥湁鎸囧悜鍖 +-鍚閿肩殑鏁版嵁琛岀殑鎸囬拡銆傦紙绫讳技瀛楀吀涓殑鍋忔梺閮ㄩ绱㈠紩锛夛紙閫昏緫瀛樺偍椤哄簭锛夈 + +**鍏跺畠绫诲瀷鐨勭储寮**: + +- 鎸夌収鏁版嵁鍞竴鎬у垎绫:鍞竴绱㈠紩銆侀潪鍞竴绱㈠紩 +- 鎸夐敭鍒椾釜鏁板尯鍒嗭細鍗曞垪绱㈠紩锛屽鍒楃储寮 + +- 鍏朵粬鍒嗙被:绱㈠紩瑙嗗浘銆佸寘鍚у垪绱㈠紩銆佸叏鏂囩储寮曘乆ML绱㈠紩绛 + + +- 绱㈠紩鐨勫垱寤 + +```sql +--01鍒涘缓绱㈠紩鍩烘湰璇硶 +CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] +INDEX ON ( [ASC|DESC][,...n]) + +- 绱㈠紩淇℃伅瀛樺偍鍦ㄧ郴缁熻鍥緎ys.indexes涓 +- 鍙互浣跨敤绯荤粺瀛樺偍杩囩▼:exec sp_helpindex鏌ョ湅褰撳墠琛ㄧ殑绱㈠紩 +- 濉厖鍥犲瓙:涓椤甸渶瑕佸~鍏呭灏戞暟鎹 + +- 浣跨敤鑱氶泦绱㈠紩鐨勬煡璇㈡晥鐜囪姣旈潪鑱氶泦绱㈠紩鐨勬晥鐜囪楂橈紝浣嗘槸濡傛灉闇瑕侀绻佸幓鏀瑰彉鑱氶泦绱㈠紩鐨勫硷紝鍐欏叆鎬ц兘骞朵笉楂橈紝鍥犱负闇瑕佺Щ鍔ㄥ搴旀暟鎹殑鐗╃悊浣嶇疆銆 +- 闈炶仛闆嗙储寮曞湪鏌ヨ鐨勬椂鍊欏彲浠ョ殑璇濆氨閬垮厤浜屾鏌ヨ锛岃繖鏍锋ц兘浼氬ぇ骞呮彁鍗囥 +- 涓嶆槸鎵鏈夌殑琛ㄩ兘閫傚悎寤虹珛绱㈠紩锛屽彧鏈夋暟鎹噺澶ц〃鎵嶉傚悎寤虹珛绱㈠紩锛屼笖寤虹珛鍦ㄩ夋嫨鎬ч珮鐨勫垪涓婇潰鎬ц兘浼氭洿濂 +- 鍦╳here鍚庝娇鐢╫r锛屽鑷寸储寮曞け鏁堬紙灏介噺灏戠敤or锛 +- 浣跨敤like 锛宭ike鏌ヨ鏄互%寮澶达紝浠%缁撳熬涓嶄細澶辨晥 +- 涓嶇鍚堟渶宸﹀師鍒欙紙澶氬垪绱㈠紩锛 +- 濡傛灉鍒楃被鍨嬫槸瀛楃涓诧紝閭d竴瀹氳鍦ㄦ潯浠朵腑灏嗘暟鎹娇鐢ㄥ紩鍙峰紩鐢ㄨ捣鏉,鍚﹀垯涓嶄娇鐢ㄧ储寮 +- 浣跨敤in瀵艰嚧绱㈠紩澶辨晥 + +涓夌绫诲瀷鍏崇郴锛 + +- 琛(Table)--鍩鸿〃锛屽瓨鍌ㄥ叧绯(Base Tables,Sorted relations) +- 瑙嗗浘(Views)--铏氭嫙鍏崇郴(Virtual relations)锛堜笉鏄墿鐞嗗瓨鍦ㄧ殑鏄櫄鎷熺殑锛 +- 涓存椂缁撴灉(Temporary results)--鐢ㄤ簬鏋勫缓**瀛愭煡璇**鐨勭粨鏋 + +#### 浠涔堟槸瑙嗗浘 + +- 瑙嗗浘鏄竴寮犺櫄鎷熻〃锛屽畠琛ㄧず涓寮犺〃鐨勯儴鍒嗘暟鎹垨澶氬紶琛ㄧ殑缁煎悎鏁版嵁锛屽叾缁撴瀯鍜屾暟鎹槸寤虹珛鍦ㄥ琛ㄧ殑鏌ヨ鍩虹涓 +- 瑙嗗浘涓苟涓嶅瓨鏀炬暟鎹紝鑰屾槸瀛樻斁鍦ㄨ鍥炬墍寮曠敤鐨勫師濮嬭〃锛堝熀琛級涓紝鍗冲熀鏈腑鐨勬暟鎹彂鐢熷彉鍖栵紝浠庤鍥句腑鏌ヨ鐨勬暟鎹篃闅忎箣鏀瑰彉銆 +- 鍚屼竴寮犲師濮嬭〃锛屾牴鎹笉鍚岀敤鎴风殑涓嶅悓闇姹傦紝鍙互鍒涘缓涓嶅悓鐨勮鍥 + +**瑙嗗浘鐨勪綔鐢** + +- 瑙嗗浘鑳藉绠鍖栫敤鎴风殑鎿嶄綔 +- 瑙嗗浘浣跨敤鎴疯兘浠ュ绉嶈搴︾湅寰呭悓涓鏁版嵁 +- 瑙嗗浘瀵归噸鏋勬暟鎹簱鎻愪緵浜嗕竴瀹氱殑閫昏緫鐙珛鎬 +- 瑙嗗浘鑳藉瀵规満瀵嗘暟鎹彁渚涘畨鍏ㄤ繚鎶 + +```sql +--寤虹珛瑙嗗浘 +create view <瑙嗗浘鍚> [(<鍒楀悕>[,<鍒楀悕>]...)] + as <瀛愭煡璇> [with check option] + +##### 鏌ヨ瑙嗗浘 + +##### 鏇存柊瑙嗗浘:涓嶆帹鑽愮洿鎺ュ湪瑙嗗浘杩涜鏇存柊鎿嶄綔,澧烇紝鍒 鎿嶄綔 + +瑙嗗浘涓鑸彧鐢ㄦ潵鏌ヨ锛屽鏋滄槸鍗曡〃鐨勮瘽锛屼篃鍙互杩涜澧炲垹鏀广備絾鏄湁濡備笅闄愬埗銆 + 1.鑱氬悎鍑芥暟锛圫UM(), MIN(), MAX(), COUNT()绛夛級銆 + +2. DISTINCT + +3. GROUP BY +4. 4 HAVING +5. UNION鎴朥NION ALL 锛堣繛琛級 +6. 浣嶄簬閫夋嫨鍒楄〃涓殑瀛愭煡璇 +7.Join +8.FROM瀛愬彞涓殑涓嶅彲鏇存柊瑙嗗浘 +9. WHERE瀛愬彞涓殑瀛愭煡璇紝寮曠敤FROM瀛愬彞涓殑琛ㄣ +10. 浠呭紩鐢ㄦ枃瀛楀硷紙鍦ㄨ鎯呭喌涓嬶紝娌℃湁瑕佹洿鏂扮殑鍩烘湰琛級銆 +9. ALGORITHM = TEMPTABLE锛堜娇鐢ㄤ复鏃惰〃鎬讳細浣胯鍥炬垚涓轰笉鍙洿鏂扮殑锛夈 + +##### 鍒犻櫎瑙嗗浘 + +```sql +drop view <瑙嗗浘鍚> + +#### 瑙嗗浘鐨勮璁″師鍒 + +- 浠 select * 鏂瑰紡鍒涘缓鐨勮鍥撅細鍙墿鍏呮у樊锛屽簲灏藉彲鑳介伩鍏 + diff --git "a/\347\254\224\350\256\260/9.28\345\256\236\347\211\251\345\217\212\346\270\270\346\240\207.md" "b/\347\254\224\350\256\260/9.28\345\256\236\347\211\251\345\217\212\346\270\270\346\240\207.md" new file mode 100644 index 0000000..202d7c4 --- /dev/null +++ "b/\347\254\224\350\256\260/9.28\345\256\236\347\211\251\345\217\212\346\270\270\346\240\207.md" @@ -0,0 +1,125 @@ +## 浜嬪姟 + + + +#### 浠涔堟槸浜嬪姟 + +**浜嬪姟锛 Transaction锛夌敱涓娆℃垨鑰呭娆″熀鏈搷浣滄瀯鎴愶紝鎴栬呰锛屼簨鍔$敱涓鏉℃垨鑰呭鏉 SQL 璇彞鏋勬垚銆** + +**浜嬪姟涓殑鎵鏈 SQL 璇彞鏄竴涓暣浣擄紝鍏卞悓杩涢锛屼笉鍙垎鍓诧紝瑕佷箞鍏ㄩ儴鎵ц鎴愬姛锛岃涔堝叏閮ㄦ墽琛屽け璐ャ** + + + +#### 浜嬪姟鐨勫睘鎬(ACID) + +涓鑸潵璇达紝浜嬪姟鍏锋湁鍥涗釜鏍囧噯灞炴э紝鍒嗗埆鏄師瀛愭э紙**A**tomicity锛屾垨绉颁笉鍙垎鍓叉э級銆佷竴鑷存э紙**C**onsistency锛夈侀殧绂绘э紙**I**solation锛屽張绉扮嫭绔嬫э級銆佹寔涔呮э紙**D**urability锛夛紝绠绉 **ACID**銆傚叿浣撹鏄庡涓嬶細 + +##### 1) 鍘熷瓙鎬 + +涓涓簨鍔′腑鐨勬墍鏈 SQL 璇彞锛岃涔堝叏閮ㄦ墽琛屾垚鍔燂紝瑕佷箞鍏ㄩ儴鎵ц澶辫触锛屼笉浼氱粨鏉熷湪涓棿鐨勬煇涓幆鑺傘備簨鍔″湪鎵ц杩囩▼涓彂鐢熼敊璇紝浼氳鍥炴粴锛圧ollback锛夊埌浜嬪姟寮濮嬪墠鐨勭姸鎬侊紝灏卞儚杩欎釜浜嬪姟浠庢潵娌℃湁鎵ц杩囦竴鏍枫 + +##### 2) 涓鑷存 + +鍦ㄤ簨鍔″紑濮嬩箣鍓嶅拰浜嬪姟缁撴潫浠ュ悗锛屾暟鎹簱鐨勫畬鏁存ф病鏈夎鐮村潖銆傝繖琛ㄧず鍐欏叆鐨勬暟鎹繀椤诲畬鍏ㄧ鍚堟墍鏈夌殑棰勮瑙勫垯锛屽叾涓寘鍚暟鎹殑绮剧‘搴︺佷覆鑱旀т互鍙婂悗缁暟鎹簱鍙互鑷彂鎬у湴瀹屾垚棰勫畾鐨勫伐浣溿 + +##### 3) 闅旂鎬 + +鏁版嵁搴撳厑璁稿涓苟鍙戜簨鍔″悓鏃跺鍏舵暟鎹繘琛岃鍐欏拰淇敼鐨勮兘鍔涳紝闅旂鎬у彲浠ラ槻姝㈠涓簨鍔″苟鍙戞墽琛屾椂鐢变簬浜ゅ弶鎵ц鑰屽鑷存暟鎹殑涓嶄竴鑷淬備簨鍔¢殧绂诲垎涓轰笉鍚岀骇鍒紝鍖呮嫭璇绘湭鎻愪氦锛圧ead uncommitted锛夈佽鎻愪氦锛坮ead committed锛夈佸彲閲嶅璇伙紙repeatable read锛夊拰涓茶鍖栵紙Serializable锛夈 姝婚攣 鎿嶄綔绯荤粺 + +##### 4) 鎸佷箙鎬 + +浜嬪姟澶勭悊缁撴潫鍚庯紝瀵规暟鎹殑淇敼灏辨槸姘镐箙鐨勶紝鍗充究绯荤粺鏁呴殰涔熶笉浼氫涪澶便 + +#### 浜嬪姟鍒嗙被 + +**鑷姩鎻愪氦浜嬬墿**锛 鏄疭QL Server榛樿鐨勪竴绉嶄簨鍔℃ā寮忥紝姣忔潯Sql璇彞閮借鐪嬫垚涓涓簨鍔¤繘琛屽鐞嗐 + +**鏄惧紡浜嬪姟**: T-sql鏍囨槑锛岀敱Begin Transaction寮鍚簨鍔″紑濮嬶紝鐢盋ommit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟缁撴潫銆 + +**闅愬紡浜嬪姟**锛氫娇鐢⊿et IMPLICIT_TRANSACTIONS ON 灏嗗皢闅愬紡浜嬪姟妯″紡鎵撳紑锛屼笉鐢˙egin Transaction寮鍚簨鍔★紝褰撲竴涓簨鍔$粨鏉燂紝杩欎釜妯″紡浼氳嚜鍔ㄥ惎鐢ㄤ笅涓涓簨鍔★紝鍙敤Commit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟鍗冲彲銆 + +TIPS: + +**浜嬬墿鍥炴粴**锛 + +xact_abort on/off : 涓簅n鏃跺鏋滃綋鍓峴ql鍑洪敊锛屽洖婊氭暣涓簨鍔★紝涓簅ff鏃跺鏋渟ql鍑洪敊鍥炴粴褰撳墠sql璇彞锛屽叾瀹冭鍙ョ収甯歌繍琛岃鍐欐暟鎹簱銆 + +## 娓告爣 + +#### 浠涔堟槸娓告爣 + +娓告爣(Cursor)瀹冧娇鐢ㄦ埛鍙愯璁块棶鐢盨QL Server杩斿洖鐨勭粨鏋滈泦銆備娇鐢ㄦ父鏍(cursor)鐨勪竴涓富瑕佺殑鍘熷洜灏辨槸鎶婇泦鍚堟搷浣滆浆鎹㈡垚**鍗曚釜璁板綍澶勭悊鏂瑰紡**銆傜敤SQL璇█浠庢暟鎹簱涓绱㈡暟鎹悗锛岀粨鏋滄斁鍦ㄥ唴瀛樼殑涓鍧楀尯鍩熶腑锛屼笖缁撴灉寰寰鏄竴涓惈鏈夊涓褰曠殑闆嗗悎銆傛父鏍囨満鍒跺厑璁哥敤鎴峰湪SQL server鍐呴愯鍦拌闂繖浜涜褰曪紝鎸夌収鐢ㄦ埛鑷繁鐨勬剰鎰挎潵鏄剧ず鍜屽鐞嗚繖浜涜褰曘 + +娓告爣鍒嗙被: + +锛1锛夐潤鎬佹父鏍(Static)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁涓嶅彉 +锛2锛夊姩鎬佹父鏍(Dynamic)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁鏀瑰彉锛岄粯璁ゅ笺 +锛3锛夐敭闆嗛┍鍔ㄦ父鏍(KeySet)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝琚爣璇嗙殑鍒楀彂鐢熸敼鍙橈紝娓告爣涓暟鎹敼鍙橈紝鍏朵粬鍒楁敼鍙橈紝娓告爣涓暟鎹笉鍙樸 + + + +#### 娓告爣鐨勪娇鐢 + +**鍒涘缓娓告爣锛** + +```sql +--1.鍒涘缓娓告爣(Scroll浠h〃婊氬姩娓告爣锛屼笉鍔燬croll鍒欐槸鍙繘鐨勶紝鍙兘鏀寔fetch next) +declare <娓告爣鍚> cursor scroll for select stuname from stuinfo +``` + +**鎵撳紑娓告爣锛** + +```sql +open <娓告爣鍚> +``` + +**鍏抽棴娓告爣锛** + +``` +close <娓告爣鍚> +``` + +**鍒犻櫎娓告爣锛** + +``` +deallocate <娓告爣鍚> +``` + +**鎻愬彇鏁版嵁鎿嶄綔锛** + +```sql +fetch first from <娓告爣鍚> --缁撴灉闆嗙殑绗竴琛 +fetch last from <娓告爣鍚> --鏈鍚庝竴琛 +fetch absolute 1 from <娓告爣鍚> --浠庢父鏍囩殑绗竴琛屽紑濮嬫暟锛岀n琛屻 +fetch relative 3 from <娓告爣鍚> --浠庡綋鍓嶄綅缃暟锛岀n琛屻 +fetch next from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笅涓琛 +fetch prior from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笂涓琛 +``` + +渚嬪瓙锛 +**鎻愬彇鏁版嵁缁欏彉閲忎互渚涘畠鐢紙鍙栧嚭绗3琛屽鐢熷鍚嶏紝鏌ヨ璇ュ鐢熻缁嗕俊鎭級锛** + +```sql +declare @vari varchar(20) +fetch absolute 3 from <娓告爣鍚> into @vari +select * from StuInfo where stuName = @vari +``` + +**鍒╃敤娓告爣鎻愬彇鎵鏈夌殑瀛︾敓淇℃伅锛** + +```sql +--鏂规涓锛 +fetch absolute 1 from <娓告爣鍚> +while @@FETCH_STATUS = 0 --@@FETCH_STATUS=0,鎻愬彇鎴愬姛锛-1鎻愬彇澶辫触锛-2琛屼笉瀛樺湪 + begin + fetch next from <娓告爣鍚> + end + +--鏂规浜岋細 +declare @myvar varchar(20) +fetch first from <娓告爣鍚> into @myvar +while @@FETCH_STATUS = 0 + begin + print '鎻愬彇鎴愬姛'+@myvar + fetch next from <娓告爣鍚> into @myvar + end \ No newline at end of file diff --git "a/\347\254\224\350\256\260/9.29\350\241\214\350\275\254\345\210\227\345\217\212\345\210\227\350\275\254\350\241\214\345\222\214\345\256\236\347\211\251.md" "b/\347\254\224\350\256\260/9.29\350\241\214\350\275\254\345\210\227\345\217\212\345\210\227\350\275\254\350\241\214\345\222\214\345\256\236\347\211\251.md" new file mode 100644 index 0000000..64887c4 --- /dev/null +++ "b/\347\254\224\350\256\260/9.29\350\241\214\350\275\254\345\210\227\345\217\212\345\210\227\350\275\254\350\241\214\345\222\214\345\256\236\347\211\251.md" @@ -0,0 +1,73 @@ +鈥 + + + +鍒楄浆琛: union + + + +![img](https://img-blog.csdnimg.cn/a2273c0c1b97415ea7aa2f8e65563270.png) + +![img](https://img-blog.csdnimg.cn/e777ba0b843b445fb7058c59e45e9471.png) + + + + + +![](https://gitee.com/snailclass/tuchuang/raw/master/img/image-20220926133049154-2022-9-2613:31:10.png) + +琛岃浆鍒楋細pivot锛 Case when\ + +杩炵画鐧婚檰锛 鐣欏瓨鐜 + + + + + +![image-20220929083755124](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220929083755124.png) + + + +--琛岃浆鍒 +create table test1( + battleDate date, + isVic varchar(20) +) + +insert into test1 values('2022-09-27','鑳'),('2022-09-28','鑳'),('2022-09-27','鑳'),('2022-09-27','璐'),('2022-09-27','鑳'),('2022-09-28','鑳'),('2022-09-27','璐'); + + +浜嬪姟渚嬪瓙 +select * from BankCard +select * from CardTransfer +select * from AccountInfo +--鍒樺鍚戝紶椋炶浆璐1000鍏冿紝(娣诲姞check绾︽潫锛岃缃处鎴蜂綑棰濆繀椤>=0) +alter table bankcard add constraint ix_jj check (cardmoney>=0) +begin transaction +declare @acc_id int = (select AccountId from AccountInfo where RealName = '鍒樺') --鍒樺鐨刟ccountid 1 +declare @acc_id2 int =(select AccountId from AccountInfo where RealName = '寮犻') --寮犻 3 +declare @card_no varchar(50) = (select CardNo from BankCard where AccountId=@acc_id) --鍒樺鍗″彿 +declare @card_no2 varchar(50) = (select CardNo from BankCard where AccountId=@acc_id2) --寮犻鍗″彿 +declare @myerr int = 0 --涓寮濮嬪亣璁惧叏閮ㄦ墽琛屾垚鍔 + + +update BankCard set CardMoney-=1000 where AccountId=@acc_id --鍒樺 -1000 111 +set @myerr += @@error +update BankCard set CardMoney+=1000 where AccountId=@acc_id2 --寮犻 +1000 0 +set @myerr += @@error +insert into CardTransfer(CardNoOut,CardNoIn,TransferMoney,TransferTime) --杞处璁板綍 +values(@card_no,@card_no2,1000,GETDATE()) +set @myerr += @@error +--鎻愪氦浜嬪姟 +if(@myerr = 0) + begin + commit transaction + end +--鍥炴粴浜嬪姟 +else + begin + rollback transaction + end + +select * from BankCard +select * from CardTransfer diff --git "a/\347\254\224\350\256\260/9.30\344\272\213\345\212\241\345\217\212\346\270\270\346\240\207.md" "b/\347\254\224\350\256\260/9.30\344\272\213\345\212\241\345\217\212\346\270\270\346\240\207.md" new file mode 100644 index 0000000..eccd881 --- /dev/null +++ "b/\347\254\224\350\256\260/9.30\344\272\213\345\212\241\345\217\212\346\270\270\346\240\207.md" @@ -0,0 +1,145 @@ +#### 浠涔堟槸浜嬪姟 + +**浜嬪姟锛 Transaction锛夌敱涓娆℃垨鑰呭娆″熀鏈搷浣滄瀯鎴愶紝鎴栬呰锛屼簨鍔$敱涓鏉℃垨鑰呭鏉 SQL 璇彞鏋勬垚銆** + +**浜嬪姟涓殑鎵鏈 SQL 璇彞鏄竴涓暣浣擄紝鍏卞悓杩涢锛屼笉鍙垎鍓诧紝瑕佷箞鍏ㄩ儴鎵ц鎴愬姛锛岃涔堝叏閮ㄦ墽琛屽け璐ャ** + + + +#### 浜嬪姟鐨勫睘鎬(ACID) + +涓鑸潵璇达紝浜嬪姟鍏锋湁鍥涗釜鏍囧噯灞炴э紝鍒嗗埆鏄師瀛愭э紙**A**tomicity锛屾垨绉颁笉鍙垎鍓叉э級銆佷竴鑷存э紙**C**onsistency锛夈侀殧绂绘э紙**I**solation锛屽張绉扮嫭绔嬫э級銆佹寔涔呮э紙**D**urability锛夛紝绠绉 **ACID**銆傚叿浣撹鏄庡涓嬶細 + +##### 1) 鍘熷瓙鎬 + +涓涓簨鍔′腑鐨勬墍鏈 SQL 璇彞锛岃涔堝叏閮ㄦ墽琛屾垚鍔燂紝瑕佷箞鍏ㄩ儴鎵ц澶辫触锛屼笉浼氱粨鏉熷湪涓棿鐨勬煇涓幆鑺傘備簨鍔″湪鎵ц杩囩▼涓彂鐢熼敊璇紝浼氳鍥炴粴锛圧ollback锛夊埌浜嬪姟寮濮嬪墠鐨勭姸鎬侊紝灏卞儚杩欎釜浜嬪姟浠庢潵娌℃湁鎵ц杩囦竴鏍枫 + +##### 2) 涓鑷存 + +鍦ㄤ簨鍔″紑濮嬩箣鍓嶅拰浜嬪姟缁撴潫浠ュ悗锛屾暟鎹簱鐨勫畬鏁存ф病鏈夎鐮村潖銆傝繖琛ㄧず鍐欏叆鐨勬暟鎹繀椤诲畬鍏ㄧ鍚堟墍鏈夌殑棰勮瑙勫垯锛屽叾涓寘鍚暟鎹殑绮剧‘搴︺佷覆鑱旀т互鍙婂悗缁暟鎹簱鍙互鑷彂鎬у湴瀹屾垚棰勫畾鐨勫伐浣溿 + +##### 3) 闅旂鎬 + +鏁版嵁搴撳厑璁稿涓苟鍙戜簨鍔″悓鏃跺鍏舵暟鎹繘琛岃鍐欏拰淇敼鐨勮兘鍔涳紝闅旂鎬у彲浠ラ槻姝㈠涓簨鍔″苟鍙戞墽琛屾椂鐢变簬浜ゅ弶鎵ц鑰屽鑷存暟鎹殑涓嶄竴鑷淬備簨鍔¢殧绂诲垎涓轰笉鍚岀骇鍒紝鍖呮嫭璇绘湭鎻愪氦锛圧ead uncommitted锛夈佽鎻愪氦锛坮ead committed锛夈佸彲閲嶅璇伙紙repeatable read锛夊拰涓茶鍖栵紙Serializable锛夈 姝婚攣 鎿嶄綔绯荤粺 + +##### 4) 鎸佷箙鎬 + +浜嬪姟澶勭悊缁撴潫鍚庯紝瀵规暟鎹殑淇敼灏辨槸姘镐箙鐨勶紝鍗充究绯荤粺鏁呴殰涔熶笉浼氫涪澶便 + + + +### 浜嬪姟鎵ц娴佺▼ + +![](https://gitee.com/snailclass/tuchuang/raw/master/img/image-20220916113630148-2022-9-1611:40:42.png) + + + + + +#### 浜嬪姟鍒嗙被 + +**鑷姩鎻愪氦浜嬬墿**锛 鏄疭QL Server榛樿鐨勪竴绉嶄簨鍔℃ā寮忥紝姣忔潯Sql璇彞閮借鐪嬫垚涓涓簨鍔¤繘琛屽鐞嗐 + +**鏄惧紡浜嬪姟**: T-sql鏍囨槑锛岀敱Begin Transaction寮鍚簨鍔″紑濮嬶紝鐢盋ommit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟缁撴潫銆 + +**闅愬紡浜嬪姟**锛氫娇鐢⊿et IMPLICIT_TRANSACTIONS ON 灏嗗皢闅愬紡浜嬪姟妯″紡鎵撳紑锛屼笉鐢˙egin Transaction寮鍚簨鍔★紝褰撲竴涓簨鍔$粨鏉燂紝杩欎釜妯″紡浼氳嚜鍔ㄥ惎鐢ㄤ笅涓涓簨鍔★紝鍙敤Commit Transaction 鎻愪氦浜嬪姟銆丷ollback Transaction 鍥炴粴浜嬪姟鍗冲彲銆 + +TIPS: + +**浜嬬墿鍥炴粴**锛 + +xact_abort on/off : 涓簅n鏃跺鏋滃綋鍓峴ql鍑洪敊锛屽洖婊氭暣涓簨鍔★紝涓簅ff鏃跺鏋渟ql鍑洪敊鍥炴粴褰撳墠sql璇彞锛屽叾瀹冭鍙ョ収甯歌繍琛岃鍐欐暟鎹簱銆 + + + + +## 娓告爣 + +#### 浠涔堟槸娓告爣 + +娓告爣(Cursor)瀹冧娇鐢ㄦ埛鍙愯璁块棶鐢盨QL Server杩斿洖鐨勭粨鏋滈泦銆備娇鐢ㄦ父鏍(cursor)鐨勪竴涓富瑕佺殑鍘熷洜灏辨槸鎶婇泦鍚堟搷浣滆浆鎹㈡垚**鍗曚釜璁板綍澶勭悊鏂瑰紡**銆傜敤SQL璇█浠庢暟鎹簱涓绱㈡暟鎹悗锛岀粨鏋滄斁鍦ㄥ唴瀛樼殑涓鍧楀尯鍩熶腑锛屼笖缁撴灉寰寰鏄竴涓惈鏈夊涓褰曠殑闆嗗悎銆傛父鏍囨満鍒跺厑璁哥敤鎴峰湪SQL server鍐呴愯鍦拌闂繖浜涜褰曪紝鎸夌収鐢ㄦ埛鑷繁鐨勬剰鎰挎潵鏄剧ず鍜屽鐞嗚繖浜涜褰曘 + +娓告爣鍒嗙被: + +锛1锛夐潤鎬佹父鏍(Static)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁涓嶅彉 +锛2锛夊姩鎬佹父鏍(Dynamic)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝鏁版嵁鍙戠敓鍙樺寲锛屾父鏍囦腑鏁版嵁鏀瑰彉锛岄粯璁ゅ笺 +锛3锛夐敭闆嗛┍鍔ㄦ父鏍(KeySet)锛氬湪鎿嶄綔娓告爣鐨勬椂鍊欙紝琚爣璇嗙殑鍒楀彂鐢熸敼鍙橈紝娓告爣涓暟鎹敼鍙橈紝鍏朵粬鍒楁敼鍙橈紝娓告爣涓暟鎹笉鍙樸 + + + +#### 娓告爣鐨勪娇鐢 + +**鍒涘缓娓告爣锛** + +```sql +--1.鍒涘缓娓告爣(Scroll浠h〃婊氬姩娓告爣锛屼笉鍔燬croll鍒欐槸鍙繘鐨勶紝鍙兘鏀寔fetch next) +declare <娓告爣鍚> cursor scroll for select stuname from stuinfo +``` + +**鎵撳紑娓告爣锛** + +```sql +open <娓告爣鍚> +``` + +**鍏抽棴娓告爣锛** + +``` +close <娓告爣鍚> +``` + +**鍒犻櫎娓告爣锛** + +``` +deallocate <娓告爣鍚> +``` + + + +**鎻愬彇鏁版嵁鎿嶄綔锛** + +```sql +fetch first from <娓告爣鍚> --缁撴灉闆嗙殑绗竴琛 +fetch last from <娓告爣鍚> --鏈鍚庝竴琛 +fetch absolute 1 from <娓告爣鍚> --浠庢父鏍囩殑绗竴琛屽紑濮嬫暟锛岀n琛屻 +fetch relative 3 from <娓告爣鍚> --浠庡綋鍓嶄綅缃暟锛岀n琛屻 +fetch next from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笅涓琛 +fetch prior from <娓告爣鍚> --褰撳墠浣嶇疆鐨勪笂涓琛 +``` + + + +**鎻愬彇鏁版嵁缁欏彉閲忎互渚涘畠鐢紙鍙栧嚭绗3琛屽鐢熷鍚嶏紝鏌ヨ璇ュ鐢熻缁嗕俊鎭級锛** + +```sql +declare @vari varchar(20) +fetch absolute 3 from <娓告爣鍚> into @vari +select * from StuInfo where stuName = @vari +``` + +**鍒╃敤娓告爣鎻愬彇鎵鏈夌殑瀛︾敓淇℃伅锛** + +```sql +--鏂规涓锛 +fetch absolute 1 from <娓告爣鍚> +while @@FETCH_STATUS = 0 --@@FETCH_STATUS=0,鎻愬彇鎴愬姛锛-1鎻愬彇澶辫触锛-2琛屼笉瀛樺湪 + begin + fetch next from <娓告爣鍚> + end + +--鏂规浜岋細 +declare @myvar varchar(20) +fetch first from <娓告爣鍚> into @myvar +while @@FETCH_STATUS = 0 + begin + print '鎻愬彇鎴愬姛'+@myvar + fetch next from <娓告爣鍚> into @myvar + end +``` + +**鍒╃敤娓告爣淇敼鍜屽垹闄ゆ暟鎹細** + +```sql +--鏇存柊璇硶: +-- fetch absolute 3 from <娓告爣鍚> +-- update 璇彞 where Current of <娓告爣鍚> \ No newline at end of file -- Gitee