1. 程式人生 > >No.3 SQL結構化查詢訓練

No.3 SQL結構化查詢訓練

最近在複習資料庫SQL,所以開始在網上找了一些SQL的訓練。完整的50個題目及答案:

學生資訊表:


課程資訊:


選課記錄:


教師資訊:


1. 查詢01課程比"02"成績高的同學學號

select sc1.sid,sc1.score,sc2.score from sc sc1,sc sc2 where sc1.sid = sc2.sid and 
sc1.cid = "01" and sc2.cid = "02" and sc1.score>sc2.score; 
2. 查詢平均成績大於60分的同學的學號和平均成績
select sc.sid ,avg(sc.score) as avg from sc
group by sc.sid
having avg>60;

3. 查詢所有同學的學號,姓名,選課數,總成績
select s.sid,s.sname,(select count(*) from sc where sc.sid = s.sid) as "選課數",(select sum(sc.score) from sc where sc.sid = s.sid) as "總成績" 
from student s,sc
group by s.sid
4. 查詢姓李的老師個數
select count(*)from teacher t where t.tname like "李%";

5. 查詢沒有學過張三老師課的同學

寫法1:(使用in)

select s.sname from student s where s.sid not in
(select distinct sc.sid from sc,course c,teacher t where t.tname = "張三"
and t.tid = c.tid and c.cid = sc.cid);
寫法2:(使用exists)
select s.sname from student s where not exists
(select * from sc,course c,teacher t where t.tname = "張三" 
and t.tid = c.tid and c.cid = sc.cid and sc.sid = s.sid);

6. 查詢學過01也學過02的同學編號

寫法1:使用SQL除法

select s.sid,s.sname from student s where not exists(
	select distinct cid from (select c.cid from course c where c.cid = "01" or c.cid = "02") tmp where not exists(
		select * from sc where sc.sid = s.sid and sc.cid = tmp.cid));
寫法2:使用計數
select sc.sid,s.sname from student s ,sc where sc.cid in (select c.cid from course c where c.cid = "01" or c.cid = "02")
and s.sid = sc.sid
group by sc.sid
having count(*) = (select count(*) from course c where c.cid = "01" or c.cid = "02");
這裡解釋一下這段SQL:

首先我們在選課記錄中,選擇所有選中了01或者02的課程記錄

然後,我們進行分組,按照學號來分組,這樣每個組裡面的記錄都是某某同學選了01或者某某同學選了02

我們選擇這樣的分組,該分組的個數是01,02號課程的總和(當然就是2了)

7. 查詢學過“張三老師”所有課程的同學

同上,也分為兩種寫法。把6中的01,02課程的集合改為張老師教授的課程集合

8. 查詢課程“02”比“01”分數低同學學號

寫法同1題

9. 查詢所有課程成績小於60分的同學學號,姓名

select distinct sc.sid,s.sname from student s,sc where sc.sid not in 
(select distinct sc.sid from sc where sc.score>=60)
and sc.sid = s.sid ;
首先找出成績大於60分的選課記錄。該同學的學號不在集合中

10. 查詢沒有選全所有課的同學

select s.sid,(select count(*) from sc where sc.sid = s.sid) as cnt from student s,sc t
group by s.sid
having cnt != (select count(*) from course);
計數法

11. 查詢至少一門課和01學號同學相同的其他同學學號和姓名

select distinct sc.sid,s.sname from sc,student s where sc.cid in (select cid from sc where sc.sid = "01") and 
sc.sid != "01" and s.sid = sc.sid;

12.題乾和11相同

13. 把sc表中“張三”老師教的課的成績改為此課程平均數

update sc set score = (select avg(sc1.score) from sc sc1 where sc1.cid = sc.cid)
where sc.cid in (select sc2.cid from sc sc2,course c,teacher t where sc2.cid = c.cid and c.tid = t.tid and t.tname = "張三" )
mysql會報報錯,還沒找到解決辦法

14. 查詢和“01”號同學學習的課程完全相同的其他同學學號和姓名

select sc.sid from sc where sc.sid!="01" and sc.cid in (select cid from sc where sc.sid = "01")
group by sc.sid
having count(*) = (select count(*) from sc where sc.sid = "01");

15. 刪除學習“王五”老師課程的SC記錄
delete sc from sc,course c,teacher t 
where sc.cid = c.cid and c.tid = t.tid and t.tname = "王五";

16. 向SC表插入一些記錄,這些記錄符合:沒有上過“02”課程的同學學號,“02”,2號課平均成績

insert into sc
select distinct sc.sid,"02",(select avg(sc1.score) from sc sc1 where sc1.cid = "02")from sc where sc.sid not in (select sid from sc where cid = "02");
17. 按照平均成績顯示所有學生“01”,“02”,“03”三門課程的成績,按如下形式顯示:

學生ID,“01”,“02”,“03”,有效課程數,有效平均分

select t.sid,(select sc.score from sc where sc.cid = "01" and t.sid = sc.sid)
from sc t
group by t.sid;
18. 查詢各科成績最高和最低的分數
select sc.cid,max(sc.score),min(sc.score) from sc
group by sc.cid;

19.按各科平均成績從低到高和及格率的百分數從高到低排列.(不包含沒有選課記錄的課程)

select t.cid,avg(t.score) as avg, ((select count(*) from sc where sc.cid = t.cid and sc.score>=60 )/(select count(*) from sc where sc.cid = t.cid ))as rate
from sc t
group by t.cid
order by avg desc,rate asc;

20. 查詢如下課程的平均成績及合格率:01,02,03(一行表示)
select 
	(select avg(sc.score) from sc where sc.cid = "01") as avg,(select count(*) from sc where sc.cid = "01" and sc.score<60)/(select count(*) from sc where sc.sid = "01")*100 as rate,
	(select avg(sc.score) from sc where sc.cid = "02") as avg,(select count(*) from sc where sc.cid = "02" and sc.score<60)/(select count(*) from sc where sc.sid = "02")*100 as rate,
	(select avg(sc.score) from sc where sc.cid = "03") as avg,(select count(*) from sc where sc.cid = "03" and sc.score<60)/(select count(*) from sc where sc.sid = "03")*100 as rate;

21.查詢不同老師不同課程平均分從高到低顯示
select sc.cid,t.tname as tname,avg(sc.score) as avg from teacher t,course c,sc
where t.tid = c.tid and c.cid = sc.cid
group by sc.cid
order by avg desc;

22. 查詢如下課程第三名到第六名的同學:01,02,03
select cid,score,rank from
(select tmp.sid,tmp.cid,tmp.score,if(tmp.cid = @tmid,@rank:[email protected]+1,@rank:=1) as rank,@tmid:= tmp.cid
from (select sc.sid,sc.cid,sc.score from sc group by sc.cid,sc.score order by sc.cid asc,sc.score desc,sc.sid) tmp,(select @rank:=0,@tmid=null) t
)r
where r.cid = "01" or r.cid = "02" or r.cid = "03"
having rank>=3 and rank<=6;
23. 統計列印各科成績,各分數段人數,課程id,課程名稱,[100-85],[85-70],[70-60],[<60]
select r.cid,cname,`[100-85]`,`[85-70]`,`[70-60]`,`[<=60]` from
(select t.cid,
(select count(*) from sc where sc.cid = t.cid and sc.score<=100 and sc.score>85) as "[100-85]",
(select count(*) from sc where sc.cid = t.cid and sc.score<=85 and sc.score>70) as "[85-70]",
(select count(*) from sc where sc.cid = t.cid and sc.score<=70 and sc.score>60) as "[70-60]",
(select count(*) from sc where sc.cid = t.cid and sc.score<=60) as "[<=60]"
from sc t
group by t.cid) as r,course c
where c.cid = r.cid;
這個題目要注意的地方是,當列名中含有[]、()的時候,在查詢時要加上` `,即反引號(tab上邊)

24. 查詢學生平均成績及其名次
select sid,sname,avg,@rownum:[email protected]+1 as rank from
(select tmp.sid,sname,avg from
(select sid ,avg(sc.score) as avg from sc group by sc.sid order by avg desc)tmp,student s
where tmp.sid = s.sid
order by avg desc)
r,(select @rownum:=0)t
這個題目,解釋瞭如何在Mysql中實現rank函式的實現

25. 查詢各科成績前三名記錄

解法同22題

26. 查詢每門課程被選的人數

select sc.cid ,count(*) from sc 
group by sc.cid;
27. 查詢只選修了一門課程的學生姓名學號
select s.sname,s.sid from student s,sc
where s.sid = sc.sid 
group by sc.sid
having count(sc.cid) = 1;
28. 查詢男女生人數
select (select count(*) from student s where s.ssex = "男") as "男",
(select count(*) from student s where s.ssex = "女") as "女";
29. 查詢姓王的同學資訊

同4題

30. 查詢同名同姓的學生名單,並統計同名人數

select s.sname,count(*) as cnt from student s
group by s.sname
having cnt >1;
31. 查詢1991年出生的學生
select s.sname from student s where s.sbirth = "1991";
32. 查詢每門成績的平均成績,結果按照平均成績升排列,平均成績相同時,按照課程號
降序排列
select sc.cid,avg(sc.score) as avg
from sc
group by sc.cid
having avg(sc.score) is not null
order by avg asc,sc.cid desc;
33. 查詢平均分數大於85的同學學號,姓名和平均成績
select s.sid,s.sname,avg(sc.score) as “Avg” from student s,sc
where s.sid = sc.sid
group by sc.sid
having  avg(sc.score) > 85;
34. 查詢課程名稱為“語文”,且分數低於60分的學生姓名和分數
select s.sname,sc.score from student s,sc,course c
where s.sid = sc.sid and sc.cid = c.cid and c.cname = "語文"
and sc.score <60;
35. 查詢所有學生的選課情況
select s.sid,s.sname,c.cname from sc,student s ,course c
where s.sid = sc.sid and c.cid = sc.cid ; 
36. 查詢任何一門成績在70分以上的姓名,課程編號和分數
select s.sname,sc.cid,sc.score from sc,student s
where s.sid = sc.sid and sc.score>=70;
37. 查詢不及格的課程成績並且按照課程號從小到大排列
select sc.cid,sc.score from sc where sc.score <60
order by sc.cid desc;
38.查詢課程編號為003且課程成績在80分以上的學生學號和姓名
select s.sid,s.sname from student s,sc where s.sid = sc.sid and
sc.cid = "03" and sc.score >=80;

39. 求選了課程的人
select count(*) from sc;
40.查詢選修“張三”老師的所有課程中,成績最高的學生姓名及其成績
select cid,tmp.sid,sname,score from
(select s.sname,sc.cid as cid,sc.sid as sid,sc.score as score from
sc,course c,teacher t,student s where 
t.tname = "張三" and 
t.tid = c.tid and 
sc.cid = c.cid and 
sc.sid = s.sid order by sc.score desc) tmp
limit 1;
41.查詢各個課程及相應選修人數
select sc.cid,c.cname,count(sc.sid) from sc,course c where c.cid = sc.cid
group by sc.cid;
42. 查詢不同課程成績相同的學生的學號,課程號,學生成績
select sc.sid,sc.cid,sc.score from sc,sc sc1 where sc.sid != sc1.sid and sc.score = sc1.score;

43.查詢每門課成績最好的前兩名:

select r.cid,c.cname,score,rank from
(select tmp.cid,tmp.score,if([email protected],@rank:[email protected]+1,@rank:=1) as rank,@tmid:=tmp.cid
from (select cid,score from sc group by cid,score order by cid asc,score desc) tmp,
(select @rank:=0,@tmid:=null)tmp1
) r,course c
where r.cid = c.cid and score is not null and rank <=2;
同樣也是rank的實現

44. 統計每門課學生選修人數(超過三個人才統計)。要求輸出課程號和選修人數,平均分
查詢結果按照人數降序排列,查詢結果按照人數降序排列。若人數相同按照課程號升序排列

select sc.cid,c.cname,count(sc.sid) as cnt ,avg(sc.score) from sc,course c
where c.cid = sc.cid
group by sc.cid
having count(sc.sid)>3
order by cnt desc,sc.sid asc;

45. 檢索至少選修三門課的學生學號
select sc.sid from sc group by sc.sid having count(sc.cid)>2;
46.查詢全部學生都選修的課程課程號和課程名
select c.cid,c.cname from course c where not exists
(select s.sid from student s where not exists
(select sc.sid from sc where sc.cid = c.cid and sc.sid = s.sid));
使用SQL除法,找出覆蓋了所有學生集合的課程

47.查詢沒有學過“王五”老師任一門課的學生姓名

同5題

48. 查詢兩門以上不及格課程的同學的學號及平均成績

select sc.sid,avg(sc.score) as avg from sc where exists 
(select * from sc sc1 where sc1.sid = sc.sid and sc1.score < 60 
having count(*) >= 2)
group by sc.sid;


49. 檢索04課程分數大於60的同學學號,按照分數降序排列
select sc.sid from sc  where sc.cid = "04" and sc.score > 60
order by sc.score desc;

50. 刪除“02”同學“01”課程成績
delete from sc where sc.sid = "02" and sc.cid = "01";
=======================================================================================================================

整理的其他題目

=======================================================================================================================

1. 統計選課但是沒有選02課程的學生姓名、學號

select distinct s.sid,s.sname from student s,sc where s.sid = sc.sid and not exists
(select sc.sid from sc where sc.cid = '02');
挑選這樣的學生,選課記錄中不存在02課程

2. 統計各個學科的平均分

select sc.cid,c.cname,avg(sc.score) from course c,sc where sc.cid = c.cid 
group by sc.cid

3. 挑選年齡比平均年齡大的同學資訊

select s.sid,s.sname,s.sage from student s where s.sage >
(select avg(s1.sage) from student s1)
首先在子查詢計算學生平均年齡,然後檢索

4.查詢至少選修了語文數學的學生學號

select distinct sc1.sid from student sc1
	where not exists
		(select distinct c.cid from (select * from course t where t.cid = "01" or t.cid = "02" ) as c
			where not exists 
					(select * from sc sc2
						where sc1.sid = sc2.sid
						and   c.cid = sc2.cid))
使用SQL除法表示,詳細檢視SQL除法這篇文章

5.選修了所有課程的同學學號(非計數寫法)

select distinct sc1.sid from student sc1  
	where not exists    
		(select distinct c.cid from course c   
			where not exists      
					(select * from sc sc2        
						where sc1.sid = sc2.sid
						and   c.cid = sc2.cid))
解釋同上。同時也可以用計數的方法,就是看同學選課的個數。也有很多習題使用這種簡單的寫法

6.王菊同學不學的課程名

select cid from course where cid not in (select sc.cid from sc ,student s where sc.sid = s.sid and s.sname = "王菊")
在子查詢中選出王菊的課程,然後減去該集合

7.至少選了兩門課的同學資訊

select s.sname, sc.sid,count(sc.cid) from student s, sc where s.sid = sc.sid group by sc.sid having count(sc.cid)>2;
按照學號分組,使用聚集函式計算每一組學生選課數目,檢索大於2的學生資訊

8.所有學生都選的課

select cid,cname from course c 
	where not exists
		(select sid from student s 
			where not exists 
				(select * from sc where sc.cid = c.cid and sc.sid = s.sid))
使用SQL除法,選出這樣一門課,不存在一個學生沒有選該課

9.選修了語文的同學的平均年齡

select avg(s.sage) from student s,sc where s.sid in (select distinct sc.sid from sc,course c where sc.cid = c.cid and c.cname = "語文")
首先選出選修語文的同學學號,計算平均年齡

10.各科選修同學的平均年齡

select c.cname,avg(s.sage) from course c,student s,sc where sc.sid =s.sid and sc.cid = c.cid
group by sc.cid;
按照課程號分組,計算每一組的學生平均年齡

11.求張三教授的每門課的學生平均成績

select c.tid,c.cname,avg(sc.score)
from course c,teacher t,sc
where c.tid = t.tid and t.tname = "張三" and sc.cid = c.cid
group by sc.cid
和10很相似,新增課程老師是張三這個條件

12.統計每門課的選課人數(超過3人),要求輸出課程號和選課人數,查詢結果按照人數降序排列,若人數相同按照課程號排列

select c.cname,sc.cid,count(sc.sid) as cnt from sc,course c where c.cid = sc.cid
group by sc.cid having count(sc.sid) > 2 order by cnt desc,sc.cid
首先按照課程號分組,選擇人數在三個以上,計算課程選課人數

13.學號比趙雷大,年齡比趙雷小的學生資訊

select * from student s
	where exists 
		(select * from student s1 where  s1.sname = "趙雷" and s1.sage>s.sage and s1.sid<s.sid )
14.所有姓王的同學資訊
select * from student s where s.sname like "王%"

使用like 和%符號,比使用正則表示式更為簡單。%表示0個或多個任意符號

15.sc表中成績為空的學生學號和課號
select sc.sid,sc.cid from sc where sc.score is null;
使用isnull判斷空值

16.年齡大於女同學平均年齡的男同學姓名年齡

select s.sname,s.sage from student s where s.ssex = "男" and s.sage > 
	(select avg(s1.sage) from student s1 where s1.ssex = "女");
17.年齡大於所有男同學年齡的女同學姓名年齡
select s.sname,s.sage from student s where s.ssex = "女" and 
s.sage > all (select s.sage from student s where s.ssex = "男");

18.在student 中檢索所選選課程每一門都大於等於80的學生的姓名學號性別,儲存到新的表youxiu中

首先建立表youxiu:

create table youxiu(
sid char(10),
sname char(10),
ssex char(10),
primary key(sid)
)
將select語句直接放在insert之後(沒有新增values)
insert into youxiu(sid,sname,ssex)
select s.sid,s.sname,s.ssex from student s
where not exists
(select sc.cid from sc
where sc.sid = s.sid and (sc.score <80 or sc.score is null))
注意,這裡為什麼要加上 isnull 呢?

主要 我們有一條記錄 王二

09 05
所以,王二同學在選課表中05課程沒有成績,在我們的select語句中,當檢索到王二的時候:

由於null 和 80相比結果為false,所以not exists 後邊的select子查詢沒有返回結果,所以not exists 為真,返回了王二這一條記錄

而我們不需要王二的記錄,所以新增上is null

P.S.文章不妥之處還望指正





相關推薦

No.3 SQL結構查詢訓練

最近在複習資料庫SQL,所以開始在網上找了一些SQL的訓練。完整的50個題目及答案: 學生資訊表: 課程資訊: 選課記錄: 教師資訊: 1. 查詢01課程比"02"成績高的同學學號 select sc1.sid,sc1.score,sc2.score from s

SQL結構查詢語言

cit sql結構 delet having 處理 ner transacti 檢索 order 一: 數據查詢語言( DQL:Data Query Language): 其語句,也稱為“數據檢索 語句”,用以從表中獲得數據,確定數據怎樣在應用程序給出。保留字 S

SQL結構查詢語言分類介紹

sql結構化查詢語言分類介紹SQL結構化查詢語言分類介紹SQL:結構化查詢語言,它是一種對關系型數據進行定義和操作的語言方法。SQL結構化查詢語言包含6個部分:一、數據查詢語言(DQL)DQL全稱Data Query Language,其語句也稱“數據檢索語句”,作用是從表中獲取數據,確定數據怎樣在應用程序給

SQL -結構查詢語言的發展史

Mysql linux DDL:數據操作語言INSERTDELETESELECTUPDATEDML:數據定義語言CREATEDROPALTERDCL:數據控制語言GRANTREVOKE RDB對象:庫、表、索引、視圖、用戶、存儲過程、存儲函數、觸發器、事件調度器。 約束: 域約束:數據

Web安全學習筆記(八):SQL-結構查詢語言

.com 時也 create 取數據 數據操作 date 簡單的 esc 標準 SQL概述: 結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系數據庫

SQL(結構查詢語言)簡介

一、結構化查詢語言簡介 結構化查詢語言(Structured Query Language)簡稱SQL, 是操作和檢索關係型資料庫的標準語言,20世紀70年代由IBM公司開發,目前應用於各種關係型資料庫。 二、SQL的發展 1974年首次提出,當時叫SEQUEL 1980年改名為SQ

SQL 結構查詢語言

導讀 MySql是我們常用的資料庫,javaEE常用幾款(Oracle,PostgreSQL,DB2或IBM),SQLite是用於嵌入式裝置裡的小型資料庫,例如Android或IOS,而掌握SQL語句,就相當於掌握了所有的常見關係化資料庫,需要同學們重點掌握以

數據庫入門4 結構查詢語言SQL

IT 相同 ber sql 方法 str 時也 程序設計 需要 知識內容: 1.SQL介紹 2.常用SQL命令 3.SQL語句練習 一、SQL介紹 1.什麽是SQL 結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的

SQL 數據庫結構查詢語言

sql 數據庫對象 控制語句 許可 結構 數據完整性 ora sqlserve C# 1、數據庫 常見數據庫 MySQL:開源免費的數據庫,小型的數據庫。 Oracle:收費的大型數據庫,Oracle 公司的產品 DB2:IBM 公司收費的數據庫,常應用在銀行系統中

mysql 資料庫快速入門 結構查詢語言SQL

目錄 結構化查詢語言SQL 標準支援 SQL的影響 語言特點 語句結構 結構化查詢語言SQL 結構化查詢語言(Structured Query Language)簡稱SQL。 一種特殊目的的程式語言:是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更

43.結構查詢語言SQL及MySQL(一)

簡介 SQL是ANSI標準下訪問和處理資料庫的結構化查詢語言。SQL可以在各個RDBMS(關係型資料庫管理系統,如MySQL、Microsoft Access)中使用,各個RDBMS也有自己獨有的擴充套件。 RDBMS中,不同資料儲存在不同的資

結構查詢語句

比較運算符 like 比較 mysql 類型 sum 影響 star 結束 By TreeDream 基本表的定義,修改,刪除簡單查詢單表查詢連接查詢等值與非等值查詢外連接查詢復合條件查詢自身連接查詢嵌套查詢數據更新插入數據修改數據刪除數據視圖創建視圖查詢視圖

Spark2.3.0 結構流 進行streaming+kafka的可操作運算元流

工作上正在進行Streaming運算元的研究學習,需要做到在流的基礎上,通過kafka接收資料到 中間若干的計算運算元,再到最後的輸出。開始使用傳統的streaming+kafka,但由於無法返回後續使用的dataset,只能放棄, 後來大牛提出永spark的結構化流處理,於是經過參考文件資料編

elasticsearch結構查詢

{"query": {"bool": {"must": [{"term": {"aaa": "bbbbb"}},{"term": {"ip": "8.8.8.8"}}],"must_not": [],"should": []}},"from": 0,"size": 10,"sort": [],"aggs":

結構查詢(Query DSL)和結構過濾(Filter DSL)

常用的查詢過濾語句 (1)term 過濾:主要用於精確匹配,比如數字,日期,布林值或 not_analyzed的字串(未經分析的文字資料型別): DEMO1: { “term”: { “age”: 26 }} DEMO2: { “term”: { “date”: “2014-

ES結構查詢

Elasticsearch結構化查詢 查詢準確值 term用於數字 term主要用在處理數字,布林值,日期和文字 GET /my_store/products/_search { "query" : { "filt

資料庫,結構查詢語言的四種語言

1.DDL(Data Definition Language)資料庫定義語言statements are used to define the database structure or schema. DDL是SQL語言的四大功能之一。 用於定義資料庫的三級結構,包括外模式、概念模式、內模式及其相互之

【Jmeter】——sql引數查詢測試

前言   現在大家寫的sql語句基本都是引數化的   當然在jmeter中也是可以測試引數化的sql語句   但是我始終都是有些疑問   不知道為什麼要測引數化的,我感覺沒什麼區別呢   

元資料與資料治理|Spark SQL結構資料分析(第六篇)

  資料科學家們早已熟悉的R和Pandas等傳統資料分析框架 雖然提供了直觀易用的API,卻侷限於單機,無法覆蓋分散式大資料場景。在Spark1.3.0以Spark SQL原有的SchemaRDD為藍本,引入了Spark DataFrameAPI,不僅為Scala、Python、Jav

sql引數查詢

//在ASP.NET程式中使用引數化查詢 //ASP.NET環境下的查詢化查詢也是通過Connection物件和Command物件完成。如果資料庫是SQL Server,就可以用有名字的引數了,格式是“@”字元加上引數名。 SqlConnection conn = new SqlCon