SQL一些常見的查詢練習


1、刪除表中重複記錄

delete from table where id not in ( select min(id) from table group by 字段1,字段2)

2、查詢數據的最大排序問題(只能用一條語句寫)

CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0))

 

insert into hard values ('A','1',3)

insert into hard values ('A','2',4)

insert into hard values ('A','4',2)

insert into hard values ('A','6',9)

insert into hard values ('B','1',4)

insert into hard values ('B','2',5)

insert into hard values ('B','3',6)

insert into hard values ('C','3',4)

insert into hard values ('C','6',7)

insert into hard values ('C','2',3)

 

 

要求查詢出來的結果如下:

 

qu co je

----------- ----------- -----

A 6 9

A 2 4

B 3 6

B 2 5

C 6 7

C 3 4

 

 

就是要按qu分組,每組中取je最大的前2位!!

而且只能用一句sql語句!!!

select *  from hard a where (select count(*) from hard b where a.qu=b.qu and b.je>=a.je)<=2 ORDER BY qu,je  DESC

 3、一個組合問題!


Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表 
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表

問題:
1、查詢“001”課程比“002”課程成績高的所有學生的學號;
select a.S# from 
(select s#,score from SC where C#=’001′) a,
(select s#,score from SC where C#=’002′) b
where a.score>b.score and a.s#=b.s#; 



2、查詢平均成績大於60分的同學的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60; 


3、查詢所有同學的學號、姓名、選課數、總成績;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left join SC on Student.S#=SC.S#
group by Student.S#,Sname 



4、查詢姓“李”的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’; 



5、查詢沒學過“葉平”老師課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’); 



6、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# and SC.C#=’001′and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=’002′);


7、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
select S#,Sname
from Student
where S# in
(select S#
from SC ,Course ,Teacher
where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’葉平’)); 



8、查詢所有課程成績小於60分的同學的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

 

9、查詢沒有學全所有課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S#
group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course); 



10、查詢至少有一門課與學號爲“1001”的同學所學相同的同學的學號和姓名;
select S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');



11、刪除學習“葉平”老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平'; 



12、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT L.C# 課程ID,L.score 最高分,R.score 最低分
FROM SC L ,SC R
WHERE L.C# = R.C#
and
L.score = (SELECT MAX(IL.score)
FROM SC IL,Student IM
WHERE IL.C# = L.C# and IM.S#=IL.S#
GROUP BY IL.C#)
and
R.Score = (SELECT MIN(IR.score)
FROM SC IR
WHERE IR.C# = R.C#
GROUP BY IR.C# ); 



13、查詢學生平均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S# ) T1
WHERE 平均成績 > T2.平均成績) 名次, S# 學生學號,平均成績
FROM (SELECT S#,AVG(score) 平均成績 FROM SC GROUP BY S# ) T2
ORDER BY 平均成績 desc;


14、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC)
ORDER BY t1.C#; 



15、查詢每門功成績最好的前兩名
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC )
ORDER BY t1.C#;




4、查詢A(ID,Name)表中第31至40條記錄,ID作爲主鍵可能是不是連續增長的列,完整的查詢語句如下:
方法一:
select top 10 *
from A
where ID >(select max(ID) from (select top 30 ID from A order by ID ) T) order by ID


方法二:
select top 10 *
from A
where ID not In (select top 30 ID from A order by ID)
order by ID



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章