SQLレビュー

表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'));

おすすめ

転載: www.cnblogs.com/cn-chy-com/p/11210547.html