「黑馬程序員」關於sql語句的練習

大家都知道,在面試中有一個重要環節就是筆試,而筆試中有個重要的環節,就是sql語句!

可見sql語句,是我們找工作當中非常重要的知識點,很多小夥伴面對眾多的sql不知道如何選擇!

那麼好!

福利來了,大家找工作前,把這個sql語句練好,就沒問題了!

第一:創建表和表關係,並插入數據

注意:這裡的數據是少量的數據,大家可以多加一些,導入你最喜歡的三國人物數據就ok

--班級表--
CREATE TABLE class(
cid INT NOT NULL,
caption VARCHAR(10),
PRIMARY KEY(cid)
);
INSERT INTO class VALUES(1,"三年二班"),(2,"一年三班"),(3,"三年一班");
--老師表--
CREATE TABLE teacher(
tid INT NOT NULL,
tname VARCHAR(10),
PRIMARY KEY(tid)
);
INSERT INTO teacher VALUES(1,"曹老師"),(2,"劉老師"),(3,"孫老師");
--學生表--
CREATE TABLE student(
sid INT NOT NULL,
sname VARCHAR(10),
gender VARCHAR(10),
class_id INT,
PRIMARY KEY(sid),
FOREIGN KEY(class_id) REFERENCES class(cid)
);
INSERT INTO student VALUES(1,"大喬","女",1),(2,"小喬","女",1),(3,"關羽","男",2);

--課程--
CREATE TABLE course(
cid INT NOT NULL,
cname VARCHAR(10),
teacher_id INT,
PRIMARY KEY(cid),
FOREIGN KEY(teacher_id) REFERENCES teacher(tid)
);
INSERT INTO course VALUES(1,"騎馬",1),(2,"射箭",1),(3,"畫畫",2);
--成績表--
CREATE TABLE score(
sid INT NOT NULL,
student_id INT,
corse_id INT,
number INT,
PRIMARY KEY(sid),
FOREIGN KEY(student_id) REFERENCES student(sid),
FOREIGN KEY(corse_id) REFERENCES course(cid)
);
INSERT INTO score VALUES (1,1,1,60),(2,1,2,59),(3,2,2,100);

第二:按照如下條件,進行操作

1、自行創建測試數據

2、查詢“生物”課程比“物理”課程成績高的所有學生的學號;

3、查詢平均成績大於60分的同學的學號和平均成績;

4、查詢所有同學的學號、姓名、選課數、總成績;

5、查詢姓“李”的老師的個數;

6、查詢沒學過“葉平”老師課的同學的學號、姓名;

7、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;

8、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;

9、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;

10、查詢有課程成績小於60分的同學的學號、姓名;

11、查詢沒有學全所有課的同學的學號、姓名;

12、查詢至少有一門課與學號為“001”的同學所學相同的同學的學號和姓名;

13、查詢至少學過學號為“001”同學所選課程中任意一門課的其他同學學號和姓名;

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

15、刪除學習“葉平”老師課的SC表記錄;

16、向SC表中插入一些記錄,這些記錄要求符合以下條件:①沒有上過編號“002”課程的同學學號;②插入“002”號課程的平均成績;

17、按平均成績從低到高顯示所有學生的“語文”、“數學”、“英語”三門的課程成績,按如下形式顯示: 學生ID,語文,數學,英語,有效課程數,有效平均分;

18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;

19、按各科平均成績從低到高和及格率的百分數從高到低順序;

20、課程平均分從高到低顯示(現實任課老師);

21、查詢各科成績前三名的記錄:(不考慮成績並列情況)

22、查詢每門課程被選修的學生數;

23、查詢出只選修了一門課程的全部學生的學號和姓名;

24、查詢男生、女生的人數;

25、查詢姓“張”的學生名單;

26、查詢同名同姓學生名單,並統計同名人數;

27、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;

28、查詢平均成績大於85的所有學生的學號、姓名和平均成績;

29、查詢課程名稱為“數學”,且分數低於60的學生姓名和分數;

30、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;

31、求選了課程的學生人數

32、查詢選修“楊豔”老師所授課程的學生中,成績最高的學生姓名及其成績;

33、查詢各個課程及相應的選修人數;

34、查詢不同課程但成績相同的學生的學號、課程號、學生成績;

35、查詢每門課程成績最好的前兩名;

36、檢索至少選修兩門課程的學生學號;

37、查詢全部學生都選修的課程的課程號和課程名;

38、查詢沒學過“葉平”老師講授的任一門課程的學生姓名;

39、查詢兩門以上不及格課程的同學的學號及其平均成績;

40、檢索“004”課程分數小於60,按分數降序排列的同學學號;

41、刪除“002”同學的“001”課程的成績;

第三:先自行完成上面的題目,然後再對比如下的sql,進行檢查!~

1、自行創建測試數據

2、查詢“生物”課程比“物理”課程成績高的所有學生的學號;
SELECT * FROM
(SELECT score.student_id,course.cname,score.num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="生物") AS A
INNER JOIN
(SELECT score.student_id,course.cname,score.num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="物理") AS B
on A.student_id = B.student_id WHERE A.num > B.num;

3、查詢平均成績大於60分的同學的學號和平均成績;
SELECT B.student_id,student.sname,B.s_num FROM (SELECT student_id,avg(num) AS s_num from score GROUP BY student_id HAVING s_num>60) as B
LEFT JOIN student on B.student_id = student.sid; 取前三: %ORDER BY s_num desc LIMIT 3;

4、查詢所有同學的學號、姓名、選課數、總成績;
SELECT score.student_id,student.sname,COUNT(score.course_id) AS courses,SUM(num) as T_Score FROM score
LEFT JOIN student on score.student_id=student.sid GROUP BY score.student_id;

5、查詢姓“李”的老師的個數;
SELECT * from teacher WHERE tname like "李%";

6、查詢沒學過“李平”老師課的同學的學號、姓名;
SELECT student.sid,student.sname FROM student WHERE student.sid NOT IN (
SELECT score.student_id FROM score LEFT JOIN course ON score.course_id = course.cid WHERE score.course_id IN (
SELECT course.cid FROM course LEFT JOIN teacher ON course.teacher_id = teacher.tid WHERE teacher.tname LIKE "李平%") GROUP BY score.student_id)


7、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
SELECT B.sid,B.sname FROM(
SELECTstudent.sid,score.course_id,student.sname FROM score
LEFT JOIN student ON score.student_id = student.sid WHERE score.course_id BETWEEN 1 AND 2) AS B
GROUP BY B.sid HAVING COUNT(B.course_id)=2;

8、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
SELECT student.sid,student.sname FROM score LEFT JOIN student ON score.student_id=student.sid WHERE score.course_id in
(SELECT course.cid FROM course LEFT JOIN teacher on course.teacher_id=teacher.tid WHERE tname LIKE "李平%")
GROUP BY student.sid HAVING COUNT(student_id)=2;

9、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;
SELECT A.sid,A.sname,A.num as score_2,B.num as score_1 FROM
(SELECT student.sid,student.sname,score.num FROM score LEFT JOIN student on score.student_id=student.sid WHERE score.course_id=2) AS A
INNER JOIN
(SELECT student.sid,student.sname,score.num FROM score LEFT JOIN student on score.student_id=student.sid WHERE score.course_id=1) AS B
ON A.sid = B.sid WHERE A.num<b.num>
10、查詢有課程成績小於60分的同學的學號、姓名;
SELECT student.sid,student.sname FROM student WHERE sid IN
(SELECT score.student_id FROM score WHERE score.num<60 GROUP BY student_id);

11、查詢沒有學全所有課的同學的學號、姓名;
SELECT student.sid,student.sname FROM student WHERE sid in
(SELECT student_id FROM score GROUP BY student_id HAVING count(course_id)!=(SELECT COUNT(cid) FROM course));

12、查詢至少有一門課與學號為“001”的同學所學相同的同學的學號和姓名;
SELECT student.sid,student.sname FROM student where student.sid in
(SELECT score.student_id FROM score WHERE course_id in
(SELECT score.course_id FROM score WHERE student_id=1) and student_id !=1 GROUP BY student_id);

13、查詢至少學過學號為“001”同學所選課程中任意一門課的其他同學學號和姓名;

SELECT student.sid,student.sname FROM student where student.sid in
(SELECT score.student_id FROM score WHERE course_id in
(SELECT score.course_id FROM score WHERE student_id=1) and student_id !=1 GROUP BY student_id
having count(1) =(SELECT count(score.course_id) FROM score WHERE student_id=1));

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

SELECT sid AS 學號,sname AS 姓名 FROM student WHERE sid IN(
SELECT student_id FROM score WHERE student_id IN (
SELECT student_id FROM score WHERE student_id!=2 GROUP BY student_id
HAVING COUNT(1)=(SELECT COUNT(1) FROM score WHERE student_id=2))
AND course_id in (SELECT course_id FROM score WHERE student_id=2)
GROUP BY student_id HAVING COUNT(1)=(SELECT COUNT(1) FROM score WHERE student_id=2))

15、刪除學習“葉平”老師課的SC表記錄;
DELETE FROM score WHERE course_id IN
(SELECT cid FROM course LEFT JOIN teacher on course.teacher_id=teacher.tid WHERE tname="李平老師")

16、向SC表中插入一些記錄,這些記錄要求符合以下條件:①沒有上過編號“002”課程的同學學號;②插入“002”號課程的平均成績;
1、INSERT into score(student_id,course_id,num)
SELECT student_id,2,(SELECT AVG(num) FROM score WHERE course_id=2) FROM score WHERE course_id!=2 group by student_id

--2、SELECT AVG(num) FROM score WHERE course_id=2 --

17、按平均成績從低到高顯示所有學生的“語文”、“數學”、“英語”三門的課程成績,按如下形式顯示: 學生ID,語文,數學,英語,有效課程數,有效平均分;
SELECT student_id AS 學生ID,
(SELECT num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="語文" AND student_id=s1.student_id) AS 語文,
(SELECT num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="數學" AND student_id=s1.student_id) AS 數學,
(SELECT num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="英語" AND student_id=s1.student_id) AS 英語
FROM score as s1 GROUP BY student_id;

18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;
SELECT score.course_id AS 課程ID,course.cname as 課程名,MAX(num) as 最高分,MIN(num) as 最低分 FROM score
LEFT JOIN course ON score.course_id=course.cid GROUP BY course_id;


19、按各科平均成績從低到高和及格率的百分數從高到低順序;

平均分:
SELECT score.course_id AS 課程ID,course.cname as 課程名,AVG(num) AS 平均分 FROM score
LEFT JOIN course ON score.course_id=course.cid GROUP BY score.course_id ORDER BY 平均分 ASC;
及格率:
SELECT A.cid,A.cname,ROUND(B.s/A.ss*100,1)+% AS 及格率 FROM
(SELECT cid,cname,COUNT(course_id) AS ss FROM score LEFT JOIN course ON score.course_id=course.cid GROUP BY course_id) as A
INNER JOIN
(SELECT course_id,COUNT(num) as s FROM score WHERE score.num>60 GROUP BY course_id) as B ON A.cid=B.course_id ORDER BY 及格率 DESC;
整合:
SELECT x.課程ID,x.課程名,x.平均分,xx.及格率 FROM
(SELECT score.course_id AS 課程ID,course.cname as 課程名,AVG(num) AS 平均分 FROM score
LEFT JOIN course ON score.course_id=course.cid GROUP BY score.course_id ORDER BY 平均分 ASC) AS x
LEFT JOIN
(SELECT A.cid,A.cname,ROUND(B.s/A.ss*100,1) AS 及格率 FROM
(SELECT cid,cname,COUNT(course_id) AS ss FROM score LEFT JOIN course ON score.course_id=course.cid GROUP BY course_id) as A
INNER JOIN
(SELECT course_id,COUNT(num) as s FROM score WHERE score.num>60 GROUP BY course_id) as B ON A.cid=B.course_id ORDER BY 及格率 DESC) AS xx
ON x.課程ID=xx.cid

標準:
SELECT course_id,AVG(num) AS 平均分,ROUND(sum(CASE WHEN num<60 then 0 ELSE 1 END)/sum(1)*100,1) AS 及格率
FROM score GROUP BY course_id ORDER BY 平均分 ASC,及格率 DESC;


20、課程平均分從高到低顯示(現實任課老師);
SELECT course.cname,teacher.tname,xxx.平均分 FROM course
LEFT JOIN teacher ON course.teacher_id=teacher.tid

LEFT JOIN (SELECT course_id,AVG(num) AS 平均分 FROM score GROUP BY course_id) AS xxx ON xxx.course_id=course.cid
ORDER BY xxx.平均分 DESC

21、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT s1.cid AS 課程ID,s1.cname AS 課程,
(SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 0,1) AS 第一,
(SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 1,1) AS 第二,
(SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 2,1) AS 第三
FROM course AS s1

22、查詢每門課程被選修的學生數;
SELECT course.cid AS 課程ID,course.cname AS 課程名,COUNT(1) AS 學生數 FROM score
LEFT JOIN course ON score.course_id=course.cid GROUP BY score.course_id;
23、查詢出只選修了一門課程的全部學生的學號和姓名;
SELECT student.sid AS 學號,student.sname AS 姓名 FROM student
WHERE sid IN (SELECT student_id FROM score GROUP BY student_id HAVING count(1)=1)

24、查詢男生、女生的人數;
SELECT gender AS 性別,COUNT(1) AS 人數 FROM student GROUP BY gender;

25、查詢姓“張”的學生名單;
SELECT * FROM student WHERE sname LIKE "張%"

26、查詢同名同姓學生名單,並統計同名人數;
SELECT sname As 姓名,COUNT(1) AS 人數 FROM student GROUP BY sname;

27、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;
SELECT
course.cid AS 課程ID,
course.cname AS 課程名,
AVG(IF(ISNULL(num),0,score.num)) AS 平均分

FROM score LEFT JOIN course ON score.course_id = course.cid
GROUP BY score.course_id ORDER BY 平均分 ASC,課程ID DESC;

28、查詢平均成績大於85的所有學生的學號、姓名和平均成績;
SELECT student.sid AS 學號,student.sname AS 姓名,AVG(if(isnull(num),0,score.num)) AS 平均分
FROM score LEFT JOIN student ON score.student_id=student.sid
GROUP BY score.student_id HAVING 平均分>85;

29、查詢課程名稱為“數學”,且分數低於60的學生姓名和分數;
SELECT student.sid AS 學號,student.sname AS 姓名,score.num AS 成績 FROM score
LEFT JOIN course ON score.course_id=course.cid
LEFT JOIN student ON score.student_id= student.sid
WHERE course.cname="數學" AND score.num<60;

30、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;
SELECT student.sid AS 學號,student.sname AS 姓名 FROM student WHERE sid IN
(SELECT student_id FROM score WHERE score.course_id =3 AND num > 80)

31、求選了課程的學生人數
SELECT COUNT(A.student_id) AS 總人數
FROM (SELECT student_id FROM score GROUP BY student_id) AS A

SELECT COUNT(DISTINCT student_id) AS 總人數 FROM score;

32、查詢選修“楊豔”老師(這個老師沒有,就以張磊老師舉例)所授課程的學生中,成績最高的學生姓名及其成績;
SELECT student.sid AS 學號,student.sname AS 姓名,num AS 成績 FROM score
LEFT JOIN course ON score.course_id=course.cid
LEFT JOIN student ON score.student_id=student.sid
LEFT JOIN teacher ON course.teacher_id=teacher.tid
WHERE teacher.tname = "張磊老師" ORDER BY num DESC LIMIT 1;

33、查詢各個課程及相應的選修人數;

SELECT course_id AS ID,course.cname AS 課程,count(1) AS 人數 FROM score
LEFT JOIN course ON score.course_id=course.cid GROUP BY course_id
34、查詢不同課程但成績相同的學生的學號、課程號、學生成績;
SELECT DISTINCT s1.student_id,s1.course_id,s1.num FROM score AS s1,score AS s2
WHERE s1.student_id != s2.student_id AND s1.course_id!=s2.course_id AND s1.num=s2.num

35、查詢每門課程成績最好的前兩名;
SELECT cid AS 課程ID,cname AS 課程,
(SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 0,1) AS 第一,
(SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 1,1) AS 第二
FROM course AS s1

36、檢索至少選修兩門課程的學生學號;
SELECT student_id FROM score GROUP BY student_id HAVING count(course_id)>=2

37、查詢全部學生都選修的課程的課程號和課程名;
SELECT course.cid AS 課程號,course.cname AS 課程名 FROM score
LEFT JOIN course ON score.course_id=course.cid GROUP BY score.course_id
HAVING COUNT(student_id)=(SELECT COUNT(sid) FROM student)

38、查詢沒學過“李平”老師講授的任一門課程的學生姓名;
SELECT student.sid,student.sname FROM student
WHERE student.sid not IN (SELECT student_id FROM score
WHERE course_id IN(SELECT cid FROM course
LEFT JOIN teacher ON course.teacher_id=teacher.tid
WHERE teacher.tname="李平老師" ) GROUP BY student_id)

39、查詢兩門以上不及格課程的同學的學號及其平均成績;
SELECT score.student_id AS 學號,student.sname AS 姓名,
(SELECT AVG(if(ISNULL(A.num),0,A.num)) FROM score AS A
WHERE A.student_id IN (SELECT student_id FROM score WHERE num<60
GROUP BY student_id HAVING COUNT(1)>=2)) AS 平均成績
FROM score LEFT JOIN student ON score.student_id=student.sid
WHERE num<60 GROUP BY student_id HAVING COUNT(1)>2


標準:
SELECT student_id AS 學號,sname AS 姓名,AVG(num) AS 平均成績 FROM score
LEFT JOIN student ON score.student_id=student.sid
WHERE student_id IN (SELECT student_id FROM score
WHERE num<60 GROUP BY student_id HAVING COUNT(1)>=2)
GROUP BY student_id

40、檢索“004”課程分數小於60,按分數降序排列的同學學號;
SELECT student_id,num FROM score
WHERE score.course_id=4 AND num <60 ORDER BY num ASC

41、刪除“002”同學的“001”課程的成績;
delete from score where student_id=2 and corse_id=1;
/<b.num>
「黑馬程序員」關於sql語句的練習


分享到:


相關文章: