SQL增删改查,循环,触发器,存储过程,以及sql语法

                                      可以直接粘贴代码使用

--创建数据库命令
create database j1216
on
(
name=j1216,
filename='E:\shuju\j1216\j1216.mdf',
size=10,
maxsize=50,
filegrowth=5
)
log on
(
name=j1216_log,
filename='E:\shuju\j1216\j1216_log.ldf',
size=5,
maxsize=25,
filegrowth=5
)
go
-----------------------------------------------------------------------------------
--创建表
--创建学生表
create table tb_student
(
id int identity(1,1) primary key not null,
s_name varchar(20),
sex varchar(10),
age int
)
--创建成绩表
create table tb_sc
(
tno varchar(20) primary key not null,
grade int,
sno varchar(20) not null,
c_no int not null
)
--创建课程表
create table tb_course
(
c_id int identity(1,1) primary key not null,
c_no int not null,
c_name varchar(50)
)
--创建部门表
create table tb_depart
(
id int identity(1,1) primary key not null,
d_no int ,
d_name varchar(50)
)
--创建成绩表
create table tb_grade
(
g_no varchar(20) primary key not null,
s_no varchar(20) not null,
w_grade int,
l_grade int
)
--创建订单表
create table OrderDetails
(
OrderD int primary key not null,
ProductD int,
UnitPrice money,
Quantity int
)
--创建货仓表
create table Products
(
ProductD int primary key not null,
UnetislnStock int
)
---------------------------------------------------------------------------------
--删除表
select * from  tb_student
select * from  tb_user
select * from OrderDetails;
select * from tb_sc;
drop table tb_sc
drop table tb_student_clone
drop table tb_student_clone2

create table tb_user
(
id int,
uname varchar(20)
)
--------------------------------------------------------------------------------
--使用数据库
 use j1216
---------------------------------------------------------------------------------
--修改表的字段类型
alter table tb_student alter column s_name varchar(30)
--删除字段
alter table tb_student drop column age
--添加字段
alter table tb_student add  age int
alter table tb_student add tno varchar(20)
alter table tb_student add d_no int
--字段重命名
exec sp_rename 'tb_student.s_name','sname','column'
--------------------------------------------------------------------------------
-------给表添加主键
----添加列语法:ALTER TABLE 表名 Add 列名 类型 ...
alter table tb_user add userid int not null identity(10,1);

------ 语法:   alter table 表名 add constraint 约束名 primary key (你的主键);  
alter table tb_user add constraint pk_tb_user primary key (userid);

--给表tb_student添加外键
----- 语法:alter table 表名 add constraint 约束名 foreign key (你的外键) references (表名)(字段名)
------ 指定表中的数据是否用新添加的或重新启用的 FOREIGN KEY 或 CHECK 约束进行验证。如果没有指定,对于新约束,假定为 WITH CHECK,对于重新启用的约束,假定为 WITH NOCHECK
alter table tb_student with check add constraint pk_tno
foreign key(tno) references tb_sc(tno)

--给表OrderDetails添加外键
alter table OrderDetails with nocheck add constraint pk_ProductD
foreign key(ProductD) references Products(ProductD)
---------------------------------------------------------------------------------
--向表中添加数据
--向学生表中添加数据
insert into  tb_student(s_name,sex,age,tno,d_no) values('张三','男',21,'1203',15);
insert into  tb_student(s_name,sex,age,tno,d_no) values('欧阳锋','男',120,'1208',63);
insert into  tb_student(s_name,sex,age,tno,d_no) values('欧阳亚雄','男',27,'1203',42);
insert into  tb_student(s_name,sex,age,tno,d_no) values('DB_i11','男',32,'1207',77);
insert into  tb_student(s_name,sex,age,tno,d_no) values('DB_ii1111','男',23,'1201',56);
--向成绩表中添加数据
insert into tb_sc(tno,grade,sno,c_no) values('1201',85,'1',1000)
insert into tb_sc(tno,grade,sno,c_no) values('1202',80,'2',1001)
insert into tb_sc(tno,grade,sno,c_no) values('1203',77,'1',1000)
insert into tb_sc(tno,grade,sno,c_no) values('1204',65,'2',1001)
insert into tb_sc(tno,grade,sno,c_no) values('1205',45,'1',1000)
insert into tb_sc(tno,grade,sno,c_no) values('1206',98,'1',1000)
insert into tb_sc(tno,grade,sno,c_no) values('1207',78,'2',1001)
insert into tb_sc(tno,grade,sno,c_no) values('1208',86,'2',1001)
--向课程表中添加数据
insert into tb_course(c_no,c_name) values(1000,'java')
insert into tb_course(c_no,c_name) values(1001,'c++')
insert into tb_course(c_no,c_name) values(1002,'c#')
insert into tb_course(c_no,c_name) values(1003,'.net')
insert into tb_course(c_no,c_name) values(1004,'php')
insert into tb_course(c_no,c_name) values(1005,'android')
--向院系表中添加信息
insert into tb_depart(d_no,d_name) values(1111,'计算机学院')
insert into tb_depart(d_no,d_name) values(2222,'管理学院')
insert into tb_depart(d_no,d_name) values(3333,'旅游学院')
insert into tb_depart(d_no,d_name) values(4444,'烹饪学院')
--向货仓表中添加数据
insert into Products(ProductD,UnetislnStock) values(1,15)
insert into Products(ProductD,UnetislnStock) values(2,65)
insert into Products(ProductD,UnetislnStock) values(3,20)
insert into Products(ProductD,UnetislnStock) values(4,50)
--向订单表中添加数据
insert into OrderDetails(OrderD, ProductD, UnitPrice, Quantity) values(10522,1,31.00,6)
insert into OrderDetails(OrderD, ProductD, UnitPrice, Quantity) values(10523,2,9.65,7)
insert into OrderDetails(OrderD, ProductD, UnitPrice, Quantity) values(10524,3,30.00,10)
insert into OrderDetails(OrderD, ProductD, UnitPrice, Quantity) values(10525,4,19.00,5)
-----------------------------------------------------------------------------
--循环向tb_grade表中添加数据
--声明变量
declare @t int
declare @a int
declare @s int
   --随即产生1-100之间的整数
   set @t=rand()*100
   set @a=rand()*100
   print @t;
   print @a;
   set @s=0
   print @s;
while(@s<100)
begin
   if(@t>10 and @a>10)
       begin
             -----一般来讲cast()适用范围略广,convert(),一般用于日期和字符串之间进行转换SELECT CAST(CONVERT(CHAR(10),CURRENT_TIMESTAMP,121) AS DATETIME
          insert into tb_grade(g_no, s_no, w_grade, l_grade) values('s27181'+cast(@s as varchar(2)),'s2530'+cast(@s as varchar(2)),@t,@a)
          set @t=rand()*100
          set @a=rand()*100
       end
          set @s=@s+1
end
go

select * from tb_grade;
select * from tb_student;
---------------------------------------------------------------------------------
--修改表中信息
update tb_student set sex='女' where s_name like '%三'
update tb_student set sex='男' where s_name like 'DB%'
update tb_student set d_no=1111 where id<7
update tb_student set d_no=2222 where id<23 and id>=21
---------------------------------------------------------------------------------
--删除整张表的信息
delete from tb_student
delete from tb_student_clone
delete from tb_student_clone2
delete from tb_sc
delete from tb_grade
delete from OrderDetails
delete from Products
--删除部分数据
delete from tb_student where id=1
delete from tb_student where s_name like '欧阳%'
---------------------------------------------------------------------------------
--查询语句
select * from tb_student
select * from tb_sc
select * from tb_course
select * from tb_grade
select * from tb_student_clone
select * from tb_student_clone2
select * from Products
select * from OrderDetails
--根据id降序查询
select * from tb_student order by id desc
--根据id升序查询
select * from tb_student order by id asc

--查询所有年龄在20岁以下的学生的姓名及其年龄
select s_name,age from tb_student where age>20
--查询年龄在20到25岁之间的学生的信息
select * from tb_student where age>20 and age<25
select * from tb_student where age between 21 and 24
--查询姓"欧阳"且全名只有3个字的学生的姓名
--- sql中like用法 :
---                *          它同于DOS命令中的通配符,代表多个字符。                          (如:c*c代表cc,cBc,cbc,cabdfec等)
---                %          这种方法在很多程序中要用到,主要是查询包含子串的。               (如:%c%代表agdcagd等)
---               [*]         代替*                                                            (如:a[*]a代表a*a)
---                ?          同于DOS命令中的?通配符,代表单个字符                            (如:b?b代表brb,bFb等)
---                #          大致同上,不同的是代只能代表单个数字。                           (如:k#k代表k1k,k8k,k0k)
---                _          指定一个范围中任意一个                                           (如:[a-z]代表a到z的26个字母中任意一个)
---             [!字符]       它只代表单个字符                                                 (如:[!a-z]代表9,0,%,*等)
---             [!数字]       它只代表单个字符                                                 (如:[!0-9]代表A,b,C,d等)
---    字符[范围类型]字符     可以和其它几种方式组合使用                                       (如:cc[!a-d]#代表ccF#等)
select s_name from tb_student where s_name like '欧阳_'
select s_name from tb_student where s_name like '欧阳%' and len(s_name)=3
--查询"DB_"开头,且倒数第三个字符为i的课程的详细情况
--当记录中有通配符时使用转义\escape '\'
select * from tb_student where s_name like 'DB\_%i__'escape '\'
--查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列
select sno,grade from tb_sc where sno=3 order by grade desc
--查询男女生各有多少人
select count(*)from tb_student where sex='男'
union
select count(*)from tb_student where sex='女'
--按性别分组查询
select sex as '性别',count(*) as '人数' from tb_student  group by sex
----------------------------------------------------------------------------------
--把相同的字段去掉
select distinct sex from tb_student
--truncate 和delete,truncate 执行的速度比delete快
--删除全部数据,保留表的结构
truncate table tb_course
----------------------------------------------------------------------------------

--T-SQL
--循环想表中添加数据的SQL脚本
declare @t int --声明一个整型变量
declare @s char(2) --性别
set @t=0 --给整型变量赋值
while(@t<10)  --循环
begin
   --循环体
   if(@t%2!=0)
       set @s='男'
   else
      set @s='女'
   insert into tb_student(s_name,sex,age,tno) values('刘备'+cast(@t as varchar(2)),@s,35+@t,cast((1202+@t) as varchar(30) ))
    set @t=@t+1
end

--循环修改表中的数据
declare @t int --声明一个变量
declare @s int
   set @t=1197  --给整型变量赋值
   set @s=31
while(@t<1204) --循环
begin
    --循环体
    update tb_student set d_no=@t where id=@s
    set @t=@t+1
    set @s=@s+1
end
----------------------------------------------------------------------------------
--复制表
select * into tb_student_clone from tb_student where 1=1
--复制表结构
select * into tb_student_clone2 from tb_student where 1=2
-----------------------------------------------------------------------------------
--分页每页显示5条记录
select top 5 * from tb_student
select top 5 * from tb_student order by id asc
--显示第二页
select top 5 * from tb_student where id not in(select top 5 id from tb_student)
-----------------------------------------------------------------------------------
--冒牌分页
declare @t1 int --声明一个整型变量
declare @pagecount int
set @t1=0 --给整型变量赋值
set @pagecount=(cast((select count(*) as count from tb_student) as int)/5)+1;
print @pagecount;
while(@t1<(@pagecount)) --循环
begin
--循环体
       select top 5 * from tb_student where id not in(select top (5*@t1) id from tb_student)
    set @t1=@t1+1
end
-------------------------------------------------------------------------------------
--每页显示m条数据,查询第n页结果
declare @m int ---每页显示多少条数据
declare @n int ---
set @m=5
set @n=(cast((select count(*) as count from tb_student) as int)/5)+1;
print @n
if (@n-1)>0
begin
   select top (@m) * from tb_student where id not in(select top (@m*(@n-1)) id from tb_student)
end
------------------------------------------------------------------------------------
--求交集,可以直接用and
select * from tb_student where sex='女'
intersect
select * from tb_student where age>35
--求并集 系统会自动将重复的元组去掉
select * from tb_student where sex='男'
union
select * from tb_student where age>21
----求交集   系统保留重复元素组
select * from tb_student where sex='男'
union all
select * from tb_student where age>21
--求补集
select * from tb_student where sex='男'
except
select * from tb_student where age<30
------------------------------------------------------------------------------------
--获得当前增量的值 identity--系统变量
select @@identity as abc
-----------------------------------------------------------------------------------
--cast类型转换函数
select cast('123' as int)
select cast('2012-12-11' as datetime)
select cast(CONVERT(varchar(800),GETDATE(),121) as datetime)
--convert类型转换函数
select convert(datetime, '2012-12-11')
--获取当前时间
select current_timestamp
--获取当前主机端口号和主机名
select host_id() as '主机端口号',host_name() as '主机名'
-----------------------------------------------------------------------------------
--字符串的连接
select * from tb_student where s_name=('刘备'+'0')
--当表中不存在此字段时,系统会自动创建一个虚列字段
select *,('abc'+'123') as a from tb_student
select *  from tb_student
select * from tb_depart
-----------------------------------------------------------------------------------
--多表查询
select distinct * from tb_student as s,tb_course as c,tb_sc as sc
 where s.tno=sc.tno and c.c_no=sc.c_no
--连接查询
--内联查询
select a.*,b.d_name from tb_student a inner join tb_depart b on b.d_name='计算机学院' and a.d_no=b.d_no
--左连查询,以左边表为基表,满足条件的查询出来,不满足条件用null填充
select * from tb_student a left join tb_depart b on a.d_no=b.d_no and b.d_name='计算机学院'
--右连查询,以右边表为基表,满足条件的查询出来,不满足条件用null填充
select * from tb_student a right join tb_depart b on a.d_no=b.d_no and b.d_name='计算机学院'
--嵌套查询
select * from tb_depart as a where a.d_no  in(select d_no from tb_student where s_name='张三')

select * from tb_depart as a where a.d_no not in(select d_no from tb_student where s_name='张三')
---------------------------------------------------------------------------------
--创建视图
create view view_sc
  as
   select a.*,b.d_name from tb_student a right join tb_depart b on a.d_no=b.d_no and b.d_name='计算机学院'
--查询视图
select * from view_sc a,tb_sc b where a.tno=b.tno
---------------------------------------------------------------------------------
--判断数据库是否存在,如果存在,就删除它
 if exists (select * from sysdatabases where name='j1216') drop database j1216
--判断表在数据库中是否存在,如果存在,就删除它
 if exists (select * from sysdatabases where name='tb_sc') drop table tb_sc
--------------------------------------------------------------------------------
--定义变量保存表中的记录
declare @t2 int
select @t2=count(*) from tb_student
print @t2;
--打印变量
----print 直接返回一个值
----select 返回一个带有结构的值,比如说有列名
print @t2
select @t2
--------------------------------------------------------------------------------
--全局变量的使用
--打印SQL Server的版本
 print  'SQL Server的版本: '+@@VERSION
--打印服务器的名称
 print  '服务器的名称: '+@@SERVERNAME
--向tb_student表中添加一行数据
INSERT INTO tb_student(s_name,sex,age,tno,d_no)   
     VALUES('武松','男',23,'1205',63)
--如果大于0表示上一条语句执行有错误
print '当前错误号: '+convert(varchar(5),@@ERROR)
--打印刚在表中添加的数据的ID号
 print '刚才报名的学员,座位号为:'  
              +convert(varchar(5),@@IDENTITY )
--修改tb_student表中姓名为'李四'的学生的年龄
UPDATE tb_student SET age=85
       WHERE s_name='李四'
--如果大于0表示上一条语句执行有错误
print '当前错误号: '+convert(varchar(5),@@ERROR)
--GO是批处理的标志,
--表示SQL Server将这些T-SQL语句编译为一个执行单元,提高执行效率
GO
--------------------------------------------------------------------------------
--if-else语句的使用
declare @a float
  select @a=avg(w_grade) from tb_grade
  print @a
  print '平均分是:'+convert(varchar(10),@a)
if(@a>=60)
    begin
        print '平均成绩:良'
        select top 3 g_no, s_no, w_grade from tb_grade order by w_grade desc
   end
else
   begin
       print '平均成绩:差'
       select top 3 g_no, s_no, w_grade from tb_grade order by w_grade asc
   end
go
---------------------------------------------------------------------------------
--while循环语句
declare @a1 float
while(1=1)
   begin
     select @a1=count(*) from tb_grade where w_grade<60
     print @a1
         if(@a1>0)
              begin
                 update tb_grade set w_grade=w_grade+2 where w_grade<60
              end
         else
              begin
                 break;
              end
    end
go

select * from tb_grade;
--变量保存小于60分的学生人数
declare @c int
   select @c=count(*) from tb_grade where w_grade<60
while(@c>0)
begin
   update tb_grade set w_grade=w_grade+2
   select @c=count(*) from tb_grade where w_grade<60
end
go
-------------------------------------------------------------------------------
--case end
---相当于switch  
select *,
 case
    when w_grade>=90 then 'A'
    when w_grade>=80 and w_grade<=89 then 'B'
    when w_grade>=70 and w_grade<=79 then 'C'
    when w_grade>=60 and w_grade<=69 then 'D'
 else 'E'
   end as '成绩评定'
from tb_grade
go
-------------------------------------------------------------------------------
--触发器的语法
----     create trigger triggerName on tableName
----     for delete,|insert,|update
----     as
----     begin
----        --T-SQL
----     end

--创建一张备份表
select * into tb_student_clone from tb_student where 1=2
--创建触发器的脚本
--deleted inserted是删除,增加时调用的虚拟表
drop trigger tg_student;
drop trigger tg_student1;
drop trigger tg_student2;

------ tb_student和tb_sc有主外键关联,创建删除触发器需要先删除从表后删主表
---------------------------------删除触发器
create trigger tg_student on tb_student
for delete
as
begin
   insert into tb_student_clone(id,s_name,sex,age,tno,d_no)
   select id,s_name,sex,age,tno,d_no from deleted
end
----调用触发器
delete from tb_student where id=25  ---报错: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'tb_student_clone' 中的标识列插入显式值。
--------正确如下:
create trigger tg_student1 on tb_student
for delete
as
begin
   set IDENTITY_INSERT tb_student_clone on
   insert into tb_student_clone(id,s_name,sex,age,tno,d_no)
   select id,s_name,sex,age,tno,d_no from deleted
end
-------------------------插入触发器
create trigger tg_student2 on tb_student
for insert
as
begin
   set IDENTITY_INSERT tb_student_clone on
   insert into tb_student_clone(id,s_name,sex,age,tno,d_no)
   select id,s_name,sex,age,tno,d_no from inserted
end
--触发器的调用
insert into tb_student(s_name,sex,age,tno,d_no)
 values('','',25,'1206',9)

select * from tb_student_clone
--删除触发器
drop trigger tg_student
--禁用触发器
disable trigger tg_student on tb_student
disable trigger tg_student2 on tb_student
--启用触发器
enable trigger tg_student on tb_student
--修改触发器 只需要在创建触发器的脚本中将create改为alter
alter trigger tg_student on tb_student
for delete,update
as
begin
   set IDENTITY_INSERT tb_student_clone on
   insert into tb_student_clone(id,s_name,sex,age,tno,d_no)
   select id,s_name,sex,age,tno,d_no from deleted
end
---------------------------------------------------------------------------------------
--创建触发器,使得在向OrderDetails表中添加数据时,货仓表中的货物数量UnetislnStock
--则要减去相应的订单表中预定的数量Quantity
create trigger tg_order on OrderDetails
for insert
as
   begin
      --@a是订单中产品数量
      declare @a int
      --@b是订单中产品号码
      declare @b int
          select @a=Quantity from inserted
          select @b=ProductD from inserted
          update Products  set UnetislnStock=(UnetislnStock-@a) where ProductD=@b
   end
--禁用触发器
disable trigger tri_order on OrderDetails
--启用触发器
enable trigger tri_order on OrderDetails
--调用触发器
insert into OrderDetails(OrderD, ProductD, UnitPrice, Quantity) values(10527,4,19.00,10)
select * from Products
select * from OrderDetails;
-------------------------------------------------------------------------------------------
--创建无参存储过程
create proc pro_2 as
begin
  insert into tb_student( s_name, sex, age, tno, d_no) values('李刚','男',35,'1207',8)
end
--调用存储过程
exec pro_2
--创建带参数的存储过程,输入和输出参数(用output定义的参数为输出参数)
--用in定义的参数是输入参数(in可以不写)
create proc pro_4(@name varchar(20),@sex varchar(2),
                  @age int,@tno varchar(50),@d_no int,@c int output) as
begin
  insert into tb_student(s_name, sex, age, tno, d_no)
              values(@name,@sex,@age,@tno,@d_no)
  set @c=@@rowcount
  print '添加'+convert(varchar(5),@c)+'条数据'
end
--调用存储过程
declare @a int
exec pro_4 '凤姐','女',30,'1203',250,@a
--修改存储过程 只需要在创建存储过程的脚本中将create改为alter
alter proc pro_4(@name varchar(20),@sex varchar(2),
                  @age int,@tno varchar(50),@d_no int,@c int output) as
begin
  if @name=''
  begin
    raiserror('姓名不能为空',17,1)
    return
  end
  insert into tb_student(s_name, sex, age, tno, d_no)
              values(@name,@sex,@age,@tno,@d_no)
  set @c=@@rowcount
  print '添加'+convert(varchar(5),@c)+'条数据'
end
--调用存储过程
declare @a int
exec pro_4 '','女',30,'1207',250,@a

declare @a int
exec pro_4 '伏羲','女',30,'1207',250,@a
--删除存储过程
drop proc pro_2
----------------------------------------------------------------------------------------
--存储过程:查询数据库中指定开始行到结束行记录
create proc pro_zuoye(@a int,@b int)
as
begin
     select * from tb_student where id not in(select top (@a-1) id from tb_student)
     intersect
     select * from tb_student where id in(select top (@b) id from tb_student )
end
--调用存储过程
exec pro_zuoye 5,8
--------------------简单的分页,使用存储过程
USE [j1216]
GO
/****** Object:  StoredProcedure [dbo].[Sp_PapeView]    Script Date: 07/24/2013 15:45:31 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
create proc Sp_PageView
(
  @RecordCount  int OUTPUT, --总记录数
  @PageSize  int=4,            --每页的大小(记录数)
  @PageCurrent int=1,              --要显示的页码
  @PageCount  int OUTPUT        --总页数  
)
as
begin
   select @RecordCount=COUNT(*) from tb_student
   select @PageCount=@RecordCount/@PageSize+1
   select top (@PageSize) * from tb_student where id not in (select top ((@PageCurrent-1)*@PageCount) id from tb_student)
end

declare @RecordCount int,@PageCount int
exec sp_pageView @RecordCount,5,1,@PageCount

-----------------------------------------------------------------------------------------
--备注:凡是使用create函数创建的数据库元素,全部都用drop来删除

你可能感兴趣的:(SQL)