1. 建立數據庫
create database homework
use homework
go
2. 創建表格
- 創建學籍表
```
create table student(
Sid int not null unique,
Sname varchar(10) ,
primary key(Sid)
);
```
- 創建課程表
create table course(
Cid int not null unique,
Cname varchar(10) ,
primary key(Cid)
);
- 創建成績單
create table sc(
Cid int not null,
Sid int not null,
grade int,
primary key(Sid,Cid)
);
3. 插入數據
- 學籍表數據
insert into student(Sid,Sname)values (201701,'張三');
insert into student(Sid,Sname)values (201702,'李四');
insert into student(Sid,Sname)values (201703,'王五');
insert into student(Sid,Sname)values (201704,'孫六');
- 課程表數據
insert into course(Cid,Cname)values (220001,'數據庫');
insert into course(Cid,Cname)values (220002,'操作系統');
insert into course(Cid,Cname)values (220003,'編譯原理');
insert into course(Cid,Cname)values (220004,'計算機網絡');
- 成績單數據
--數據庫成績
insert into sc(Cid,Sid,grade)values(220001,201701,90);
insert into sc(Cid,Sid,grade)values(220001,201702,80);
insert into sc(Cid,Sid,grade)values(220001,201703,85);
insert into sc(Cid,Sid,grade)values(220001,201704,70);
--操作系統成績
insert into sc(Cid,Sid,grade)values(220002,201701,55);
insert into sc(Cid,Sid,grade)values(220002,201702,73);
insert into sc(Cid,Sid,grade)values(220002,201703,66);
insert into sc(Cid,Sid,grade)values(220002,201704,77);
--編譯原理成績
insert into sc(Cid,Sid,grade)values(220003,201701,78);
insert into sc(Cid,Sid,grade)values(220003,201702,87);
insert into sc(Cid,Sid,grade)values(220003,201703,66);
insert into sc(Cid,Sid,grade)values(220003,201704,56);
--計算機網絡
insert into sc(Cid,Sid,grade)values(220004,201701,45);
insert into sc(Cid,Sid,grade)values(220004,201702,68);
insert into sc(Cid,Sid,grade)values(220004,201703,98);
insert into sc(Cid,Sid,grade)values(220004,201704,82);
4.顯示結果
- 使用內連接查詢顯示成績
select student.Sname as '姓名',course.Cname as '課程',sc.grade as '成績'
from sc join course
on sc.Cid=course.Cid
join student
on sc.Sid=student.Sid
order by course.Cid ASC ,student.Sid ASC;
結果如下- 使用左外連接查詢顯示成績
select student.Sname as '姓名',b1.grade as '數據庫',b2.grade as
'操作系統',b3.grade as '編譯原理',b4.grade as '計算機網絡'
from student
left join sc as b1
on b1.Cid = 220001 and b1.Sid=student.Sid
left join sc as b2
on b2.Cid = 220002 and b2.Sid=student.Sid
left join sc as b3
on b3.Cid = 220003 and b3.Sid=student.Sid
left join sc as b4
on b4.Cid = 220004 and b4.Sid=student.Sid
結果如下- 使用子查詢顯示成績
select Sname,
(select grade from sc s1 where s1.Sid=st.Sid and s1.Cid=220001) as '數據庫',
(select grade from sc s1 where s1.Sid=st.Sid and s1.Cid=220002) as '操作系統',
(select grade from sc s1 where s1.Sid=st.Sid and s1.Cid=220003) as '編譯原理',
(select grade from sc s1 where s1.Sid=st.Sid and s1.Cid=220004) as '計算機網絡'
from student st
結果與2中使用左外連接查詢一致。
- 使用case語句查詢成績
select student.Sname as '姓名',
sum(case Cid when '220001' then grade else null end) as '數據庫',
sum(case Cid when '220002' then grade else null end) as '操作系統',
sum(case Cid when '220003' then grade else null end) as '編譯原理',
sum(case Cid when '220004' then grade else null end) as '計算機網絡'
from sc,student
where student.Sid=sc.Sid
group by student.Sname
結果如下- 使用存儲過程,自行判斷課程的數量
```
declare @sql varchar(1000);
set @sql = 'select student.Sname as ''姓名'',';
select @sql = @sql+'
sum(case Cname when '''+Cname+'''then grade else null end) as '''+Cname+''','
from course
set @sql =left(@sql,len(@sql)-1)+'
from sc,student,course
where student.Sid=sc.Sid and course.Cid=sc.Cid
group by student.Sname'
exec(@sql);
```
結果和4中使用case語句查詢一致。