50道SQL練習題
來自http://www.reibang.com/p/476b52ee4f1b
sql語句的執(zhí)行順序
(9)Select
(10)distinct 字段名1,字段名2掺炭,
(7)[fun(字段名)]
(1)from 表1
(3)<join類型>join 表2
(2)on <join條件>
(4)where <where條件>
(5)group by <字段>
(6)with <cube|rollup>
(8)having <having條件>
(11)order by <排序字段>
(12)limit <起始偏移量,行數(shù)>
學生表 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' , '數(shù)學' , '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);
1.查詢" 01 "課程比" 02 "課程成績高的學生的信息及課程分數(shù)
SELECT
*
FROM
Student s
WHERE
s.SId IN (
SELECT
sc1.SId
FROM
SC sc1
JOIN SC sc2 ON sc1.SId = sc2.SId
AND sc1.CId = '01'
AND sc2.CId = '02'
AND sc1.score > sc2.score
);
2.查詢同時存在" 01 "課程和" 02 "課程的學生情況
SELECT
*
FROM
Student s
WHERE
s.SId IN (
SELECT
sc1.SId
FROM
SC sc1
JOIN SC sc2 ON sc1.CId = '01'
AND sc2.CId = '02'
AND sc1.SId = sc2.SId
);
3.查詢存在" 01 "課程但不存在" 02 "課程的學生情況(不存在時顯示為 null )
SELECT
*
FROM
Student s
WHERE
s.SId IN (
SELECT
sc1.SId
FROM
( SELECT * FROM SC WHERE SC.CId = '01' ) AS sc1
LEFT JOIN ( SELECT * FROM SC WHERE SC.CId = '02' ) AS sc2 ON sc1.SId = sc2.SId
WHERE
sc2.SId IS NULL
);
4.查詢不存在" 01 "課程但存在" 02 "課程的學生情況
SELECT
s.*
FROM
Student s,
(
SELECT
sc2.SId
FROM
( SELECT * FROM SC WHERE SC.CId = '01' ) AS sc1
RIGHT JOIN ( SELECT * FROM SC WHERE SC.CId = '02' ) AS sc2 ON sc1.SId = sc2.SId
WHERE
sc1.SId IS NULL
) AS sc2id
WHERE
s.SId = sc2id.SId;
5.查詢平均成績大于等于 60 分的同學的學生編號和學生姓名和平均成績
SELECT
s.SId,
s.Sname,
avgs1.as1
FROM
Student s,
( SELECT SId, AVG( score ) AS as1 FROM SC GROUP BY SId HAVING AVG( score ) > 60 ) AS avgs1
WHERE
s.SId = avgs1.SId;
6.查詢在 SC 表存在成績的學生信息
SELECT DISTINCT
s.*
FROM
Student s,
SC
WHERE
s.SId = SC.SId;
7.查詢所有同學的學生編號姑原、學生姓名、選課總數(shù)临庇、所有課程的成績總和
SELECT
s.SId,
s.Sname,
sccs.scc,
sccs.scs
FROM
Student s
LEFT JOIN (
SELECT
SC.SId,
COUNT( SC.CId ) AS scc,
SUM( SC.score ) AS scs
FROM
SC
GROUP BY
SC.SId
) AS sccs ON s.SId = sccs.SId;
8.查有成績的學生信息
SELECT
*
FROM
Student s
WHERE
EXISTS ( SELECT SC.SId FROM SC WHERE SC.SId = s.SId );
9.查詢「李」姓老師的數(shù)量
SELECT
COUNT( * )
FROM
Teacher
WHERE
Tname LIKE '李%';
10.查詢學過「張三」老師授課的同學的信息
SELECT
s.*
FROM
Teacher t,
Course c,
SC,
Student s
WHERE
t.Tname = '張三'
AND t.TId = c.TId
AND SC.CId = c.CId
AND s.SId = SC.SId;
11.查詢沒有學全所有課程的同學的信息
SELECT
*
FROM
Student s
WHERE
s.SId NOT IN (
SELECT
SC.SId
FROM
SC
GROUP BY
SC.SId
HAVING
COUNT( SC.CId ) = ( SELECT COUNT( c.CId ) FROM Course c )
);
12.查詢至少有一門課與學號為" 01 "的同學所學相同的同學的信息
SELECT DISTINCT
s.*
FROM
( SELECT * FROM SC WHERE SC.SId = '01' ) AS sc1
JOIN ( SELECT * FROM SC WHERE SC.SId != '01' ) AS sc2
JOIN Student s
WHERE
sc1.CId = sc2.CId
AND s.SId = sc2.SId;
13.查詢和" 01 "號的同學學習的課程完全相同的其他同學的信息
SELECT
SId
FROM
SC
WHERE
CId IN ( SELECT SC.CId FROM SC WHERE SC.SId = '01' )
GROUP BY
SC.SId
HAVING
COUNT( * ) = ( SELECT COUNT( * ) FROM SC WHERE SC.SId = '01' )
AND SC.SId != '01';
但是如果SId='02'增加一條CId='04',按照上面的語句也是符合條件。因為第三行的語句把這種CId='04'給過濾了昵慌。
SELECT
*
FROM
Student
WHERE
SId IN (
SELECT
SId
FROM
SC
GROUP BY
SId
HAVING
GROUP_CONCAT( CId ) = ( SELECT GROUP_CONCAT( CId ) FROM SC WHERE SId = '01' )
AND SId != '01'
);
14.查詢沒學過"張三"老師講授的任一門課程的學生姓名
SELECT
s.SName
FROM
Student s
WHERE
s.SId NOT IN (
SELECT
SC.SId
FROM
Teacher t,
Course c,
SC
WHERE
t.Tname = '張三'
AND t.TId = c.TId
AND SC.CId = c.CId
);
15.查詢兩門及其以上不及格課程的同學的學號假夺,姓名及其平均成績
SELECT
s.SId,
s.Sname,
AVG( SC.score )
FROM
SC,
Student s
WHERE
s.SId = SC.SId
AND SC.score < 60 GROUP BY SC.SId HAVING COUNT( * ) > 1;
16.檢索" 01 "課程分數(shù)小于 60,按分數(shù)降序排列的學生信息
SELECT
s.*,
SC.score
FROM
SC,
Student s
WHERE
SC.CId = '01'
AND SC.score < 60
AND SC.SId = s.SId
ORDER BY
SC.score DESC;
17.按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
SELECT
SC.*,
sc1.avgs
FROM
SC
LEFT JOIN ( SELECT SId, AVG( SC.score ) AS avgs FROM SC GROUP BY SId ) AS sc1 ON SC.SId = sc1.SId
ORDER BY
sc1.avgs DESC;
18.查詢各科成績最高分斋攀、最低分和平均分:
以如下形式顯示:課程 ID已卷,課程 name,最高分淳蔼,最低分侧蘸,平均分裁眯,及格率,中等率讳癌,優(yōu)良率穿稳,優(yōu)秀率
及格為>=60,中等為:70-80晌坤,優(yōu)良為:80-90逢艘,優(yōu)秀為:>=90
要求輸出課程號和選修人數(shù),查詢結(jié)果按人數(shù)降序排列骤菠,若人數(shù)相同埋虹,按課程號升序排列
SELECT
SC.CId,
c.Cname,
MAX( SC.score ) AS tops,
MIN( SC.score ) AS lows,
AVG( SC.score ) AS avgs,
COUNT( * ) AS nump,
SUM( CASE WHEN SC.score >= 60 THEN 1 ELSE 0 END ) / COUNT( * ) AS pasr,
SUM( CASE WHEN SC.score >= 70 AND SC.score < 80 THEN 1 ELSE 0 END ) / COUNT( * ) AS medr,
SUM( CASE WHEN SC.score >= 90 THEN 1 ELSE 0 END ) / COUNT( * ) AS excr
FROM
SC,
Course c
WHERE
SC.CId = c.CId
GROUP BY
SC.CId
ORDER BY
COUNT( * ) DESC,
SC.CId ASC;
19.按各科成績進行排序,并顯示排名娩怎, Score 重復(fù)時保留名次空缺
SELECT
sc1.CId,
sc1.SId,
COUNT( sc2.score ) + 1 rank
FROM
SC sc1
LEFT JOIN SC sc2 ON sc1.CId = sc2.CId
AND sc1.score < sc2.score
GROUP BY
sc1.CId,
sc1.SId
ORDER BY
sc1.CId,
rank;
查詢學生的總成績搔课,并進行排名,總分重復(fù)時不保留名次空缺
SET @rank := 0;
SELECT
sc.SId,
total,
@rank := @rank + 1 AS Rank
FROM
( SELECT SC.SId, SUM( SC.score ) AS total FROM SC GROUP BY SC.SId ORDER BY total DESC ) sc;
20.統(tǒng)計各科成績各分數(shù)段人數(shù):課程編號截亦,課程名稱爬泥,[100-85],[85-70]崩瓤,[70-60]袍啡,[60-0] 及所占百分比
SELECT
Course.CId,
Course.Cname,
p1.`[100-85]`,
p1.`[100-85]%`,
p2.`[85-70]`,
p2.`[85-70]%`,
p3.`[70-60]`,
p3.`[70-60]%`,
p4.`[60-0]`,
p4.`[60-0]%`
FROM
Course
LEFT JOIN (
SELECT
CId,
SUM( CASE WHEN SC.score <= 100 AND SC.score > 85 THEN 1 ELSE 0 END ) AS `[100-85]`,
ROUND(
(
SUM( CASE WHEN SC.score <= 100 AND SC.score > 85 THEN 1 ELSE 0 END ) * 100 / COUNT( * )
),
2
) `[100-85]%`
FROM
SC
GROUP BY
SC.CId
) p1 ON Course.CId = p1.CId
LEFT JOIN (
SELECT
CId,
SUM( CASE WHEN SC.score <= 85 AND SC.score > 70 THEN 1 ELSE 0 END ) AS `[85-70]`,
ROUND(
(
SUM( CASE WHEN SC.score <= 85 AND SC.score > 70 THEN 1 ELSE 0 END ) * 100 / COUNT( * )
),
2
) AS `[85-70]%`
FROM
SC
GROUP BY
SC.CId
) AS p2 ON Course.CId = p2.CId
LEFT JOIN (
SELECT
CId,
SUM( CASE WHEN SC.score <= 70 AND SC.score > 60 THEN 1 ELSE 0 END ) AS `[70-60]`,
ROUND(
(
SUM( CASE WHEN SC.score <= 70 AND SC.score > 60 THEN 1 ELSE 0 END ) * 100 / COUNT( * )
),
2
) AS `[70-60]%`
FROM
SC
GROUP BY
SC.CId
) AS p3 ON Course.CId = p3.CId
LEFT JOIN (
SELECT
CId,
SUM( CASE WHEN SC.score <= 60 AND SC.score > 0 THEN 1 ELSE 0 END ) AS `[60-0]`,
ROUND(
(
SUM( CASE WHEN SC.score <= 60 AND SC.score > 0 THEN 1 ELSE 0 END ) * 100 / COUNT( * )
),
2
) AS `[60-0]%`
FROM
SC
GROUP BY
SC.CId
) AS p4 ON Course.CId = p4.CId;
21.查詢各科成績前三名的記錄
SELECT
sc1.*
FROM
SC sc1
LEFT JOIN SC sc2 ON sc1.CId = sc2.CId
AND sc1.score < sc2.score
GROUP BY
sc1.SId,
sc1.CId
HAVING
COUNT( sc2.CId ) < 3
ORDER BY
sc1.CId;
22.查詢每門課程被選修的學生數(shù)
SELECT
CId,
COUNT( SId )
FROM
SC
GROUP BY
CId;
23.查詢出只選修兩門課程的學生學號和姓名
SELECT
Student.SId,
Student.Sname
FROM
SC,
Student
WHERE
SC.SId = Student.SId
GROUP BY
SC.SId
HAVING
COUNT( * ) = 2;
24.查詢男生、女生人數(shù)
SELECT
Ssex,
COUNT( * )
FROM
Student
GROUP BY
Ssex;
25.查詢名字中含有「風」字的學生信息
SELECT
*
FROM
Student
WHERE
Sname LIKE '%風%';
26.查詢同名學生名單却桶,并統(tǒng)計同名人數(shù)
SELECT
Sname,
COUNT( * )
FROM
Student
GROUP BY
Sname
HAVING
COUNT( * ) > 1;
27.查詢 1990 年出生的學生名單
SELECT
*
FROM
Student
WHERE
YEAR ( Sage ) = 1990;
28.查詢每門課程的平均成績境输,結(jié)果按平均成績降序排列,平均成績相同時颖系,按課程編號升序排列
SELECT
SC.CId,
Course.Cname,
AVG( SC.score ) AS average
FROM
SC,
Course
WHERE
SC.CId = Course.CId
GROUP BY
SC.CId
ORDER BY
average DESC,
CId;
29.查詢平均成績大于等于 85 的所有學生的學號嗅剖、姓名和平均成績
SELECT
Student.SId,
Student.Sname,
AVG( SC.score ) AS average
FROM
Student,
SC
WHERE
Student.SId = SC.SId
GROUP BY
SC.SId
HAVING
average >= 85;
30.查詢課程名稱為「數(shù)學」,且分數(shù)低于 60 的學生姓名和分數(shù)
SELECT
Student.Sname,
SC.score
FROM
Course,
SC,
Student
WHERE
Course.Cname = "數(shù)學"
AND Course.CId = SC.CId
AND SC.score < 60
AND Student.SId = SC.SId;
31.查詢所有學生的課程及分數(shù)情況(存在學生沒成績嘁扼,沒選課的情況)
SELECT
Sname,
CId,
score
FROM
Student
LEFT JOIN SC USING ( SId );
32.查詢?nèi)魏我婚T課程成績在 70 分以上的姓名信粮、課程名稱和分數(shù)
SELECT
Student.Sname,
Course.Cname,
SC.score
FROM
SC,
Student,
Course
WHERE
SC.score > 70
AND Student.SId = SC.SId
AND SC.CId = Course.CId;
33.查詢存在不及格的課程
SELECT DISTINCT
SC.CId
FROM
SC
WHERE
SC.score < 60;
34.查詢課程編號為 01 且課程成績在 80 分及以上的學生的學號和姓名
SELECT
Student.SId,
Student.Sname
FROM
Student,
SC
WHERE
Student.SId = SC.SId
AND CId = "01"
AND score >= 80;
35.求每門課程的學生人數(shù)
SELECT
SC.CId,
COUNT( * ) AS sn
FROM
SC
GROUP BY
CId;
36.成績不重復(fù),查詢選修「張三」老師所授課程的學生中趁啸,成績最高的學生信息及其成績
SELECT
Student.*,
SC.CId,
SC.score
FROM
Teacher,
Course,
SC,
Student
WHERE
Teacher.Tname = "張三"
AND Teacher.TId = Course.TId
AND Course.CId = SC.CId
AND SC.SId = Student.SId
ORDER BY
SC.score DESC
LIMIT 1;
37.成績有重復(fù)的情況下强缘,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
SELECT Student.*,SC.CId,SC.score
FROM Teacher,Course,SC,Student
WHERE Teacher.Tname="張三"
AND Teacher.TId=Course.TId
AND Course.CId=SC.CId
AND SC.SId=Student.SId
AND SC.score=
(SELECT MAX(SC.score)
FROM Teacher,Course,SC,Student
WHERE Teacher.Tname="張三"
AND Teacher.TId=Course.TId
AND Course.CId=SC.CId
AND SC.SId=Student.SId );
38.查詢不同課程成績相同的學生的學生編號不傅、課程編號旅掂、學生成績
SELECT
sc1.*
FROM
SC sc1
JOIN SC sc2 USING ( SId )
WHERE
sc1.CId != sc2.CId
AND sc1.score = sc2.score
GROUP BY
sc1.CId;
39.查詢每門課程成績最好的前兩名
SELECT
sc1.*
FROM
SC sc1
LEFT JOIN SC sc2 ON sc1.CId = sc2.CId
AND sc1.score < sc2.score
GROUP BY
sc1.SId,
sc1.CId
HAVING
COUNT( sc2.CId ) < 2
ORDER BY
sc1.CId;
40.統(tǒng)計每門課程的學生選修人數(shù)(超過 5 人的課程才統(tǒng)計)
SELECT
SC.CId,
COUNT( SId ) AS cc
FROM
SC
GROUP BY
CId
HAVING
cc > 5;
41.檢索至少選修兩門課程的學生學號
SELECT
SC.SId,
COUNT( SId ) AS cc
FROM
SC
GROUP BY
SId
HAVING
cc >= 2;
42.查詢選修了全部課程的學生信息
SELECT
Student.*
FROM
SC,
Student
WHERE
SC.SId = Student.SId
GROUP BY
SC.SId
HAVING
COUNT( * ) = ( SELECT COUNT( * ) FROM Course );
43.查詢各學生的年齡,只按年份來算
SELECT
SId,
Sname,
YEAR ( CURDATE( ) ) - YEAR ( Sage ) AS age
FROM
Student;
44.按照出生日期來算访娶,當前月日 < 出生年月的月日則商虐,年齡減一
SELECT
SId,
Sname,
TIMESTAMPDIFF( YEAR, Sage, CURDATE( ) ) AS age
FROM
Student;
45.查詢本周過生日的學生
SELECT
*
FROM
Student
WHERE
WEEKOFYEAR( Sage ) = WEEKOFYEAR( CURDATE( ) );
查詢下周過生日的學生
SELECT
*
FROM
Student
WHERE
WEEKOFYEAR( Sage ) = WEEKOFYEAR( CURDATE( ) ) + 1;
46.查詢本月過生日的學生
SELECT
*
FROM
Student
WHERE
MONTH ( Sage ) = MONTH ( CURDATE( ) );
47.查詢下月過生日的學生
SELECT
*
FROM
Student
WHERE
MONTH ( Sage ) = MONTH ( CURDATE( ) ) + 1;