文章目录
一 表的结构
mysql> use mydb;
Database changed
mysql> show tables;
+
| Tables_in_mydb |
+
| course |
| score |
| student |
| teacher |
+
4 rows in set (0.00 sec)
mysql> select * from course;
+
| cid | cname | tid |
+
| 01 | 语文 | 02 |
| 02 | 数学 | 01 |
| 03 | 英语 | 03 |
+
3 rows in set (0.00 sec)
mysql> select * from score;
+
| sid | cid | sscore |
+
| 01 | 01 | 80 |
| 01 | 02 | 90 |
| 01 | 03 | 99 |
| 02 | 01 | 70 |
| 02 | 02 | 60 |
| 02 | 03 | 80 |
| 03 | 01 | 80 |
| 03 | 02 | 80 |
| 03 | 03 | 80 |
| 04 | 01 | 50 |
| 04 | 02 | 30 |
| 04 | 03 | 20 |
| 05 | 01 | 76 |
| 05 | 02 | 87 |
| 06 | 01 | 31 |
| 06 | 03 | 34 |
| 07 | 02 | 89 |
| 07 | 03 | 98 |
+
18 rows in set (0.00 sec)
mysql> select * from student;
+
| sid | sname | sbirth | ssex |
+
| 01 | 赵雷 | 1990-01-01 | 男 |
| 02 | 钱电 | 1990-12-21 | 男 |
| 03 | 孙风 | 1990-05-20 | 男 |
| 04 | 李云 | 1990-08-26 | 女 |
| 05 | 周梅 | 1991-12-01 | 女 |
| 06 | 吴兰 | 1992-03-01 | 女 |
| 07 | 郑竹 | 1989-07-01 | 女 |
| 08 | 王菊 | 1990-01-20 | 女 |
| 09 | 王菊 | 1990-02-20 | 女 |
+
9 rows in set (0.00 sec)
mysql> select * from teacher;
+
| tid | tname |
+
| 01 | 张三 |
| 02 | 李四 |
| 03 | 王五 |
+
3 rows in set (0.00 sec)
二 50小题
SELECT st.sid,sname,sbirth,ssex,sc1.sscore
FROM student st,score sc1,score sc2
WHERE st.sid=sc1.sid AND
sc1.cid='01' AND sc2.cid='02'
AND sc1.sscore>sc2.sscore;
SELECT st.sid,sname,sbirth,ssex,sc1.sscore
FROM student st,score sc1,score sc2
WHERE st.sid=sc1.sid
AND sc1.cid='01'
AND sc2.cid='02'
AND sc1.sscore<sc2.sscore;
SELECT st.sid,st.sname,ROUND(AVG(sc.sscore),2)
FROM student st
LEFT JOIN score sc ON sc.sid=st.sid
GROUP BY sc.sid
HAVING AVG(sc.sscore)>=60;
SELECT st.sid,st.sname,ROUND(AVG(sc.sscore),2)
FROM student st
LEFT JOIN score sc
ON sc.sid=st.sid
GROUP BY sc.sid
HAVING AVG(sc.sscore)<60;
SELECT st.sid,st.sname,COUNT(sc.cid),
CASE WHEN SUM(sc.sscore) IS NULL THEN 0.00
ELSE ROUND(SUM(sc.sscore),2)
END AS '总成绩'
FROM student st
LEFT JOIN score sc
ON st.sid=sc.sid
GROUP BY st.sid;
SELECT COUNT(te.tname)
FROM teacher te
WHERE tname LIKE"李%";
SELECT st.*
FROM student st
WHERE st.sid IN
(SELECT sc.sid
FROM score sc
WHERE sc.cid
IN (SELECT c.cid
FROM course c,teacher t
WHERE c.tid=t.tid AND t.tname='张三'));
SELECT st.*
FROM student st
WHERE st.sid IN( SELECT sc.sid
FROM score sc
WHERE sc.cid
IN
(SELECT c.cid
FROM course c,teacher t
WHERE c.tid=t.tid
AND t.tname!='张三')
);
SELECT st.*
FROM student st
WHERE st.sid IN
(SELECT sc.sid
FROM score sc
WHERE sc.sid='01'
AND sc.cid='02');
SELECT st.*
FROM student st
WHERE st.sid IN
(SELECT sc.sid
FROM score sc
WHERE sc.sid='01'
AND sc.cid!='02');
SELECT st.*
FROM student st
LEFT JOIN score sc ON st.sid=sc.sid
GROUP BY st.sid
HAVING COUNT(sc.sscore)<(
SELECT COUNT(DISTINCT cid)
FROM score
);
SELECT DISTINCT student.sid,sname
FROM student,score
WHERE student.sid=score.sid
AND score.cid IN
(SELECT cid
FROM score
WHERE sid='01')
AND student.sid!='01';
SELECT * FROM student
WHERE sid IN(
SELECT DISTINCT sid
FROM score
WHERE sid NOT IN
(SELECT sid
FROM score
WHERE cid NOT IN
(SELECT cid
FROM score
WHERE sid='01')
)
GROUP BY sid
HAVING COUNT(cid)=(SELECT COUNT(cid)
FROM score
WHERE sid='01'
)
AND sid<>'01');
SELECT *
FROM student
WHERE sid IN(
SELECT r2.sid FROM (
(SELECT sid,cid FROM score WHERE sid="01") AS r1
INNER JOIN (
SELECT sid,cid
FROM score
WHERE sid IN (
SELECT sid FROM score
GROUP BY sid
HAVING sid!="01"
AND COUNT(cid)=(
SELECT COUNT(cid)
FROM score
WHERE sid="01")
)
) AS r2
ON r1.cid=r2.cid)
GROUP BY r2.sid
HAVING COUNT(r2.sid)=(SELECT COUNT(cid)
FROM score
WHERE sid="01")
);
SELECT sname
FROM student
WHERE sid IN (
SELECT sid
FROM score
WHERE cid IN(
SELECT cid
FROM course
WHERE tid !=(
SELECT tid
FROM teacher
WHERE tname="张三"
)
)
);
SELECT student.sid,student.sname,AVG(sscore)
FROM student, score
WHERE student.sid=score.sid AND sscore<60
GROUP BY student.sid
HAVING COUNT(cid)>=2;
SELECT student.sid,student.sname,AVG(sscore)
FROM student, score
WHERE student.sid=score.sid
GROUP BY student.sid
HAVING SUM(CASE WHEN sscore<60 THEN 1 ELSE 0 END)>=2;
SELECT *
FROM student st JOIN
(SELECT sid,sscore
FROM score
WHERE cid='01' AND sscore<60) sid
ON st.sid=sid.sid
ORDER BY sid.sscore DESC;
SELECT student.sid,
SUM(CASE WHEN cid='01' THEN sscore ELSE NULL END ) cid1,
SUM(CASE WHEN cid='02' THEN sscore ELSE NULL END ) cid2,
SUM(CASE WHEN cid='03' THEN sscore ELSE NULL END ) cid3,
AVG(sscore) average
FROM student,score
WHERE student.sid=score.sid
GROUP BY student.sid
ORDER BY average DESC;
SELECT score.cid,course.cname,MAX(sscore),MIN(sscore),AVG(sscore),
ROUND( SUM(CASE WHEN sscore>=60 THEN 1 ELSE 0 END)/COUNT(sscore) ,2) '及格率',
ROUND( SUM(CASE WHEN sscore>=70 AND sscore<=80 THEN 1 ELSE 0 END)/COUNT(sscore) ,2) '中等率',
ROUND( SUM(CASE WHEN sscore>80 AND sscore<90 THEN 1 ELSE 0 END)/COUNT(sscore) ,2)'优良率',
ROUND( SUM(CASE WHEN sscore>=90 THEN 1 ELSE 0 END)/COUNT(sscore) ,2)'优秀率'
FROM score,course WHERE score.cid=course.cid
GROUP BY score.cid;
SELECT sid, cid,sscore,
ROW_NUMBER() OVER(PARTITION BY cid ORDER BY sscore DESC) rank_cid
FROM score;
SET @crank =0;
SELECT b.sid, b.a, @crank := @crank +1 AS rank1 FROM
(SELECT sid,SUM(sscore) AS a
FROM score
GROUP BY sid
ORDER BY a DESC) b ;
SET @crank =0;
SELECT @crank := @crank +1 AS rank1,sc.sid,SUM(sscore) AS a
FROM score sc
GROUP BY sid
ORDER BY a DESC;
SELECT st.sid,st.sname,(CASE WHEN SUM(sc.sscore) IS NULL THEN 0 ELSE SUM(sc.sscore) END) AS '总成绩'
FROM student st
LEFT JOIN score sc
ON sc.sid=st.sid
GROUP BY st.sid ORDER BY SUM(sc.sscore) DESC;
SELECT course.tid,teacher.tname,course.cid,AVG(sscore) average
FROM course,teacher,score
WHERE course.tid=teacher.tid AND course.cid=score.cid
GROUP BY course.tid,course.cid
ORDER BY average DESC;
SELECT sid,sscore FROM
(SELECT sid, sscore,
ROW_NUMBER() OVER(PARTITION BY cid ORDER BY sscore DESC) rank_cid
FROM score
) cc
WHERE rank_cid IN (2,3) ;
SELECT st.*,cc.sscore FROM student st,
(SELECT sid, sscore,
ROW_NUMBER() OVER(PARTITION BY cid ORDER BY sscore DESC) rank_cid
FROM score
) cc
WHERE rank_cid IN (2,3)AND st.sid=cc.sid ;
SELECT score.cid,course.cname,
ROUND( SUM(CASE WHEN sscore<=100 AND sscore>85 THEN 1 ELSE 0 END)/COUNT(sscore) ,2) '[100-85]百分比',
ROUND( SUM(CASE WHEN sscore>70 AND sscore<85 THEN 1 ELSE 0 END)/COUNT(sscore) ,2)'[85-70]百分比',
ROUND( SUM(CASE WHEN sscore>60 AND sscore<=70 THEN 1 ELSE 0 END)/COUNT(sscore) ,2)'[70-60]百分比',
ROUND( SUM(CASE WHEN sscore<=60 AND sscore>0 THEN 1 ELSE 0 END)/COUNT(sscore) ,2)'[0-60]百分比'
FROM score,course WHERE score.cid=course.cid
GROUP BY score.cid;
SELECT cid,
SUM(CASE WHEN rank_cid=1 THEN sscore ELSE NULL END) 'first',
SUM(CASE WHEN rank_cid=2 THEN sscore ELSE NULL END) '2nd',
SUM(CASE WHEN rank_cid=3 THEN sscore ELSE NULL END) '3rd'
FROM (
SELECT cid,sid,sscore,
ROW_NUMBER() OVER (PARTITION BY cid ORDER BY sscore DESC) rank_cid
FROM score
) cc
GROUP BY cid;
SELECT cid,COUNT(sid)
FROM score
GROUP BY cid;
SELECT st.sid,st.sname
FROM student st,score sc
WHERE st.sid=sc.sid
GROUP BY sc.sid HAVING(COUNT(*)=2);
SELECT COUNT(st1.ssex) "男生人数",COUNT(st2.sid)-COUNT(st1.ssex) "女生人数"
FROM student st1,student st2
WHERE st1.ssex='男';
SELECT ssex '性别',COUNT(*) '总人数'
FROM student
GROUP BY ssex;
SELECT *
FROM student
WHERE sname LIKE'%风%';
SELECT sname,COUNT(*) AS NUM
FROM student
GROUP BY sname HAVING (COUNT(student.sid)>1);
SELECT *
FROM student
WHERE DATE_FORMAT(sbirth,'%Y')LIKE'1990';
SELECT *
FROM student
WHERE YEAR(sbirth)='1990';
SELECT cid,AVG(sscore)
FROM score
GROUP BY cid
ORDER BY AVG(sscore) DESC,cid ASC;
SELECT st.sid,st.sname,ROUND( AVG(sscore),2) '平均成绩'
FROM student st ,score sc
WHERE st.sid=sc.sid
GROUP BY sc.sid HAVING(AVG(sscore)>85);
SELECT sname,'数学',sc2.sscore
FROM student st,(SELECT *
FROM score
WHERE cid=(SELECT cid
FROM course
WHERE cname='数学')
AND sscore<60) sc2
WHERE st.sid=sc2.sid ;
SELECT st.sid,co.cname,sc.sscore
FROM student st , score sc , course co
WHERE st.sid=sc.sid AND sc.cid=co.cid;
SELECT sname,cname,sscore
FROM score s
JOIN course c ON s.cid=c.cid
JOIN Student stu ON s.sid=stu.sid
WHERE sscore>=70;
SELECT DISTINCT(co.cname)
FROM course co JOIN score sc
ON co.cid=sc.cid
WHERE sc.sscore<60;
SELECT st.sid,sname
FROM student st
JOIN score sc ON st.sid=sc.sid
WHERE cid='01' AND sscore>=80;
SELECT cid,COUNT(*) '人数'
FROM score
GROUP BY cid;
SELECT st.*,c.cid,sscore
FROM teacher t JOIN course c ON t.tid=c.tid
JOIN score s ON s.cid = c.cid
JOIN student st ON st.sid = s.sid
WHERE t.tname='张三'
ORDER BY sscore DESC
LIMIT 1;
SELECT DISTINCT a.sid,a.cid,a.sscore
FROM Score a,Score b
WHERE a.cid<>b.cid AND a.sscore=b.sscore;
SELECT t1.*
FROM(SELECT cname,
RANK() OVER(PARTITION BY s.cid ORDER BY sscore DESC) rs,
stu.*
FROM score s
JOIN student stu ON s.sid= stu.sid
JOIN Course c ON c.cid=s.cid
)t1
WHERE t1.rs <=2;
SELECT cid,COUNT(*)
FROM score
GROUP BY cid HAVING(COUNT(*)>5)
ORDER BY COUNT(*) DESC,cid ASC;
SELECT sid
FROM score
GROUP BY sid
HAVING COUNT(*)>=2;
SELECT *
FROM student
WHERE sid IN(
SELECT sid
FROM score
GROUP BY sid
HAVING COUNT(*)=(
SELECT COUNT(*)
FROM course
)
);
SELECT sname,sbirth,
(DATE_FORMAT(NOW(),'%Y') - DATE_FORMAT(sbirth,'%Y') -
(CASE WHEN DATE_FORMAT(NOW(),'%m%d') > DATE_FORMAT(sbirth,'%m%d')
THEN 0 ELSE 1 END)
) AS age
FROM student;
SELECT * FROM Student
WHERE WEEKOFYEAR(CONCAT(
DATE_FORMAT(CURRENT_DATE,'%Y'),
'-',DATE_FORMAT(Sbirth,'%m-%d')
)
) = WEEKOFYEAR(CURRENT_DATE);
SELECT * FROM Student
WHERE WEEKOFYEAR(CONCAT(
DATE_FORMAT(CURRENT_DATE,'%Y'),
'-',DATE_FORMAT(Sbirth,'%m-%d')
)
) = WEEKOFYEAR(CURRENT_DATE)+1;
SELECT *
FROM student
WHERE MONTH(sbirth)=MONTH(DATE(NOW()));
SELECT *
FROM student
WHERE MONTH(sbirth)=(MONTH(DATE(NOW()))+1);