--对xs表增加身份证号码属性列,要求是18位的字符类型
alter table xs
add 身份证号 char(18)
--1.查询有直接先行课的课程的课号,课名和先行课号。
select 课程号 ,课程名 ,先行课号
from kc
where 先行课号 is not null
--2.查询先行课号是“J001”号课程的课号和课名
select 课程号 ,课程名
from kc
where 课程号 ='J001'
--3.查询所有的网络工程系姓李,张,王的同学的学号和姓名
select 学号,姓名
from xs
where 专业= '网络工程' and 姓名 like '[李,张,王]%'
--4.查询不在网络工程和信息管理专业学习的学生的学号和姓名,系别,并对查询结果按照专业的升序和学号的降序排序
select 学号,姓名
from xs
where 专业 not in ('网络工程','信息管理')
order by 专业 , 学号 DESC
--5.查询每门课不及格的学生的人数,显示课号和人数
select 课程号 , count(*) "人数"
from cj
where 成绩 < 60
group by 课程号
--6.查询年龄不在30-35之间的网络工程系的学生的学号,姓名和年龄
select 学号, 姓名 ,年龄=DATEDIFF(yy,出生时间,getdate())
from xs
where DATEDIFF(yy,出生时间,getdate()) not between 30 and 35 and 专业 = '网络工程'
--7.查询没有选修‘J001’号课程的学生的学号(注意去掉重复的元组)
select distinct 学号
from xs
where not exists
(
select *
from cj
where xs.学号=cj.学号 and 课程号 = 'J001'
)
--8.查询每个学生的学号,姓名,出生年份,并给出生年份起别名为chusheng
select 学号,姓名 ,year(出生时间) chusheng
from xs
--9. 查询每个学生的学号,姓名和出生日期(出生日期根据身份证号码查询)
select 学号,姓名,出生日期=SUBSTRING(身份证号,7,8)
from xs
--10.查询选修J001课程成绩排名第一的同学的学号和成绩
select top 1 学号,成绩
from cj
where 课程号 in ('j001')
order by 成绩 desc
--11. 查询所有名字中含有’明’或者’丽’的同学的学号,姓名
select 学号,姓名
from xs
where 姓名 like '%明%' or 姓名 like '%丽%'
--12. 查询信息管理专业年龄超过20岁的学生的人数
select 人数 = count(*)
from xs
where 专业 = '信息管理' and DATEDIFF(yy,出生时间,getdate())>20
--13. 查询平均成绩超过80分的课程的课程号和平均成绩
select 课程号, AVG(成绩) as 平均成绩
from cj
group by 课程号
having avg(成绩)>=80
--14. 查询每个专业所有姓张的人数
select 专业, 人数 = count(*)
from xs
where 姓名 like '张%'
group by 专业
--15. 查询各种姓氏的人数(假设没有复姓)
select 姓 = SUBSTRING(姓名,1,1) , 人数 = count(*)
from xs
group by SUBSTRING(姓名,1,1)
--16.查询选修课程超过5门的学生的学号和选课门数,以及平均成绩
select 学号, 选课门数 = count(*),AVG(成绩) as 平均成绩
from cj
group by 学号
having count(*)>5
--17. 查询选修‘J001’课程的成绩排名前五的学生的学号和成绩
select top 5 学号, 成绩
from cj
where 课程号 = 'j001'
order by 成绩 desc
--18.查询每个学生的最低分和选课门数
select 学号 ,最低分 = min(成绩), 选课门数=count(*)
from cj
group by 学号
--19. 查询各个专业各种性别的人数
SELECT xs.专业, count (case when 性别='男' THEN 1 END) 男生数,
count (case when 性别='女' THEN 1 END) 女生数
FROM xs
GROUP BY 专业
--20.查询各个专业男生的人数
select 专业, 男生人数=count (*)
from xs
where 性别 = '男'
group by 专业
--21. 列出有二门以上课程(含两门)不及格的学生的学号及该学生的平均成绩;
select 学号, 平均成绩= avg(成绩)
from cj
where 成绩<60
group by 学号
having COUNT(*)>=2
--22. 显示学号第五位或者第六位是1、2、3、4或者9的学生的学号、姓名、性别、年龄及专业;
select 学号,姓名,性别,年龄 = DATEDIFF(yy,出生时间,getdate()),专业
from xs
where 学号 like '____[1,2,3,4,9]%' or 学号 like '_____[1,2,3,4,9]%'
--23. 显示选修课程数最多的学号及选修课程数最少的学号;
select top 1 学号
from cj
group by 学号
order by count(*)
select top 1 学号
from cj
group by 学号
order by count(*) desc
--24. 查询选修了A001或者A002或者J001或者J002课程的学生的学号和课程号
select 学号,课程号
from cj
where 课程号 = 'A001' or 课程号 = 'A002' or 课程号 = 'J001,' or 课程号 = 'J002'
--25. 查询姓名为两个字的不同姓氏的人数,输出姓氏,人数。
select 姓=SUBSTRING(姓名, 1,1),count(*)
from xs
where len(姓名)=2
group by SUBSTRING(姓名, 1,1)
--二:对书上第二章课后习题的4的SPJ数据库各表查询:
--1.求供应工程J1零件的供应商号码SNO
select sno
from spj
where jno = 'J1'
--2.求查询每个工程使用不同供应商的零件的个数
select JNO,pno , count(sno)
from spj
group by jno , pno
--3.求供应工程使用零件P3数量超过200的工程号JNO
select jno
from spj
where pno = 'P3' and qty >=200
--4.求颜色为红色和蓝色的零件的零件号和名称
select pno , pname
from p
where color = ' 蓝' or color = ' 红'
--5.求使用零件数量在200-400之间的工程号
select jno
from spj
group by jno
having sum(qit)between 200 and 400
--6.查询每种零件的零件号,以及使用该零件的工程数。
select pno , count(DISTINCT jno)
from spj
group by pno