表1.学生
学生(SID、SNAME、セージ、 Ssex)--sid 学生数、SNAMEの学生の名前、誕生のセージ日、Ssex学生のセックス
2.カリキュラム
コース(CID、CNAME、TID)--CID - コース番号、CNAMEのコース名、教師のTID番号
3.教師テーブル
教師(TID、TNAME)--TID教師番号、TNAME教師の名前
4.転写産物
SC(SID、CID、スコア)--sid学生番号、CIDコース数、得点
テストデータを追加
1.学生テーブルを
テーブルの学生(SIDのはvarchar(10)、SNAMEのデータ型はnvarchar(10)、セージ日時、Ssex VARCHAR(10))を作成します。
学生値('01「」レイ趙「」1990年1月1日「」M「)に挿入します。
学生値('02「」お金の力「」1990年12月21日「」男性「)に挿入します。
学生値('03「」風の日「」1990年5月20日「」M「)に挿入します。
学生値('04「」李ユン「」1990年8月6日「」M「)に挿入します。
学生値('05「」周メイ「」1991年12月1日「」女性「)に挿入します。
学生値('06「」ウーラン「」1992年3月1日「」F「)に挿入します。
学生値('07「」竹チェン「」1989年7月1日「」F「)に挿入します。
学生値('08「」王チュ「」1990年1月20日「」F「)に挿入します。
2.カリキュラム
表コース(CIDのVARCHAR(10)、CNAMEのNVARCHAR(10)、TIDのVARCHAR(10))を作成します。
コース値('01' 、 '语文'、 '02')に挿入します。
コース値('02' 、 '数学'、 '01')に挿入します。
コースの値('03「」英語「」03「)に挿入します。
3.教師テーブル
表教師(TIDのVARCHAR(10)、TNAMEのNVARCHAR(10))を作成します。
教師値に挿入('01' 、 『张三』)。
教師値に挿入('02' 、 『李四』)。
教師値('03「」王ウー「)に挿入します。
4.転写産物
テーブルSC(SIDのVARCHAR(10)、CIDのVARCHAR(10)、スコア小数(18,1))を作成します。
SC値('01' 、 '01'、80)に挿入します。
SC値('01' 、 '02'、90)に挿入します。
SC値('01' 、 '03'、99)に挿入します。
SC値('02' 、 '01'、70)に挿入します。
SC値('02' 、 '02'、60)に挿入します。
SC値('02' 、 '03'、80)に挿入します。
SC値('03' 、 '01'、80)に挿入します。
SC値('03' 、 '02'、80)に挿入します。
SC値('03' 、 '03'、80)に挿入します。
SC値('04' 、 '01'、50)に挿入します。
SC値('04' 、 '02'、30)に挿入します。
SC値('04' 、 '03'、20)に挿入します。
SC値('05' 、 '01'、76)に挿入します。
SC値('05' 、 '02'、87)に挿入します。
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);
--1、查询"01"课程比"02"课程成绩高的学生的 信息及课程分数--1.1、查询同时存在"01"课程和"02"课程的情况
select a.* , b.score 课程01的分数,c.score 课程02的分数 from Student a , SC b , SC c
where a.SID = b.SID and a.SID = c.SID and b.CID = '01' and c.CID = '02' and b.score > c.score
--1.2、存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)
select a.* , b.score 课程01的分数,c.score 课程02的分数 from Student a
left join SC b on a.SID = b.SID and b.CID = '01'
left join SC c on a.SID = c.SID and c.CID = '02'
where b.score > ifnull(c.score,0);
此语句中student表为左表
ifnull(a,b):若a不为null则返回a,否则返回b
--3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
两者道理相同
wo:
select a.sid, a.sname, avg(b.score)
from student a,sc b
where a.sid = b.sid group by a.sid having avg(b.score) >= 60;
ta:
select a.SID , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score
from Student a , sc b
where a.SID = b.SID
group by a.SID , a.Sname
having cast(avg(b.score) as decimal(18,2)) >= 60
order by a.SID
Cast(字段名 as 转换的类型 )
cast(a as b):将a字段转换为b类型
--4.2、查询在sc表中不存在成绩的学生信息的SQL语句。
select a.* from student a where a.sid in (select sc.sid from sc where ifnull(sc.score,0) = 0);
--5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩--5.1、查询所有有成绩的SQL。
select a.SID 学生编号 , a.Sname 学生姓名 , count(b.CID) 选课总数, sum(score) 所有课程的总成绩
from Student a , SC b
where a.SID = b.SID
group by a.SID,a.Sname
order by a.SID
--5.2、查询所有(包括有成绩和无成绩)的SQL。
select a.SID 学生编号 , a.Sname 学生姓名 , count(b.CID) 选课总数, sum(score) 所有课程的总成绩
from Student a left join SC b
on a.SID = b.SID
group by a.SID,a.Sname
order by a.SID
--7、查询学过"张三"老师授课的同学的信息
select distinct Student.* from Student , SC , Course , Teacher
where Student.SID = SC.SID and SC.CID = Course.CID and Course.TID = Teacher.TID and Teacher.Tname = '张三'
order by Student.SID
--8、查询没学过"张三"老师授课的同学的信息
select m.* from Student m where SID not in (select distinct SC.SID from SC , Course , Teacher where SC.CID = Course.CID and Course.TID = Teacher.TID and Teacher.Tname = '张三') order by m.SID
--9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
我的方法:
select *
from student
where sid in (select sid from sc where cid = '01')
and sid in (select sid from sc where cid = '02');
--方法1
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID
--方法2
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '02' and exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '01') order by Student.SID
--方法3
select m.* from Student m where SID in
(
select SID from
(
select distinct SID from SC where CID = '01'
union all
select distinct SID from SC where CID = '02'
) t group by SID having count(1) = 2
)
order by m.SID
--10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
我的方法1
select student.*
from student where student.sid in(select sid from sc where cid = '01' and sid not in (select sid from sc where cid = '02'));
我的方法2
select *
from student
where sid in (select sid from sc where cid = '01')
and sid not in (select sid from sc where cid = '02');
--方法1
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and not exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID
--方法2
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and Student.SID not in (Select SC_2.SID from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID
--11、查询没有学全所有课程的同学的信息
我的方法1:
select
a.*
from student a,sc b
where a.sid = b.sid
group by a.sid having count(a.sid) < (select count(*) from course);
我的方法2:
select *
from student
where sid in (select sid from sc group by sid having count(*) < (select count(*) from course));
--11.1、
select Student.*
from Student , SC
where Student.SID = SC.SID
group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)
--11.2
select Student.*
from Student left join SC
on Student.SID = SC.SID
group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)
--12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
我的方法1:
select distinct student.*
from student , sc
where student.sid = sc.sid
and student.sid != '01'
and sc.cid
in (select cid from sc where sid = '01');
select distinct Student.* from Student , SC where Student.SID = SC.SID and SC.CID in (select CID from SC where SID = '01') and Student.SID <> '01'
--13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
此答案的思路是:查询出课程ID在01学生所学课程ID之中,即两者有相同
select Student.* from Student where SID in
(select distinct SC.SID from SC where SID <> '01' and SC.CID in (select distinct CID from SC where SID = '01')
group by SC.SID having count(1) = (select count(1) from SC where SID='01'))
--13、1 查询和"01"号的同学学习的课程数相同的其他同学的信息
select student.* from student where student.sid in(
select a.sid
from sc a where a.sid != '01' group by a.sid having count(a.sid) = (select count(*) from sc where sid= '01'));