SQL数据库基础练习分享

use master
if exists(select *from sysdatabases where name='Company1')--判断数据库是否存在
   drop database Company1
go
create database Company1
/*on primary
(
name=Company1_data,--主文件逻辑名称
filename='E:\sqlnsa\SQLmy\Company1.mdf',--物理文件名
size=10mb,
maxsize=unlimited,
filegrowth=15%--15%的速度增长
)



log on
(
name=Company1_log,--日志文件
filename='E:\sqlnsa\SQLmy\Company1.ldf',--逻辑文件名
size=1mb,
maxsize=10,
filegrowth=2%
)*/
/********************创建部门数据表******************/
go
use Company1
go
create table 部门
(
部门编号 int  primary key,/*主键*/
部门名称 char(10),
)
go



/**********************创建职工数据表***********************/
create table 职工
(
职工编号 int primary key,/*主键约束*/
/*phonenum 职工编号,
constratint chk_职工编号 check
(phonenum line'[1-9]')*/
姓名 char(10),
性别 char (2)
constraint chk_性别 check(性别 in ('男','女')),
出生日期 smalldatetime
constraint chk_出生日期 check(出生日期<getdate()),
党员 char(2)
constraint chk_党员 check(党员 in('是','否')),


入职时间 smalldatetime
constraint chk_入职时间 check(入职时间<getdate()),
籍贯 char(10),


所在部门 int
constraint con_no
foreign key(所在部门)
references 部门(部门编号),



)
go
/******************工资表*******************/
create table 工资
(
职工编号 int ,
constraint con_gz/*工资*/
foreign key(职工编号)
references 职工(职工编号),


月份 int  check(月份>=1 and 月份<=12),
基本工资 money check(基本工资>0),
津贴 money check(津贴>=0),
补助 money check(补助>=0),
奖金 money check(奖金>=0),
扣除 money check(扣除>=0),
税收 money check(税收>=0),



)
go
/*插入记录,针对部门表*/
insert into 部门
(部门编号,部门名称)
values('1','财务处')
insert into 部门
values ('2','人事处')
insert into 部门
values('3','市场部')


/*插入记录,针对职工表*/
insert into 职工
(职工编号,姓名,性别,出生日期,党员,入职时间,籍贯,所在部门)
values('1','孙华','男','1952-1-3','是','1970-10-10','天津市','1')
insert into 职工
values('2','陈明','男','1945-5-8','否','1965-01-01','北京市','2')
insert into 职工
values('3','程西','女','1980-6-10','否','2002-07-10','北京市','1')
insert into 职工
values('4','苏天气','女','1965-3-10','是','1987-07-10','天津市','2')
insert into 职工
values('5','刘少文','男','1942-1-11','否','1960-08-10','','1')
insert into 职工
values('6','刘新','男','1952-10-08','否','1970-7-01','上海市','1')
insert into 职工
values('7','余辉','女','1980-12-4','否','2001-07-10','武汉市','3')
insert into 职工
values('8','王晓艳','女','1980-12-11','是','2001-07-10','河北省','2')
insert into 职工
values('9','李玉','女','1964-2-12','是','1989-07-15','天津市','1')
insert into 职工
values('10','周涛','男','1963-2-10','否','1983-07-20','河北省','3')
insert into 职工
values('11','欧阳少兵','男','1965-4-19','否','1984-07-12','北京市','2')
insert into 职工
values('12','张旗','男','1980-11-10','否','1999-09-18','天津市','3')
insert into 职工
values('13','李涵','女','1980-5-10','否','2002-02-14','天津市','3')
insert into 职工
values('14','魏君','女','1977-3-23','是','1993-07-10','','3')
insert into 职工
values('15','李艺','男','1979-9-18','否','2001-07-20','上海市','3')


/*插入记录,针对工资*/
insert into 工资
(职工编号,月份,基本工资,津贴,补助,奖金,扣除,税收)
values('1','8','2800','1200','180','200','0','220')
insert into 工资
values('2','8','2600','1000','200','300','0','180')
insert into 工资
values('3','8','1880','880','200','260','50','120')
insert into 工资
values('4','8','2200','980','180','230','80','110')
insert into 工资
values('5','8','2300','880','210','0','0','125')
insert into 工资
values('6','8','2100','600','220','180','50','110')
insert into 工资
values('7','8','2200','800','180','200','120','120')
insert into 工资
values('8','8','2000','780','120','100','0','100')
insert into 工资
values('9','8','2500','870','130','150','0','120')
insert into 工资
values('10','8','2350','700','250','180','50','120')
insert into 工资
values('11','8','1900','800','260','130','0','100')
insert into 工资
values('12','8','1800','500','200','100','50','100')
insert into 工资
values('13','8','1580','500','200','100','0','100')
insert into 工资
values('14','8','1300','450','200','100','0','100')
insert into 工资
values('15','8','1380','450','200','100','0','10')
/*************************查询部分*******************************************/


select *from 职工 --a)查询所有职工的基本信息
select  *from 职工 where 所在部门='3'--b)查询所有市场部职工的基本信息
select 姓名,入职时间 from 职工 where 所在部门='2'--c)查询出所有人事处职工的姓名和入职时间
select *from 职工 where 性别='男'--d)查询出所有男职工的基本信息
select 姓名,出生日期,所在部门 from 职工 where 性别='女'--e)查询出所有女职工的姓名、出生年月和所在部门
select 职工编号,姓名,入职时间 from 职工 where 性别='女' and 入职时间>'2002-01-01 0:00:00'--f)查询出所有入职时间在2000年以后的女职工的职工号、姓名和入职时间
select 职工编号,姓名,入职时间,year(getdate())-year(入职时间) as 工龄 from 职工--g)查询出所有职工的职工号、姓名、入职时间和工龄(注:只考虑整年数,取得当前系统日期的是getdate()函数,取得日期的年份是year()函数。)
select *from 职工 where len(姓名)=2--h)查询出所有姓名是两个字的员工基本信息
select *from 职工 where 姓名 like '李%'--i)查询出所有姓李的职工的基本信息
select *from 职工 where 党员='是' and 所在部门='3'--j)查询出财务处的所有的党员
select *from 职工 where 党员='是' --k)查询所有的女党员
select *from 职工 where 出生日期<'1960-01-01'--l)查询出所有出生年月在1960以前的员工
select 姓名,year(getdate())-year(出生日期)as 年龄 from 职工 --查询出所有职工的姓名和年龄(注意:是年龄不是出生日期)
select *from 职工  where  籍贯='北京市'or 籍贯='天津市'--n)查询出所有籍贯是北京市或天津市的职工信息(使用or和in分别查询)
select *from 职工 where not 籍贯='天津市'--o)查询出所有籍贯不是天津市的职工信息(使用not和<>分别查询)
select *from 职工 where 籍贯<>'天津市'
select *from 职工 where not 籍贯='天津市' and 籍贯<>'北京市' -- p)查询出所有籍贯不是天津市也不是北京市的员工信息(使用and和not in分别查询)
select *from 职工 where 职工编号>='5' and 职工编号<='10'--q)查询出职工号在5-10之间的员工信息(使用and和between分别查询)
select 月份,基本工资,津贴,补助,奖金,扣除,税收,基本工资+津贴+补助+奖金+扣除+税收 as 实发工资 from  工资--r)查询出所有职工的实际工资和职工号
select 职工编号,月份,基本工资,津贴,补助,奖金,扣除,税收,基本工资+津贴+补助+奖金+扣除+税收 as 实发工资 from 工资 where 基本工资+津贴+补助+奖金-扣除-税收<3500 and 基本工资+津贴+补助+奖金-扣除-税收>3000--s)查询出所有实际工资在3000-3500之间的职工号和税收
--select *from 职工 where 籍贯  --t)查询出所有籍贯为空的职工的基本信息
select *from 职工 where 籍贯=''
select *from 职工 where 籍贯 <>''--不为空的信息
select *from 职工 where 姓名 like'李[ 玉 , 艺]'  --u)查询出姓李并且第二个字是玉或者艺字的职工
select *from 职工 where 姓名  like '李[^玉,^艺]'--v)查询出姓李并且第二个字不是玉或者艺的职工
select *from 职工 where 姓名 like'[^李]%'--w)查询出所有不姓李的职工的信息
select * from 职工 where 姓名 not like '%少%'--x)查询出名字中没有“少”字的职工
select 职工编号,(基本工资+津贴+补助+奖金+扣除+税收)*0.08  as '分积金' from 工资  --y)现在每个职工都要拿出自己实际工资的百分之8作为住房公积金使用,查询出所有职工的职工号的应拿出的公积金
/*插入记录,针对职工表*/
insert into 职工
(职工编号,姓名,性别,出生日期,党员,入职时间,籍贯,所在部门)
values('16','少合','女','1992-1-3','是','1970-10-10','天津市','3')--6.针对上表,做如下操作:a)新添加16号员工的信息,其他字段值自定*/
delete from 工资 where 职工编号 in (select 职工编号 from 职工 where 出生日期<='1950-01-01')
delete from  职工 where 出生日期<='1950-01-01'--b)删除1950年以前的员工信息
update 工资 set 基本工资=基本工资+200 where 职工编号 between 1 and 5--c)工资的调整:i.1-5号职工,基本工资增加200
select *from 工资 where 职工编号>='1' and 职工编号<='5' --测试增加200是成功的
update 工资 set 基本工资=基本工资+(基本工资*0.1 ),津贴=津贴+50 where 职工编号>='6' and 职工编号='10'--ii.6-10号职工,基本工资增加百分之十,津贴增加50
update 工资 set 基本工资=基本工资+(基本工资*0.1 ),津贴=津贴+50 where 职工编号 between 6 and 10--必须使用between
select *from 工资 where 职工编号 between 6 and 10--总结,运行成功,必须使用between
update 工资 set 基本工资=基本工资+150,津贴=津贴+30,补助=补助+20 where 职工编号>11--iii.11号以上职工,基本工资增加150,津贴增加30,补助增加20
select *from 工资 where 职工编号>='11'  --测试


update 工资 set 奖金=奖金+80 --iv.所有职工奖金增加80
update 工资 set 奖金=0 where 扣除>0--v.有“扣除”项的职工,没有奖金
/*高级查询*/
select *,基本工资+津贴+补助+奖金+扣除+税收 as 实发工资 from 工资 order by 基本工资 asc--按基本工资由大到小显示所有职工的职工号和实际工资
select *,基本工资+津贴+补助+奖金+扣除+税收 as 实发工资 from 工资 order by 基本工资 desc--按实际工资由大到小显示所有职工的职工号和实际工资

--c)  按部门升序显示职工的职工号和实际工资
select 职工.职工编号,工资.基本工资+工资.津贴+工资.补助+工资.奖金+工资.扣除+工资.税收 as 实发工资,所在部门
from 职工 inner join 工资 on 职工.职工编号=工资.职工编号  order by 职工.所在部门

select sum(基本工资) as 基本工资总和 from 工资--d)  求出所有职工的基本工资的和
select sum(基本工资+津贴+补助+奖金+扣除+税收) as 实发工资总和 from 工资--e)  求出所有职工的实际工资的和
select sum(基本工资) as 基本工资总和 from 工资 where 职工编号>='5' and 职工编号<='10'(select *from 工资 where 扣除>0)--f)  求出5-10号没有被扣除工资的员工的基本工资和
select avg(基本工资) as 平均基本工资 from 工资--g)  求出所有职工基本工资的平均工资
select avg (基本工资+津贴+补助+奖金+扣除+税收) as 实发平均工资 from 工资--h)  求出所有职工实际工资的平均工资
select count(性别) as '女工总数' from 职工 where 性别='女'--i)  统计出女工的数目
select count(性别) as '天津籍女工总数' from 职工 where 性别='女' and 籍贯='天津市'--j)  统计出天津的女工个数
select count(扣除) as '扣除职工人数',sum(扣除) as '扣除总金额' from 工资 where 扣除>0--k)  统计出本月被扣除工资的职工数和扣除的总金额
select (基本工资+津贴+补助+奖金-扣除-税收) as '实际工资' from 工资 where (基本工资+津贴+补助+奖金-扣除-税收)>3000--l)  统计出实际工资大于3000的职工数
select max(datediff(yy,[入职时间],getdate())) as '最大工龄员工' from 职工--m)  统计出职工的最大工龄
select min(datediff(yy,[出生日期],getdate())) as '最小年龄员工' from 职工 where 性别='女'--n)  统计出女职工的最小年龄
select max(datediff(yy,[出生日期],getdate())) as '最大年龄天津籍女党员' from 职工 where (性别='女' and 党员='是' and 籍贯='天津市')--o)  统计出天津女党员的最大年龄
select 所在部门, max(datediff(yy,[入职时间],getdate())) as '最大工龄' from 职工 group by 所在部门 --p)  统计出各部门最高的工龄
select 性别,max(datediff(yy,[入职时间],getdate())) as '最大工龄' from 职工 group by 性别--q)  统计出最大的男工和女工的年龄
select 所在部门,count(所在部门) from 职工 group by 所在部门--r)  统计出各部门的员工数
select 所在部门,count(所在部门) as '各部门女工人数' from 职工 where 性别='女' group by 所在部门--s)  列出各部门的女工数
select 性别,count(性别) as '各部门人数',所在部门 from 职工 group by 所在部门,性别--t)  列出各部门的男工数和女工数
select 所在部门,count(所在部门) as 员工数 from 职工 group by 所在部门 having count(所在部门)>'3'--u)  列出员工数超过3人的部门号和员工数
select 性别,count(性别) as 女工数,所在部门 from 职工 where 性别='女' group by 性别,所在部门 having count(性别)>'1'--v)  列出女工数超过1人的部门号和女工数
/*8.  多表连接查询:*/
select 职工.姓名,部门.部门名称 from 职工 left join 部门 on 职工.所在部门=部门.部门编号--a)  显示出所有职工的姓名和部门名
select 姓名,部门名称 from 职工 left join 部门 on 职工.所在部门=部门.部门编号 order by 部门名称--b)  按部门升序显示出所有职工的姓名和部门名
select 职工.姓名,工资.基本工资,职工.入职时间 from 职工 right join 工资 on 职工.职工编号=工资. 职工编号--c)  显示出所有职工的姓名、基本工资和入职时间
select 姓名,datediff(yy,出生日期,getdate()) as '年龄',部门.部门名称,(基本工资+津贴+补助+奖金-扣除-税收) as '实际工资'
from  工资 right join 职工
on 职工.职工编号=工资.职工编号
left join 部门
on 职工.所在部门=部门.部门编号--d)  显示出所有职工的姓名、年龄、部门和实际工资

select zg.姓名,gz.扣除
from 职工 zg left join 工资 gz
on zg.职工编号=gz.职工编号
where gz.扣除>0--e)  显示出所有被扣工资的员工姓名和被扣金额


select zg.姓名,zg.所在部门,(基本工资+津贴+补助+奖金-扣除-税收) as '实际工资'
from 职工 zg left join 工资 gz
on zg.职工编号=gz.职工编号
order by 所在部门 asc--f)  按部门升序显示职工的姓名、所在部门和实际工资


select bm.部门名称,gz.职工编号,(基本工资+津贴+补助+奖金-扣除-税收) as '实际工资'
from 职工 zg left join 工资 gz
on zg.职工编号=gz.职工编号
left join 部门 bm
on zg.所在部门=bm.部门编号
--order by 部门名称 asc
order by 实际工资 desc --g)  按部门名升序、实际工资降序显示部门名称、职工号和实际工资

select max(基本工资+津贴+补助+奖金-扣除-税收) as '实际工资'
from 职工 zg left join 工资 gz
on zg.职工编号=gz.职工编号
where 籍贯='天津市'--h)  统计出天津籍员工的最高实际工资
/*9.  子查询 */
select top 1 姓名,max(datediff(yy,入职时间,getdate())) as 最大工龄 from 职工
group by 姓名,入职时间
order by datediff(yy,入职时间,getdate()) desc--a)  显示出工龄最大的职工姓名和工龄


select sum(基本工资) as 工资总和
from 工资 gz full join 职工 zg
on gz.职工编号=zg.职工编号
where 籍贯='北京市'--b)  统计出所有北京籍员工的工资总和


select avg(基本工资) as '平均工资'
from 工资 gz full join 职工 zg
on gz.职工编号=zg.职工编号
where 性别='女'--c)  统计出所有女职工的平均工资


select min(基本工资) as '最低工资'
from 工资 gz full join 职工 zg
on gz.职工编号=zg.职工编号
where 性别='女' and 党员='是'--d)  统计出所有天津女党员的最低工资


select bm.部门名称,zg.*
from 职工 zg full join 部门 bm
on zg.所在部门=bm.部门编号
where 部门名称='市场部'--e)  查询所有市场部职工的基本信息
select top 1 姓名,min(datediff(yy,出生日期,getdate())) as 最小年龄
from 职工
group by 姓名,出生日期
order by datediff(yy,出生日期,getdate()) --f)  显示出最小的女职工的姓名和年龄

select top 1 姓名,max(基本工资+津贴+补助+奖金-扣除-税收) as '实际工资',籍贯
from 工资 gz full join 职工 zg
on gz.职工编号=zg.职工编号
group by 姓名,籍贯
--order by 实际工资 desc
having 籍贯='北京市'  --g)  统计出实际工资最高的北京籍员工的姓名和实际工资


select 性别,max(datediff(yy,出生日期,getdate())) as 最大年龄
from 职工 zg
group by 性别,党员
having  性别='女' and 党员='是' --h)  显示出年龄最大的天津女党员


--i)  显示出基本工资比天津市最高工资高的所有职工


select * from 职工 zg inner join 工资 gz
on zg.职工编号=gz.职工编号
where (基本工资+津贴+补助+奖金-扣除-税收)<(select avg(基本工资+津贴+补助+奖金-扣除-税收) from 工资 where 性别='女')--j)  显示出实际工资比总体平均工资低的女职工


select * from 职工 zg inner join 部门 bm
on zg.所在部门=bm.部门编号
where bm.部门编号 in (select count(部门名称) from 部门)--k)  显示出人数最多的部门的所有职工信息


select 姓名,性别,籍贯,所在部门
from 职工 zg inner join 工资 gz
on zg.职工编号=gz.职工编号
where 基本工资 in (select max(基本工资) from 工资)--l)  显示出工资最高的职工的姓名,性别,籍贯和所在部门名称


select * from 职工
where 入职时间>(select max(入职时间) from 职工 where 籍贯='天津市')--m)  显示出比天津市入职最晚的职工入职还晚的职工


select 姓名,(基本工资+津贴+补助+奖金-扣除-税收) as '实际工资'
from 职工 zg inner join 工资 gz
on zg.职工编号=gz.职工编号
where gz.基本工资>(select 基本工资 from 工资 where 职工编号=(select 职工编号 from 职工 where 姓名='刘新'))--n)  显示出比‘刘新’工资高的所有职工姓名和实际工资


select 姓名,部门名称,奖金
from 工资 gz right join 职工 zg 
on zg.职工编号=gz.职工编号
right join 部门 bm
on zg.所在部门=bm.部门编号
where gz.奖金 in (select 奖金 from 工资 where 职工编号=(select 职工编号 from 职工 where 姓名='李艺'))--o)  显示出奖金和‘李艺’一样多的职工姓名和所在部门名称


update 工资
set 基本工资=基本工资+200
where 职工编号 in (select 职工编号 from 职工 where 所在部门=(select 部门编号 from 部门 where 部门名称='市场部'))--p)  给所有市场部的职工增加200元的基本工资


update 工资
set 基本工资=基本工资+100
where 职工编号 in (select 职工编号 from 职工 where 籍贯<>'天津市')--q)  所有非天津籍员工的补助增加100元作为思乡补助


delete from 工资
where 基本工资 and 籍贯='上海市'--r)  删除所有上海籍员工的基本信息(注意删除的次序)
delete from 工资
where 扣除=(select top 1 扣除 from 工资 order by 扣除 desc) --s)  辞退扣除最多的职工

猜你喜欢

转载自feng2029.iteye.com/blog/1553240