当前位置:网站首页>SQL語句加强練習(MySQL8.0為例)
SQL語句加强練習(MySQL8.0為例)
2022-07-04 03:36:00 【Cancri e】
數據錶介紹
- 學生錶
Student(SId,Sname,Sage,Ssex)
SId 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別
- 課程錶
Course(CId,Cname,TId)
CId 課程編號,Cname 課程名稱,TId 教師編號
- 教師錶
Teacher(TId,Tname)
TId 教師編號,Tname 教師姓名
- 成績錶
SC(SId,CId,score)
SId 學生編號,CId 課程編號,score 分數
SQL語句
- 學生錶 Student
create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '趙雷' , '1990-01-01' , '男');
insert into Student values('02' , '錢電' , '1990-12-21' , '男');
insert into Student values('03' , '孫風' , '1990-12-20' , '男');
insert into Student values('04' , '李雲' , '1990-12-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吳蘭' , '1992-01-01' , '女');
insert into Student values('07' , '鄭竹' , '1989-01-01' , '女');
insert into Student values('09' , '張三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2012-06-06' , '女');
insert into Student values('12' , '趙六' , '2013-06-13' , '女');
insert into Student values('13' , '孫七' , '2014-06-01' , '女');
- 課程錶 Course
create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '語文' , '02');
insert into Course values('02' , '數學' , '01');
insert into Course values('03' , '英語' , '03');
- 教師錶 Teacher
create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '張三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
- 成績錶 SC
create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('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);
練習題目
查詢" 0 "課程比" 02 "課程成績高的學生的信息及課程分數
SQL語句
SELECT s.*, s1.CId, s1.score, s2.CId, s2.score
FROM Student as s, SC as s1, SC as s2
WHERE s.SId = s1.SId AND s.SId = s2.SId AND
s1.CId = '01' AND s2.CId = '02' AND
s1.score > s2.score
結果
查詢同時存在" 01 "課程和" 02 "課程的情况
SQL語句
SELECT s1.*, s2.CId, s2.score
FROM SC as s1, SC as s2
WHERE s1.SId = s2.SId AND
s1.CId = '01' AND s2.CId = '02'
結果
查詢存在" 01 "課程但可能不存在" 02 "課程的情况(不存在時顯示為 null )
SQL語句
SELECT s1.*, s2.CId,s2.score
FROM( SELECT *
FROM SC
WHERE SC.CId = '01') AS s1
LEFT JOIN (SELECT *
FROM SC
WHERE SC.CId = '02') AS s2
ON s1.SId = s2.SId
結果
查詢不存在" 01 "課程但存在" 02 "課程的情况
SQL語句
SELECT s2.SId, s1.CId, s1.score, s2.CId, s2.score
FROM( SELECT *
FROM SC
WHERE SC.CId = '01') AS s1
RIGHT JOIN (SELECT *
FROM SC
WHERE SC.CId = '02') AS s2
ON s1.SId = s2.SId
結果
查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績
SQL語句
SELECT s.SId, s.Sname, a.average_score
FROM (SELECT SId, AVG(score) as average_score
FROM SC
GROUP BY SId) as a
LEFT JOIN Student as s
ON a.SId = s.SId
WHERE a.average_score >= 60
結果
查詢在 SC 錶存在成績的學生信息
SQL語句
SELECT *
FROM Student
WHERE SId in (SELECT DISTINCT SId
FROM SC)
結果
查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績(沒成績的顯示為 null)
SQL語句
SELECT s.SId, s.Sname, a.course_num, a.sorce_sum
FROM Student as s
LEFT JOIN (SELECT SId, COUNT(CId) AS course_num, SUM(score) AS sorce_sum
FROM SC
GROUP BY SId) AS a
ON s.SId = a.SId
結果
查詢「李」姓老師的數量
SQL語句
SELECT COUNT(*) AS li_num
FROM Teacher
WHERE Tname LIKE '李%'
結果
查詢學過「張三」老師授課的同學的信息
SQL語句
SELECT s.*
FROM Student as s
WHERE SId IN (SELECT SId
FROM SC
WHERE CId IN (SELECT CId
FROM Course
WHERE TId IN (SELECT TId
FROM Teacher
WHERE Tname = '張三')))
結果
查詢沒有學全所有課程的同學的信息
SQL語句
SELECT *
FROM Student
WHERE SId IN (SELECT SId
FROM SC
GROUP BY SId
HAVING COUNT(CId) < (SELECT COUNT(*)
FROM Course) )
結果
查詢至少有一門課與學號為" 01 "的同學所學相同的同學的信息
SQL語句
SELECT *
FROM Student
WHERE SId IN (SELECT DISTINCT SId
FROM SC
WHERE CId IN (SELECT CId
FROM SC
WHERE SId = '01') AND SId != '01')
結果
查詢和" 0 "號的同學學習的課程完全相同的其他同學的信息
SQL語句
SELECT *
FROM Student
WHERE SId IN (SELECT DISTINCT SId
FROM SC
WHERE CId IN (SELECT CId
FROM SC
WHERE SId = '01') AND SId != '01'
GROUP BY SId
HAVING COUNT(CId)>=3)
結果
查詢沒學過"張三"老師講授的任一門課程的學生姓名
SQL語句
SELECT Sname
FROM Student
WHERE SId NOT IN (SELECT SId
FROM SC
WHERE CId IN(SELECT CId
FROM Course
WHERE TId IN (SELECT TId
FROM Teacher
WHERE Tname = '張三')))
結果
查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
SQL語句
SELECT s.SId, s.Sname, AVG(score)
FROM Student as s, SC
WHERE s.SId = SC.SId AND score < 60
GROUP BY SC.SId
HAVING COUNT(*) >= 2
結果
檢索" 0 "課程分數小於 60,按分數降序排列的學生信息
SQL語句
SELECT s.*, score
FROM Student as s, SC
WHERE CId = '01' AND score < 60 AND s.SId = SC.SId
ORDER BY score DESC
結果
按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
SQL語句
SELECT SId,
SUM(CASE WHEN CId = '01' THEN score ELSE NULL END) AS score_01,
SUM(CASE WHEN CId = '02' THEN score ELSE NULL END) AS score_02,
SUM(CASE WHEN CId = '03' THEN score ELSE NULL END) AS score_03,
AVG(score) AS average_score
FROM SC
GROUP BY SId
ORDER BY average_score DESC
結果
查詢各科成績最高分、最低分和平均分: 以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率。及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號昇序排列
SQL語句
SELECT c.CId AS '課程ID',
c.Cname AS '課程name',
MAX(score) AS '最高分',
MIN(score) AS '最低分',
AVG(score) AS '平均分',
SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END)/COUNT(*) AS '及格率',
SUM(CASE WHEN score>=70 AND score<80 THEN 1 ELSE 0 END)/COUNT(*) AS '中等率',
SUM(CASE WHEN score>=80 AND score<90 THEN 1 ELSE 0 END)/COUNT(*) AS '優良率',
SUM(CASE WHEN score>=90 THEN 1 ELSE 0 END)/COUNT(*) AS '優秀率'
FROM SC, Course AS c
WHERE SC.CId = c.CId
GROUP BY c.CId
ORDER BY COUNT(*) DESC, c.CId ASC
結果
按各科成績進行排序,並顯示排名, Score 重複時保留名次空缺
SQL語句
SELECT s.*, rank_01, rank_02, rank_03
FROM Student as s
LEFT JOIN ( SELECT SId, rank() OVER ( PARTITION BY CId ORDER BY score DESC ) AS rank_01 FROM SC WHERE CId = 01 ) a ON s.SId = a.SId
LEFT JOIN ( SELECT SId, rank() OVER ( PARTITION BY CId ORDER BY score DESC ) AS rank_02 FROM SC WHERE CId = 02 ) b ON s.SId = b.SId
LEFT JOIN ( SELECT SId, rank() OVER ( PARTITION BY CId ORDER BY score DESC ) AS rank_03 FROM SC WHERE CId = 03 ) c ON s.SId = c.Sid
結果
按各科成績進行排序,並顯示排名, Score 重複時合並名次
SQL語句
SELECT s.*, rank_01, rank_02, rank_03
FROM Student as s
LEFT JOIN ( SELECT SId, dense_rank() OVER ( PARTITION BY CId ORDER BY score DESC ) AS rank_01 FROM SC WHERE CId = 01 ) a ON s.SId = a.SId
LEFT JOIN ( SELECT SId, dense_rank() OVER ( PARTITION BY CId ORDER BY score DESC ) AS rank_02 FROM SC WHERE CId = 02 ) b ON s.SId = b.SId
LEFT JOIN ( SELECT SId, dense_rank() OVER ( PARTITION BY CId ORDER BY score DESC ) AS rank_03 FROM SC WHERE CId = 03 ) c ON s.SId = c.Sid
結果
查詢學生的總成績,並進行排名,總分重複時保留名次空缺
SQL語句
SELECT s.*, rank_total
FROM Student as s
LEFT JOIN (SELECT SId, rank() OVER (ORDER BY AVG(score) DESC) AS rank_total FROM SC GROUP BY SId) a ON s.SId = a.SId
ORDER BY rank_total ASC
結果
查詢學生的總成績,並進行排名,總分重複時不保留名次空缺
SQL語句
SELECT s.*, rank_total
FROM Student as s
LEFT JOIN (SELECT SId, dense_rank() OVER (ORDER BY AVG(score) DESC) AS rank_total FROM SC GROUP BY SId) a ON s.SId = a.SId
ORDER BY rank_total ASC
結果
統計各科成績各分數段人數:課程編號,課程名稱,[00-85],[85-70],[70-60],[60-0] 及所占百分比
SQL語句
SELECT c.CId AS '課程編號',
Cname AS '課程名稱',
a.*
FROM Course as c,
(SELECT CId,
SUM(CASE WHEN score>=85 AND score<=100 THEN 1 ELSE 0 END)/COUNT(*) AS '100_85',
SUM(CASE WHEN score>=70 AND score<85 THEN 1 ELSE 0 END)/COUNT(*) AS '85_70',
SUM(CASE WHEN score>=60 AND score<70 THEN 1 ELSE 0 END)/COUNT(*) AS '70_60',
SUM(CASE WHEN score>=0 AND score<60 THEN 1 ELSE 0 END)/COUNT(*) AS '60_0'
FROM SC
GROUP BY CId) as a
WHERE a.CId = c.CId
結果
查詢各科成績前三名的記錄
SQL語句
SELECT *
FROM (SELECT *, rank() OVER(PARTITION BY CId ORDER BY score DESC) AS rank_three
FROM SC) as a
WHERE a.rank_three<=3
ORDER BY a.CId, a.rank_three
結果
查詢每門課程被選修的學生數
SQL語句
SELECT c.CId, Cname, COUNT(*) AS '選修人數'
FROM SC, Course as c
WHERE SC.CId = c.CId
GROUP BY CId
結果
查詢出只選修兩門課程的學生學號和姓名
SQL語句
SELECT s.SId, Sname
FROM SC, Student as s
WHERE SC.SId = s.SId
GROUP BY s.SId
HAVING COUNT(*) = 2
結果
查詢男生、女生人數
SQL語句
SELECT Ssex, COUNT(*)
FROM Student
GROUP BY Ssex
結果
查詢名字中含有「風」字的學生信息
SQL語句
SELECT *
FROM Student
WHERE Sname LIKE '%風%'
結果
查詢同名同性學生名單,並統計同名人數
SQL語句
SELECT s.*, a.num
FROM Student as s
LEFT JOIN (SELECT Sname, Ssex, COUNT(*) AS num
FROM Student
GROUP BY Sname, Ssex) AS a
ON a.Sname = s.Sname
WHERE
a.num>1
結果
查詢 990 年出生的學生名單
SQL語句
SELECT Sname, Sage
FROM Student
WHERE Sage LIKE '1990%'
結果
查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號昇序排列
SQL語句
SELECT CId, AVG(score) AS average_score
FROM SC
GROUP BY CId
ORDER BY AVG(score) DESC, CId ASC
結果
查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績
SQL語句
SELECT s.SId, Sname, AVG(score) AS average_score
FROM SC, Student as s
WHERE SC.SId = s.SId
GROUP BY SC.SId
HAVING average_score>=85
結果
查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數
SQL語句
SELECT s.Sname, score
FROM Student as s, Course as c, SC
WHERE s.SId = SC.SId AND SC.CId = c.CId AND c.Cname = '數學'
HAVING score<60
結果
查詢所有學生的課程及分數情况(存在學生沒成績,沒選課的情况)
SQL語句
SELECT s.*, score, c.Cname
FROM Student as s
LEFT JOIN SC ON SC.SId = s.SId
LEFT JOIN Course as c ON SC.CId = c.CId
結果
查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
SQL語句
SELECT Sname, Cname, score
FROM Student as s, SC, Course as c
WHERE s.SId = SC.SId AND SC.CId = c.CId
HAVING score>70
結果
查詢不及格的課程
SQL語句
SELECT Sname, Cname
FROM Student as s, SC, Course as c
WHERE s.SId = SC.SId AND SC.CId = c.CId AND score<60
結果
查詢課程編號為 0 且課程成績在 80 分以上的學生的學號和姓名
SQL語句
SELECT s.SId, Sname
FROM Student as s, SC
WHERE SC.SId = s.SId AND SC.CId = '01' AND score>=80
結果
求每門課程的學生人數
SQL語句
SELECT CId, COUNT(*) AS '學生人數'
FROM SC
GROUP BY CId
結果
成績不重複,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
SQL語句
SELECT s.*, a.Cname, a.max_score
FROM Student as s,
(SELECT SId, c.Cname, MAX(score) AS max_score
FROM SC, Course as c, Teacher as t
WHERE t.Tname = '張三' AND t.TId = c.TId AND
c.CId = SC.CId) as a
WHERE a.SId = s.SId
結果
成績有重複的情况下,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
SQL語句
SELECT s.*, b.score, b.ranking
FROM Student as s,
(SELECT SC.SId, SC.score, dense_rank() OVER(ORDER BY score DESC) AS ranking
FROM SC
WHERE CId = (SELECT CId
FROM Course
WHERE TId = (SELECT TId
FROM Teacher
WHERE Tname = '張三'))) AS b
WHERE b.ranking = 1 AND b.SId = s.SId
結果
查詢不同課程成績相同的學生的學生編號、課程編號、學生成績(有點小問題)
SQL語句
SELECT s1.*, s2.*
FROM SC as s1 JOIN SC as s2
WHERE s1.CId != s2.CId AND s1.score = s2.score AND s1.SId != s2.SId
ORDER BY s1.SId, s1.CId, s1.score
結果
查詢每門功成績最好的前兩名
SQL語句
SELECT *
FROM (SELECT *, rank() OVER(PARTITION BY CId ORDER BY score DESC) AS rank_two
FROM SC) as a
WHERE a.rank_two<=2
ORDER BY a.CId, a.rank_two
結果
統計每門課程的學生選修人數(超過 5 人的課程才統計)
SQL語句
SELECT CId, COUNT(*) AS course_num
FROM SC
GROUP BY CId
HAVING course_num>5
結果
檢索至少選修兩門課程的學生學號
SQL語句
SELECT SId, COUNT(*) AS course_num
FROM SC
GROUP BY SId
HAVING course_num>=2
結果
查詢選修了全部課程的學生信息
SQL語句
SELECT *
FROM Student
WHERE SId IN(SELECT SId
FROM SC
GROUP BY SId
HAVING COUNT(*) = (SELECT COUNT(*) FROM Course))
結果
查詢各學生的年齡,只按年份來算
SQL語句
SELECT Sname, YEAR(NOW())-YEAR(Sage) AS age
FROM Student
結果
按照出生日期來算,當前月日 < 出生年月的月日則,年齡减一
SQL語句
SELECT Sname, TIMESTAMPDIFF(YEAR,Sage,NOW()) AS age
FROM Student
結果
查詢本周過生日的學生
SQL語句
SELECT *
FROM Student
WHERE WEEK(NOW()) = WEEK(Sage)
結果
查詢下周過生日的學生
SQL語句
SELECT *
FROM Student
WHERE WEEK(NOW())+1 = WEEK(Sage)
結果
查詢本月過生日的學生
SQL語句
SELECT *
FROM Student
WHERE MONTH(NOW()) =MONTH(Sage)
結果
查詢下月過生日的學生
SQL語句
SELECT *
FROM Student
WHERE MONTH(NOW())+1 =MONTH(Sage)
結果
SQL語句僅供參考,有更好的方法歡迎留言和私信!!
边栏推荐
- super_ Subclass object memory structure_ Inheritance tree traceability
- What are the virtual machine software? What are their respective functions?
- [database I] database overview, common commands, view the table structure of 'demo data', simple query, condition query, sorting data, data processing function (single row processing function), groupi
- Add token validation in swagger
- Which product is better if you want to go abroad to insure Xinguan?
- What is the difference between enterprise wechat applet and wechat applet
- 【.NET+MQTT】.NET6 環境下實現MQTT通信,以及服務端、客戶端的雙邊消息訂閱與發布的代碼演示
- 渗透实战-guest账户-mimikatz-向日葵-sql提权-离线解密
- [source code analysis] model parallel distributed training Megatron (5) -- pipestream flush
- PMP 考試常見工具與技術點總結
猜你喜欢
Hospital network planning and design document based on GLBP protocol + application form + task statement + opening report + interim examination + literature review + PPT + weekly progress + network to
logistic regression
New year's first race, submit bug reward more!
渗透实战-SQLServer提权
Typical applications of minimum spanning tree
No clue about the data analysis report? After reading this introduction of smartbi, you will understand!
Have you entered the workplace since the first 00???
Development of digital collection trading platform development of digital collection platform
I stepped on a foundation pit today
SQL injection (1) -- determine whether there are SQL injection vulnerabilities
随机推荐
Webhook triggers Jenkins for sonar detection
Which product is better for 2022 annual gold insurance?
Session learning diary 1
Constantly changing harmonyos custom JS components during the Spring Festival - Smart Koi
Solve the problems encountered by the laravel framework using mongodb
Zigzag scan
Add token validation in swagger
基于PHP的轻量企业销售管理系统
Tsinghua University product: penalty gradient norm improves generalization of deep learning model
7 * 24-hour business without interruption! Practice of applying multiple live landing in rookie villages
Backpropagation formula derivation [Li Hongyi deep learning version]
[PaddleSeg 源码阅读] PaddleSeg Transform 的 Normalize操作
How to use websocket to realize simple chat function in C #
If you have just joined a new company, don't be fired because of your mistakes
Why is it recommended that technologists write blogs?
Formulaire day05
The difference between MCU serial communication and parallel communication and the understanding of UART
Zhihu million hot discussion: why can we only rely on job hopping for salary increase? Bosses would rather hire outsiders with a high salary than get a raise?
Object oriented -- encapsulation, inheritance, polymorphism
Apple submitted the new MAC model to the regulatory database before the spring conference