sql之mysql45題
- 建表+數據
- 45題
- 個人認爲第11,12,13,18,20,26,38,42題比較有意思
- 1.查詢“001”課程比“002”課程成績高的所有學生的學號;
- 2.查詢平均成績大於60分的同學的學號和平均成績;
- 3.查詢所有同學的學號、姓名、選課數、總成績;
- 4.查詢姓“李”的老師的個數;
- 5.查詢沒學過“葉平”老師課的同學的學號、姓名;
- 6.查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
- 7.查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
- 8.查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;
- 9.查詢所有課程成績小於60分的同學的學號、姓名;
- 10.查詢沒有學全所有課的同學的學號、姓名;
- 11.****查詢至少有一門課與學號爲“1001”的同學所學相同的同學的學號和姓名; ****
- 12.****把“SC”表中“葉平”老師教的課的成績都更改爲此課程的平均成績;****
- 13.****查詢和“1002”號的同學學習的課程完全相同的其他同學學號和姓名; ****
- 13擴展、查詢所有包含“1002”號的同學學習的所有課程的其他同學學號和姓名;
- 14.刪除學習“葉平”老師課的SC表記錄;
- 15.按平均成績從高到低顯示所有學生的“數據庫”、“企業管理”、“英語”三門的課程成績,按如下形式顯示: 學生ID,,數據庫,企業管理,英語,有效課程數,有效平均分
- 16.查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
- 17.按各科平均成績從低到高和及格率的百分數從高到低排序
- 18.****查詢如下課程平均成績和及格率的百分數(用1行顯示): 企業管理(001),馬克思(002),UML (003),數據庫(004) ****
- 19.查詢不同老師所教不同課程平均分從高到低顯示 要求顯示:教師ID,教師姓名,課程ID,課程名稱,平均成績
- 20.****統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60] (從本題開始沒有使用美化sql)****
- 21.查詢每門課程被選修的學生數
- 22.查詢出只選修了一門課程的全部學生的學號和姓名
- 23.查詢男生、女生人數
- 24.查詢姓“張”的學生名單
- 25.查詢同名同性學生名單,並統計同名人數
- 26.****1981年出生的學生名單(注:Student表中Sage列的類型是datetime)****
- 27.查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
- 28.查詢平均成績大於85的所有學生的學號、姓名和平均成績
- 29.查詢課程名稱爲“數據庫”,且分數低於60的學生姓名和分數
- 30.查詢所有學生的選課情況;
- 31.查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
- 32.查詢不及格的課程,並按課程號從大到小排列
- 33.查詢課程編號爲003且課程成績在80分以上的學生的學號和姓名;
- 34.求選了課程的學生人數
- 35.查詢選修“葉平”老師所授課程的學生中,成績最高的學生姓名及其成績
- 36.查詢各個課程及相應的選修人數
- 37.查詢不同課程成績相同的學生的學號、課程號、學生成績
- 38.****查詢每門功課成績最好的前兩名****
- 39.統計每門課程的學生選修人數。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
- 40.檢索至少選修兩門課程的學生學號
- 41.查詢全部學生都選修的課程的課程號和課程名
- 42.****查詢沒學過“葉平”老師講授的任一門課程的學生姓名 ****
- 43.查詢兩門以上不及格課程的同學的學號及其平均成績
- 44.檢索“004”課程分數小於60,按分數降序排列的同學學號
- 45.刪除“1002”同學的“001”課程的成績
建表+數據
建表語句
/*Student(sid,Sname,Sage,Ssex) 學生表*/
CREATE TABLE student (
sid varchar(10) NOT NULL,
sName varchar(20) DEFAULT NULL,
sAge datetime DEFAULT '1980-10-12 23:12:36',
sSex varchar(10) DEFAULT NULL,
PRIMARY KEY (sid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Course(cid,Cname,tid) 課程表 */
CREATE TABLE course (
cid varchar(10) NOT NULL,
cName varchar(10) DEFAULT NULL,
tid int(20) DEFAULT NULL,
PRIMARY KEY (cid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*SC(sid,cid,score) 成績表 */
CREATE TABLE sc (
sid varchar(10) DEFAULT NULL,
cid varchar(10) DEFAULT NULL,
score int(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Teacher(tid,Tname) 教師表*/
CREATE TABLE teacher (
tid int(10) DEFAULT NULL,
tName varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
增加數據
/*增加數據*/
insert into teacher(tid,tName) values (1,'李老師'),(2,'何以琛'),(3,'葉平');
insert into student(sid,sName,sAge,sSex) values ('1001','張三丰','1980-10-12 23:12:36','男'),('1002','張無極','1995-10-12 23:12:36','男'),('1003','李奎','1992-10-12 23:12:36','女'),('1004','李元寶','1980-10-12 23:12:36','女'),('1005','李世明','1981-10-12 23:12:36','男'),('1006','趙六','1986-10-12 23:12:36','男'),('1007','田七','1981-10-12 23:12:36','女');
insert into sc(sid,cid,score) values ('1001','001',80),('1001','002',60),('1001','003',75),('1002','001',85),('1002','002',70),('1003','004',100),('1003','001',90),('1003','002',55),('1004','002',65),('1004','003',60);
insert into course(cid,cName,tid) values ('001','企業管理',3),('002','馬克思',3),('003','UML',2),('004','數據庫',1),('005','英語',1);
45題
個人認爲第11,12,13,18,20,26,38,42題比較有意思
1.查詢“001”課程比“002”課程成績高的所有學生的學號;
SELECT
a.sid
FROM
(
SELECT
sid,
score
FROM
sc
WHERE
cid = '001'
) a
LEFT JOIN (
SELECT
sid,
score
FROM
sc
WHERE
cid = '002'
) b ON a.sid = b.sid
WHERE
a.score > b.score
2.查詢平均成績大於60分的同學的學號和平均成績;
SELECT
sid,
AVG(score) score
FROM
sc
GROUP BY
sid
HAVING
AVG(score) > 60;
3.查詢所有同學的學號、姓名、選課數、總成績;
SELECT
student.sid,
MAX(student.sName),
COUNT(sc.cid) cidnum,
SUM(sc.score) score
FROM
student
LEFT JOIN sc ON student.sid = sc.sid
GROUP BY
student.sid
4.查詢姓“李”的老師的個數;
SELECT
SUM(teacher.tid)
FROM
teacher
WHERE
teacher.tName LIKE '李%';
5.查詢沒學過“葉平”老師課的同學的學號、姓名;
select s.sid,s.sName from student s where s.sid
NOT IN (
select stu.sid from student stu
LEFT JOIN sc on sc.sid = stu.sid
LEFT JOIN course on course.cid = sc.cid
LEFT JOIN teacher on teacher.tid = course.tid
WHERE teacher.tName = '葉平'
)
6.查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
SELECT
a.sid
FROM
(
SELECT
sid,
score
FROM
sc
WHERE
cid = '001'
) a
LEFT JOIN (
SELECT
sid,
score
FROM
sc
WHERE
cid = '002'
) b ON a.sid = b.sid
7.查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
SELECT
s.sid,
s.sName
FROM
student s
WHERE
s.sid IN (
SELECT
stu.sid
FROM
student stu
LEFT JOIN sc ON sc.sid = stu.sid
LEFT JOIN course ON course.cid = sc.cid
LEFT JOIN teacher ON teacher.tid = course.tid
WHERE
teacher.tName = '葉平'
GROUP BY
stu.sid
HAVING
COUNT(stu.sid) = (
SELECT
COUNT(teacher.tid)
FROM
teacher
LEFT JOIN course ON teacher.tid = course.tid
WHERE
teacher.tName = '葉平'
)
)
8.查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;
SELECT
student.sid,
student.sName
FROM
(
SELECT
sid,
score
FROM
sc
WHERE
cid = '001'
) a
LEFT JOIN (
SELECT
sid,
score
FROM
sc
WHERE
cid = '002'
) b ON a.sid = b.sid
LEFT JOIN student ON b.sid = student.sid
WHERE
a.score > b.score
9.查詢所有課程成績小於60分的同學的學號、姓名;
9.1、
SELECT
student.sid,
student.sName
FROM
(
SELECT
sid,
score
FROM
sc
WHERE
cid = '001'
) a
LEFT JOIN (
SELECT
sid,
score
FROM
sc
WHERE
cid = '002'
) b ON a.sid = b.sid
LEFT JOIN (
SELECT
sid,
score
FROM
sc
WHERE
cid = '002'
) c ON c.sid = b.sid
LEFT JOIN student ON c.sid = student.sid
WHERE
a.score < 60
AND b.score < 60
AND c.score < 60
9.2、一個課程都沒有選擇的也算是成績在60以下
select sid,Sname
from Student
where sid not in (select Student.sid from Student,SC where Student.sid=SC.sid and score>60);
10.查詢沒有學全所有課的同學的學號、姓名;
select sid,Sname
from Student
where sid not in (select Student.sid from Student,SC where Student.sid=SC.sid);
11.****查詢至少有一門課與學號爲“1001”的同學所學相同的同學的學號和姓名; ****
SELECT
student.sid,
student.sName
FROM
student
LEFT JOIN sc ON sc.sid = student.sid
WHERE
sc.cid IN (
SELECT
sc.cid
FROM
sc
WHERE
sc.sid = '1001'
)
AND sc.sid != '1001'
GROUP BY
student.sid
12.把“SC”表中“葉平”老師教的課的成績都更改爲此課程的平均成績;
UPDATE sc,
(
SELECT
c.cid,
AVG(score) avgs
FROM
sc,
course c,
teacher t
WHERE
sc.cid = c.cid
AND c.tid = t.tid
AND t.tName = '葉平'
GROUP BY
c.cid
) sc_2
SET sc.score = sc_2.avgs
WHERE
sc.cid = sc_2.cid
13.****查詢和“1002”號的同學學習的課程完全相同的其他同學學號和姓名; ****
課程完全相同:兩個人的課程一模一樣,誰的都不能多,也不能少
其他同學:搜索的結果不能爲1002號同學
方法1:
SELECT
SC.sid
FROM
SC
LEFT JOIN (
SELECT
sid,
count(1) a1
FROM
SC
GROUP BY
sid
) a ON SC.sid = a.sid
LEFT JOIN (
SELECT
count(1) b1
FROM
SC
WHERE
sid = '1002'
) b ON a.a1 = b.b1
WHERE
cid IN (
SELECT
cid
FROM
SC
WHERE
sid = '1002'
)
AND a.a1 = b.b1
AND SC.sid != '1002'
GROUP BY
sid
方法2:
SELECT
SC.sid
FROM
SC
LEFT JOIN (
SELECT
sid,
count(1) a1
FROM
SC
GROUP BY
sid
) a ON SC.sid = a.sid
WHERE
cid IN (
SELECT
cid
FROM
SC
WHERE
sid = '1002'
)
AND a.a1 = (
SELECT
count(1) b1
FROM
SC
WHERE
sid = '1002'
)
AND SC.sid != '1002'
GROUP BY
sid
13擴展、查詢所有包含“1002”號的同學學習的所有課程的其他同學學號和姓名;
SELECT
sid,
count(1)
FROM
SC
WHERE
cid IN (
SELECT
cid
FROM
SC
WHERE
sid = '1002'
)
GROUP BY
sid
HAVING
count(1) = (
SELECT
count(1)
FROM
SC
WHERE
sid = '1002'
);
14.刪除學習“葉平”老師課的SC表記錄;
DELETE
FROM
sc
WHERE
cid IN (
SELECT
cid
FROM
course
LEFT JOIN teacher ON course.tid = teacher.tid
WHERE
teacher.tName = '葉平'
);
15.按平均成績從高到低顯示所有學生的“數據庫”、“企業管理”、“英語”三門的課程成績,按如下形式顯示: 學生ID,數據庫,企業管理,英語,有效課程數,有效平均分
SELECT
sid AS 學生ID,
(
SELECT
score
FROM
SC
WHERE
SC.sid = t.sid
AND cid = '004'
) AS 數據庫,
(
SELECT
score
FROM
SC
WHERE
SC.sid = t.sid
AND cid = '001'
) AS 企業管理,
(
SELECT
score
FROM
SC
WHERE
SC.sid = t.sid
AND cid = '005'
) AS 英語,
COUNT(*) AS 有效課程數,
AVG(t.score) AS 平均成績
FROM
SC AS t
GROUP BY
sid
ORDER BY
avg(t.score)
16.查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT
cid '課程ID',
MAX(score) '最高分',
MIN(score) '最低分'
FROM
sc
GROUP BY
cid
17.按各科平均成績從低到高和及格率的百分數從高到低排序
17.1.測試:中文升序降序不好使
SELECT
cid '課程ID',
AVG(score) '平均成績',
SUM(
CASE
WHEN IFNULL(score, 0) > 60 THEN
1
ELSE
0
END
) / COUNT(1) '及格率'
FROM
sc
GROUP BY
cid
ORDER BY
'平均成績' DESC,
'及格率' DESC
17.2.別名改爲英文才可以
SELECT
cid '課程ID',
AVG(score) avg_s,
SUM(
CASE
WHEN IFNULL(score, 0) > 60 THEN
1
ELSE
0
END
) / COUNT(1) pass_rate
FROM
sc
GROUP BY
cid
ORDER BY
avg_s DESC,
pass_rate DESC
18.****查詢如下課程平均成績和及格率的百分數(用1行顯示): 企業管理(001),馬克思(002),UML (003),數據庫(004) ****
SELECT
SUM(
CASE
WHEN cid = '001' THEN
IFNULL(score, 0)
ELSE
0
END
) / SUM(
CASE
WHEN cid = '001' THEN
1
ELSE
0
END
) '企業管理平均成績',
SUM(
CASE
WHEN IFNULL(score, 0) > 60
AND cid = '001' THEN
1
ELSE
0
END
) / SUM(
CASE
WHEN cid = '001' THEN
1
ELSE
0
END
) * 100 '企業管理百分比',
SUM(
CASE
WHEN cid = '002' THEN
IFNULL(score, 0)
ELSE
0
END
) / SUM(
CASE
WHEN cid = '002' THEN
1
ELSE
0
END
) '馬克思平均成績',
SUM(
CASE
WHEN IFNULL(score, 0) > 60
AND cid = '002' THEN
1
ELSE
0
END
) / SUM(
CASE
WHEN cid = '002' THEN
1
ELSE
0
END
) * 100 '馬克思百分比',
SUM(
CASE
WHEN cid = '003' THEN
IFNULL(score, 0)
ELSE
0
END
) / SUM(
CASE
WHEN cid = '003' THEN
1
ELSE
0
END
) 'UML平均成績',
SUM(
CASE
WHEN IFNULL(score, 0) > 60
AND cid = '003' THEN
1
ELSE
0
END
) / SUM(
CASE
WHEN cid = '003' THEN
1
ELSE
0
END
) * 100 'UML百分比',
SUM(
CASE
WHEN cid = '004' THEN
IFNULL(score, 0)
ELSE
0
END
) / SUM(
CASE
WHEN cid = '004' THEN
1
ELSE
0
END
) '數據庫平均成績',
SUM(
CASE
WHEN IFNULL(score, 0) > 60
AND cid = '004' THEN
1
ELSE
0
END
) / SUM(
CASE
WHEN cid = '004' THEN
1
ELSE
0
END
) * 100 '數據庫百分比'
FROM
sc
19.查詢不同老師所教不同課程平均分從高到低顯示 要求顯示:教師ID,教師姓名,課程ID,課程名稱,平均成績
SELECT
MAX(t.tid),
MAX(t.tName),
c.cid,
MAX(c.cName),
AVG(score)
FROM
teacher t
LEFT JOIN course c ON t.tid = c.tid
LEFT JOIN sc ON sc.cid = c.cid
GROUP BY
c.cid
20.統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60] (從本題開始沒有使用美化sql)
20.1.使用大於小於號
SELECT
sc.cid,MAX(cName) '課程名稱',
SUM(CASE WHEN score >= 85 THEN 1 ELSE 0 END) '[100-85]',
SUM(CASE WHEN score >= 70 AND score < 85 THEN 1 ELSE 0 END) '[70-85]',
SUM(CASE WHEN score < 70 AND score >= 60 THEN 1 ELSE 0 END) '[60-70]',
SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) '[60-0]'
FROM
sc LEFT JOIN course on sc.cid = course.cid
GROUP BY sc.cid
20.2.使用BETWEEN-AND
SELECT SC.cid as 課程ID, Cname as 課程名稱
,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS '[100 - 85]'
,SUM(CASE WHEN score BETWEEN 70 AND 84 THEN 1 ELSE 0 END) AS '[85 - 70]'
,SUM(CASE WHEN score BETWEEN 60 AND 69 THEN 1 ELSE 0 END) AS '[70 - 60] '
,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS '[60 -] '
FROM SC,Course
where SC.cid=Course.cid
GROUP BY SC.cid,Cname;
21.查詢每門課程被選修的學生數
select COUNT(sid) from sc GROUP BY cid
22.查詢出只選修了一門課程的全部學生的學號和姓名
SELECT sc.sid,MAX(sName)
FROM sc
LEFT JOIN student on student.sid = sc.sid
GROUP BY sc.sid
HAVING COUNT(cid) = 1
23.查詢男生、女生人數
select SUM(CASE WHEN sSex = '男' THEN 1 ELSE 0 END) '男',
SUM(CASE WHEN sSex = '女' THEN 1 ELSE 0 END) '女'
FROM student
24.查詢姓“張”的學生名單
SELECT sName FROM student WHERE sName LIKE '張%'
25.查詢同名同性學生名單,並統計同名人數
SELECT sName,sSex,COUNT(1) FROM student GROUP BY sName,sSex HAVING COUNT(1) > 1
26.1981年出生的學生名單(注:Student表中Sage列的類型是datetime)
SELECT SNAME, SAGE
FROM student
WHERE DATE_FORMAT(sAge,'%Y')='1981';
27.查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
SELECT cid,AVG(score) avg_s FROM sc GROUP BY cid ORDER BY avg_s ASC ,cid DESC
28.查詢平均成績大於85的所有學生的學號、姓名和平均成績
SELECT student.sid,MAX(sName),AVG(score) avg_s
FROM student
LEFT JOIN sc ON student.sid = sc.sid
GROUP BY student.sid
HAVING avg_s > 85
29.查詢課程名稱爲“數據庫”,且分數低於60的學生姓名和分數
SELECT sName, score
FROM sc
LEFT JOIN course on course.cid = sc.cid
LEFT JOIN student on student.sid = sc.sid
WHERE course.cName = '數據庫' AND sc.score < 60
30.查詢所有學生的選課情況;
SELECT student.sid,sName,cName
FROM sc
LEFT JOIN course on sc.cid = course.cid
LEFT JOIN student on student.sid = sc.sid
31.查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
SELECT sName,cName,score
FROM student
LEFT JOIN sc on sc.sid = student.sid
LEFT JOIN course on course.cid = sc.cid
WHERE sc.score > 70
32.查詢不及格的課程,並按課程號從大到小排列
SELECT cid,score FROM sc WHERE score < 60 ORDER BY cid DESC
33.查詢課程編號爲003且課程成績在80分以上的學生的學號和姓名;
SELECT sc.sid,sName
FROM student
LEFT JOIN sc on sc.sid = student.sid
LEFT JOIN course on course.cid = sc.cid
WHERE score > 80
AND sc.cid = '003'
34.求選了課程的學生人數
34.1統計sc表的總數
SELECT COUNT(1) FROM sc;
34.2在sid上去重
SELECT COUNT(DISTINCT sid) FROM sc
35.查詢選修“葉平”老師所授課程的學生中,成績最高的學生姓名及其成績
SELECT sName,score
FROM student
LEFT JOIN sc on sc.sid = student.sid
LEFT JOIN course on course.cid = sc.cid
LEFT JOIN teacher on teacher.tid = course.tid
WHERE teacher.tName = '葉平'
ORDER BY score DESC
LIMIT 1
36.查詢各個課程及相應的選修人數
SELECT cid,count(sid)
FROM sc
GROUP BY cid
37.查詢不同課程成績相同的學生的學號、課程號、學生成績
SELECT DISTINCT a.sid,b.score
FROM sc a
LEFT JOIN sc b ON a.score = b.score
WHERE a.cid <> b.cid
38.查詢每門功課成績最好的前兩名
38.1如果第二名和之後學生的成績相同,則捨去
SELECT *
FROM sc t1
WHERE (
SELECT COUNT(*)
FROM sc t2
WHERE t1.cid=t2.cid
AND t2.score>=t1.score
) <=2 ORDER BY t1.cid,t1.score DESC
38.2如果第二名和之後學生的成績相同,則都顯示
SELECT *
FROM sc t1
WHERE (
SELECT COUNT(*)
FROM sc t2
WHERE t1.cid=t2.cid
AND t2.score>t1.score
) <=1 ORDER BY t1.cid,t1.score DESC
39.統計每門課程的學生選修人數。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
SELECT cid,COUNT(1) c
FROM sc
GROUP BY cid
ORDER BY c DESC,cid
40.檢索至少選修兩門課程的學生學號
SELECT sid
FROM sc
GROUP BY sid
HAVING COUNT(1) > 1
41.查詢全部學生都選修的課程的課程號和課程名
SELECT sc.cid,course.cName
FROM sc
LEFT JOIN course on course.cid = sc.cid
GROUP BY sc.cid
HAVING COUNT(1) = (SELECT COUNT(1) FROM student)
42.****查詢沒學過“葉平”老師講授的任一門課程的學生姓名 ****
SELECT sName
FROM student
WHERE sid NOT IN (
SELECT sid
FROM teacher
LEFT JOIN course on course.tid = teacher.tid
LEFT JOIN sc on sc.cid = course.cid
WHERE tName = '葉平')
43.查詢兩門以上不及格課程的同學的學號及其平均成績
SELECT student.sid,AVG(score)
FROM sc
LEFT JOIN student on student.sid = sc.sid
GROUP BY sc.sid
HAVING SUM(CASE WHEN score<60 THEN 1 ELSE 0 END) > 1
44.檢索“004”課程分數小於60,按分數降序排列的同學學號
SELECT sid
FROM sc
WHERE cid = '004'
ORDER BY sid
45.刪除“1002”同學的“001”課程的成績
delete from Sc where sid='1002' and cid='001';
金融理財師(AFP)雙證
註冊理財規劃師(CFP)四證
出證單位:中國註冊理財規劃師協會。
適合人羣如下:
1.銀行工作人員
2.證劵公司工作人員
3.理財投資公司工作人員
4.社會投資理財顧問人員。
查詢網址:中國註冊理財規劃師協會http://www.cfp.org.cn。