sqlserver练习

1.基本表的练习:

create table Test(
    name varchar(4),
    age int,
    sex varchar(2)
)
alter table Test
add id char(16)
alter table Test
alter column id varchar(16)
alter table Test
drop column id
drop table Test
select * from Test

2.记录操作DML:

create table Test(
    name varchar(4),
    age int,
    id char(16)
)
alter table Test
 alter column name varchar(6) 
insert into Test 
values('崔哥哥',15,'311409060209');--注意单引号

delete from Test
where name='崔哥哥'

update Test set age=18 where name='崔哥哥'

bulk insert Test 
from 'C:UsersAdministratorDesktop	est.txt'
with(
    fieldterminator=' ',rowterminator='
'
)

select name from Test where LEN(id)=7 order by age 
--desc asc
select * from Test

3.function用法:

--declare @a int, @b int
--print rand()*26+65
--select @a=cast('123' as int), @b=convert(int,'456');
--print @b
--print ascii('A')
--print char(rand()*26+65)

--print substring('李四',1,1);
--select * from Test
--where left(name,1)='崔' or right(name,1)='三'or substring(name,2,1)='四'

print getdate()
print dateadd(day,2,getdate())
print dateadd(minute,2,getdate())
print dateadd(second,2,getdate())
print dateadd(hour,2,getdate())
print datediff(second,getdate(),dateadd(hour,2,getdate()))
print datepart(week,getdate())-datepart(week,dateadd(month,-1,getdate()))
print str(1.25,3,1)+'asd'

--print str(参数1,参数2,参数3)
--参数2表示转换后的数据的总位数,包括小数点,正负号
--参数3表示转换后的数据的小数位数

4.bulk insert用法:

bulk insert Test 
from 'C:UsersAdministratorDesktop	est.txt'
with(
    fieldterminator=' ',rowterminator='
'
)

5.cursor用法:

--declare mycursor scroll cursor for select * from Test
open mycursor
declare @name varchar(6),@age int,@id char(16)

fetch first from mycursor into @name,@age,@id
print @name
print @age
print @id
while @@FETCH_STATUS=0
begin
    fetch next from mycursor into @name,@age,@id
    --absolute 10
    print @name
    print @age
    print @id
end
close mycursor
deallocate mycursor

6.primary key,unique,not null, check用法:

alter table Test 
drop column name

select * from Test
delete from Test

select * from Test

alter table Test
add name varchar(6) primary key

alter table Test
alter column id varchar(16) not null

alter table Test
drop column age
alter table Test
add age int check( age>=0 and age<=100)

7.view and index:

create view myview as select * from Test
select * from myview
select * from myview where age=18

create clustered index myindex on Test(age)
alter index myindex on Test rebuild
drop index Test.myindex

8.trigger用法:

建立车牌信息表:

--io10

declare @id varchar(10), @i int, @j int, @k int, @temp varchar(10), @tmp varchar(26);
set @temp = '豫京津沪';
set @tmp = 'HABCDEFGHJKLMN23456789';
set @i = 0;

while(@i<200000)
begin
    set @id = '';
    select @k = 0;
    set @j = rand()*4+1;
    set @id = @id + substring(@temp, @j, 1);
    set @j =rand()*14+1;
    set @id = @id + substring(@tmp, @j, 1);
    print @id;
    while(@k < 5)
    begin
        set @j =rand()*22+1;
        set @id = @id + substring(@tmp, @j, 1);
        set @k = @k + 1;
    end
    set @i = @i + 1;
    insert into viechle values(@id,0,0,0);
end

--select * from viechle

建立日志表:

--use handsomecui
--drop table mylog
--create table mylog(
--    tablename varchar(10),
--    altername varchar(10),
--    altertimr date
--)

insert into viechle values('123',0,0,0);

update viechle set number_id='456' where number_id='123'

select * from mylog


触发器插入日志文件:

--drop trigger mytrigg
create trigger mytrigger
on viechle after insert,update, delete
as
begin
if exists(select 1 from inserted) and exists(select 1 from deleted)
insert into mylog values('viechle','update',getdate());
if exists(select 1 from inserted) and not exists(select 1 from deleted)
insert into mylog values('viechle','insert',getdate());
if not exists(select 1 from inserted) and exists(select 1 from deleted)
insert into mylog values('viechle','delete',getdate());
end

数据库考核,统计职工生日,以及生日相同的人的个数;

1.建表,插入数据

--姓名>3 age 20-30
--drop table Worker
--create table Worker(
--    stname varchar(10),
--    stbirth date,
--    styear int,
--    stdate varchar(4),
--    cnt int
--)

declare @bir date, @yy int, @mm int, @dd int, @name varchar(10), @i int, @j int, @stdate varchar(4);
select @i = 0, @j = 0;
while(@i < 365)
begin
    select @name = '', @j = 0, @stdate = '';
    while(@j < 5)
    begin
        set @name = @name + char(rand()*26 + 65);
        set @j = @j + 1;
    end
    set @bir = dateadd(day, -20*365, dateadd(day, -10*365*rand(), getdate()));
    set @yy = datepart(year, @bir);
    set @mm = datepart(month, @bir);
    set @dd = datepart(day, @bir);
    if(@mm < 10)
    begin
        set @stdate = @stdate + '0';
        set @stdate = @stdate + char(@mm + 48);
    end
    else
    begin
        set @stdate = @stdate + char(@mm/10 + 48);
        set @stdate = @stdate + char(@mm%10 + 48);
    end
    if(@dd < 10)
    begin
        set @stdate = @stdate + '0';
        set @stdate = @stdate + char(@dd + 48);
    end
    else
    begin
        set @stdate = @stdate + char(@dd/10 + 48);
        set @stdate = @stdate + char(@dd%10 + 48);
    end
    insert into Worker values(@name, @bir, @yy, @stdate, 1);
    set @i = @i + 1;
end

--select * from Worker

2.游标修改cnt员工相同人的个数:

--select stname from Worker where left(stname, 1)='A'

--create clustered index myindex on Worker(stdate)

--select  *  from Worker order by stdate 

--close mycursor
--deallocate mycursor

declare mycursor scroll cursor for select stname,stdate from Worker


declare @date varchar(4), @cnt int, @stname varchar(10);
open mycursor
fetch first from mycursor into @stname,@date
select @cnt = count(*) from Worker where stdate=@date group by stdate
update Worker set cnt=@cnt where stdate = @date;
while @@FETCH_STATUS=0
begin
    fetch next from mycursor into @stname,@date
    
    select @cnt = count(*) from Worker where stdate=@date group by stdate
    update Worker set cnt=@cnt where stdate = @date;
end
close mycursor
deallocate mycursor


--select * from Worker order by cnt desc


3.查询最多人生日的方法:

select * from Worker where stdate in(
    select top 1 stdate from Worker group by stdate
    order by count(1) desc
)
原文地址:https://www.cnblogs.com/handsomecui/p/6005876.html