sql 记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35781178/article/details/82932458

use 北风贸易
go
--查看约束sp_helpconstraint
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  

--聚合函数,求总数量
with t as(
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  
)select SUM (订单数量) from t 

--最多,接的订单第一名,排名次
with t as
(
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  
)select*,(select COUNT (*) from t as s where s.订单数量<t.订单数量)+1 as'名次' from t where
((select COUNT (*)from t as s where s.订单数量<t.订单数量)+1)=1
order by 名次 asc

--每个快递公司接的订单数量
select COUNT(订货主档.订单号码)as'数量',货运公司 .货运公司名称  from 订货主档 right join 货运公司 on 订货主档.送货方式=货运公司 .货运公司编号
group by 货运公司 .货运公司名称

---10254的接的订单总价
select 订货主档.订单号码,订货明细.产品编号,订货明细 .单价*订货明细 .数量*(1-订货明细 .折扣)as'总价' from 订货主档 inner join 订货明细 on 订货主档.订单号码=订货明细.订单号码
where 订货主档.订单号码=10254
---按着畅销商品的程度排序
select 产品数据.产品编号,产品数据.产品,COUNT (订货明细 .订单号码)as'数量' from 产品数据 inner join 订货明细 on 产品数据.产品编号=订货明细.产品编号
group by 产品数据.产品编号,产品数据.产品
order by 数量 desc

---------------------------------------------------------------------------------------
--rank()over 用于排序--
with t as (
select 员工.姓名,count(订货主档.订单号码) as '订单数量' from 员工 left join 订货主档
on 员工.员工编号 = 订货主档.员工编号
group by 员工.姓名
)  select*,RANK()over(order by 订单数量 desc)as'名次' from t 
------------------------------------------------------------------------------------------
--排名
with t as(
select 身份证号码,语文成绩,RANK()over(order by 语文成绩 desc)as'名次' from 成绩 
)
select*from t  where 名次=1
--前三名
select 身份证号码 ,语文成绩,(select COUNT(*)from 成绩 as t where 成绩.语文成绩<t.语文成绩)+1 as'名次' from 成绩 where
((select COUNT (*)from 成绩 as t where 成绩.语文成绩<t.语文成绩)+1)<=3
-------------------------------------------------------------------------------------
use stuDB 
go
--学习c#的人
select stuName from stuInfo where stuNo in(
select stuNo from stuMarks where courseNo in( 
select courseNo from course where courseName='c#'
)
)
--三表连接,c# and score <60 的人
select *from stuInfo inner join stuMarks on
stuInfo.stuNo=stuMarks.stuNo inner join course  on
stuMarks.courseNo=course .courseNo where
course .courseName='c#' and stuMarks.marks<60
------------------------------------------------------------------------------------
--拷贝
use 北风贸易
go
select* into a from 成绩  
--拷贝表结构不带数据
select*into b from 成绩 where 1>23
-------------------------------------------------------------------
--交叉报表
create table info
(
   sid int identity primary key,
    chinese int,
    math int  
)
insert into info values(100,150)
insert into info values(200,0)
insert into info values(-9,185)
insert into info values(198,199)
insert into info values(186,89)
insert into info values(20,-1)
insert into info values(50,50)
--all
select*from info where chinese >all(select math from info )
select*from info where chinese<all(select math from info)
select * from info where chinese  >any
(
    select math from  info
)

select * from info where chinese  <any
(
    select math from  info
)
----------------------------------------------------------------------------------------
use stuDB 
go 
select*from teacher 
select*from teachinginfo

select teacher .EmpNo,teacher .EmpName,t.总课时费 from(
select empno,classHour *payPerHour as'总课时费' from teachingInfo where EmpNo in
(
select EmpNo from teacher where department !='计算机系'
)
) t inner join teacher on teacher .EmpNo=t.EmpNo  where t.总课时费>all(

select classHour *payPerHour as'总课时费' from teachingInfo where EmpNo in
(
select EmpNo from teacher where department ='计算机系'
))
---------------------------------------------------------------------------------
--赋值
declare @numA int = 10,@numB int = 20,@sum int
set @sum = @numA+@numB
print convert(char(2),@numA)+'+'+convert(char(2),@numB)+'='+convert(char(3),@sum)
--乘法口诀表
declare @i int=1,@j int=1;
declare @temp varchar(1000)=''
while(@i<=9)
begin 
    set @j=1;
    while(@j<=@i)
    begin
     set @temp +=convert (varchar(5),@j)+'*'+CONVERT(char(2),@i) +'='+CONVERT(char(2),@i*@j)+'   '
     set @j=@j+1;
    end
    print @temp;
    set @temp ='' ;
    set @i=@i+1
end
-------------------------------------------------------------
--交叉报表
create database MyDB
use myDB
create table friend
(
  fid int identity primary key,
  fname varchar(20),
  dislikeMe bit,
  LoveToShe bit
)
insert into friend values('吴彤彤',1,1)
insert into friend values('王飘',0,1)
insert into friend values('董丹丹',1,1)
insert into friend values('虫虫',1,1)
insert into friend values('小慧',0,0)
select*from friend
select fid as'编号',fname as'名',case dislikeMe
when 1 then '喜欢'
when 0 then '不喜欢' end as '爱', case lovetoshe
when 1 then '喜欢'
else '不' end as '恨' from friend   
---------------------------------------------------------------------
--开启事务
USE 北风贸易 
go
begin tran aa
select*from 表名 
save tran a
rollback tran c--事务回滚
commit tran aa--提交
-------------------------------------------------------------------
--重新命名数据库
 sp_rename 'stuDB','yu'
 --查看索引
sp_helpindex 表名 
------------------------------------------------------------
--创建视图
create view 名字
as
--(代码) 
--调用
select*from 名字
---------------------------------------------------------------
--存储过程
create proc name
as
select*from 成绩
--调用
exec name
------------------------------------------------------------------------
use stuDB 
go
create proc getstudent
@courseName varchar(20)
as
select stuInfo .stuName,course.courseName,stuMarks .marks from course inner join stuMarks
on course.courseNO=stuMarks.courseNo inner join stuInfo on stuInfo.stuNo=stuMarks.stuNo
WHERE course.courseName=@courseName 

exec getstudent 'c#'
----------------------------------------------------------------------------
--多语句表值函数
use stuDB
go
create function getinfo
(
  @department varchar(20)
)
returns @courinfo table
(
  empName varchar(20),
  courName varchar(20),
  classHour int
)
as
begin 
  insert into @courinfo select teacher.empName,course.courseName,
  teachingInfo.classHour from teacher,teachingInfo,course where
   teacher.EmpNo=teachingInfo.EmpNo and course.courseNo=teachingInfo.courseNo
  and teacher.department=@department
  return 
end
--调用--
select*from dbo.GetInfo ('计算机系')
----------------------------------------------------------------------------------------
---第一个return+s,function 方法+()
use 北风贸易
go
create function getemp()
returns table
as
return
(
 select*from 员工
)
select*from dbo.getemp()
------------------------------------------------------------------
----标量值函数
create function getinfo(@numa int=1,@numb int=2,@numc int=3)
returns int
as
begin
return @numa+@numb+@numc
end
select dbo.getinfo(10,20,30) 
select dbo.getinfo(DEFAULT,DEFAULT,DEFAULT)
-------------------------------------------------------------------------
sp_helpindex 员工
--------------------------------------------------------------------------------
--------触发器的未解之谜
create database MyDB
use MyDB
go
create table member
(
    id int identity primary key,
    mid  varchar(20),
    password varchar(20)
)
insert into member values('吴彤彤','577521')
insert into member values('董丹丹','521521')
insert into member values('张盼盼','521180')
insert into member values('王淑影','521577')
select*from emp 
update emp set hiredate ='1993-8-26' where empno=25
create table emp
(
    empno int identity primary key,
    ename varchar(20),
    job varchar(20),
    hiredate datetime,
    sal numeric(7,2),
    comm numeric(7,2)
)

insert into emp values('无所谓','学生','1996-10-11',100.2,31.2)
insert into emp values('吴彤彤','摄影师','1994-05-12',102.1,32.2)
insert into emp values('杨云','记者','1992-06-23',90.2,33.2)
insert into emp values('张敏','伙伴','1996-10-24',105.2,34.2)
insert into emp values('范雅轩','朋友','1997-10-21',100.5,35.2)
insert into emp values('刘蔽萱','知己','1996-11-16',90.6,36.2)
insert into emp values('王如意','妹妹','1997-7-7',101.1,37.2)
insert into emp values('王叶玲','老妹儿','1995-8-18',93.2,38.2)
insert into emp values('王晗','红颜','1995-10-29',103.7,39.2)
insert into emp values('杨敏','梦中人','1995-11-20',93.3,40.2)
insert into emp values('王淑影','老婆','1996-10-24',111.1,41.2)
insert into emp values('张雪','前任','1992-01-12',112.2,42.2)
insert into emp values('李梦瑶','恋人','1993-2-13',113.2,43.2)
insert into emp values('冉小慧','前前任','1993-12-14',114.2,44.2)
insert into emp values('晨晨','小情人','1997-03-15',115.2,45.2)
insert into emp values('董丹丹','好朋友','1996-10-26',116.2,46.2)
insert into emp values('王梦月','猫猫','1995-5-17',117.2,47.2)
insert into emp values('紫儿','恋人','1993-6-18',118.2,48.2)
insert into emp values('张瑾','陌生人','1991-8-19',119.2,49.2)
insert into emp values('张莎','好朋友','1993-7-16',120.2,50.2)
insert into emp values('牛华清','好朋友','1994-6-21',121.2,51.2)
insert into emp values('韩金萍','同学','1993-5-22',122.2,52.2)
insert into emp values('张盼盼','好朋友','1994-4-23',123.2,53.2)
insert into emp values('任杜鹃','同学','1993-3-24',124.2,54.2)
insert into emp values('Y','YYY','2015-2-25',125.2,55.2)
insert into emp values('Z','ZZZ','2016-1-26',126.2,56.2)
---分页显示
create proc getpagesize
@pagesize int=5,
@currentIndex int
as
if(@pagesize<=0)
begin 
raiserror('每页显示的个数必须大于',16,1)
return
end
select top(@pagesize )*from emp where empno not in
(
 select top((@currentIndex -1)*@pagesize )empno from emp
order by empno 

order by empno
--储存调用
exec getpagesize 5,5
--------------------------------------创建DDL触发器------------------------------------------
use stuDB 
go
create trigger love
on database 
for drop_table,alter_table
as
print'不许删除或者修改表'
rollback tran
--测试
drop table teacher
--删除DDL触发器
drop trigger love on database
--禁用DDL触发器
use stuDB
go
disable trigger love on database
--------------------------------------Insert表,delete 表------------------------------------------
--insert触发器

use stuDB
go
if exists(select*from sys.triggers where name ='love')
go
create trigger love
on teachingInfo 
for insert
as
declare @paymoney money
select @paymoney=payperhour from inserted
if(@paymoney>120 or @paymoney<50)
begin 
print'录入课时费不在50-120之间,操作终止'
rollback tran
end
--测试
insert into teachingInfo values('c002','E002',500,1000)
---update触发器
use stuDB
go
if exists(select*from sys.triggers where name='love')
drop trigger love
create trigger love
on teachingInfo
for update
as
declare @newmoney int,@oldmoney int
select @oldmoney=payperhour from deleted
select @newmoney= payperhour from inserted
if(@newmoney>@oldmoney+10)
begin 
print'最多涨10'
rollback tran
end
--测试
update teachingInfo set payperhour=80+100 where EmpNo='E007'
--instead of触发器
use stuDB
go
if exists(select*from sys.views where name='v_teacher')
drop view v_teacher

create view v_teacher
as
select teacher .EmpName,course .courseName,teachingInfo.classHour from course inner
join teachingInfo on course .courseNo=teachingInfo.courseNo inner join teacher 
on teacher .EmpNo=teachingInfo.EmpNo
go 
--调用视图
select*from v_teacher 
--测试
delete from v_teacher where empname='钱学森'
--开始编写instead of触发器
use stuDB 
go
if exists(select*from sys.triggers where name='love')
drop trigger love
create trigger love
on v_teacher
instead of delete
as
begin 
--由于外键关系,所以需先删除授课信息
delete from teachingInfo where EmpNo in
(select EmpNo from teacher where EmpName in(
select empName from deleted)
)
--再删除教师表里的数据
delete from teacher where empName in(select EmpName from deleted)
end
--测试(此时会报错)
insert into v_teacher values('伊羽','c#',500)
------------------------------------------------------------------------------------
---带有参数的存储过程
use 北风贸易
go
--create proc getemp
 alter proc getemp
@title varchar(20)='业务经理'
as
select*from 员工 where 职称 =@title 
---调用存储过程
exec getemp default
exec getemp '业务'
------------------------------------------------------------------------------------------
---带有输出参数的存储过程
use 北风贸易
go

create proc getmark
@id varchar(15),
@level int,
@chinese int output,
@english int output,
@math int output
as
select @chinese =语文成绩 ,@english =英语成绩 ,@math=数学成绩 from 成绩 
where 身份证号码 =@id and 期中期末 =@level 
select*from 成绩
--存储调用
declare @chinese int,@english int,@math int
exec getmark '362409478255657',1,@chinese output,@english output,@math output
print '语文成绩'+convert(char(3),@chinese)+'英语成绩'+convert(char(3),@english)+'数学成绩'+convert(char(3),@math)
-------------------------------------------------------------------------------------------
---带有输出参数的存储过程
use stuDB
go
create proc getperson
@count int output,
@courseName varchar(20)
as
select @count=COUNT (marks) from stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName  and marks<60

print'不及格的人数'+convert (char(3),@count)

select stuName,case 
when courseType=1 then '必修'
when courseType=0 then '选修'
end marks,courseType from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName

---存储调用
declare @sum int
exec  getperson @sum output,'JAVA编程世界'
print @sum
----------------------------------------------------------------------------------------
---带有输出参数的存储过程
use stuDB 
go
create proc getmark
@count int output,
@courseName varchar(20),
@marks int
as
if(not @marks  between 0 and 100)
begin 
 print'分数输入有误'
return 
end
select  @count=COUNT(marks) from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName and b.marks=@marks
print'不及格的人数'+convert(char(3),@count)

select stuName,case
when courseType=1 then '必修'
when courseType=0 then '选修' end marks,courseType from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName
 
--存储调用
declare @num int
exec getmark @num output ,'c#',52
-----------------------------------------------------------------------------------------
use master 
go
create table teacher
(
  tid int primary key,
  tname varchar(20)
)
create table student
(
  sid int primary key,
  sname varchar(20),
  sex char(20),
  tid int foreign key references teacher(tid)
)

insert into teacher values(1001,'赵老师')
insert into teacher values(1002,'钱老师')
insert into teacher values(1003,'孙老师')
insert into teacher values(1004,'李老师')
insert into teacher values(1005,'周老师')
select*from teacher 
select*from student
insert into student values(1,'赵敏','女',1001)
insert into student values(2,'钱万三','男',1002)
--创建视图
create view aaa
as
select teacher .tid,teacher .tname,student .sid,student.sname from teacher  inner join student on teacher .tid=student.tid
--调用视图
select*from aaa 
 insert into aaa values(1003,'孙子',3,'孙膑')
drop trigger teacher_student_view
create trigger teacher_student_view
on aaa
instead of insert
as
    declare @tid int,@tname varchar(20),@sid int,@sname varchar(20)
   select @tid = tid,@tname =tname,@sid =sid,@sname = sname from inserted
   if(select count(*) from teacher where tid=@tid and tname = @tname)>0
  begin
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  else
  begin
     insert into teacher values(@tid,@tname)
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  ---------------------------------------------------------------------
    use 北风贸易
    go
    ----定义游标
    declare my_cursor cursor scroll
    for select*from 员工
    --打开游标
    open my_cursor
    --提取游标
    fetch next from my_cursor
    fetch prior from my_cursor
    fetch first from my_cursor
    fetch last from my_cursor
    fetch absolute 5 from my_cursor
    fetch relative 2 from my_cursor
    --关闭游标
    close my_cursor
    --释放游标
    deallocate my_cursor
    --例子:
    
    create proc aa
    as
    begin
     declare my_cursor cursor scroll
     for select*from 员工
     open my_cursor 
     fetch next from my_cursor
     while(@@FETCH_STATUS =0)
     begin 
     fetch next from my_cursor
     return
     end
     end
-------------------------------------------------------------------------------------------
use stuDB 
go
--(1)创建非聚集索引--
create nonclustered index IX_stuMarks_marks on stuMarks(marks) with fillfactor=30
--调用--
select*from stuMarks with(index=IX_stuMarks_marks)
--(2)
use stuDB
go
--(1)创建唯一索引--
create unique index IX_stuInfo_stuName on stuInfo(stuName) with fillfactor=30
--调用--
select*from stuInfo with(index=IX_stuInfo_stuName)
--------------------------------------------------------------------------------------
--游标的使用
--(1)
use 北风贸易
go
declare @Name varchar(10),
@Sex bit,
@Married bit,
@Phone char(10),
@Chinese char(2),
@Math char(4)

declare  baby_cursor cursor for select 姓名, 员工性别, 婚姻状况, 电话号码 from 飞狐工作室
open baby_cursor;
fetch next from baby_cursor
into @Name,@Sex,@Married,@Phone;

while @@FETCH_STATUS =0
begin 
print'员工姓名:'+@Name;
if(@Sex =1)
set @Chinese ='男';
else
set @Chinese ='女';
if(@Married=1)
set @Math='已婚';
else
set @Math ='未婚';
print'性别'+@chinese;
print'婚姻'+@math;
print'电话'+@phone;
print replicate ('-',30);
fetch next from baby_cursor
into @Name,@Sex,@Married,@Phone;
end;
close baby_cursor
deallocate baby_cursor
--(2)
use 北风贸易
go
declare @Customer varchar(40),
@Contact varchar(30),
@Phone varchar(24);
declare Customer_Cursor Cursor for
select 公司名称,联系人,电话 from 客户
order by 公司名称;
open Customer_Cursor
fetch next from Customer_Cursor into @Customer,@Contact,@Phone;
while @@FETCH_STATUS =0
begin 
    PRINT '公司名称: ' + @Customer;
    PRINT '联系人: ' + @Contact;
    PRINT '电话: ' + @Phone;
    PRINT REPLICATE('-',30);
fetch next from Customer_Cursor into @Customer, @Contact, @Phone;
end

CLOSE Customer_Cursor;

DEALLOCATE Customer_Cursor;
----------------------------------------------------------------------------------
declare @errnum int
set @errnum =0
--添加到毕业表--
insert into graduate select*from stuInfo where grade =4
set @errnum =@errnum +@@ERROR 
--学生信息表删除--
delete from stuInfo where grade=4
set @errnum =@@ERROR +@errnum 
if @errnum >0
begin
    print '事务出现错误'
    rollback tran
end
else
begin
   print'事务成功'
  rollback tran 
end
-----------------------------------------------------------------------------------
use stuDB 
go
--(1)创建索引--
create nonclustered index IX_stuMarks_marks on stuMarks(marks) with fillfactor=30
--调用--
select*from stuMarks with(index=IX_stuMarks_marks)
--(2)
use stuDB
go
create unique index IX_stuInfo_stuName on stuInfo(stuName) with fillfactor=30
--调用--
select*from stuInfo with(index=IX_stuInfo_stuName)
---------------------------------------------------------------------------------
use stuDB 
go
if exists(select*from sysobjects where name='love')
drop view love
--创建视图--
create view love
as
select dbo.stuInfo.stuName as 姓名,dbo.course .courseName as课程名,dbo.stuMarks.marks
as 分数 ,dbo.course .MarkPoint as 学分 from dbo.course  inner join dbo.stuMarks on
dbo.course.courseNo =dbo.stuMarks.courseNo inner join dbo.stuInfo on dbo.stuMarks.stuNo
=dbo.stuInfo.stuNo
go

--调用视图--
use stuDB 
go 
select*from love
------------------------------------------------------------------------------------
--创建同义词--
select*from stuInfo
use stuDB 
go
select*from like
---------------------------------------------------------------------------------------
---上机题
use 北风贸易
go
create nonclustered index IX_paney
on 客户(公司名称) with fillfactor=30

use 北风贸易
go
select*from 客户
----------------------------------------------------------------------------
use Library
go
--(1)--
select*from Reader where Id in(
select RId from BorrowInfo where BId in
(
select Id  from Book where BookName='C#技术内幕'
)
)

select*from Reader
select*from BorrowInfo
select*from Book 
select*from PenaltyInfo
--(2)--
select Id,ReaderName  from Reader where Id not IN
(
select distinct RId from PenaltyInfo 
)
----------------------------------------------------------
--2--
select*from Book 
select*from BorrowInfo
select*from PenaltyInfo
select*from Reader 
use Library
go
if exists(select*from PenaltyInfo where Rid in(select RId  from Reader  where ReaderName ='张三'))
begin
update Reader set  LeadNum=LeadNum-1
select*from Reader  where ReaderName='张三'
end
else
begin
update Reader set LeadNum =LeadNum +1
select*from Reader  where ReaderName='张三'
 end

------------------------------------------------------------------------
--3--
use stuDB
go

select *from(
select empno, (payPerHour*classHour)as'总课时费' from teachingInfo where EmpNo in(
select EmpNo from teacher where department !='计算机系'
)
)t inner join teacher on t.EmpNo=teacher .EmpNo where t.总课时费>all(

select (payPerHour*classHour)as'总课时费' from teachingInfo where EmpNo in(
select EmpNo from teacher where department='计算机系'
)
)

--(2)--
select* from teacher where EmpNo in(
select EmpNo from teachingInfo where payPerHour<any(
select payPerHour from teachingInfo where EmpNo in(
select EmpNo from teacher where department ='计算机系'
)
)
)
--------------------------------------------------------------------
--4--
use stuDB
go

select*from stuInfo
select*from stuMarks
select*from course 

select stuName from stuInfo where stuNo in(
select stuNo from stuMarks where marks
>all(
select AVG (marks) from stuMarks where courseNo=(
select courseNo from course where courseName='c#' )
)
)
----------------------------------------------------------------------------------------
--上机题--
create database SCD
use SCD
go

create table Student
(
    sno varchar(20) primary key,--学号
    sname varchar(20),--姓名
    age int,--年龄
    classid int--班号
)
insert into Student values('2011001','张三',18,101)
insert into Student values('2011002','李四',16,101)
insert into Student values('2011003','王五',17,111)
insert into Student values('2011004','赵六',19,111)
insert into Student values('2011005','李广',19,112)
insert into Student values('2011006','李凤',16,112)
select * from Student

create table ClassInfo
(
    classid int primary key,--班号
    sdeptname varchar(20),--专业名
    departid varchar(20),--系号
    studydate varchar(20)--入学年份
)
insert into ClassInfo values(101,'软件工程','002','2010')
insert into ClassInfo values(102,'C#编程','002','2011')
insert into ClassInfo values(111,'SQL Server2008','003','2010')
insert into ClassInfo values(112,'JAVA入门','003','2011')
select * from ClassInfo

create table Department
(
    departid varchar(20) primary key,
    deparname varchar(20)
)
insert into Department values('001','英语系')
insert into Department values('002','NET系')
insert into Department values('003','JAVA系')
select * from Department
--查英语系名字和学号--
select sno,sname from Student where classid in(
select classid from ClassInfo where departid in(
select departid from Department where deparname='JAVA系'
)
)
--(2)各个系的系号,系名和学生人数
select m.num,m.departid,deparname from
(
select t.num,departid from
(
    select count(sname) as 'num',classid as '班号' from Student
    group by classid
)t inner join ClassInfo on t.班号 = ClassInfo.classid
)m inner join Department on Department.departid = m.departid
--(3)软件专业学生的学号和姓名
select sname,sno from Student where classid in(
select classid from ClassInfo where sdeptname='软件工程'
)
--(4)    不是软件专业的学生学号和姓名
select sname,sno from Student where classid not in(
select classid from ClassInfo where sdeptname='软件工程'
)

--(5)各个系的班级情况,包括系名以及该系拥有的班号及其入学年份,即使该系目前没有班级,也显示信息

select*from ClassInfo right join Department on ClassInfo.departid=Department.departid

--(6)显示各系的学生情况,包括系名,该系学生的学号和姓名,即使该系目前没有学生也显示信息


select deparname,sno,sname from(
select departid,sno,sname from(
select sno,sname,classid  from Student where classid in(
select classid from ClassInfo where departid in
(
    select departid from Department
 )
 )
 )t inner join ClassInfo on ClassInfo.classid=t.classid)
m right join Department  on m.departid=Department.departid
--(7)与李凤在同一专业学习的学生姓名

select sname from Student where classid in(
select classid from ClassInfo where classid in
(
select classid from Student where sname='李凤'
)
)and sname!='李凤'

--(8)不与李凤在同一专业学习的学生姓名
select sname from Student where classid not in(
select classid from ClassInfo where classid in
(
select classid from Student where sname='李凤'
)
)and sname!='李凤'

--(9)各班中年龄超过本班平均年龄的学生学号和姓名
select*from Student where age>all(  select AVG (age) from Student)
--(10)系中班级超过2(含2)的系的系名

select deparname from
(
    select COUNT(classid) as 'classNum',departid from ClassInfo where departid in
    (
        select departid from Department 
    )
    group by departid
)t inner join Department on t.departid = Department.departid

--------------------------------------------------------------------
use stuDB 
go 
begin tran
declare @errnum int
set @errnum =0
--增加新表--
insert into graduate select*from stuInfo where grade =4
set @errnum =@errnum +@@ERROR
--删除学生表--
delete from stuInfo where grade =4
set @errnum =@errnum +@@ERROR
if @errnum >0
begin 
print'事务错误'
rollback tran
end
else
begin 
print'事务执行中'
commit tran
end

create proc GetEmpInfo
as
 select * from 员工

execute GetEmpInfo
exec GetEmpInfo
GetEmpInfo 

--带输入参数的存储过程
alter proc GetEmpInfobyJob
@title varchar(20) ='业务'
as
  select 姓名 ,职称,出生日期 from 员工  where 职称 = @title
  
 execute GetEmpInfobyJob  default
execute GetEmpInfobyJob  '业务经理' 


select * from 成绩

create proc GetMark
@id varchar(15),
@level int,
@chinese int output,
@english int output,
@math int output
as
 select @chinese = 语文成绩,@english = 英语成绩,@math = 数学成绩
from 成绩 where 身份证号码 = @id and 期中期末 = @level


declare @chinese int,@english int,@math int
exec GetMark '234612223654985',1,@chinese output,@english output,@math output
print '语文成绩'+convert(char(3),@chinese)+'数学成绩'+convert(char(3),@math)+'英语成绩'+convert(char(3),@english) 

------------------------
drop proc UP_GetStuMarksByCourse


alter PROCEDURE UP_GetStuMarksByCourse
@count INT OUTPUT,
@courseName VARCHAR(20)='JAVA编程世界'
AS


    SELECT @count=COUNT(marks)
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName AND b.marks<60
    
    PRINT  '不及格人数:'+CONVERT(CHAR(20),@count)
    
    
    SELECT stuName,CASE WHEN courseType=0 THEN '选修' ELSE '必修' END courseType,marks 
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName

declare @math int
exec UP_GetStuMarksByCourse @math output,'C#'
print @math

sp_helptext UP_GetStuMarksByCourse
----------------------------------------------------
drop proc UP_GetStusByCourse
alter PROCEDURE UP_GetStusByCourse
@count INT OUTPUT,
@courseName VARCHAR(20)='JAVA编程世界',
@marks INT=60
AS
    IF(NOT @marks BETWEEN 0 AND 100)
    BEGIN
        RAISERROR('及格线不在-100之间,统计退出!',10,1)
        RETURN --退出执行
    END
    --统计不及格人数
    SELECT @count=COUNT(marks)
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName AND b.marks<@marks
    PRINT  @courseName+'不及格人数:'+CONVERT(VARCHAR(2),@count)
    --查询所有学生信息
    SELECT stuName,CASE WHEN courseType=0 THEN '选修' ELSE '必修' END courseType,marks 
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName
    
    
    declare @num int
    exec UP_GetStusByCourse @num output,'C#',-9
    
GO 
-----------------------------------
select * from emp
delete from emp where empno = 1

select * into back_emp from emp where 1>2
drop table back_emp
alter table back_emp 
add  empno int
select * from emp
select * from back_emp

--inserted deleted (没有updated逻辑表)
delete from emp where empno =7

alter trigger delete_emp
on emp
for delete
as
 insert into  back_emp(empno,ename,job,hiredate,sal,comm)
  select empno, ename,job,hiredate,sal,comm from deleted
  
  
  
  select * from emp

create table Insert_emp
(
    empno int primary key,
    ename varchar(20),
    job varchar(20),
    hiredate datetime,
    sal numeric(7,2),
    comm numeric(7,2)
)
insert into emp values('A','AAA','1991-1-1',101.2,31.2)
insert into emp values('B','BBB','1992-2-2',102.2,32.2)
insert into emp values('C','CCC','1993-3-3',103.2,33.2)
insert into emp values('D','DDD','1994-4-4',104.2,34.2)
insert into emp values('E','EEE','1995-5-5',105.2,35.2)
insert into emp values('F','FFF','1996-6-6',106.2,36.2)

select * from emp
select * from Insert_emp

alter trigger Insert_emptrigger
on emp
for insert
as
insert into Insert_emp  select * from inserted


create table stuInfoMark
(
    sid int  primary key,
    sname varchar(20),
    math int
)

create table stuInfoMarkBack
(
    id int identity primary key,
    sid int,
    sname varchar(20),
    before_math int, 
    alter_math int,
    time datetime default getdate()
)
create trigger stuInfoUpdate
on stuInfoMark
for update
as
   declare @sid int,@sname varchar(20),@before_math int,@after_math int
    select @sid = sid,@sname = sname,@before_math = math from deleted
   select  @after_math = math from inserted
  
  insert into  stuInfoMarkBack values(@sid,@sname,@before_math,@after_math,default)

insert into stuInfoMark values(1001,'张三',90)
select * from stuInfoMark
update stuInfoMark set math = 180 where sid = 1001
select * from stuInfoMarkBack

--启用|禁用,触发器
  DISABLE|ENABLE TRIGGER trigger_name
  
  
  
DISABLE TRIGGER stuInfoUpdate ON DATABASE 

sp_helptext stuInfoUpdate

select * from 成绩

alter trigger disableChinese
on 成绩
for update
 as
  if(update(语文成绩))
  begin
        declare @语文成绩 int
        select @语文成绩=语文成绩  from inserted 
            print '语文成绩:'+convert(char(3),@语文成绩)
            if(@语文成绩<80 or @语文成绩>100)
            begin
                print '成绩只能在80到100之间'
                rollback tran
            end
  end 
  
  update 成绩  set 语文成绩 = 40 where 身份证号码= '107854123456781'
  
  disable  trigger stuInfoUpdate on database
  
  ------------------------
  create table teacher
(
    tid int primary key,
    tname varchar(20)
)
create table student
(
    sid int primary key,
    sname varchar(20),
    sex char(20),
    tid int foreign key references teacher(tid)
)
insert into teacher values(1001,'张老师')
insert into teacher values(1002,'李老师')
insert into teacher values(1003,'高老师')
insert into teacher values(1004,'曹老师')
insert into teacher values(1005,'孙老师')
select * from teacher
select * from student

insert into student values(1,'孙策','男',1005)
insert into student values(2,'高老庄','女',1003)

create view t_s
as
select teacher.tid,teacher.tname,student.sid,student.sname from teacher inner join student
on teacher.tid = student.tid
select * from teacher
select * from student
select * from t_s

insert into t_s values(1009,'赵老师',6,'赵AAA')

alter trigger teacher_student_view
on t_s
instead of insert
as
    declare @tid int,@tname varchar(20),@sid int,@sname varchar(20)
   select @tid = tid,@tname =tname,@sid =sid,@sname = sname from inserted
   if(select count(*) from teacher where tid=@tid and tname = @tname)>0
  begin
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  else
  begin
     insert into teacher values(@tid,@tname)
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  
  -----------------------------------------
  create database MyDB
go
use MyDB
go
create table member
(
    id int identity primary key,
    mid  varchar(20),
    password varchar(20)
)
GO
insert into member values('admin','admin')
insert into member values('test','test')
insert into member values('马燕','test1001')
GO
select * from member
select * from emp
select mid from member where mid = 'admin' and password = 'admin'
go
create table emp
(
    empno int identity primary key,
    ename varchar(20),
    job varchar(20),
    hiredate datetime,
    sal numeric(7,2),
    comm numeric(7,2)
)
go
select COUNT(*) from emp where  empno like  '%%' or ename like '%%' or job like '%%' or hiredate like '%%' or sal like '%%' or comm like '%%'
select empno,ename,job,hiredate,sal,comm from emp
select empno,ename,job,hiredate,sal,comm from emp where  empno like  '%%' or ename like '%%' or job like '%%' or hiredate like '%%' or sal like '%%' or comm like '%%'

insert into emp values('A','AAA','1991-1-1',101.2,31.2)


SELECT empno,ename,job,hiredate,sal,comm from emp where ename like '%%' and job like '%%'

select * from emp


alter proc up_getCourseByPage
@pageSize int = 5,
@currentIndex int

as
 if(@pageSize<=0)
begin
    raiserror('每页显示的个数大于 ',16,1)
    return
end 
select top(@pageSize) * from emp where empno not in
(
    select top((@currentIndex-1)*@pageSize) empno from emp order by empno
)
order by empno

exec up_getCourseByPage 5,3

select 员工.姓名,COUNT (订货主档.订单号码)as'数量' from 员工 inner join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名

create proc getmarkjob
as
select*from 成绩
--调用--
exec getmarkjob
execute getmarkjob
getmarkjob
-------------------------------------------
--带参数的存储--
select*from 员工
--create proc getlove
drop proc getlove
create proc getlove
@title varchar(20)='业务'
as
select 姓名,称呼,附注,职称 from 员工 where 职称=@title 
--调用
exec getlove default
exec getlove '业务经理'
----------------------------------------------
select*from 成绩
create proc getlike
@id varchar(15),
@level int,
@chinese int output,
@math int output,
@english int output
as
select @chinese=语文成绩,@math=数学成绩,@english =英语成绩 from 成绩 where
身份证号码=@id and 期中期末=@level 

--调用--
declare @chinese int,@math int,@english int
exec getlike'107854123456781',2,@chinese output,
@math output,@english output
print'语文成绩'+convert(char(3),@chinese)+'数学成绩'+convert(char(3),@math)+'英语成绩'+convert(char(3),@english)
-------------------------------------------------------------------------------------------
use stuDB create proc getlove @count int output, @courseName varchar(20)='JAVA编程世界' as select @count=count(marks) from stuInfo a,stuMarks b,course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and c.courseName=@courseName and b.marks<60 print'不及格'+convert(char(20),@count)     select stuName,case when courseType=0 then'选修' when courseType=1 then '必修' end courseType, marks from stuInfo a,stuMarks b,course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and c.courseName=@courseName   declare @math int exec getlove @math output,'c#' print @math sp_helptext getlove ---------------------------------------------------------------------------------------------- create proc getwutong @count int output, @courseName varchar(20)='JAVA编程世界', @marks int=60 as if(not @marks between 0 and 100) begin raiserror('分数错误',16,1) return end --统计不及格人数 select @count=count(marks) from stuInfo a,stuMarks b,course c where a.stuNo= b.stuNo and b.courseNo=c.courseNo and c.courseName=@courseName and b.marks <@marks print @courseName+'不及格人数'+convert(varchar(2),@count) --查询所有学生信息 select stuName,case when courseTypt=0 then'选修' else'必修' end courseType,marks from stuInfo a,stuMarks b,course c where a.stuNo= b.stuNo and b.courseNo=c.courseNo and c.courseName=@courseName      declare @num int exec getwutong @num output,'c#',-9     -------------------------------------------------------------------------------------------- use stuDB
go
if exists(select*from sysobjects where name='up_getcourse')
drop proc  up_getcourse
--自定义错误--
create procedure up_getcourse
@count int output,
@courseName varchar(20)='JAVA编程世界',
@marks int=60
as
if(not @marks between 0 and 100)
begin
raiserror('分数不在0-100之间',1,61)
return
end

select @count =COUNT (marks) from stuInfo a,stuMarks b,course c where a.stuNo=b.stuNo
and b.courseNo=c.courseNo and c.courseName=@courseName and b.marks<@marks
print @courseName+'不及格人数'+convert(varchar(20),@count)
select stuName,case
 when courseType=0 then '选修'
when courseType=1 then '必修' end courseType,marks  from stuInfo a,stuMarks b,course c where
a.stuNo=b.stuNo and b.courseNo=c.courseNo and c.courseName=@courseName
go

--方法调用--
declare @count int
declare @marks int
declare @courseName varchar(20)
set @courseName='c#'
set @marks=108
exec up_getcourse @count output,@courseName,@marks
--getmarks
------------------------------------------------------------------------


alter procedure getmarks
@count INT OUTPUT,
@courseName VARCHAR(20)='JAVA编程世界'
AS


    SELECT @count=COUNT(marks)
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName AND b.marks<60
    
    PRINT  '不及格人数:'+CONVERT(CHAR(20),@count)

SELECT stuName,CASE WHEN courseType=0 THEN '选修' ELSE '必修' END 
    courseType,marks 
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName

declare @math int
exec UP_GetStuMarksByCourse @math output,'C#'
print @math

-------------------------------------
use stuDB
go
select*from stuInfo
select*from stuMarks
select*from course

select*from stuInfo inner join stuMarks on stuInfo.stuNo=
stuMarks.stuNo inner join course on stuMarks.courseNo=
course .courseNo where course.courseName='c#' and stuMarks.marks
>=60

select* from stuInfo where stuNo in(
select stuNo from stuMarks where courseNo=(
select courseNo from course where courseName='c#'
)
)
-----------------------------------------------
use 北风贸易
go
--创建存储--
create proc getmark
as
select*FROM 员工 
exec getmark
---------------------------------------------------------------------
create database MyDB
go
use MyDB
go
create table member
(
    id int identity primary key,
    mid  varchar(20),
    password varchar(20)
)
insert into member values('姜尚诚','577577')
insert into member values('董丹丹','521521')
insert into member values('张盼盼','zzzzz')
create table emp
(
    empno int identity primary key,
    ename varchar(20),
    job varchar(20),
    hiredate datetime,
    sal numeric(7,2),
    comm numeric(7,2)
)

insert into emp values('A','AAA','1991-1-1',101.2,31.2)
insert into emp values('B','BBB','1992-2-2',102.2,32.2)

---------------------------------------------------------------------
--分页--
create proc getzhangpan
@pagesize int=5,
@currentIndex int
as
if(@pagesize<=0)
begin 
raiserror('每页显示个数必大于',11,1)
return 
end
select top(@pagesize)*from emp where empno not in
(
 select top((@currentIndex-1)*@pagesize)empno from emp order by empno
)
order by empno
--方法调用--
exec getzhangpan 5,3
---------------------------------------------------------
select*from emp 
select*into a from emp where 1>2
select*from a

----------------------------------------------------------
--备份--

create proc UP_Salary_insert
(
    @maxsalary money output,--最高工资
    @empname varchar(20) output,
    @empno varchar(20),
    @salary money = 10000,
    @start datetime
)
as
 if(@start<GETDATE())
begin
    raiserror('新的工资标准执行日期必须大于当前日期',15,1);
    return
end 
insert into Salary values(@empno,@salary,@start)
  
 with t as (
  select * from (
   select *,(EmpNo+CONVERT(char(50),starttime)) as 'temp' from Salary
  ) temp where temp in (
    select  (EmpNo+CONVERT(char(50),MAX(starttime))) as 'temp' from Salary group by EmpNo
   ) 
  ) select @empno = t.EmpNo,@empname,Employee.EmpName,t.Salary from t inner join Employee
  on t.EmpNo = Employee.EmpNo
where ((select count(*) from t as s where t.Salary < s.Salary)+1 ) = 1
  
  select * from Employee
  select * from Salary
  select * from Salary
  
  ----------------------------
  create proc t 
as  
 with t as (
  select * from (
   select *,(EmpNo+CONVERT(char(50),starttime)) as 'temp' from Salary
  ) temp where temp in (
    select  (EmpNo+CONVERT(char(50),MAX(starttime))) as 'temp' from Salary group by EmpNo
   ) 
  ) select       Employee.EmpName,   t.Salary from t inner join Employee
  on t.EmpNo = Employee.EmpNo
where ((select count(*) from t as s where t.Salary < s.Salary)+1 ) = 1

select * from Salary
t
------------------------------------------
drop trigger AddSalary
sp_helptrigger Salary
----------------------------------------
drop trigger AddSalary
create trigger AddSalary  
on Salary  
for insert  
as  
begin tran  
declare @empno nvarchar(20)  
declare @oldsalary money  
declare @newsalary money  
--使用临时表inserted读取员工编号和新薪水  
select @empno =EmpNo,@newsalary=Salary from inserted  
select @oldsalary=salary from Salary where EmpNo=@empno   
and StartTime=(select top 1 StartTime from Salary where StartTime  
not in(select top 1 StartTime from Salary where EmpNo=@empno  
order by  StartTime desc)order by  StartTime desc)  
if(@newsalary>(@oldsalary+@oldsalary*0.2))  
begin  
 print '新增加的工资不能超过此员工当前工资的20%'  
 rollback tran  --事务回滚  
end

select * from salary

insert into salary values('E011',30000,'2018-9-9')

alter trigger AddSalary
on salary 
for insert
as
begin tran
    declare @empno varchar(20)
    declare @oldSalary money
    declare @newsalary money
select @empno = empno,@newsalary = salary from inserted

select @oldSalary = salary  from salary
where ((select count(*) from salary as s where s.StartTime>Salary.StartTime and s.EmpNo = Salary.Empno)+1 ) = 2
and empno = @empno


print '新工资' + convert(char(10),@newSalary)
print '旧工资'+ convert(char(20),@oldSalary)
if(@newsalary >(@oldSalary +@oldSalary * 0.2))
begin
    print '超过了20%'
    rollback tran
end 
else
begin
    commit 
end


insert into salary values('E011',21600,'2020-9-9')
select * from salary

delete from salary where id >=44


select *,(select count(*) from salary as s where s.StartTime<salary.startTime) as '名词' from salary
group by empNO
 

select salary,(select count(*) from salary as s where s.StartTime>Salary.StartTime and s.EmpNo = Salary.Empno)+1 as '名次' from salary
where ((select count(*) from salary as s where s.StartTime>Salary.StartTime and s.EmpNo = Salary.Empno)+1 ) = 2
and empno = 'E011'


order by empno 


select *,(
select count(*) from 成绩 as s where s.语文成绩<成绩.语文成绩
 group by 期中期末) from 成绩 
 
 ------------------
 select 语文成绩,期中期末,
(select count(*) from 成绩 as s where s.语文成绩>成绩.语文成绩 
group by 期中期末)+1 as '名次' from 成绩
group by 期中期末


select 语文成绩,期中期末,
(select COUNT(*) from 成绩 as s where s.语文成绩>成绩.语文成绩 and s.期中期末 = 成绩.期中期末)+1 from 成绩
where ((select COUNT(*) from 成绩 as s where s.语文成绩>成绩.语文成绩 and s.期中期末 = 成绩.期中期末)+1) = 2

select * from 成绩
-------------------------------
create table on1
(
    id char(19),-- 1010 3576 **** ****
    sname varchar(20),
    sex char(2)
)
sp_helpconstraint on1
sp_help on1
select * from on1

insert into on1(sname,sex) values('abc','男')

select  '1010 3576 '+CONVERT(char(4), CONVERT(int, RAND()*10000))+ ' '+CONVERT(char(4), CONVERT(int, RAND()*10000))

create trigger Insert_on1
on on1
for insert
as
print '进来了'
declare @name varchar(20)
select @name = sname from inserted

declare @str varchar(19) = '1010 3576 '
declare @count int= 1;

declare @temp int= CONVERT(int,RAND()*10000)
while(@count<=2)
begin
        while(@temp<1000)
        begin
            set @temp =  CONVERT(int,RAND()*10000)
        end
            if(@count =1)
            begin
                set @str  +=  CONVERT(char(5), @temp+' ')
            end else 
            begin
                set @str  +=  CONVERT(char(4), @temp)
        end
        set @temp =  CONVERT(int,RAND()*10000)
        set @count =@count+1
        
end
update on1 set id = @str where sname = @name


select CONVERT(char(4), CONVERT(int, RAND()*10000))

drop proc UP_GetStusByCourse alter PROCEDURE UP_GetStusByCourse @count INT OUTPUT, @courseName VARCHAR(20)='JAVA编程世界', @marks INT=60 AS     IF(NOT @marks BETWEEN 0 AND 100)     BEGIN         RAISERROR('及格线不在-100之间,统计退出!',10,1)         RETURN --退出执行     END     --统计不及格人数     SELECT @count=COUNT(marks)     FROM stuInfo a,stuMarks b,course c     WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo     AND c.courseName=@courseName AND b.marks<@marks     PRINT  @courseName+'不及格人数:'+CONVERT(VARCHAR(2),@count)     --查询所有学生信息     SELECT stuName,CASE WHEN courseType=0 THEN '选修' ELSE '必修' END courseType,marks     FROM stuInfo a,stuMarks b,course c     WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo     AND c.courseName=@courseName               declare @num int     exec UP_GetStusByCourse @num output,'C#',-9      GO ------------- drop proc UP_GetStuMarksByCourse alter PROCEDURE UP_GetStuMarksByCourse @count INT OUTPUT, @courseName VARCHAR(20)='JAVA编程世界' AS     SELECT @count=COUNT(marks)     FROM stuInfo a,stuMarks b,course c     WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo     AND c.courseName=@courseName AND b.marks<60          PRINT  '不及格人数:'+CONVERT(CHAR(20),@count)               SELECT stuName,CASE WHEN courseType=0 THEN '选修' ELSE '必修' END courseType,marks     FROM stuInfo a,stuMarks b,course c     WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo     AND c.courseName=@courseName declare @math int exec UP_GetStuMarksByCourse @math output,'C#' print @math sp_helptext UP_GetStuMarksByCourse create proc GetEmpInfo as  select * from 员工 execute GetEmpInfo exec GetEmpInfo GetEmpInfo --带输入参数的存储过程 alter proc GetEmpInfobyJob @title varchar(20) ='业务' as   select 姓名 ,职称,出生日期 from 员工  where 职称 = @title    execute GetEmpInfobyJob  default execute GetEmpInfobyJob  '业务经理' select * from 成绩 create proc GetMark @id varchar(15), @level int, @chinese int output, @english int output, @math int output as  select @chinese = 语文成绩,@english = 英语成绩,@math = 数学成绩 from 成绩 where 身份证号码 = @id and 期中期末 = @level declare @chinese int,@english int,@math int exec GetMark '234612223654985',1,@chinese output,@english output,@math output print '语文成绩'+convert(char(3),@chinese)+'数学成绩'+convert(char(3),@math)+'英语成绩'+convert(char(3),@english) 

create table teacher
(
    tid int primary key,
    tname varchar(20)
)
create table student
(
    sid int primary key,
    sname varchar(20),
    sex char(20),
    tid int foreign key references teacher(tid)
)
insert into teacher values(1001,'张老师')
insert into teacher values(1002,'李老师')
insert into teacher values(1003,'高老师')
insert into teacher values(1004,'曹老师')
insert into teacher values(1005,'孙老师')
select * from teacher
select * from student

insert into student values(1,'孙策','男',1005)
insert into student values(2,'高老庄','女',1003)

create view t_s
as
select teacher.tid,teacher.tname,student.sid,student.sname from teacher inner join student
on teacher.tid = student.tid
select * from teacher
select * from student
select * from t_s

insert into t_s values(1009,'赵老师',6,'赵AAA')

alter trigger teacher_student_view
on t_s
instead of insert
as
    declare @tid int,@tname varchar(20),@sid int,@sname varchar(20)
   select @tid = tid,@tname =tname,@sid =sid,@sname = sname from inserted
   if(select count(*) from teacher where tid=@tid and tname = @tname)>0
  begin
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  else
  begin
     insert into teacher values(@tid,@tname)
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  
  disable  trigger stuInfoUpdate on database
  
  create database MyDB
go
use MyDB
go
create table member
(
    id int identity primary key,
    mid  varchar(20),
    password varchar(20)
)
GO
insert into member values('admin','admin')
insert into member values('test','test')
insert into member values('马燕','test1001')
GO
select * from member
select * from emp
select mid from member where mid = 'admin' and password = 'admin'
go
create table emp
(
    empno int identity primary key,
    ename varchar(20),
    job varchar(20),
    hiredate datetime,
    sal numeric(7,2),
    comm numeric(7,2)
)
go
select COUNT(*) from emp where  empno like  '%%' or ename like '%%' or job like '%%' or hiredate like '%%' or sal like '%%' or comm like '%%'
select empno,ename,job,hiredate,sal,comm from emp
select empno,ename,job,hiredate,sal,comm from emp where  empno like  '%%' or ename like '%%' or job like '%%' or hiredate like '%%' or sal like '%%' or comm like '%%'

insert into emp values('A','AAA','1991-1-1',101.2,31.2)
insert into emp values('B','BBB','1992-2-2',102.2,32.2)
insert into emp values('C','CCC','1993-3-3',103.2,33.2)
insert into emp values('D','DDD','1994-4-4',104.2,34.2)
insert into emp values('E','EEE','1995-5-5',105.2,35.2)


SELECT empno,ename,job,hiredate,sal,comm from emp where ename like '%%' and job like '%%'

select * from emp


alter proc up_getCourseByPage
@pageSize int = 5,
@currentIndex int

as
 if(@pageSize<=0)
begin
    raiserror('每页显示的个数大于 ',16,1)
    return
end 
select top(@pageSize) * from emp where empno not in
(
    select top((@currentIndex-1)*@pageSize) empno from emp order by empno
)
order by empno

exec up_getCourseByPage 5,3

select * from emp
delete from emp where empno = 1

select * into back_emp from emp where 1>2
drop table back_emp
alter table back_emp 
add  empno int
select * from emp
select * from back_emp

--inserted deleted (没有updated逻辑表)
delete from emp where empno =7

alter trigger delete_emp
on emp
for delete
as
 insert into  back_emp(empno,ename,job,hiredate,sal,comm)
  select empno, ename,job,hiredate,sal,comm from deleted
  
  
  
  select * from emp

create table Insert_emp
(
    empno int primary key,
    ename varchar(20),
    job varchar(20),
    hiredate datetime,
    sal numeric(7,2),
    comm numeric(7,2)
)
insert into emp values('A','AAA','1991-1-1',101.2,31.2)
insert into emp values('B','BBB','1992-2-2',102.2,32.2)
insert into emp values('C','CCC','1993-3-3',103.2,33.2)
insert into emp values('D','DDD','1994-4-4',104.2,34.2)
insert into emp values('E','EEE','1995-5-5',105.2,35.2)
insert into emp values('F','FFF','1996-6-6',106.2,36.2)

select * from emp
select * from Insert_emp

alter trigger Insert_emptrigger
on emp
for insert
as
insert into Insert_emp  select * from inserted


create table stuInfoMark
(
    sid int  primary key,
    sname varchar(20),
    math int
)

create table stuInfoMarkBack
(
    id int identity primary key,
    sid int,
    sname varchar(20),
    before_math int, 
    alter_math int,
    time datetime default getdate()
)
create trigger stuInfoUpdate
on stuInfoMark
for update
as

   declare @sid int,@sname varchar(20),@before_math int,@after_math int
    select @sid = sid,@sname = sname,@before_math = math from deleted
   select  @after_math = math from inserted
  
  insert into  stuInfoMarkBack values(@sid,@sname,@before_math,@after_math,default)
  
  


insert into stuInfoMark values(1001,'张三',90)

select * from stuInfoMark
update stuInfoMark set math = 180 where sid = 1001

select * from stuInfoMarkBack

--启用|禁用,触发器
  DISABLE|ENABLE TRIGGER trigger_name
  
  
  
DISABLE TRIGGER stuInfoUpdate ON DATABASE 

sp_helptext stuInfoUpdate

select * from 成绩

alter trigger disableChinese
on 成绩
for update
 as
  if(update(语文成绩))
  begin
        declare @语文成绩 int
        select @语文成绩=语文成绩  from inserted 
            print '语文成绩:'+convert(char(3),@语文成绩)
            if(@语文成绩<80 or @语文成绩>100)
            begin
                print '成绩只能在80到100之间'
                rollback tran
            end
  end 
  
  
  update 成绩  set 语文成绩 = 40 where 身份证号码= '107854123456781'
  
  drop proc UP_GetStusByCourse
alter PROCEDURE UP_GetStusByCourse
@count INT OUTPUT,
@courseName VARCHAR(20)='JAVA编程世界',
@marks INT=60
AS
    IF(NOT @marks BETWEEN 0 AND 100)
    BEGIN
        RAISERROR('及格线不在-100之间,统计退出!',10,1)
        RETURN --退出执行
    END
    --统计不及格人数
    SELECT @count=COUNT(marks)
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName AND b.marks<@marks
    PRINT  @courseName+'不及格人数:'+CONVERT(VARCHAR(2),@count)
    --查询所有学生信息
    SELECT stuName,CASE WHEN courseType=0 THEN '选修' ELSE '必修' END courseType,marks 
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName
    
    
    declare @num int
    exec UP_GetStusByCourse @num output,'C#',-9
    
GO 
-------------
drop proc UP_GetStuMarksByCourse


alter PROCEDURE UP_GetStuMarksByCourse
@count INT OUTPUT,
@courseName VARCHAR(20)='JAVA编程世界'
AS


    SELECT @count=COUNT(marks)
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName AND b.marks<60
    
    PRINT  '不及格人数:'+CONVERT(CHAR(20),@count)
    
    
    SELECT stuName,CASE WHEN courseType=0 THEN '选修' ELSE '必修' END courseType,marks 
    FROM stuInfo a,stuMarks b,course c
    WHERE a.stuNo=b.stuNo AND b.courseNo=c.courseNo
    AND c.courseName=@courseName

declare @math int
exec UP_GetStuMarksByCourse @math output,'C#'
print @math

sp_helptext UP_GetStuMarksByCourse

create proc GetEmpInfo
as
 select * from 员工


execute GetEmpInfo
exec GetEmpInfo
GetEmpInfo 

--带输入参数的存储过程
alter proc GetEmpInfobyJob
@title varchar(20) ='业务'
as
  select 姓名 ,职称,出生日期 from 员工  where 职称 = @title
  
 execute GetEmpInfobyJob  default
execute GetEmpInfobyJob  '业务经理' 


select * from 成绩

create proc GetMark
@id varchar(15),
@level int,
@chinese int output,
@english int output,
@math int output
as
 select @chinese = 语文成绩,@english = 英语成绩,@math = 数学成绩
from 成绩 where 身份证号码 = @id and 期中期末 = @level


declare @chinese int,@english int,@math int
exec GetMark '234612223654985',1,@chinese output,@english output,@math output
print '语文成绩'+convert(char(3),@chinese)+'数学成绩'+convert(char(3),@math)+'英语成绩'+convert(char(3),@english) 

select * from 成绩


--拷贝表结构,并且带数据
select * into A from 成绩
--拷贝表结构,不带数据
select * into B from 成绩 where 1>2
--把成绩表的数据全部导入到B表
insert into B select * from 成绩

select * from A
select * from B

create table stuMarksinfo
(
    id int identity primary key,
    sname varchar(20),
    math int
)
insert into stuMarksinfo values('张三',90)

update stuMarksinfo set math =  15 where id = 1

select * from stuMarksinfo


--事物
begin tran AA--开起事物
update stuMarksinfo set math = 100 where id = 1
save tran A
update stuMarksinfo set math = 9 where id =1
save tran B
update stuMarksinfo set math = 80 where id =1
save tran C
update stuMarksinfo set math = 1 where id = 1
save tran D

rollback tran C
--提交事务
commit tran AA

可以用 ALL 或 ANY 关键字修改引入子查询的比较运算符

以 > 比较运算符为例,>ALL 表示大于每一个值。
换句话说,它表示大于最大值。
例如,>ALL (1, 2, 3) 表示大于 3。

>ANY 表示至少大于一个值,即大于最小值。
因此 >ANY (1, 2, 3) 表示大于 1。

=ANY 运算符与 IN 等效。
< >ANY 运算符则不同于 NOT IN:
< >ANY 表示不等于 a,或者不等于 b,或者不等于 c。
NOT IN 表示不等于 a、不等于 b 并且不等于 c。

<>ALL 与 NOT IN 表示的意思相同。

< >ALL 运算符获得相同的结果,该运算符与 NOT IN 等效。
create table info
(
    编号 int primary key,
    语文成绩  int
    数学成绩 int
)

>all <all <>all 
>any <any <>any =any
in    not in

create table info
(
    编号 int identity primary key,
    语文成绩 int,
    数学成绩 int
)
insert into info values(100,150)


select * from info
--(1)
select * from info where 语文成绩>all 
(
    select 数学成绩 from  info
)

select * from info where 语文成绩<all 
(
    select 数学成绩 from  info
)

select * from info where 语文成绩 in 
(
    select 数学成绩 from  info
)
select * from info where 语文成绩  not in 
(
    select 数学成绩 from  info
)
select * from info where 语文成绩 <>all 
(
    select 数学成绩 from  info
)

--(2) any

select * from info where 语文成绩  >any
(
    select 数学成绩 from  info
)

select * from info where 语文成绩  <any
(
    select 数学成绩 from  info
)


select * from info where 语文成绩  =any
(
    select 数学成绩 from  info
)
select * from info where 语文成绩  in
(
    select 数学成绩 from  info
)
select * from info
select * from info where 语文成绩  <>any
(
    select 数学成绩 from  info
)

select * from teacher
select * from teachingInfo

select teacher.EmpNo,teacher.EmpName,t.总课费 from (
select empno, classHour * payPerHour as '总课费' from teachingInfo where EmpNo in (
select EmpNo from teacher where department != '计算机系'

) t  inner join teacher
on teacher.EmpNo = t.EmpNo  where t.总课费 >all (

select classHour * payPerHour as '总课费' from teachingInfo where EmpNo in (
select EmpNo from teacher where department = '计算机系'
))


select * from (
select empno, classHour * payPerHour as '总课费' from teachingInfo
 where
 EmpNo in (
select EmpNo from teacher where department != '计算机系'
)   
) t


select * from (select * from teacher) t

select * from 成绩


--拷贝表结构,并且带数据
select * into A from 成绩
--拷贝表结构,不带数据
select * into B from 成绩 where 1>2
--把成绩表的数据全部导入到B表
insert into B select * from 成绩

select * from A
select * from B

可以用 ALL 或 ANY 关键字修改引入子查询的比较运算符

以 > 比较运算符为例,>ALL 表示大于每一个值。
换句话说,它表示大于最大值。
例如,>ALL (1, 2, 3) 表示大于 3。

>ANY 表示至少大于一个值,即大于最小值。
因此 >ANY (1, 2, 3) 表示大于 1。

=ANY 运算符与 IN 等效。
< >ANY 运算符则不同于 NOT IN:
< >ANY 表示不等于 a,或者不等于 b,或者不等于 c。
NOT IN 表示不等于 a、不等于 b 并且不等于 c。

<>ALL 与 NOT IN 表示的意思相同。

< >ALL 运算符获得相同的结果,该运算符与 NOT IN 等效。
create table info
(
    编号 int primary key,
    语文成绩  int
    数学成绩 int
)

>all <all <>all 
>any <any <>any =any
in    not in

create table info
(
    编号 int identity primary key,
    语文成绩 int,
    数学成绩 int
)
insert into info values(100,150)


select * from info
--(1)
select * from info where 语文成绩>all 
(
    select 数学成绩 from  info
)

select * from info where 语文成绩<all 
(
    select 数学成绩 from  info
)

select * from info where 语文成绩 in 
(
    select 数学成绩 from  info
)
select * from info where 语文成绩  not in 
(
    select 数学成绩 from  info
)
select * from info where 语文成绩 <>all 
(
    select 数学成绩 from  info
)

--(2) any

select * from info where 语文成绩  >any
(
    select 数学成绩 from  info
)

select * from info where 语文成绩  <any
(
    select 数学成绩 from  info
)


select * from info where 语文成绩  =any
(
    select 数学成绩 from  info
)
select * from info where 语文成绩  in
(
    select 数学成绩 from  info
)
select * from info
select * from info where 语文成绩  <>any
(
    select 数学成绩 from  info
)

select * from teacher
select * from teachingInfo

select teacher.EmpNo,teacher.EmpName,t.总课费 from (
select empno, classHour * payPerHour as '总课费' from teachingInfo where EmpNo in (
select EmpNo from teacher where department != '计算机系'

) t  inner join teacher
on teacher.EmpNo = t.EmpNo  where t.总课费 >all (

select classHour * payPerHour as '总课费' from teachingInfo where EmpNo in (
select EmpNo from teacher where department = '计算机系'
))


select * from (
select empno, classHour * payPerHour as '总课费' from teachingInfo
 where
 EmpNo in (
select EmpNo from teacher where department != '计算机系'
)   
) t


select * from (select * from teacher) t

use 北风贸易
go
--查看约束sp_helpconstraint
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  

--聚合函数,求总数量
with t as(
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  
)select SUM (订单数量) from t 

--最多,接的订单第一名,排名次
with t as
(
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  
)select*,(select COUNT (*) from t as s where s.订单数量<t.订单数量)+1 as'名次' from t where
((select COUNT (*)from t as s where s.订单数量<t.订单数量)+1)=1
order by 名次 asc

--每个快递公司接的订单数量
select COUNT(订货主档.订单号码)as'数量',货运公司 .货运公司名称  from 订货主档 right join 货运公司 on 订货主档.送货方式=货运公司 .货运公司编号
group by 货运公司 .货运公司名称

---10254的接的订单总价
select 订货主档.订单号码,订货明细.产品编号,订货明细 .单价*订货明细 .数量*(1-订货明细 .折扣)as'总价' from 订货主档 inner join 订货明细 on 订货主档.订单号码=订货明细.订单号码
where 订货主档.订单号码=10254
---按着畅销商品的程度排序
select 产品数据.产品编号,产品数据.产品,COUNT (订货明细 .订单号码)as'数量' from 产品数据 inner join 订货明细 on 产品数据.产品编号=订货明细.产品编号
group by 产品数据.产品编号,产品数据.产品
order by 数量 desc

---------------------------------------------------------------------------------------
--rank()over 用于排序--
with t as (
select 员工.姓名,count(订货主档.订单号码) as '订单数量' from 员工 left join 订货主档
on 员工.员工编号 = 订货主档.员工编号
group by 员工.姓名
)  select*,RANK()over(order by 订单数量 desc)as'名次' from t 
------------------------------------------------------------------------------------------
--排名
with t as(
select 身份证号码,语文成绩,RANK()over(order by 语文成绩 desc)as'名次' from 成绩 
)
select*from t  where 名次=1
--前三名
select 身份证号码 ,语文成绩,(select COUNT(*)from 成绩 as t where 成绩.语文成绩<t.语文成绩)+1 as'名次' from 成绩 where
((select COUNT (*)from 成绩 as t where 成绩.语文成绩<t.语文成绩)+1)<=3
-------------------------------------------------------------------------------------
use stuDB 
go
--学习c#的人
select stuName from stuInfo where stuNo in(
select stuNo from stuMarks where courseNo in( 
select courseNo from course where courseName='c#'
)
)
--三表连接,c# and score <60 的人
select *from stuInfo inner join stuMarks on
stuInfo.stuNo=stuMarks.stuNo inner join course  on
stuMarks.courseNo=course .courseNo where
course .courseName='c#' and stuMarks.marks<60
------------------------------------------------------------------------------------
--拷贝
use 北风贸易
go
select* into a from 成绩  
--拷贝表结构不带数据
select*into b from 成绩 where 1>23
-------------------------------------------------------------------
--交叉报表
create table info
(
   sid int identity primary key,
    chinese int,
    math int  
)
insert into info values(100,150)
insert into info values(200,0)
insert into info values(-9,185)
insert into info values(198,199)
insert into info values(186,89)
insert into info values(20,-1)
insert into info values(50,50)
--all
select*from info where chinese >all(select math from info )
select*from info where chinese<all(select math from info)
select * from info where chinese  >any
(
    select math from  info
)

select * from info where chinese  <any
(
    select math from  info
)
----------------------------------------------------------------------------------------
use stuDB 
go 
select*from teacher 
select*from teachinginfo

select teacher .EmpNo,teacher .EmpName,t.总课时费 from(
select empno,classHour *payPerHour as'总课时费' from teachingInfo where EmpNo in
(
select EmpNo from teacher where department !='计算机系'
)
) t inner join teacher on teacher .EmpNo=t.EmpNo  where t.总课时费>all(

select classHour *payPerHour as'总课时费' from teachingInfo where EmpNo in
(
select EmpNo from teacher where department ='计算机系'
))
---------------------------------------------------------------------------------
--赋值
declare @numA int = 10,@numB int = 20,@sum int
set @sum = @numA+@numB
print convert(char(2),@numA)+'+'+convert(char(2),@numB)+'='+convert(char(3),@sum)
--乘法口诀表
declare @i int=1,@j int=1;
declare @temp varchar(1000)=''
while(@i<=9)
begin 
    set @j=1;
    while(@j<=@i)
    begin
     set @temp +=convert (varchar(5),@j)+'*'+CONVERT(char(2),@i) +'='+CONVERT(char(2),@i*@j)+'   '
     set @j=@j+1;
    end
    print @temp;
    set @temp ='' ;
    set @i=@i+1
end
-------------------------------------------------------------
--交叉报表
create database MyDB
use myDB
create table friend
(
  fid int identity primary key,
  fname varchar(20),
  dislikeMe bit,
  LoveToShe bit
)
insert into friend values('吴彤彤',1,1)
insert into friend values('王飘',0,1)
insert into friend values('董丹丹',1,1)
insert into friend values('虫虫',1,1)
insert into friend values('小慧',0,0)
select*from friend
select fid as'编号',fname as'名',case dislikeMe
when 1 then '喜欢'
when 0 then '不喜欢' end as '爱', case lovetoshe
when 1 then '喜欢'
else '不' end as '恨' from friend   
---------------------------------------------------------------------
--开启事务
USE 北风贸易 
go
begin tran aa
select*from 表名 
save tran a
rollback tran c--事务回滚
commit tran aa--提交
-------------------------------------------------------------------
--重新命名数据库
 sp_rename 'stuDB','yu'
 --查看索引
sp_helpindex 表名 
------------------------------------------------------------
--创建视图
create view 名字
as
--(代码) 
--调用
select*from 名字
---------------------------------------------------------------
--存储过程
create proc name
as
select*from 成绩
--调用
exec name
------------------------------------------------------------------------
use stuDB 
go
create proc getstudent
@courseName varchar(20)
as
select stuInfo .stuName,course.courseName,stuMarks .marks from course inner join stuMarks
on course.courseNO=stuMarks.courseNo inner join stuInfo on stuInfo.stuNo=stuMarks.stuNo
WHERE course.courseName=@courseName 

exec getstudent 'c#'
----------------------------------------------------------------------------
--多语句表值函数
use stuDB
go
create function getinfo
(
  @department varchar(20)
)
returns @courinfo table
(
  empName varchar(20),
  courName varchar(20),
  classHour int
)
as
begin 
  insert into @courinfo select teacher.empName,course.courseName,
  teachingInfo.classHour from teacher,teachingInfo,course where
   teacher.EmpNo=teachingInfo.EmpNo and course.courseNo=teachingInfo.courseNo
  and teacher.department=@department
  return 
end
--调用--
select*from dbo.GetInfo ('计算机系')
----------------------------------------------------------------------------------------
---第一个return+s,function 方法+()
use 北风贸易
go
create function getemp()
returns table
as
return
(
 select*from 员工
)
select*from dbo.getemp()
------------------------------------------------------------------
----标量值函数
create function getinfo(@numa int=1,@numb int=2,@numc int=3)
returns int
as
begin
return @numa+@numb+@numc
end
select dbo.getinfo(10,20,30) 
select dbo.getinfo(DEFAULT,DEFAULT,DEFAULT)
-------------------------------------------------------------------------
sp_helpindex 员工
--------------------------------------------------------------------------------
--------触发器的未解之谜
create database MyDB
use MyDB
go
create table member
(
    id int identity primary key,
    mid  varchar(20),
    password varchar(20)
)
insert into member values('吴彤彤','577521')
insert into member values('董丹丹','521521')
insert into member values('张盼盼','521180')
insert into member values('王淑影','521577')
select*from emp 
update emp set hiredate ='1993-8-26' where empno=25
create table emp
(
    empno int identity primary key,
    ename varchar(20),
    job varchar(20),
    hiredate datetime,
    sal numeric(7,2),
    comm numeric(7,2)
)

insert into emp values('无所谓','学生','1996-10-11',100.2,31.2)
insert into emp values('吴彤彤','摄影师','1994-05-12',102.1,32.2)
insert into emp values('杨云','记者','1992-06-23',90.2,33.2)
insert into emp values('张敏','伙伴','1996-10-24',105.2,34.2)
insert into emp values('范雅轩','朋友','1997-10-21',100.5,35.2)
insert into emp values('刘蔽萱','知己','1996-11-16',90.6,36.2)
insert into emp values('王如意','妹妹','1997-7-7',101.1,37.2)
insert into emp values('王叶玲','老妹儿','1995-8-18',93.2,38.2)
insert into emp values('王晗','红颜','1995-10-29',103.7,39.2)
insert into emp values('杨敏','梦中人','1995-11-20',93.3,40.2)
insert into emp values('王淑影','老婆','1996-10-24',111.1,41.2)
insert into emp values('张雪','前任','1992-01-12',112.2,42.2)
insert into emp values('李梦瑶','恋人','1993-2-13',113.2,43.2)
insert into emp values('冉小慧','前前任','1993-12-14',114.2,44.2)
insert into emp values('晨晨','小情人','1997-03-15',115.2,45.2)
insert into emp values('董丹丹','好朋友','1996-10-26',116.2,46.2)
insert into emp values('王梦月','猫猫','1995-5-17',117.2,47.2)
insert into emp values('紫儿','恋人','1993-6-18',118.2,48.2)
insert into emp values('张瑾','陌生人','1991-8-19',119.2,49.2)
insert into emp values('张莎','好朋友','1993-7-16',120.2,50.2)
insert into emp values('牛华清','好朋友','1994-6-21',121.2,51.2)
insert into emp values('韩金萍','同学','1993-5-22',122.2,52.2)
insert into emp values('张盼盼','好朋友','1994-4-23',123.2,53.2)
insert into emp values('任杜鹃','同学','1993-3-24',124.2,54.2)
insert into emp values('Y','YYY','2015-2-25',125.2,55.2)
insert into emp values('Z','ZZZ','2016-1-26',126.2,56.2)
---分页显示
create proc getpagesize
@pagesize int=5,
@currentIndex int
as
if(@pagesize<=0)
begin 
raiserror('每页显示的个数必须大于',16,1)
return
end
select top(@pagesize )*from emp where empno not in
(
 select top((@currentIndex -1)*@pagesize )empno from emp
order by empno 

order by empno
--储存调用
exec getpagesize 5,5
--------------------------------------创建DDL触发器------------------------------------------
use stuDB 
go
create trigger love
on database 
for drop_table,alter_table
as
print'不许删除或者修改表'
rollback tran
--测试
drop table teacher
--删除DDL触发器
drop trigger love on database
--禁用DDL触发器
use stuDB
go
disable trigger love on database
--------------------------------------Insert表,delete 表------------------------------------------
--insert触发器

use stuDB
go
if exists(select*from sys.triggers where name ='love')
go
create trigger love
on teachingInfo 
for insert
as
declare @paymoney money
select @paymoney=payperhour from inserted
if(@paymoney>120 or @paymoney<50)
begin 
print'录入课时费不在50-120之间,操作终止'
rollback tran
end
--测试
insert into teachingInfo values('c002','E002',500,1000)
---update触发器
use stuDB
go
if exists(select*from sys.triggers where name='love')
drop trigger love
create trigger love
on teachingInfo
for update
as
declare @newmoney int,@oldmoney int
select @oldmoney=payperhour from deleted
select @newmoney= payperhour from inserted
if(@newmoney>@oldmoney+10)
begin 
print'最多涨10'
rollback tran
end
--测试
update teachingInfo set payperhour=80+100 where EmpNo='E007'
--instead of触发器
use stuDB
go
if exists(select*from sys.views where name='v_teacher')
drop view v_teacher

create view v_teacher
as
select teacher .EmpName,course .courseName,teachingInfo.classHour from course inner
join teachingInfo on course .courseNo=teachingInfo.courseNo inner join teacher 
on teacher .EmpNo=teachingInfo.EmpNo
go 
--调用视图
select*from v_teacher 
--测试
delete from v_teacher where empname='钱学森'
--开始编写instead of触发器,相当于for
use stuDB 
go
if exists(select*from sys.triggers where name='love')
drop trigger love
create trigger love
on v_teacher
instead of delete
as
begin 
--由于外键关系,所以需先删除授课信息
delete from teachingInfo where EmpNo in
(select EmpNo from teacher where EmpName in(
select empName from deleted)
)
--再删除教师表里的数据
delete from teacher where empName in(select EmpName from deleted)
end
--测试
delete from teacher where empName in(select EmpName from deleted)
------------------------------------------------------------------------------------
---带有参数的存储过程
use 北风贸易
go
--create proc getemp
 alter proc getemp
@title varchar(20)='业务经理'
as
select*from 员工 where 职称 =@title 
---调用存储过程
exec getemp default
exec getemp '业务'
------------------------------------------------------------------------------------------
---带有输出参数的存储过程
use 北风贸易
go

create proc getmark
@id varchar(15),
@level int,
@chinese int output,
@english int output,
@math int output
as
select @chinese =语文成绩 ,@english =英语成绩 ,@math=数学成绩 from 成绩 
where 身份证号码 =@id and 期中期末 =@level 
select*from 成绩
--存储调用
declare @chinese int,@english int,@math int
exec getmark '362409478255657',1,@chinese output,@english output,@math output
print '语文成绩'+convert(char(3),@chinese)+'英语成绩'+convert(char(3),@english)+'数学成绩'+convert(char(3),@math)
-------------------------------------------------------------------------------------------
---带有输出参数的存储过程
use stuDB
go
create proc getperson
@count int output,
@courseName varchar(20)
as
select @count=COUNT (marks) from stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName  and marks<60

print'不及格的人数'+convert (char(3),@count)

select stuName,case 
when courseType=1 then '必修'
when courseType=0 then '选修'
end marks,courseType from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName

---存储调用
declare @sum int
exec  getperson @sum output,'JAVA编程世界'
print @sum
----------------------------------------------------------------------------------------
---带有输出参数的存储过程
use stuDB 
go
create proc getmark
@count int output,
@courseName varchar(20),
@marks int
as
if(not @marks  between 0 and 100)
begin 
 print'分数输入有误'
return 
end
select  @count=COUNT(marks) from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName and b.marks=@marks
print'不及格的人数'+convert(char(3),@count)

select stuName,case
when courseType=1 then '必修'
when courseType=0 then '选修' end marks,courseType from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName
 
--存储调用
declare @num int
exec getmark @num output ,'c#',52
-----------------------------------------------------------------------------------------
use master 
go
create table teacher
(
  tid int primary key,
  tname varchar(20)
)
create table student
(
  sid int primary key,
  sname varchar(20),
  sex char(20),
  tid int foreign key references teacher(tid)
)

insert into teacher values(1001,'赵老师')
insert into teacher values(1002,'钱老师')
insert into teacher values(1003,'孙老师')
insert into teacher values(1004,'李老师')
insert into teacher values(1005,'周老师')
select*from teacher 
select*from student
insert into student values(1,'赵敏','女',1001)
insert into student values(2,'钱万三','男',1002)
--创建视图
create view aaa
as
select teacher .tid,teacher .tname,student .sid,student.sname from teacher  inner join student on teacher .tid=student.tid
--调用视图
select*from aaa 
 insert into aaa values(1003,'孙子',3,'孙膑')
drop trigger teacher_student_view
create trigger teacher_student_view
on aaa
instead of insert
as
    declare @tid int,@tname varchar(20),@sid int,@sname varchar(20)
   select @tid = tid,@tname =tname,@sid =sid,@sname = sname from inserted
   if(select count(*) from teacher where tid=@tid and tname = @tname)>0
  begin
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  else
  begin
     insert into teacher values(@tid,@tname)
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  ---------------------------------------------------------------------
    use 北风贸易
    go
    ----定义游标
    declare my_cursor cursor scroll
    for select*from 员工
    --打开游标
    open my_cursor
    --提取游标
    fetch next from my_cursor
    fetch prior from my_cursor
    fetch first from my_cursor
    fetch last from my_cursor
    fetch absolute 5 from my_cursor
    fetch relative 2 from my_cursor
    --关闭游标
    close my_cursor
    --释放游标
    deallocate my_cursor
    --例子:
    
    create proc aa
    as
    begin
     declare my_cursor cursor scroll
     for select*from 员工
     open my_cursor 
     fetch next from my_cursor
     while(@@FETCH_STATUS =0)
     begin 
     fetch next from my_cursor
     return
     end
     end
-------------------------------------------------------------------------------------------
use stuDB 
go
--(1)创建非聚集索引--
create nonclustered index IX_stuMarks_marks on stuMarks(marks) with fillfactor=30
--调用--
select*from stuMarks with(index=IX_stuMarks_marks)
--(2)
use stuDB
go
--(1)创建唯一索引--
create unique index IX_stuInfo_stuName on stuInfo(stuName) with fillfactor=30
--调用--
select*from stuInfo with(index=IX_stuInfo_stuName)
--------------------------------------------------------------------------------------
--游标的使用
--(1)
use 北风贸易
go
declare @Name varchar(10),
@Sex bit,
@Married bit,
@Phone char(10),
@Chinese char(2),
@Math char(4)

declare  baby_cursor cursor for select 姓名, 员工性别, 婚姻状况, 电话号码 from 飞狐工作室
open baby_cursor;
fetch next from baby_cursor
into @Name,@Sex,@Married,@Phone;

while @@FETCH_STATUS =0
begin 
print'员工姓名:'+@Name;
if(@Sex =1)
set @Chinese ='男';
else
set @Chinese ='女';
if(@Married=1)
set @Math='已婚';
else
set @Math ='未婚';
print'性别'+@chinese;
print'婚姻'+@math;
print'电话'+@phone;
print replicate ('-',30);
fetch next from baby_cursor
into @Name,@Sex,@Married,@Phone;
end;
close baby_cursor
deallocate baby_cursor
--(2)
use 北风贸易
go
declare @Customer varchar(40),
@Contact varchar(30),
@Phone varchar(24);
declare Customer_Cursor Cursor for
select 公司名称,联系人,电话 from 客户
order by 公司名称;
open Customer_Cursor
fetch next from Customer_Cursor into @Customer,@Contact,@Phone;
while @@FETCH_STATUS =0
begin 
    PRINT '公司名称: ' + @Customer;
    PRINT '联系人: ' + @Contact;
    PRINT '电话: ' + @Phone;
    PRINT REPLICATE('-',30);
fetch next from Customer_Cursor into @Customer, @Contact, @Phone;
end

CLOSE Customer_Cursor;

DEALLOCATE Customer_Cursor;
----------------------------------------------------------------------------------
 

use 北风贸易
go
--查看约束sp_helpconstraint
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  

--聚合函数,求总数量
with t as(
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  
)select SUM (订单数量) from t 

--最多,接的订单第一名,排名次
with t as
(
select 员工.姓名,count(订货主档.订单号码)as'订单数量' from 员工 left join 订货主档 on 员工.员工编号=订货主档.员工编号
group by 员工.姓名  
)select*,(select COUNT (*) from t as s where s.订单数量<t.订单数量)+1 as'名次' from t where
((select COUNT (*)from t as s where s.订单数量<t.订单数量)+1)=1
order by 名次 asc

--每个快递公司接的订单数量
select COUNT(订货主档.订单号码)as'数量',货运公司 .货运公司名称  from 订货主档 right join 货运公司 on 订货主档.送货方式=货运公司 .货运公司编号
group by 货运公司 .货运公司名称

---10254的接的订单总价
select 订货主档.订单号码,订货明细.产品编号,订货明细 .单价*订货明细 .数量*(1-订货明细 .折扣)as'总价' from 订货主档 inner join 订货明细 on 订货主档.订单号码=订货明细.订单号码
where 订货主档.订单号码=10254
---按着畅销商品的程度排序
select 产品数据.产品编号,产品数据.产品,COUNT (订货明细 .订单号码)as'数量' from 产品数据 inner join 订货明细 on 产品数据.产品编号=订货明细.产品编号
group by 产品数据.产品编号,产品数据.产品
order by 数量 desc

---------------------------------------------------------------------------------------
--rank()over 用于排序--
with t as (
select 员工.姓名,count(订货主档.订单号码) as '订单数量' from 员工 left join 订货主档
on 员工.员工编号 = 订货主档.员工编号
group by 员工.姓名
)  select*,RANK()over(order by 订单数量 desc)as'名次' from t 
------------------------------------------------------------------------------------------
--排名
with t as(
select 身份证号码,语文成绩,RANK()over(order by 语文成绩 desc)as'名次' from 成绩 
)
select*from t  where 名次=1
--前三名
select 身份证号码 ,语文成绩,(select COUNT(*)from 成绩 as t where 成绩.语文成绩<t.语文成绩)+1 as'名次' from 成绩 where
((select COUNT (*)from 成绩 as t where 成绩.语文成绩<t.语文成绩)+1)<=3
-------------------------------------------------------------------------------------
use stuDB 
go
--学习c#的人
select stuName from stuInfo where stuNo in(
select stuNo from stuMarks where courseNo in( 
select courseNo from course where courseName='c#'
)
)
--三表连接,c# and score <60 的人
select *from stuInfo inner join stuMarks on
stuInfo.stuNo=stuMarks.stuNo inner join course  on
stuMarks.courseNo=course .courseNo where
course .courseName='c#' and stuMarks.marks<60
------------------------------------------------------------------------------------
--拷贝
use 北风贸易
go
select* into a from 成绩  
--拷贝表结构不带数据
select*into b from 成绩 where 1>23
-------------------------------------------------------------------
--交叉报表
create table info
(
   sid int identity primary key,
    chinese int,
    math int  
)
insert into info values(100,150)
insert into info values(200,0)
insert into info values(-9,185)
insert into info values(198,199)
insert into info values(186,89)
insert into info values(20,-1)
insert into info values(50,50)
--all
select*from info where chinese >all(select math from info )
select*from info where chinese<all(select math from info)
select * from info where chinese  >any
(
    select math from  info
)

select * from info where chinese  <any
(
    select math from  info
)
----------------------------------------------------------------------------------------
use stuDB 
go 
select*from teacher 
select*from teachinginfo

select teacher .EmpNo,teacher .EmpName,t.总课时费 from(
select empno,classHour *payPerHour as'总课时费' from teachingInfo where EmpNo in
(
select EmpNo from teacher where department !='计算机系'
)
) t inner join teacher on teacher .EmpNo=t.EmpNo  where t.总课时费>all(

select classHour *payPerHour as'总课时费' from teachingInfo where EmpNo in
(
select EmpNo from teacher where department ='计算机系'
))
---------------------------------------------------------------------------------
--赋值
declare @numA int = 10,@numB int = 20,@sum int
set @sum = @numA+@numB
print convert(char(2),@numA)+'+'+convert(char(2),@numB)+'='+convert(char(3),@sum)
--乘法口诀表
declare @i int=1,@j int=1;
declare @temp varchar(1000)=''
while(@i<=9)
begin 
    set @j=1;
    while(@j<=@i)
    begin
     set @temp +=convert (varchar(5),@j)+'*'+CONVERT(char(2),@i) +'='+CONVERT(char(2),@i*@j)+'   '
     set @j=@j+1;
    end
    print @temp;
    set @temp ='' ;
    set @i=@i+1
end
-------------------------------------------------------------
--交叉报表
create database MyDB
use myDB
create table friend
(
  fid int identity primary key,
  fname varchar(20),
  dislikeMe bit,
  LoveToShe bit
)
insert into friend values('吴彤彤',1,1)
insert into friend values('王飘',0,1)
insert into friend values('董丹丹',1,1)
insert into friend values('虫虫',1,1)
insert into friend values('小慧',0,0)
select*from friend
select fid as'编号',fname as'名',case dislikeMe
when 1 then '喜欢'
when 0 then '不喜欢' end as '爱', case lovetoshe
when 1 then '喜欢'
else '不' end as '恨' from friend   
---------------------------------------------------------------------
--开启事务
USE 北风贸易 
go
begin tran aa
select*from 表名 
save tran a
rollback tran c--事务回滚
commit tran aa--提交
-------------------------------------------------------------------
--重新命名数据库
 sp_rename 'stuDB','yu'
 --查看索引
sp_helpindex 表名 
------------------------------------------------------------
--创建视图
create view 名字
as
--(代码) 
--调用
select*from 名字
---------------------------------------------------------------
--存储过程
create proc name
as
select*from 成绩
--调用
exec name
------------------------------------------------------------------------
use stuDB 
go
create proc getstudent
@courseName varchar(20)
as
select stuInfo .stuName,course.courseName,stuMarks .marks from course inner join stuMarks
on course.courseNO=stuMarks.courseNo inner join stuInfo on stuInfo.stuNo=stuMarks.stuNo
WHERE course.courseName=@courseName 

exec getstudent 'c#'
----------------------------------------------------------------------------
--多语句表值函数
use stuDB
go
create function getinfo
(
  @department varchar(20)
)
returns @courinfo table
(
  empName varchar(20),
  courName varchar(20),
  classHour int
)
as
begin 
  insert into @courinfo select teacher.empName,course.courseName,
  teachingInfo.classHour from teacher,teachingInfo,course where
   teacher.EmpNo=teachingInfo.EmpNo and course.courseNo=teachingInfo.courseNo
  and teacher.department=@department
  return 
end
--调用--
select*from dbo.GetInfo ('计算机系')
----------------------------------------------------------------------------------------
---第一个return+s,function 方法+()
use 北风贸易
go
create function getemp()
returns table
as
return
(
 select*from 员工
)
select*from dbo.getemp()
------------------------------------------------------------------
----标量值函数
create function getinfo(@numa int=1,@numb int=2,@numc int=3)
returns int
as
begin
return @numa+@numb+@numc
end
select dbo.getinfo(10,20,30) 
select dbo.getinfo(DEFAULT,DEFAULT,DEFAULT)
-------------------------------------------------------------------------
sp_helpindex 员工
--------------------------------------------------------------------------------
--------触发器的未解之谜
create database MyDB
use MyDB
go
create table member
(
    id int identity primary key,
    mid  varchar(20),
    password varchar(20)
)
insert into member values('吴彤彤','577521')
insert into member values('董丹丹','521521')
insert into member values('张盼盼','521180')
insert into member values('王淑影','521577')
select*from emp 
update emp set hiredate ='1993-8-26' where empno=25
create table emp
(
    empno int identity primary key,
    ename varchar(20),
    job varchar(20),
    hiredate datetime,
    sal numeric(7,2),
    comm numeric(7,2)
)

insert into emp values('无所谓','学生','1996-10-11',100.2,31.2)
insert into emp values('吴彤彤','摄影师','1994-05-12',102.1,32.2)
insert into emp values('杨云','记者','1992-06-23',90.2,33.2)
insert into emp values('张敏','伙伴','1996-10-24',105.2,34.2)
insert into emp values('范雅轩','朋友','1997-10-21',100.5,35.2)
insert into emp values('刘蔽萱','知己','1996-11-16',90.6,36.2)
insert into emp values('王如意','妹妹','1997-7-7',101.1,37.2)
insert into emp values('王叶玲','老妹儿','1995-8-18',93.2,38.2)
insert into emp values('王晗','红颜','1995-10-29',103.7,39.2)
insert into emp values('杨敏','梦中人','1995-11-20',93.3,40.2)
insert into emp values('王淑影','老婆','1996-10-24',111.1,41.2)
insert into emp values('张雪','前任','1992-01-12',112.2,42.2)
insert into emp values('李梦瑶','恋人','1993-2-13',113.2,43.2)
insert into emp values('冉小慧','前前任','1993-12-14',114.2,44.2)
insert into emp values('晨晨','小情人','1997-03-15',115.2,45.2)
insert into emp values('董丹丹','好朋友','1996-10-26',116.2,46.2)
insert into emp values('王梦月','猫猫','1995-5-17',117.2,47.2)
insert into emp values('紫儿','恋人','1993-6-18',118.2,48.2)
insert into emp values('张瑾','陌生人','1991-8-19',119.2,49.2)
insert into emp values('张莎','好朋友','1993-7-16',120.2,50.2)
insert into emp values('牛华清','好朋友','1994-6-21',121.2,51.2)
insert into emp values('韩金萍','同学','1993-5-22',122.2,52.2)
insert into emp values('张盼盼','好朋友','1994-4-23',123.2,53.2)
insert into emp values('任杜鹃','同学','1993-3-24',124.2,54.2)
---分页显示
create proc getpagesize
@pagesize int=5,
@currentIndex int
as
if(@pagesize<=0)
begin 
raiserror('每页显示的个数必须大于',16,1)
return
end
select top(@pagesize )*from emp where empno not in
(
 select top((@currentIndex -1)*@pagesize )empno from emp
order by empno 

order by empno
--储存调用
exec getpagesize 5,5
--------------------------------------创建DDL触发器------------------------------------------
use stuDB 
go
create trigger love
on database 
for drop_table,alter_table
as
print'不许删除或者修改表'
rollback tran
--测试
drop table teacher
--删除DDL触发器
drop trigger love on database
--禁用DDL触发器
use stuDB
go
disable trigger love on database
------------Insert表,delete 表------------------------------------------
--insert触发器

use stuDB
go
if exists(select*from sys.triggers where name ='love')
go
create trigger love
on teachingInfo 
for insert
as
declare @paymoney money
select @paymoney=payperhour from inserted
if(@paymoney>120 or @paymoney<50)
begin 
print'录入课时费不在50-120之间,操作终止'
rollback tran
end
--测试
insert into teachingInfo values('c002','E002',500,1000)
---update触发器
use stuDB
go
if exists(select*from sys.triggers where name='love')
drop trigger love
create trigger love
on teachingInfo
for update
as
declare @newmoney int,@oldmoney int
select @oldmoney=payperhour from deleted
select @newmoney= payperhour from inserted
if(@newmoney>@oldmoney+10)
begin 
print'最多涨10'
rollback tran
end
--测试
update teachingInfo set payperhour=80+100 where EmpNo='E007'
--instead of触发器
use stuDB
go
if exists(select*from sys.views where name='v_teacher')
drop view v_teacher

create view v_teacher
as
select teacher .EmpName,course .courseName,teachingInfo.classHour from course inner
join teachingInfo on course .courseNo=teachingInfo.courseNo inner join teacher 
on teacher .EmpNo=teachingInfo.EmpNo
go 
--调用视图
select*from v_teacher 
--测试
delete from v_teacher where empname='钱学森'
--开始编写instead of触发器
use stuDB 
go
if exists(select*from sys.triggers where name='love')
drop trigger love
create trigger love
on v_teacher
instead of delete
as
begin 
--由于外键关系,所以需先删除授课信息
delete from teachingInfo where EmpNo in
(select EmpNo from teacher where EmpName in(
select empName from deleted)
)
--再删除教师表里的数据
delete from teacher where empName in(select EmpName from deleted)
end
--测试(此时会报错)
insert into v_teacher values('伊羽','c#',500)
------------------------------------------------------------------------------------
---带有参数的存储过程
use 北风贸易
go
--create proc getemp
 alter proc getemp
@title varchar(20)='业务经理'
as
select*from 员工 where 职称 =@title 
---调用存储过程
exec getemp default
exec getemp '业务'
------------------------------------------------------------------------------------------
---带有输出参数的存储过程
use 北风贸易
go

create proc getmark
@id varchar(15),
@level int,
@chinese int output,
@english int output,
@math int output
as
select @chinese =语文成绩 ,@english =英语成绩 ,@math=数学成绩 from 成绩 
where 身份证号码 =@id and 期中期末 =@level 
select*from 成绩
--存储调用
declare @chinese int,@english int,@math int
exec getmark '362409478255657',1,@chinese output,@english output,@math output
print '语文成绩'+convert(char(3),@chinese)+'英语成绩'+convert(char(3),@english)+'数学成绩'+convert(char(3),@math)
-------------------------------------------------------------------------------------------
---带有输出参数的存储过程
use stuDB
go
create proc getperson
@count int output,
@courseName varchar(20)
as
select @count=COUNT (marks) from stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName  and marks<60

print'不及格的人数'+convert (char(3),@count)

select stuName,case 
when courseType=1 then '必修'
when courseType=0 then '选修'
end marks,courseType from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName

---存储调用
declare @sum int
exec  getperson @sum output,'JAVA编程世界'
print @sum
----------------------------------------------------------------------------------------
---带有输出参数的存储过程
use stuDB 
go
create proc getmark
@count int output,
@courseName varchar(20),
@marks int
as
if(not @marks  between 0 and 100)
begin 
 print'分数输入有误'
return 
end
select  @count=COUNT(marks) from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName and b.marks=@marks
print'不及格的人数'+convert(char(3),@count)

select stuName,case
when courseType=1 then '必修'
when courseType=0 then '选修' end marks,courseType from  stuInfo a, stuMarks b, course c where a.stuNo=b.stuNo and b.courseNo=c.courseNo and
 c.courseName=@courseName
 
--存储调用
declare @num int
exec getmark @num output ,'c#',52
-----------------------------------------------------------------------------------------
use master 
go
create table teacher
(
  tid int primary key,
  tname varchar(20)
)
create table student
(
  sid int primary key,
  sname varchar(20),
  sex char(20),
  tid int foreign key references teacher(tid)
)

insert into teacher values(1001,'赵老师')
insert into teacher values(1002,'钱老师')
insert into teacher values(1003,'孙老师')
insert into teacher values(1004,'李老师')
insert into teacher values(1005,'周老师')
select*from teacher 
select*from student
insert into student values(1,'赵敏','女',1001)
insert into student values(2,'钱万三','男',1002)
--创建视图
create view aaa
as
select teacher .tid,teacher .tname,student .sid,student.sname from teacher  inner join student on teacher .tid=student.tid
--调用视图
select*from aaa 
 insert into aaa values(1003,'孙子',3,'孙膑')
drop trigger teacher_student_view
create trigger teacher_student_view
on aaa
instead of insert
as
    declare @tid int,@tname varchar(20),@sid int,@sname varchar(20)
   select @tid = tid,@tname =tname,@sid =sid,@sname = sname from inserted
   if(select count(*) from teacher where tid=@tid and tname = @tname)>0
  begin
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  else
  begin
     insert into teacher values(@tid,@tname)
     insert into student(sid,sname,tid) values(@sid,@sname,@tid)
  end
  ---------------------------------------------------------------------
    use 北风贸易
    go
    ----定义游标
    declare my_cursor cursor scroll
    for select*from 员工
    --打开游标
    open my_cursor
    --提取游标
    fetch next from my_cursor
    fetch prior from my_cursor
    fetch first from my_cursor
    fetch last from my_cursor
    fetch absolute 5 from my_cursor
    fetch relative 2 from my_cursor
    --关闭游标
    close my_cursor
    --释放游标
    deallocate my_cursor
    --例子:
    
    create proc aa
    as
    begin
     declare my_cursor cursor scroll
     for select*from 员工
     open my_cursor 
     fetch next from my_cursor
     while(@@FETCH_STATUS =0)
     begin 
     fetch next from my_cursor
     return
     end
     end
-------------------------------------------------------------------------------------------
use stuDB 
go
--(1)创建非聚集索引--
create nonclustered index IX_stuMarks_marks on stuMarks(marks) with fillfactor=30
--调用--
select*from stuMarks with(index=IX_stuMarks_marks)
--(2)
use stuDB
go
--(1)创建唯一索引--
create unique index IX_stuInfo_stuName on stuInfo(stuName) with fillfactor=30
--调用--
select*from stuInfo with(index=IX_stuInfo_stuName)
--------------------------------------------------------------------------------------
--游标的使用
--(1)
use 北风贸易
go
declare @Name varchar(10),
@Sex bit,
@Married bit,
@Phone char(10),
@Chinese char(2),
@Math char(4)

declare  baby_cursor cursor for select 姓名, 员工性别, 婚姻状况, 电话号码 from 飞狐工作室
open baby_cursor;
fetch next from baby_cursor
into @Name,@Sex,@Married,@Phone;

while @@FETCH_STATUS =0
begin 
print'员工姓名:'+@Name;
if(@Sex =1)
set @Chinese ='男';
else
set @Chinese ='女';
if(@Married=1)
set @Math='已婚';
else
set @Math ='未婚';
print'性别'+@chinese;
print'婚姻'+@math;
print'电话'+@phone;
print replicate ('-',30);
fetch next from baby_cursor
into @Name,@Sex,@Married,@Phone;
end;
close baby_cursor
deallocate baby_cursor
--(2)
use 北风贸易
go
declare @Customer varchar(40),
@Contact varchar(30),
@Phone varchar(24);
declare Customer_Cursor Cursor for
select 公司名称,联系人,电话 from 客户
order by 公司名称;
open Customer_Cursor
fetch next from Customer_Cursor into @Customer,@Contact,@Phone;
while @@FETCH_STATUS =0
begin 
    PRINT '公司名称: ' + @Customer;
    PRINT '联系人: ' + @Contact;
    PRINT '电话: ' + @Phone;
    PRINT REPLICATE('-',30);
fetch next from Customer_Cursor into @Customer, @Contact, @Phone;
end

CLOSE Customer_Cursor;

DEALLOCATE Customer_Cursor;
----------------------------------------------------------------------------------
 

--(1)默认数据库主文件3MB,日志文件1MB
/*(2)查询表数据:select *from 表名(其中*代表所有列名);
       查询表结构:sp_help 表名;
       查看约束:sp_helpconstraint 表名

/*(3)删除数据:delete from 表名 where 列名=值;
                         delete from表名 where 列名 is null;
       删除一列:alter table 表名 drop column 列名 ;
       全部删除(数据):delete from 表名;
       删除表:       drop table 表名;
                  :    truncate table 表名 效率高,但无法恢复
*/
/*(4)修改表名:sp_help'需要改的名','要用之表名';
        修改列名:sp_help'表名.列名','要用之列名';
        修改列数据类型长度:alter table 表名 alter column 列名 varchar(100). 
/*(5)更新一列数据:update set 列名 =(赋值)  where 编号=(?),
       更新多列:update 表名 set 列名=(赋值),set 列名=(赋值) where 编号=(?)*/
(6)增加一列: alter table 表名 add 列名 数据类型(如char);
     添加约束:alter table 表名  add 约束词.
--(7)主键:不为空,不重复,一个表只有一个主键约束
--(8)外键(实例):tid int foreign key references teacher(tid)
--(9)约束:unique;check;primary key; default
--(10)属性:identity ;not null
--(11)级联:使用    on update cascade on delete cascade之前,肯定有外键;
  一般使用:on delete set null on update set null;
                    on delete set default on update set default.
--(12)伪列:计算列,不能参与运算,可以排序;
         select $,$,$,$,$,($+$+$+$+$)as'伪列名'($代表列名);
将伪列变为实列:with 新表名 as()然后和select*from 新表名where 属性值一起执行        
--(13)逻辑运算符:and, or,not
--查看字符段在字符串中的位置:
select *from 表名 where CHARINDEX('字',字符串)=3
--字符串的长度:
select *from 表名 where LEN(列名)=4
--替换字符段:
select REPLACE ('李梦瑶是个小美女','小','大')
--可以计算出伪列:
with 表名 as
(
select 列名,列名,DATEDIFF (YEAR ,出生日期,GETDATE()
as'年'from 员工
)
select *from 表名
--一年中的第几天:
select DATEPART(DAYOFYEAR,GETDATE())
--级联删除,级联更新:
--on delete cascade on update cascade
--删除项变子表数据为空:
on delete set null on update set null
--on delete set default on update set default
--更新表数据:
update 表名 set 列名=5 where 列名=2
--*等同于所有列名 
--不让其有重复值:
select distinct 列名 from 表名
--整个表前30%数据:
select TOP 30 percent *from 表名 
--表连接:
select l第一表名 .列名 as'编号',第二表名 .列名 as'名字'from 第一表名 inner join 第二表名
on 第一表名 .列名=第二表名 .列名
--表连接兼统计
select feeling.fname,COUNT (love .lname)as'数量' 
from feeling inner join love 
on feeling .fid=love .fid
group by feeling .fname 
having COUNT (love .lname)>3
--聚合函数 max ,min,avg,sum,count
--having是第二次运算,所以要用原列名
--表连接
查询第一(表名.列),第二(表名.列),form父表inner join 子表,最后 on 父表.列名=子表.列名
--交叉连接
select *from 供应商,商品
select *from 供应商 cross join 商品 
--桥梁表:要有primary key
create table t_s
(
  tid int foreign key references teacher(tid),
  sid int foreign key references student(sid),
  primary key(tid,sid)
)
--查询父表,子表中所需要的列,from 父表 inner join 桥梁表,然后 on 父表.列=桥梁表.列(两列相同),inner join 子表,然后 on 桥梁表.列=子表.列
select student .sid,student.sname,teacher.tid, teacher.tname from teacher inner join t_s 
on teacher.tid=t_s.tid inner join student
on t_s .sid=student .sid

--左连接
select * from table_01 left outer join table_02
on table_01.city = table_02.city

--右连接
select * from table_01 right outer join table_02
on table_01.city = table_02.city

select * from table_01 full join table_02
on table_01.city = table_02.city

--交叉连接
select * from table_01 cross join table_02
select CHARINDEX('毒','爱是毒药')
select charindex ('z','asfdzxgfsarfgd')
select LEN ('jkjgkfddfgjkfdmg')
select UPPER ('jkdfjkshj')
select ltrim ('            jgkf')
select REPLACE ('我恨你','恨','ai')
select STUFF('l love you better than he',2,5,'hart')
select substring('越执著越没有结果',2,2) 
select DATEADD (YEAR ,-1,GETDATE ())
select GETDATE ()
select DATEDIFF(YEAR ,'2012','2010')
select DATENAME(DW ,'1994-05-12')
--这一天在星期中的第几天
select DATEPART(DW,'2013-12-26')
select ABS (-18)
--大于小数的最小整数
select ceiling(25.6)
select FLOOR (25.3)
--计算次方
select POWER (5,6)
--四舍五入
select round(68.32,1)
select SIGN (-123)
--开平方
select SQRT (16)
--转换数据类型
select convert(varchar(4),123)
--返回任何数据类型
select datalength(1212)
===========================================================================================================================
create database loveDB
use loveDB
create table teacher
(
    tid int primary key,
    tname varchar(20)
)
--一次多行输入数据
例子:
insert into 表名 
select 1,'孔子' union
select 2,'孟子' union
select 3,'老子' union
select 4,'孙子' union
select 5,'儿子'

insert into teacher values(6,'龙')
--查询表
select *from teacher 
create table student
(
    sid int primary key,
    sname varchar(20) ,
    tid int foreign key references teacher(tid)
    on delete set null on update set null
)--删除表
drop table student
select *from student
insert into student 
select 10,'姜尚诚',1 union
select 11,'伊羽',2 union
select 12,'伊扬',3 union
select 13,'萧尘飞',4 union
select 14,'order god',5
delete from teacher where tid=6
update teacher set tid=7 where tid=2
select *from teacher 
select *from student
============================================================================================================================
伪列:
例子:
select *from 成绩
--弄出伪列,总分
select 身份证号码,语文成绩,英语成绩,数学成绩,物理成绩,化学成绩,(语文成绩+英语成绩+数学成绩+物理成绩+化学成绩) as'总分'from 成绩
with dergun as
(
  select 身份证号码,语文成绩,英语成绩,数学成绩,物理成绩,化学成绩,(语文成绩+英语成绩+数学成绩+物理成绩+化学成绩) as'总分'from 成绩
)
select *from dergun where 总分>400

--自创表

select*from emp where substr(ename,1,1)='a';
create table student
(
 id number primary key,
 name varchar2(20)not null,
 intime date not null
)
alter table student  add constraint uqe_name unique(name);--唯一约束
方法1:
create sequence id
start with 1
increment by 1--自动增长
方法2:
create sequence seq_id minvalue 1;


insert into student values(3,'张小花','2-3月-2014');
select*from student;
--子查询
select*from emp;
--最高工资
select ename,job from emp where sal=(select max(sal) from emp);
select ename,job,sal,deptno from emp where sal>=all(select sal from emp where deptno=20);
--相关子查询
select empno,ename,deptno,sal from emp a where exists(select*from emp b where b.mgr=a.empno);
--复制表
create table newtable(列名 属性,列名 属性);
insert into newtable select*from oldtable;
--分页
select e.* from(select rownum r,deptno,ename,job,mgr,hiredate from emp)e where r>5 and r<11;
select e.* from (select rownum r,ename,job,hiredate from emp)e where r>1 and r<9--分页
--创建表空间
create tablespace table_space
datafile 'd:\app\table_space.dbf'
size 30m
--创建用户
create user 张小萌--用户名
identified by 123-密码
default tablespace table_space;
--授权and 撤权
grant connect,resource,update,insert to  张小萌 --用户名
revoke connect from 张小萌--撤权
select upper(ename)from emp;--名字大写[lower]
select concat('010','1234')from dual;【select 'l'||'o'||'v'||'e'from dual;】--链接字符串
select initcap('zhang xiao meng')from emp;--首字母大写
select instr('41142119930823','930823',1,1)from dual;--从第9位开始截取
select lpad('love',5,'l')from dual;--在左侧加l【5代表共?位】
select rpad(lpad('love',5,'l'),8,'you')from dual;--右侧加
select substr('wtt5211314',4,3)from dual;--截取字符串
select replace('l love you','you','she')from dual;--代换
select trim('          zhangxiaomeng          ')from dual;--去掉空格
select sysdate ,to_char(sysdate,'yy-mm-dd day')from dual;
select sysdate from dual;--日期
select ceil(3.1415)from dual;--返回比大于目标数的最小整数
select floor(3.1415)from dual;--取整
[select round(123.98)from dual]select round(1234.34)from dual;--四舍五入
select to_char(add_months(to_date('1999-12','yy-mm'),2),'yyyy-mm')from dual;--日期加2个月是?
select to_char(to_date('1994-5-12','yyyy-mm-dd'))from dual;
select months_between('12-5月-1994','23-8月-1993')mon_between from dual;--间隔月份


【命令块】
--输出东西时必须的代码
set serveroutput on;--命令
例子:
SQL> declare
  2  v_ename emp.ename%type;
  3  begin
  4  select ename into v_ename from emp where  empno=&no;
  5  dbms_output.put_line('name:'||v_ename);
  6  exception
  7  when no_data_found then
  8  dbms_output.put_line('no data');
  9  end;
 10  /
 
 例子:【常量】
 SQL> declare
  2  v_pi constant number(6,2):=3.14;--常量constant :=赋值号
  3  v_r number:=2;
  4  v_area number;
  5  begin
  6  v_area:=v_pi*v_r*v_r;
  7  dbms_output.put_line('半径:'||v_r);
  8  dbms_output.put_line('面积:'||v_area);
  9  end;
 10  /
 
半径:2
面积:12.56
 
 例子:【自定义类型】
 SQL> declare
  2  type table_record is record---自定义类型
  3  (ename emp.ename%type,
  4   sal emp.sal%type,
  5   comm emp.comm%type,
  6   total_sal sal%type
  7  );
  8  v_table table_record;
  9  begin
 10    select ename,sal,nvl(comm,0),sal+nvl(comm,0)into v_table from emp where empno=7369;
 11    dbms_output.put_line('name:'||v_table.ename);
 12    dbms_output.put_line('sal:'||v_table.sal);
 13    dbms_output.put_line('comm:'||v_table.comm);
 14    dbms_output.put_line('total_sal:'||v_table.total_sal);
 15  end;
 16  /
 
name:SMITH
sal:800
comm:0
total_sal:800
 
 例子:
     insert into sb values(1,'张三3',to_date('2015-12-11 20:20:20','yyyy-MM-dd HH24:mi:ss'));

 例子:【输出参数】
 create function getdept3(eno number,deptname out varchar2)
  2  return varchar2
  3  as
  4  v_address varchar2(40);
  5  begin
  6  select dname,loc into deptname,v_address from dept,emp where dept.deptno=emp.deptno and empno=eno;
  7  return v_address;
  8  end;

declare
  2  address varchar2(30);
  3  deptname varchar2(20);
  4  begin
  5  address:=getdept3(7654,deptname);
  6  dbms_output.put_line('部门名字:'||deptname);
  7  dbms_output.put_line('部门地址:'||address);
  8  end;
 例子:【带有输入参数的函数】
create function getdept2(e_no number)return varchar2
  2  as
  3  deptname dept.dname%type;
  4  begin
  5  select dname into deptname from dept,emp where dept.deptno=emp.deptno and empno=e_no;
  6  return deptname;
  7  end;

declare
  2  deptname varchar2(30);
  3  begin
  4  deptname:=getdept2(7654);
  5  dbms_output.put_line(deptname);
  6  end;
 
 例子:【函数】
create or replace function fun_getno return number
  2  as
  3  v_no number;
  4  begin
  5  v_no:=floor(dbms_random.value(1,10));
  6  return v_no;
  7  end;
  例子:


if exists(select * from sys.triggers where name = 'Up_pay')
drop trigger Up_pay
alter trigger Up_pay
on salary
for update
as
    if(update(salary_money))
begin
    --deleted
    --inserted
    declare @old money
    declare @new money
    
    select @old=salary_money from deleted
    select @new=salary_money from inserted
    if(@new >= @old+10)
    begin
        print '最多只能加10元'
        rollback tran
    end
end

update salary set salary_money = salary_money+20 where salary_id = 100

select * from salary

if exists(select * from sys.triggers where name = 'del')
drop trigger del
create trigger del
on on1
for delete
as
begin
    print '不能删除此表信息!'
    rollback tran
end

delete from on1 where id = 1

select * from on1

declare
  2  num number;
  3  begin
  4  num:=fun_getno();
  5  dbms_output.put_line(num);
  6  end;
 
 例子:【位置传参】【名字传参】【组合传参】3种调用方法
create or replace procedure emp_table(v_no number,v_name varchar2,v_loc varchar2)
  2  as
  3  begin
  4  insert into dept values(v_no,v_name,v_loc);
  5  end;

 exec emp_table(70,'北京','beijing');
 call emp_table(v_no=>77,v_name => '我爱你',v_loc => '吴彤彤');
 call emp_table(57,v_loc => '郑州' ,v_name => '张小萌');
 
 例子:【包规范】
创建包:
SQL> create or replace package dbutil_page is
  2  pi constant number(10,7):=3.14159;
  3  function getarea(radius number)return number;
  4  procedure print_area;
  5  end dbutil_page;
  6  /

创建包体:
SQL> create or replace package body dbutil_page is area number(10);
  2  function getarea(radius number)return number is 
  3  begin
  4  area:=pi*radius*radius;
  5  return area;
  6  end;
  7  procedure print_area is
  8  begin
  9  dbms_output.put_line('面积:'||area);
 10  end;
 11  end dbutil_page;
 12  /
 
 例子:
删除子程序(过程)
drop procedure name;
 
 例子:【in out 输入输出】
create or replace procedure emp_table(haha in out number)
as
begin
select sal into haha from emp where empno=haha;
end;

declare
 inout_haha number;
 begin
 inout_haha:=&no;
 emp_table(inout_haha);
 dbms_output.put_line('工资:'||inout_haha);
 end;
 
 例子:【输出参数】
create or replace procedure emp_table(v_no in emp.empno%type,v_sal out emp.sal%type)
as
begin
select sal into v_sal from emp where empno=v_no;
exception 
when no_data_found then 
dbms_output.put_line('咩有找到此数据');
end;

declare
v_no emp.empno%type;
v_sal emp.sal%type;
begin
v_no:=&no;
emp_table(v_no,v_sal);
dbms_output.put_line('薪水:'||v_sal);
end;
外键关系:

--创建音乐表
create table music
(
   musicid number(4) primary key,
   title varchar2(50),
   singer varchar2(30),--歌手
   special varchar2(30),--专辑
   value varchar2(100),--说明
   time timestamp,--上传时间
   click number(4),--试听次数
   url varchar2(500)
)
create sequence seq_music
start with 1
increment by 1;

create or replace trigger tri_music
before insert
on music
for each row
begin
   select seq_music.nextval into :new.musicid from dual;
end;

--创建音乐盒
create table music_box
(
   musicid number(4),
   constraint fk_musicid foreign key(musicid)references music(musicid),
   userid number(4)
)

String ordersql="delete orders where id=:oid";
        Map params=new HashMap();
        params.put("oid",orderId);

--默认数据库主文件3MB,日志文件1MB

--查询表数据:(其中*代表所有列名);

select *from 表名

--查询表结构:sp_help 表名

--查看约束sp_helpconstraint

--拷贝表结构带数据

select* into table from table2 

--拷贝表结构不带数据

select*into table from 成绩 where 1>23

--复制表

create table newtable(列名 属性,列名 属性);

insert into newtable select*from oldtable;

--重新命名数据库

 sp_rename 'stuDB','yu'

--查看索引

sp_helpindex 表名

--删除数据:

delete from 表名 where 列名=值;

delete from表名 where 列名 is null;

--删除一列:

alter table 表名 drop column 列名 ;

--增加一列:

 alter table 表名 add 列名 数据类型(如char);

 --添加约束:

alter table 表名  add 约束词.

--全部删除(数据):

delete from 表名;

--删除表:drop table 表名;

【truncate table 表名 效率高,但无法恢复】

--修改表名:sp_help'需要改的名','要用之表名';

--修改列名:sp_help'表名.列名','要用之列名';

--修改列数据类型长度:alter table 表名 alter column 列名 varchar(100).

--更新多列:update 表名 set 列名=(赋值),set 列名=(赋值) where 编号=(?)

--主键:不为空,不重复,一个表只有一个主键约束

--外键(实例):tid int foreign key references teacher(tid)

--约束关键字:unique;check;primary key; default

--属性:identity ;not null

--级联:使用 on update cascade on delete cascade之前,肯定有外键;

一般使用:

on delete set null on update set null;

on delete set default on update set default.

--可以计算出伪列:

with 表名 as

(

select 列名,列名,DATEDIFF (YEAR ,出生日期,GETDATE()

as'年'from 员工

)

select *from 表名。

--查看字符段在字符串中的位置:

select *from 表名 where CHARINDEX('字',字符串)=3

--字符串的长度:

select *from 表名 where LEN(列名)=4

--一年中的第几天:

select DATEPART(DAYOFYEAR,GETDATE());

--级联删除,级联更新:

on delete cascade on update cascade

--去掉重复值:

select distinct 列名 from 表名

--整个表前30%数据:

select TOP 30 percent *from 表名

--替换字符段:

select REPLACE ('李梦瑶是个小美女','小','大')

--伪列:计算列,不能参与运算,可以排序;

--将伪列变为实列:

with 新表名 as()然后和select*from 新表名where 属性值一起执行

 --逻辑运算符:and, or,not

--case 语句

select fid as'编号',fname as'名',case dislikeMe

when 1 then '喜欢'

when 0 then '不喜欢' end as '爱', case lovetoshe

when 1 then '喜欢'

else '不' end as '恨' from friend

--开启事务

USE 北风贸易

go

begin tran aa

select*from 表名

save tran a

rollback tran c--事务回滚

commit tran aa--提交

--创建视图

Create view 名字

As

Select*from table

Select*from 名字【--调用视图】

--创建存储过程

Create proc name

As

Select*from table

Select name【--调用存储】

--DDL触发器

Use  stuDB

GO

Create trigger table

On database

For drop_table,alter_table

As

Print’不许删除或者修改表’

Rollback tran

Drop table teacher【--测试】

删除DDL触发器

Drop trigger love on database

--禁用DDL触发器

Use stuDB

GO

Disable trigger love on database

--定义游标

use 北风贸易

         go

         ----定义游标

         declare my_cursor cursor scroll

         for select*from 员工

         --打开游标

         open my_cursor

         --提取游标

         fetch next from my_cursor

         fetch prior from my_cursor

         fetch first from my_cursor

         fetch last from my_cursor

         fetch absolute 5 from my_cursor

         fetch relative 2 from my_cursor

         --关闭游标

         close my_cursor

         --释放游标

         deallocate my_cursor

--创建非聚集索引

 

use stuDB

go

create nonclustered index IX_stuMarks_marks on stuMarks(marks) with fillfactor=30

--调用

select*from stuMarks with(index=IX_stuMarks_marks)

--创建唯一索引

use stuDB

go

create unique index IX_stuInfo_stuName on stuInfo(stuName) with fillfactor=30

--调用

select*from stuInfo with(index=IX_stuInfo_stuName)

--表连接:

select l第一表名 .列名 as'编号',第二表名 .列名 as'名字'from 第一表名 inner join 第二表名

on 第一表名 .列名=第二表名 .列名

--表连接兼统计

select feeling.fname,COUNT (love .lname)as'数量'

from feeling inner join love

on feeling .fid=love .fid

group by feeling .fname

having COUNT (love .lname)>3

--聚合函数 max ,min,avg,sum,count

--桥梁表:要有primary key

create table t_s

(

  tid int foreign key references teacher(tid),

  sid int foreign key references student(sid),

  primary key(tid,sid)

)

--查询父表,子表中所需要的列,from 父表 inner join 桥梁表,然后 on 父表.列=桥梁表.列(两列相同),inner join 子表,然后 on 桥梁表.列=子表.列

select student .sid,student.sname,teacher.tid, teacher.tname from teacher inner join t_s

on teacher.tid=t_s.tid inner join student

on t_s .sid=student .sid

--左外连接

select * from table_01 left outer join table_02

on table_01.city = table_02.city

--右外连接

select * from table_01 right outer join table_02

on table_01.city = table_02.city

--全连接

select * from table_01 full join table_02

on table_01.city = table_02.city

--交叉连接

select * from table_01 cross join table_02

--转换字符

select CHARINDEX('毒','爱是毒药')

select charindex ('z','asfdzxgfsarfgd')

select LEN ('jkjgkfddfgjkfdmg')

select UPPER ('jkdfjkshj')

select ltrim ('            jgkf')

select REPLACE ('我恨你','恨','ai')

select STUFF('l love you better than he',2,5,'hart')

select substring('越执著越没有结果',2,2)

select DATEADD (YEAR ,-1,GETDATE ())

select GETDATE ()

select DATEDIFF(YEAR ,'2012','2010')

select DATENAME(DW ,'1994-05-12')

--这一天在星期中的第几天

select DATEPART(DW,'2013-12-26')

select ABS (-18)

--大于小数的最小整数

select ceiling(25.6)

select FLOOR (25.3)

--计算次方

select POWER (5,6)

--四舍五入

select round(68.32,1)

select SIGN (-123)

--开平方

select SQRT (16)

--转换数据类型

select convert(varchar(4),123)

--返回任何数据类型

select datalength(1212)

--一次多行输入数据

insert into 表名

select 1,'孔子' union

select 5,'儿子'

--关于级联操作实例

create table student

(

         sid int primary key,

         sname varchar(20) ,

         tid int foreign key references teacher(tid)

         on delete set null on update set null

)

--伪列:

with dergun as

(

  select 身份证号码,语文成绩,英语成绩,数学成绩,物理成绩,化学成绩,(语文成绩+英语成绩+数学成绩+物理成绩+化学成绩) as'总分'from 成绩

)

select *from dergun where 总分>400

--自动增长序列

alter table tablename add constraint uqe_name unique(name);--唯一约束

方法1:

create sequence id

start with 1

increment by 1--自动增长

方法2:

create sequence seq_id minvalue 1;

--子查询

select ename,job from emp where sal=(select max(sal) from emp);

select ename,job,sal,deptno from emp where sal>=all(select sal from emp where deptno=20);

--相关子查询

select empno,ename,deptno,sal from emp a where exists(select*from emp b where b.mgr=a.empno);

 

ORACLE:

--分页(oracle)

select e.* from(select rownum r,deptno,ename,job,mgr,hiredate from emp)e where r>5 and r<11;

select e.* from (select rownum r,ename,job,hiredate from emp)e where r>1 and r<9--分页

--创建表空间

create tablespace table_space

datafile 'd:\app\table_space.dbf'

size 30m

--创建用户

create user 张小萌--用户名

identified by 123-密码

default tablespace table_space;

--授权and 撤权

grant connect,resource,update,insert to  张小萌 --用户名

revoke connect from 张小萌--撤权

select upper(ename)from emp;--名字大写[lower]

--拼接字符串

select concat('010','1234')from dual;【select 'l'||'o'||'v'||'e' from dual;

--首字母大写

select initcap('zhang xiao meng')from emp;

--从第9位开始截取

select instr('41142119930823','930823',1,1)from dual;

--在左侧加l【5代表共?位】

select lpad('love',5,'l')from dual;

--右侧加

select rpad(lpad('love',5,'l'),8,'you')from dual;

--截取字符串

select substr('wtt5211314',4,3)from dual;

--替换字符串

select replace('l love you','you','she')from dual;

--去掉空格

select trim('          zhangxiaomeng          ')from dual;

--日期格式

select sysdate ,to_char(sysdate,'yy-mm-dd day')from dual;

--当前日期

select sysdate from dual;

-日期加2个月是?

select to_char(add_months(to_date('1999-12','yy-mm'),2),'yyyy-mm')from dual;

---返回比大于目标数的最小整数

select ceil(3.1415)from dual;

select floor(3.1415)from dual;--取整

--四舍五入

[select round(123.98)from dual]select round(1234.34)from dual;

--日期

select to_char(to_date('1994-5-12','yyyy-mm-dd'))from dual;

--两个日期间隔时间

select months_between('12-5月-1994','23-8月-1993')mon_between from dual;--间隔月份

猜你喜欢

转载自blog.csdn.net/qq_35781178/article/details/82932458
今日推荐