SQL

SQL基础 4

20141030 4

第一,创建一个数据库文件 4

1,创建数据库 4

2,创建主文件 4

3,创建日志文件 5

第二,备份.还原,删除数据库 5

1,数据库的备份 5

2,还原数据库 5

3,删除数据库--删除原有的结构 5

-第三,查询数据库 5

1,查询所有的数据库 5

2,查询所有的表 6

3,-查询当前用户的表 6

4,查询表结构与修改 6

第四,创建一般的表与查询等 6

1,创建表 6

2,查询指定的表 6

3,修改表中的指定列 7

4,添加一列 7

5,删除指定的列 7

6,往表中添加数据 7

7,修改表中的记录(要唯一确定一行) 7

8,deletetruncate删除表的区别 7

9,删除记录 7

10,distinct 根据指定的字段去除重复的记录显示, 8

第五,创建带自增涨的带主键的表 8

1,创建主键方法: 8

2,varchar(长度) char(长度)的区别 8

3,表内容的增删查改 8

第六,约束型的创建表,以及功能实现 9

1,约束的类型 9

2,创建employee表实现功能 9

3,查询表 9

4,添加内容 9

5,删除关联的表内的某条记录 10

第七,整体练习 10

20141031 11

第一,字符串的操作 11

1,char():转换成对应的字母 11

2,lower():把指定的参数转换成小写 11

3,upper():把指定的参数转换成大写 11

4,ltrim():去掉指定字符左边的空格 11

5,rtrim():去掉指定字符右边的空格 11

6,left():从指定的字符左边方向截取指定个数的字符 12

7,right():从指定的字符右边方向截取指定个数的字符 12

8,replace(arg1,arg2,arg3)替换原有的字符串 12

9,len():返回字符的长度 12

10,stuff(arg1,int1,int2,arg2):替换指定长度的字符 12

第二,获取时间 12

1,getdate()获取当前系统时间 13

2,year()获取指定日期的年份 13

3,month()获取指定日期的月份 13

4,day():获取指定日期的天数 13

5,获取指定格式的日期 13

第三,创建表department并添加部门 13

1,创建department 13

2,添加部门 14

第四,创建表emp并添加成员 14

1,创建emp 14

2,添加员工 14

第五,聚集函数 14

1,count(*):获取指定字段在当前表中的总共记录数.如果指定的参数是'*'那么获取总计录数 15

2,max(字段):返回指定字段的最大值 15

3,min(字段):返回指定字段的最小值 15

4,--AVG(字段):返回指定字段的平均值 15

5,sum(字段):返回指定字段的总和 15

6,聚集函数可以出现的位置: 15

第六,查找与模糊查找 15

1,使用不等于符号!= <> 16

2,in()的用法,查询字段在指定的范围之内的记录 16

3,like '':模糊查询 16

4,查询某个字段为null的记录is null 16

5,in not in 16

第七,分页查询 16

1,top 获取前几条记录 17

2,分页语句 17

3,order by 排序 17

4,分组group by 18

20141101 18

第一,添加数据 19

1,创建表DEPT01 19

2,创建表EMP01 19

3,添加数据 19

第二,多表查询 20

1,快速添加数据 20

2,如果多表联合查询就会产生笛卡尔集,我们就需要在后面添加条件 20

3,anyall 的区别 21

第三,多表的联合查询 21

1,左连接: 表名LEFT JION 表名ON 条件 21

2,右连接: 表名RIGHT JOIN 表名ON 条件 21

3,内连接: 表名JOIN  表名ON 条件 21

第四,练习 21

20141103 24

第一,声明变量 24

1,定义变量 24

2,变量赋值 24

3,查询 25

4,把某一个变量的值赋给别人 25

5,把查询的的值赋给变量 25

第二循环语句 25

1,数据库中的代码块用BEGIN ... END 包含起来(类似与java{}的意思)执行时是一个整体 25

2,数据库中的if语句 25

3,消除重复 26

4,练习if语句 26

5,goto 是指定程序到某一个标记处执行 27

第三,设置等级以及在指定的时间去执行 28

1,判断设置等级 28

2,waitfor delay sql在指定时间后再去执行 29

3,waitfor time sql在指定时间(0-24小时)点再去执行 29

第四,事物与异常 29

1,方法: 29

2,例题: 29

3,练习--往银行里进行转账 30

第五,存储过程 32

1,创建一个没有参数的存储过程 32

2,查看用户定义的存储过程 32

3,删除存储过程 32

4,调用存储过程 32

5,查看定义的存储过程实现的代码 32

6,创建一个加密的存储过程用:with encryption 33

7,创建有参数的过程 33

8,创建一个有输入和输出的过程 33

第六,用存储过程实现分页 34

1,常见的分页方法 34

2,创建一个分页存储过程 34

3,第一种分页 35

4,第二种分页 35

5,分页语句三::通用的 36

6,转换函数:cast( as 类型),convert(类型,) 37

7,有默认值的过程 37

20141104 37

第一,游标 37

1,游标:对表进行遍历 37

2,删除游标 38

第二,用游标创建等级 38

1,创建学生表和分数等级表并添加数据 38

2,创建游标stu_test01实现功能 38

第三,创建实现查找学生分数等级的游标 39

第四,创建一个可以自由移动的游标 40

第五,触发器 40

1,触发器介绍以及分类 40

2,创建实现触发器的学生表和借书表 41

3,后触发器alter 41

4,替代触发器instead of 42

5,删除触发器 42

6,查看当前用户定义的触发器 42

 

SQL基础

20141030

第一,创建一个数据库文件

1,创建数据库

create database erp

2,创建主文件

on(

name = 'erp',--指定数据库的逻辑名

filename = 'e:\sql\erp.mdf',--创建数据库的物理路径

size = 10,--数据库的初始大小

maxsize=50,--数据库的最大容量

filegrowth =5--数据库的达到最大容量时,每次自增长

)

3,创建日志文件

log on(

name='erp_log',

filename='e:\sql\erp_log.ldf',

size=10,

maxsize=50,

filegrowth=5

)

第二,备份.还原,删除数据库

1,数据库的备份

语法:backup database 数据库名 to disk=’保存路径\\名字.dat’ with format

backup database erp to disk='e:sql\erp.dat' with format

2,还原数据库

语法:restor database 库名 from disk=’保存路径\\名字.dat’ with move ‘库名’to’原来保存数据库的路径\\库名.mdf’ , move ‘原来的日志名’ to ‘路径’

restore database erp from disk='e:sql\erp.dat' with move 'erp' to 'e:\sql\erp.mdf' ,

move'erp_log' to 'e:\sql\erp_log.ldf

3,删除数据库--删除原有的结构

drop database erp

第三,查询数据库

1,查询所有的数据库

select * from sysdatabases

2,查询所有的表

select * from sysobjects

3,-查询当前用户的表

select * from sysobjects where xtype = 'U'

4,查询表结构与修改

查看表结构

exec sp_help 'dept'

--修改表名

--exec sp_rename '旧表名' , '新表名'

--修改字段名

--exec sp_rename '表明.列名' ,'新列名'

第四,创建一般的表与查询等

1,创建表

create table dept(

--定义字段的时候,先定义字段名,再声明字段类型

id int,

name varchar(5),

sex char(2)

)

2,查询指定的表

语法:select 属性 from 表名

*代表查询表结构的所有from后面是表名

2-1,查询数据

select * from dept

select name from dept

select id ,name from dept

2-2查询,并为字段指定别名

select id '编号', name'姓名' from dept

3,修改表中的指定列

语法:alter table 表名 alter column 属性 内容

alter table dept alter column sex varchar(5)

4,添加一列

语法:alter table 表名 add 列名 属性

alter table dept add dno int

5,删除指定的列

语法:alter table 表名 drop column 列名

alter table dept drop column dno

6,往表中添加数据

insert into dept (id,name,sex)values(1,'李氏','男')

insert into dept values(2,'李妞','女')

insert into dept (name) values('王霸')

7,修改表中的记录(要唯一确定一行)

语法:upde 表名set 字段名,字段名,.....where 条件

update dept set sex='男' where name = '王霸'

update dept set name='张三',sex ='女' where id = 1

8,deletetruncate删除表的区别

(1)delete删除记录的时候会把当前被删除的记录先保存一份到日志文件中区,可以进行恢复,主键不会重置

(2)truncate删除记录的时候会直接进行删除,不会备份,并且主键会进行重置

delete from dept

truncate table  dept

9,删除记录

delete from dept where name = '王霸'

10,distinct 根据指定的字段去除重复的记录显示,

--相同的标准:distinct后面的查询字段都相同时才算重复

select distinct ename from emp

select COUNT(distinct Ename)from emp

 

第五,创建带自增涨的带主键的表

create table dept(

id int primary key identity(1,1),--id是主键并且设置了自动增涨,所以不能手动添加

name varchar(15),

sex char(2)

)

1,创建主键方法:

1-1第一种设置主键

--primary key  用来设置主键

--identity(参数一,参数二)  设置自动创建

--参数一:从哪一个数开始增涨(起始值)  参数二:每次自增涨的值

 

1-2第二种添加主键

--primary key(id)

 

1-3第三种添加主键(必须保证不能为空)constraint(约束)

alter table dept add constraint pk_no primary key(id);

2,varchar(长度) char(长度)的区别

(1)-varchar(字节长度) 可变字符,字符最大长度自己指定,

--当传递的长度小于指定的长度时会自动的缩小所占的字节数,但是不会自动扩容

(2)char(字节长度)定长,一旦创建,长度就确定

选择标准:如果知道某个字段的值所占的字节数那么就用char()效率比较高,否则用varchar()

3,表内容的增删查改

--增

insert into dept values('李氏','女')

--删

delete from dept where name = '李氏'

--查

select * from dept

--改

update dept set name = '笨蛋' where id = 1000

第六,约束型的创建表,以及功能实现

1,约束的类型

(1)not null:非空约束,他修饰的字段不能为空

(2)check:检查约束,他修饰的字段每次添加时会检查添加的数据是否符合指定的规则

(3)default:默认约束,他修饰的字段在添加时,如果没有为该字段赋值,则使用默认的值

(4)unique:唯一约束,他修饰的字段不能重复,一个表中可以有多个字段用他来修饰

(5)primary key:主键约束,他修饰的字段不能为空且唯一.作用是用来唯一确定一张表中的唯一一条记录

(6)foreign key:外键约束,他是用来规范表与表之间的联系,添加的数据要存在与被关联的表内

2,创建employee表实现功能

create table employee(

eid int primary key identity(1,1),--主键约束

ename char(15) not null,--非空约束

esex char(2) check(esex in('男','女')),--检查约束

esel varchar(10) default '3000',--默认约束

eno int unique,--唯一约束

--创建外键约束,并设置为级联删除

pid int foreign key references dept (id)on  delete cascade

)

3,查询表

select * from employee

select * from dept

4,添加内容

4-1往dept添加一条记录

insert into dept values('电信部','综')

4-2往employee 添加数据外键关联与dept表中的主键

insert into employee values('李氏','男','6000',1002,3)

insert into employee values('李氏','男','4500',1001,1)

insert into employee values ('刘德华','男','6000',1002,2)

insert into employee (ename,esex,eno,pid)values('得了','女',1004,3)

5,删除关联的表内的某条记录

如果一个表有另外一个表进行关联,那么就不能直接删除主表中的被关联的记录

删除步骤:

(1)先删除关联的从表,

delete from employee where pid=2;

(2)再删除主表的记录

delete from dept where id = 2;

第七,整体练习

---自己练习----

create table school(

pno int primary key identity(1,1),

pname varchar(15)not null unique,

property char(8)

)

create table student(

Sno int primary key ,--设置主键

Sname varchar(15)not null,--设置姓名不能空

Ssex char(2) check(Ssex in ('男','女')),--设置性别只能是男和女

Sage int check(Sage between 1 and 130),--设置年龄只能在-130之间

Sgrade int check(Sgrade >=0 and Sgrade<=100),--设置分数只能在-100之间

pno int foreign key references school (pno) on delete cascade --设置pno为外来主键

)

 

select * from school

select * from student

--修改字节长度

alter table school alter column pname varchar(20)

--查询表结构

exec sp_help  'school'

--往学校表添加信息

insert into school values('电信','院')

insert into school values('经管','院')

insert into school values('教务处','处')

--往学生表添加信息

insert into student values(1001,'王向新','男',21,88,1)

insert into student values(1002,'陈思宇','男',20,88,2)

insert Into student values(1003,'甘小娟','女',20,90,3)

insert into student values(1004,'郭勇','男',20,88,2)

insert into student values(1005,'祝浩琪','男',20,88,1)

--查询部门编号为的学生信息

select * from school ,student where school.pno = 2 and school.pno = student.pno;

select c.pname,s.Sname from school c,student s where c.pno = 3 and c.pno = s.pno;

20141031

第一,字符串的操作

1,char():转换成对应的字母

select CHAR(98)

2,lower():把指定的参数转换成小写

select LOWER('ABCD')

3,upper():把指定的参数转换成大写

select UPPER('abcd')

4,ltrim():去掉指定字符左边的空格

select LTRIM ('    abacd')

5,rtrim():去掉指定字符右边的空格

select RTRIM('      aaaa     ')

6,left():从指定的字符左边方向截取指定个数的字符

select left('今天放假',3)

7,right():从指定的字符右边方向截取指定个数的字符

select right('今天放假',3)

8,replace(arg1,arg2,arg3)替换原有的字符串

--arg1:原始的字符串

--arg2:要被替换的字符串

--arg3:被替换成的字符

select REPLACE('abcdefg','ab','**')

练习:

---练习替换:袁**

select REPLACE ('袁江洪','袁江洪',(select LEFT ('袁江洪',1)+'**'))

select REPLACE('袁江洪','袁江洪',(select left('袁江洪',1)+'**'))

select LEFT ('袁江洪',1)+REPLACE(right('袁江洪',2),right('袁江洪',2),'**')

9,len():返回字符的长度

select LEN ('abcdefg') as'长度'

10,stuff(arg1,int1,int2,arg2):替换指定长度的字符

--arg1:原始的字符

--int1:要替换的起始位置

--int2:替换的长度

--arg2:替换后的字符

select STUFF('abcdef',2,2,'t')

---上题练习

select STUFF('袁江洪',2,LEN('袁江洪')-1,'**')

第二,获取时间

1,getdate()获取当前系统时间

select GETDATE()

2,year()获取指定日期的年份

select YEAR(GETDATE())

3,month()获取指定日期的月份

select MONTH(GETDATE())

4,day():获取指定日期的天数

select day(GETDATE())

5,获取指定格式的日期

方法:conver(a1,a2,type):把指定的日期类型转换为字符类

a1:转换过后的类型

a2:值要转换的类型

type:要转换的格式

select CONVERT(varchar(12),GETDATE(),101)--10/31/2014

select CONVERT(varchar(12),GETDATE(),102)--2014.10.31

select CONVERT(varchar(12),GETDATE(),103)--31/10/2014

select CONVERT(varchar(12),GETDATE(),111)--2014/10/31

--获取具体的时间

select CONVERT(varchar(12),GETDATE(),108)--09:32:03

第三,创建表department并添加部门

1,创建department

create table department(

deptNo int primary key,

deptName varchar(20) not null

)

2,添加部门

insert into department values(10,'外包部')

insert into department values(20,'就业部')

 insert into department values(30,'培训部')

第四,创建表emp并添加成员

 

1,创建emp

create table emp(

Eid int primary key identity(1000,1),

Ename varchar(20) not null,

Esex char(2) check(Esex in('男','女')),

Esal decimal(10,2) default 3000.00,

--decimal:表示可以有小数.10代表一共有多少为,2代表保留几位小数

deptNo int foreign key references department (deptNo)

)

2,添加员工

insert into emp values('张三','男',4500.50,10)

insert into emp values('李氏','女',3500.50,10)

insert into emp values('赵六','男',4500.50,20)

insert into emp values('张大锤','女',5500.50,10)

insert into emp values('欧阳','男',6500.50,20)

insert into emp values('杨过','男',8500.50,10)

insert into emp values('李玉','女',4000.50,30)

insert into emp values('萧山','男',7500.50,30)

insert into emp values('聂云','女',9000.50,20)

insert into emp values('韵律','男',10000.50,10)

insert into emp values('张大三','男',10000.50,10)

insert into emp values('张小三','男',10000.50,10)

insert into emp values('三八','女',0.50,20)

insert into emp values('张','男',10000.50,20)

第五,聚集函数

1,count(*):获取指定字段在当前表中的总共记录数.如果指定的参数是'*'那么获取总计录数

select COUNT (*) 总记录数 from emp 

2,max(字段):返回指定字段的最大值

select MAX(Esal) from emp

3,min(字段):返回指定字段的最小值

select MIN (Esal) from emp

4,AVG(字段):返回指定字段的平均值

select AVG(Esal) from emp

--判断是不是空,进行准确的平均值

select AVG (ISNULL(Esal,0)) from emp

--查询薪资大于平均薪资的员工信息

select * from emp where Esal >(select AVG(Esal) from emp)

5,sum(字段):返回指定字段的总和

select SUM(Esal) from emp

注意:--聚集函数不能出现在where语句中select * from emp where Esal>avg(Esal)

6,聚集函数可以出现的位置:

(1)查询列表中

(2)having语句中

(3)order by 语句中

---聚集函数不可以直接出现在where语句中

 

第六,查找与模糊查找

1,使用不等于符号!= <>

select * from emp where Esal!=10000.50

select * from emp where Esal<>10000.50

2,in()的用法,查询字段在指定的范围之内的记录

select * from emp where Ename in ('张11','张10','张12')

3,like '':模糊查询

--%:代表多个字符

--_:代表一个字符

--[a,b,c]:代表是[]内的之一

--[^abc]:代表除了指定的字符

练习:

(1),查询姓名中有'三'的员工信息

select * FROM emp WHERE Ename like '%三%'

select * from emp where Ename like '三%'

(2),--查询员工李赵杨

select * from emp where Ename like '[李,赵,杨]%'

(3),查询员工不是李赵杨

select * from emp where Ename like '[^李,赵,杨]%'

select * from emp where Ename like  '[李,赵,杨]%' and Esal>(SELECT AVG(Esal) FROM emp )

4,查询某个字段为null的记录is null

select * from emp  where Ename is  null

select * from emp where Ename is not null

5,in not in

select * from emp where Ename not in('张三','李氏') 

第七,分页查询

1,top 获取前几条记录

--*代表每条记录中显示的字段为全部

--5代表显示前条记录

select top 5 * from emp

select top 2 Eid,Ename from emp 

2,分页语句

--当前页数(page),每页显示的记录个数(size)

--语法:select top size * from emp  where Eid not in (

--select top ((page-1)*size) Eid from emp )

例题:

--第一页,每一页显示条记录

select top 2 * from emp  where Eid not in (

select top ((1-1)*2) Eid from emp ) 

--第二页

select top 2 * from emp  where Eid not in (

select top ((2-1)*2) Eid from emp ) 

--第三页

select top 2 * from emp  where Eid not in (

select top ((3-1)*2) Eid from emp )

3,order by 排序

---asc 默认的排序规则,升序

---desc 降序

例题:

(1),薪资升序

select * from emp   order by Esal asc

(2),薪资降序

select * from emp   order by Esal desc

(3),先按照薪资降序,然后按照部门编号降序,然后按照Eid升序

select * from emp order by Esal desc,deptNo desc ,Eid desc

--------练习----------

(1)查询属于号部门并且薪资大于平均值的员工的信息,并且按照薪资的降序排列

select * from emp where deptNo = 20 and Esal>(

select AVG(Esal) FROM emp) order by Esal desc

(2)查询姓名为张三或者李氏部门为10号部门

select * from emp where deptNo = 10 and Ename IN ('张三','李氏')

4,分组group by

--一般与聚集函数一起用(avg , count ,max ,min ,sum)

例题:

(1)部门薪资的平均值

select deptNo ,avg(Esal) 薪资 from emp group by deptNo

(2)查询部门人数

select deptNo ,count(*) 薪资 from emp group by deptNo

(3)部门薪资最高的值

select deptNo ,max(Esal) 薪资 from emp group by deptNo

(4)部门最低的薪资值

select deptNo ,min(Esal) 薪资 from emp group by deptNo

(5)部门薪资的总和

select deptNo ,sum(Esal) 薪资 from emp group by deptNo

练习

(1)查询每个部门薪资大于本部门平均薪资的员工信息

方法一:

select * from emp where deptNo = 10 and Esal >(

select AVG(Esal) from emp where deptNo = 10 ) or

deptNo = 20 and Esal >(

select AVG(Esal) from emp where deptNo = 20) or

deptNo = 30 and Esal >(

select AVG(Esal) from emp where deptNo = 30) order by deptNo

方法二:

--多表查询

select Eid,Ename,Esex,Esal,emp.deptNo from emp,(select deptNo ,AVG(Esal) sal from emp group by deptNo) t 

where emp.deptNo = t.deptNo and emp .Esal>t.sal

 

(2)查询每个部门薪资平均薪资

select deptNo ,AVG(Esal) from emp group by deptNo

20141101

第一,添加数据

1,创建表DEPT01

 CREATE TABLE DEPT01(

   DEPTNO INT PRIMARY KEY,

   DNAME VARCHAR(20) NOT NULL UNIQUE,

   LOC VARCHAR(20) NOT NULL--部门地址

   )

 2,创建表EMP01

 CREATE TABLE EMP01(

    EMPNO char(4) not null unique,

    ENAME VARCHAR(20) NOT NULL UNIQUE,

    JOB VARCHAR(20)  ,

    MGR CHAR(4) NOT NULL,--上级

    HIREDATE VARCHAR(15),--入职时间

    SAL DECIMAL(8,2)NOT NULL,

    COMM DECIMAL(8,2),--奖金

    DEPTNO INT FOREIGN KEY REFERENCES DEPT01(DEPTNO) 

   )

3,添加数据

  修改属性 

ALTER TABLE EMP01 ALTER COLUMN JOB VARCHAR(20) NOT NULL

    ALTER TABLE EMP01 ALTER COLUMN MGR CHAR(4) 

   

  INSERT INTO DEPT01 VALUES(10,'ACCOUNTING','NEW YORK')

  INSERT INTO DEPT01 VALUES(20,'RESEARCH','DALLAS')

  INSERT INTO DEPT01 VALUES(30,'SALES','CHICAGO')

  INSERT INTO DEPT01 VALUES(40,'OPERATIONS','BOSTON')

  SELECT * FROM EMP01

     

 INSERT INTO EMP01 VALUES('7369','SMITH','CLERK','7902','1980/12/17',800.00,NULL,20);

 INSERT INTO EMP01 VALUES('7499','ALLEN','SALESMAN ','7698','1981/2/20',1600.00,300.00,30);

 INSERT INTO EMP01 VALUES('7521','WARD','SALESMAN','7698','1981/2/22',1250.00,500.00,30)

 INSERT INTO EMP01 VALUES('7566','JONES','MANAGER','7839','1981/4/2',2975.00,NULL,20);

 INSERT INTO EMP01 VALUES('7654','MARTIN','SALESMAN','7698','1981/9/28',1250.00,1400.00,30);

 INSERT INTO EMP01 VALUES('7698','BLAKE','MANAGER','7839','1981/5/1',2850.00,NULL,30);

 INSERT INTO EMP01 VALUES('7782','CLARK','MANAGER','7839','1981/6/9',2450.00,NULL,10);

 INSERT INTO EMP01 VALUES('7788','SCOTT','ANALYST','7566','1987/4/19',3000.00,NULL,20);

 INSERT INTO EMP01 VALUES('7839','KING','PRESIDENT',NULL,'1981/11/17',5000.00,NULL,10);

 INSERT INTO EMP01 VALUES('7844','TURNER','SALESMAN','7698','1981/9/8',1500.00,0.00,30);

 INSERT INTO EMP01 VALUES('7876','ADAMS','CLERK','7788','1987/5/23',1100.00,NULL,20);

 INSERT INTO EMP01 VALUES('7900','JAMES','CLERK','7698','1981/12/3',950.00,NULL,30);

 INSERT INTO EMP01 VALUES('7902','FORD','ANALYST','7566','1981/12/3',3000.00,NULL,20);

 INSERT INTO EMP01 VALUES('7934','MILLER','CLERK','7782','1982/1/23',1300.00,NULL,10);

第二,多表查询

1,快速添加数据

insert into emp (Ename,Esex,Esal,deptNo) SELECT Ename ,Esex,Esal,deptNo from emp 

2,如果多表联合查询就会产生笛卡尔集,我们就需要在后面添加条件

---D.DEPTNO = E.DEPTNO  条件的个数为表的个数-1

select * from EMP01 E,DEPT01 D WHERE D.DEPTNO = E.DEPTNO

例如:

(1)查询号部门下的所有员工信息以及部门信息

select D.DEPTNO,D.DNAME,D.LOC,E.EMPNO,E.JOB,E.SAL from EMP01 E ,DEPT01 D where E.DEPTNO = D.DEPTNO AND D.DEPTNO = 10

 

(2)查出比SMITH或ALIEN薪资高的员工,以及部门信息

select E2.EMPNO,E2.ENAME,E2.SAL,D.DNAME from EMP01 E1,EMP01 E2,DEPT01 D where E1.ENAME in('SMITH','ALIEN') 

and E2.SAL>E1.SAL AND E2.DEPTNO=D.DEPTNO

3,anyall 的区别

(1)any 如果有一个字段要与多个字段进行比较.用ANY表示:当这个字段比后面要比较的字段大(小),只要满足一个就成立

(2)all 如果有一个字段要与多个字段进行比较.用all表示:当这个字段比后面要比较的字段大(小),都要满足才成立

第三,多表的联合查询

--左连接,右连接,内连接,自连接

1,左连接: 表名LEFT JION 表名ON 条件

select * from EMP01 E LEFT JOIN DEPT01 D ON E.DEPTNO = D.DEPTNO

2,右连接: 表名RIGHT JOIN 表名ON 条件

SELECT * FROM EMP01 E RIGHT JOIN DEPT01 D ON E.DEPTNO = D.DEPTNO

 

3,内连接: 表名JOIN  表名ON 条件

SELECT * FROM EMP01 E JOIN DEPT01 D ON D.DEPTNO = E.DEPTNO

SELECT * FROM EMP01 E,DEPT01 D WHERE D.DEPTNO = E.DEPTNO

第四,练习

---------练习---------

--1.列出至少有一个员工的所有部门编号,名称,并统计出这些部门的平均工资.最高工资

SELECT D.DEPTNO,D.DNAME,AVG(E.SAL)'平均薪资',MAX(E.SAL)'最高薪资' FROM EMP01 E,DEPT01 D WHERE E.DEPTNO = D.DEPTNO GROUP BY D.DEPTNO,D.DNAME

 

SELECT D.DEPTNO,D.DNAME,AVG(E.SAL)'平均薪资',MAX(E.SAL)'最高薪资' FROM EMP01 E,DEPT01 D WHERE E.DEPTNO = D.DEPTNO GROUP BY D.DEPTNO,D.DNAME

HAVING AVG (SAL)>0

 

--2.列出薪金比“SMITH”或“ALLEN”多的所有员工的编号姓名部门名称其领导姓名

 

SELECT E.EMPNO '编号',E.ENAME '姓名',D.DNAME '部门',E1.ENAME'领导姓名'FROM EMP01 E,DEPT01 D,EMP01 E1 WHERE E.SAL>ANY(

SELECT SAL FROM EMP01 WHERE EMP01.ENAME IN ('SMITH','ALIEN')) AND D.DEPTNO = E.DEPTNO AND E.MGR = E1.EMPNO

--3.列出所有员工的编号,姓名及其直接上级的编号姓名,显示的结果按领导的年工资的降序排列

SELECT E1.EMPNO'员工编号',E1.ENAME'员工姓名',E2.EMPNO'上级编号' ,E2.ENAME'上级姓名' ,(E2.SAL+ISNULL(E2.COMM,0))*12 AA  FROM EMP01 E1,EMP01 E2

 WHERE E1.MGR = E2 .EMPNO  ORDER BY AA DESC

 

--4.列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数

 

SELECT E1.EMPNO'员工编号',E1.ENAME'员工姓名',D.DNAME'部门姓名',D.LOC'部门位置',A.C'部门人数'  FROM EMP01 E1,EMP01 E2,DEPT01 D,( SELECT  DEPTNO , COUNT(*) C FROM EMP01 GROUP BY DEPTNO)A WHERE E1.DEPTNO = D.DEPTNO AND D.DEPTNO = A.DEPTNO AND E1.MGR = E2.EMPNO  AND  CONVERT(VARCHAR(15), E1.HIREDATE,111)<CONVERT(VARCHAR(15), E2.HIREDATE,111)

 

--5.列出部门名称和这些部门的员工的信息(数量、平均工资),同时列出那些没有员工的部门

 

SELECT D.DNAME'部门名称',A.C'部门人数',A.S'平均工资' FROM DEPT01 D LEFT JOIN ( SELECT  DEPTNO , COUNT(*) C ,AVG(SAL)S  FROM EMP01 GROUP BY DEPTNO)A ON A.DEPTNO = D.DEPTNO  GROUP BY D.DNAME,A.C ,A.S

 

--6.列出所有"clerk"(办事员)的姓名及其部门的名称,部门的人数

SELECT E.ENAME'员工姓名',D.DNAME'所在部门',A.C'部门人数'  FROM EMP01 E,DEPT01 D,( SELECT  DEPTNO , COUNT(*) C FROM EMP01 GROUP BY DEPTNO)A WHERE E.DEPTNO=D.DEPTNO AND D.DEPTNO=A.DEPTNO AND E.JOB='CLERK'   

 

--7.列出最低薪金大于的各种工作及此从事工作的全部雇员人数及所在部门名称、位置、平均工资 

SELECT J.JOB,D.DNAME,D.LOC,J.C,AVG(E.SAL)  FROM EMP01 E,DEPT01 D,(SELECT DEPTNO,JOB,COUNT(*)C FROM EMP01 WHERE SAL>1500 GROUP BY DEPTNO ,JOB)J WHERE E.DEPTNO=D.DEPTNO AND D.DEPTNO = J.DEPTNO  GROUP BY J.JOB,D.DNAME,D.LOC,J.C

 

--8.列出在部门“SALES”(销售部)工作的员工的姓名、基本工资、雇佣日期,部门名称,假定不

SELECT E.ENAME'员工姓名',E.SAL'基本工资',E.HIREDATE'雇佣日期',D.DNAME'部门名称' FROM EMP01 E,DEPT01 D WHERE E.DEPTNO = D.DEPTNO AND D.DNAME = 'SALES'

 

--9.列出薪金高于公司平均薪金的所有员工,所在的部门,上级领导

SELECT E1.EMPNO,E1.ENAME,D.DNAME,E2.ENAME FROM EMP01 E1,EMP01 E2  ,DEPT01 D WHERE E1.DEPTNO = D.DEPTNO AND E1.MGR = E2.EMPNO AND E1.SAL >(SELECT AVG(SAL) FROM EMP01 )  

 

--10.列出与‘SCOTT’从事相同工作的所有员工及部门名称,部门人数

SELECT E.EMPNO,E.ENAME,E.JOB,E.MGR,E.HIREDATE,E.SAL,E.COMM,E.DEPTNO,D.DNAME,D.LOC ,A.T '部门人数'  FROM EMP01 E , DEPT01 D ,(SELECT  DEPTNO , COUNT(*) T FROM EMP01 GROUP BY DEPTNO)A WHERE E.DEPTNO = D.DEPTNO AND A.DEPTNO = D.DEPTNO

AND E.JOB = (SELECT JOB FROM EMP01 WHERE  ENAME = 'SCOTT') 

---查部门人数

SELECT E.ENAME ,D.DEPTNO , A.T FROM EMP01 E,DEPT01 D ,(SELECT  DEPTNO , COUNT(*) T FROM EMP01 GROUP BY DEPTNO)A WHERE E.DEPTNO = D.DEPTNO AND A.DEPTNO = D.DEPTNO    GROUP BY D.DEPTNO ,E.ENAME, A.T

 

--12.列出薪金高于部门工作的所有员工的薪金的员工姓名和薪金、部门名称

SELECT E.ENAME'员工姓名',E.SAL'员工薪金',D.DNAME'所在部门' FROM EMP01 E,DEPT01 D WHERE E.DEPTNO = D.DEPTNO AND E.SAL>ALL( SELECT SAL FROM EMP01 WHERE DEPTNO = 30 )

 

--13.列出每个部门工作的员工数量、平均工资和平均服务期限

SELECT D.DNAME'部门名称',A.C'部门人数',A.S'平均工资' FROM DEPT01 D LEFT JOIN ( SELECT  DEPTNO , COUNT(*) C ,AVG(SAL)S  FROM EMP01 GROUP BY DEPTNO)A ON A.DEPTNO = D.DEPTNO  GROUP BY D.DNAME,A.C ,A.S

 

--14.列出所有员工的姓名、部门名称和工资

SELECT E.ENAME'员工姓名',D.DNAME'部门名称',(E.SAL+ISNULL(E.COMM,0))'工资' FROM EMP01 E,DEPT01 D WHERE E.DEPTNO = D.DEPTNO

 

--15.列出所有部门的详细信息和部门人数

SELECT D.DEPTNO'部门编号',D.DNAME'部门名称',D.LOC'部门地址',A.C'部门人数' FROM DEPT01 D LEFT JOIN ( SELECT DEPTNO,COUNT(*)C FROM EMP01 GROUP BY DEPTNO )A ON A.DEPTNO = D.DEPTNO

 

--16.列出各种工作的最低工资及从事此工作的雇员姓名

SELECT J.JOB'工作',E.ENAME'姓名' ,J.M'工资' FROM EMP01 E,(SELECT JOB,MIN(SAL)M FROM EMP01 GROUP BY JOB)J WHERE E.JOB =J.JOB AND E.SAL = J.M

 

SELECT JOB,MIN(SAL)M FROM EMP01 GROUP BY JOB

 

--18.列出所有员工的年工资,所在部门名称,按年薪从低到高排列

SELECT  E.DEPTNO'部门编号',D.DNAME'部门名称'  ,E.ENAME'员工姓名',(E.SAL+ISNULL(E.COMM,0))*12'年薪' FROM EMP01 E,DEPT01 D WHERE E.DEPTNO = D.DEPTNO ORDER BY SAL asc

 

--19.查出某个员工的上级主管级所在部门名称,并要求出这些主管中的薪水超过

 

 

 

--20.求出部门名称中,带‘S’字符的部门员工的工资合计、部门人数

SELECT D.DNAME,A.C,A.S FROM DEPT01 D LEFT JOIN (SELECT DEPTNO, COUNT(*)C ,SUM(SAL)S FROM EMP01 GROUP BY DEPTNO )A  ON D.DNAME LIKE'%S%' AND D.DEPTNO = A.DEPTNO

20141103

第一,声明变量

方法:声明变量用declare @变量名 类型,@变量名类型.....

--变量赋值用set(或者select) @变量名= 值;

--查询变量:select @变量名;

--每条语句用';'结尾

1,定义变量

DECLARE

@NAME VARCHAR(15),

@AGE INT

2,变量赋值

SET @NAME = '张三';

SET @AGE = 18;

select @AGE=20;

3,查询

select @NAME;

select @AGE;

4,把某一个变量的值赋给别人

declare

@eid int

 set @eid = 1001;

 select * from emp where Eid = @eid;

 

5,把查询的的值赋给变量

 declare 

 @avg decimal(8,2)

select @avg = AVG(esal) from emp;

select @avg'平均工资';

第二循环语句

1,数据库中的代码块用BEGIN ... END 包含起来(类似与java{}的意思)执行时是一个整体

BEGIN

SELECT * FROM EMP

 

END

2,数据库中的if语句

declare 

@eid int

select @eid = 1111;

if exists(select * from emp where Eid = @eid)

begin

select *from emp where Eid=@eid;

end

else

select '当前编号对应的用户不存在'

3,消除重复

---distinct 去除重复的记录显示,根据指定的字段

--相同的标准:distinct后面的查询字段都相同时才算重复

select distinct ename from emp

--查询总共记录(消除重复的记录)

select COUNT(distinct Ename)from emp

select *from emp

4,练习if语句

--题目:输入用户名,密码,判断当前的用户名是否存在

---如果用户名错误就提示用户名错误

---如果密码错误就提示密码错误

---否则就提示登陆成功

declare

@ename varchar(20),

@eid int

set @ename = '张三大';

set @eid = 1001;

 

if exists(select * from emp where Ename = @ename)

begin

if exists(select * from emp where Ename = @ename and Eid = @eid)

select '登陆成功'

else

select '密码错误'

end

else

select '用户名错误'

-----------老师答案---

--创建用户表

create table users(

username varchar(20),

userpass varchar(20)

)

insert into users values ('呵呵','123456')

declare 

@name1 varchar(20),

@pass varchar(20),

@msg varchar(20)

set @name1 ='呵呵';

set @pass = '123456';

if exists(select * from users where username = @name1)

begin

if exists(select * from users where username = @name1 and userpass = @pass)

begin

set @msg = '登陆成功'

select @msg;

end

else begin

set @msg = '输入的用户密码错误'

select @msg;

end

end

else begin

set @msg = '输入的用户名不存在'

select @msg;

end

5,goto 是指定程序到某一个标记处执行

--定义标记:标记名+':'

练习:

(1)用if打印出-10的和

declare 

@i int = 1,

@sum int =0

bc:--定义一个标签

if @i<=10

begin

set @sum+=@i;

set @i= @i+1;

goto bc;

end

select @sum;

(2)求-100的偶数和

declare 

@i int = 1,

@sum int = 0;

--用if

bc:

if @i<=100

begin if @i%2 =0

begin

set @sum +=@i;

set @i +=2;

goto bc; 

end else

begin

set @i +=1;

goto bc; 

end

end

select @sum

(3)用while求-100偶数和

declare

@i int = 1,

@sum int = 0

 

while @i<=100

begin if @i%2 =0

begin

set @sum +=@i;

set @i +=2;

end else

set @i +=1;

end

select @sum

第三,设置等级以及在指定的时间去执行

1,判断设置等级

--语法:  case when 条件then 等级名称 when 条件then .....end

select * from EMP01

 

select ename,JOB,DEPTNO,'等级'=case 

when SAL>=4000 then '白领'

when SAL>=3000  and sal <4000 then '蓝领'

when SAL<3000 then '黑领' end from EMP01

2,waitfor delay sql在指定时间后再去执行

--语法: waitfor delay :设置sql语句等待指定的时间后执行

--时间格式:00:00:00

declare

@deptno int =20

waitfor delay '00:00:05';

select * from EMP01 where DEPTNO = @deptno

3,waitfor time sql在指定时间(0-24小时)点再去执行

--语法: waitfor time :设置sql语句等待指定的时间点执行

 

declare

@deptno int =20

waitfor time '10:05:00';

select * from EMP01 where DEPTNO = @deptno

第四,事物与异常

1,方法:

--开启事物:begin transaction

--开启异常处理机制:begin try

 

--需要处理的内容代码

--提交事物:commit transaction

--end try

--处理异常:begin catch

--出现异常回滚数据:rollback transaction

--end catch

2,例题:

declare

@name2 varchar(20)='张三',

@pass2 varchar(20)='1234',

@num int

--开启事物

begin transaction

--开启异常处理机制

begin try

--制造一个会出现异常的代码

set @num = 10/0;

--添加数据

insert into users values(@name2,@pass2);

--提交事物

commit transaction

end try

--处理异常

begin catch

--回滚数据

rollback transaction

end catch

3,练习--往银行里进行转账

2-1,自己所写

create table yinhang(

name varchar(15),

pass varchar(15),

money decimal(10,2)

)

insert into yinhang values('李氏','123456',50000);

insert into yinhang values('张三','12345',4000);

declare 

@name3 varchar(15),

@pass3 varchar(15),

@tonum varchar(20),

@len int,

@cm int

set @name3 = '李氏';

set @pass3 = '123456';

set @tonum ='张三'

set @len = 1000;

 

if exists(select * from yinhang where name = @name3)

begin if exists(select * from yinhang where name = @name3 and pass = @pass3 )

begin

begin try

begin transaction

if exists(select money from yinhang where name = @name3 and pass = @pass3 and money >@len)

begin

update yinhang set money=(select money from yinhang where name = @name3 and pass = @pass3)-@len where name = @name3 and pass = @pass3;

update yinhang set money=(select money from yinhang where name = @tonum )+@len where name =@tonum ;

--自己制造一个异常

--余额不会改变

set @cm = 10/0;

end

else

begin 

select '余额不足'

--提交事物

end  commit transaction

end try

begin catch

select '出现异常'

--回滚数据

rollback transaction

end catch

end else 

select '密码错误'

end else

select '账户不存在'

select * from yinhang

2-2老师答案

create table zhanghu(

num varchar(20)not null unique,

yue decimal(9,2)

)

insert into zhanghu values ('100001',5000);

insert into zhanghu values ('100002',5000);

declare 

@fromnum varchar(20),

@tonum varchar(20),

@m decimal(9,2),

@c int

set @fromnum = '100001';

set @tonum = '100002';

set @m = 1000;

begin try

begin transaction

update zhanghu set yue = yue-@m where num = @fromnum;

set @c = 10/0;

update zhanghu set yue = yue+@m where num = @tonum;

commit transaction

end try

begin catch

rollback transaction

end catch

select * from zhanghu

第五,存储过程

1,创建一个没有参数的存储过程

--语法:create procedure 名字as 实现的代码

GO

CREATE PROCEDURE  STU_EMP

AS

SELECT * FROM EMP;

2,查看用户定义的存储过程

select*from SYSOBJECTS WHERE TYPE= 'P'

3,删除存储过程

drop proc stu_emp

4,调用存储过程

exec STU_EMP

5,查看定义的存储过程实现的代码

exec sp_helptext 'stu_emp'

6,创建一个加密的存储过程用:with encryption

go

create procedure stu_test

with encryption

as

select * from emp;

 

--查看定义的存储过程实现的代码

exec sp_helptext 'stu_test' --对象'stu_test' 的文本已加密。

 

7,创建有参数的过程

--创建方法:create procedure 名字(@变量类型) as 实现方法

--调用方法:exec 名字变量

go

create procedure stu_input(

@eid int

)

as

select * from emp where Eid = @eid;

 

--调用有参数的存储过程

declare

@eid int

set @eid = 1001;

exec stu_input @eid

8,创建一个有输入和输出的过程

--输入后加:in(也可以不加)

--输出后加:out

--既可以输入有可以输出用:output

go

create procedure stu_output(

@eid int,

@esal decimal(7,2) out

)as

select @esal = esal from emp where Eid = @eid;

 

--调用stu_output存储过程函数

declare

@re decimal(7,2)

exec stu_output '1001',@re out;

select @re;

第六,用存储过程实现分页

1,常见的分页方法

1-1分页语句一:

--当前页数(page),每页显示的记录个数(size)

--语法:select top size * from emp  where Eid not in (

--select top((page-1)*size) Eid from emp )

select top 2 * from emp where Eid not in(select top((2-1)*2)Eid from emp)

1-2分页语句二:

--当前页数(page),每页显示的记录个数(size)

--语法:select * from (select ROW_NUMBER()over(order by 主键或者要分页的键值) rowid,* from 表名)temp

--where rowid between  (( page-1 )*size + 1) and page*size

--between ...and..之间是显示的从哪条记录到哪条记录,所以分页时要计算出当前页的值

select * from (select ROW_NUMBER()over(order by eid) rowid,* from emp)temp where rowid between 1 and 5

2,创建一个分页存储过程

--分析:因为要传送表名,但是只能定义成字符行的,所以不能让它直接执行,要先转换成字符串然后调用时进行执行

--创建分页存储

--create procedure fenye(

--@tablename  varchar(20),--表名

--@currpage int,--页数

--@pagesize int--每页显示的个数

--)as

--创建接受方法语句的变量

--declare

--@sql varchar(200)--方法变量字符串

--set @sql='方法实现的字符串'

--exec(@sql);--运行该字符串语句

--检查指定的存储过程是否存在,存在删除

if exists(select * from sysobjects where type = 'fenye')

drop proc fenye;

3,第一种分页

go

create procedure fenye(

@tablename  varchar(20),

@currpage int,

@pagesize int

)as

declare

@sql varchar(200)

set @sql='select top '+cast(@pagesize as varchar(15))+' * from  '+@tablename+'  where Eid not in (

select top (('+cast(@pagesize as varchar(15))+'-1)*'+cast(@pagesize as varchar(15))+') Eid  from '+ @tablename+');' 

exec(@sql);

--删除fenye

drop proc fenye;

--查询

exec fenye 'emp',2 ,3;

4,第二种分页

go

create procedure fenye1(

@tablename  varchar(20),

@begin int,

@end int

)as

declare

@sql varchar(200)

set @sql= 

'select * from ( select ROW_NUMBER()over(order by eid)rowid,* from '+@tablename+')temp where rowid between '+cast( (((@begin-1)*@end)+1) as varchar(15))+' and '+convert(varchar(15),(@begin*@end))+' ; '

exec(@sql);

 

--删除分页存储函数fenye1

drop proc fenye1;

 

--使用fenye1进行分页

exec fenye1 'emp',2 ,4;

select * from emp

5,分页语句三::通用的

 

select * from (select ROW_NUMBER()over (order by eid)rowid ,* from emp )temp where rowid between 1 and 5

 

go

create proc sp_paging(

@tbname varchar(20),--表名

@sortcolumn varchar(10),--排序列段

@column varchar(200) ,--列表

@selection varchar(200),--查询条件

@currentpage int,--当前列

@pagesize int --每页的记录数

)

as

declare

@sql varchar(1000)

if @column=''or @column is null

begin

set @column = '*';

end

if @selection != '' and @selection is  not null

begin

set @selection = ' where '+@selection;

end

 

--select * from (select ROW_NUMBER()over (order by eid)rowid ,* from emp )temp where rowid between 1 and 5

set @sql ='select '+@column+' from (select ROW_NUMBER()over (order by '+@sortcolumn+' )rowid ,* from '+@tbname+' '+

@selection+' )temp where rowid between '+convert(varchar(15),((@currentpage-1)*@pagesize+1))+' and '+convert(varchar(15),(@currentpage*@pagesize+1))

exec (@sql);

 

drop proc sp_paging;

exec sp_paging 'emp','eid','*','',1,3;

6,转换函数:cast( as 类型),convert(类型,)

Case(  12 , varchar(15)  )

Convert(  varchar(15) , 12)

 

7,有默认值的过程

go

create proc getname(

@name varchar(10) = '%张%'

)as

select * from emp where Ename like @name;

 

exec getname;

exec getname '%李%';

20141104

第一,游标

1,游标:对表进行遍历

--定义,开启,关闭,释放

步骤:(1)创建游标

create procedure 游标名 as 

declare--定义一个游标

游标名 cursor for select 列名 from 表名

declare --创建变量接收列名值

@变量名

(2)开启游标

open 游标名 ;

 

(3)获取游标指定的值

fetch next from 游标名  into @变量名;

 

(4)必要的语句

 

(5)关闭游标

close stu_curso

(6)释放游标

deallocate stu_cursor

2,删除游标

drop proc stu_test01;

第二,用游标创建等级

1,创建学生表和分数等级表并添加数据

create table student01(

stu_id int primary key,

stu_name varchar(15),

stu_score decimal(3,1)

)

create table stu_grade(

stu_id int not null,

stu_name varchar(15),

grade varchar(10)

)

insert into student01 values(10001,'小明',65);

insert into student01 values(10002,'小红',70);

insert into student01 values(10003,'小张',80);

insert into student01 values(10004,'小李',90);

insert into student01 values(10005,'小笨',55);

2,创建游标stu_test01实现功能

create procedure stu_test01

as 

declare

--定义一个游标

stu_cursor cursor for select stu_id,stu_name,stu_score from student01

declare 

@stu_id int ,@stu_name varchar(15),@stu_score decimal(3,1)

--开启游标

open stu_cursor;

--获取游标指定的值

fetch next from stu_cursor into @stu_id,@stu_name,@stu_score;

while @@FETCH_STATUS = 0

begin

if @stu_score>=60 and @stu_score<70

begin

insert into stu_grade values(@stu_id,@stu_name,'D');

end else if @stu_score>=70 and @stu_score<80

begin

insert into stu_grade values(@stu_id,@stu_name,'C');

end else if @stu_score>=80 and @stu_score<90

begin

insert into stu_grade values(@stu_id,@stu_name,'B');

end else if @stu_score>=90 and @stu_score<100

begin

insert into stu_grade values(@stu_id,@stu_name,'A');

end 

else 

 insert into stu_grade values(@stu_id,@stu_name,'E');

fetch next from stu_cursor into @stu_id,@stu_name,@stu_score

end

--关闭游标

close stu_cursor

--释放游标

deallocate stu_cursor

第三,创建实现查找学生分数等级的游标

create proc stu_test02

as

declare

stucurcor cursor for select stu_id,stu_name from student01 

declare

@stuid int ,@stuname varchar(15)

open stucurcor;

fetch next from stucurcor into @stuid,@stuname;

while @@FETCH_STATUS = 0

begin

select * from stu_grade where stu_id = @stuid and stu_name = @stuname;

fetch next from stucurcor into @stuid,@stuname;

end

close stucurcor;

deallocate stucurcor;

 

exec stu_test02;

第四,创建一个可以自由移动的游标

create proc stu_test03

as

declare cursor03 cursor scroll for select stu_id ,stu_name from student01

declare 

@stu_id int ,@stu_name varchar(15)

--开启游标

open cursor03;

--定位最后一行

fetch last from cursor03 into @stu_id ,@stu_name;

select @stu_id;

select @stu_name;

--关闭游标

close cursor03;

--释放游标

deallocate cursor03;

--自由定位

--fetch last[first, next,last,absolute,relative] from....

--定位到第行

--fetch absolute 3 from cursor03 into @stu_id ,@stu_name;

drop proc stu_test03;

exec stu_test03;

第五,触发器

1,触发器介绍以及分类

--为某个表的insert或update或delete语句绑定一个事件,当我们操作该表时候,就会触发该事件

--分类:alter:后触发器.在指定的sql语句执行完毕后才触发

--instead of:替代触发器.替代指定的sql语句,这时不会执行替代的sql语句只执行该触发器

--每个触发器都有系统提供的两张临时表inserted,deleted,触发器结束后也消失

--insert触发器:当前表如果执行insert语句的时候会在当前表中添加一条记录,同时也会把

--该记录添加到inserted表中.

--update触发器:当前表执行update语句的时候,会把旧记录存入deleted表中,然后把新纪录

--添加到当前表中,最后会把新纪录也添加到inserted表中

--delete触发器:当前表执行delete语句时,会把记录存入deleted表中.

2,创建实现触发器的学生表和借书表

2-1创建学生表

create table stu(

stu_id int primary key ,

stu_name varchar(15)

)

drop table stu

2-2借书表

create table borrowrecord(

stu_id int primary key ,

borrownum int,

rebook int

)

insert into stu values(10001,'老王')

insert into stu values(10002,'老李')

insert into borrowrecord values(10001,2,1)

insert into borrowrecord values(10002,3,2)

3,后触发器alter

--需求:在修改学生表中的id时也修改借书表中对应学生的id

go

create trigger updatestuid

on stu after update

as

declare

@oldid int,

@newid int

--找到旧记录中的stu_id

select @oldid=stu_id from deleted;

--找到新记录中的stu_id

select @newid=stu_id from inserted;

--修改借书表中对应的学生的stu_id

update borrowrecord set stu_id = @newid where stu_id = @oldid;

 

--修改stu_id触发update触发器

update stu set stu_id = 10003 where stu_id = 10001;

--查询是否触发

select * from stu

select * from borrowrecord

4,替代触发器instead of

--需求:往stu表中添加数据,但是不会添加进去,添加进去指定的数据

go

create trigger insterstu

on stu instead of insert

as

insert into stu values('10001','隔壁韩大爷')

--添加数据出发替代触发器instead of

insert into stu values('10005','隔壁老王')

select * from stu

5,删除触发器

drop trigger insterstu;

6,查看当前用户定义的触发器

--type = 'tr(触发器)'[p(存储过程),u(当前用户的表)]

select * from sysobjects where type = 'tr';

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值