mysql的sql面試題(1)


需要數據庫表1.學生表

Student(SID,Sname,Sage,Ssex) --SID 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別

2.課程表

Course(CID,Cname,TID) --CID --課程編號,Cname 課程名稱,TID 教師編號

3.教師表

Teacher(TID,Tname) --TID 教師編號,Tname 教師姓名

4.成績表

SC(SID,CID,score) --SID 學生編號,CID 課程編號,score 分數

添加測試數據1.學生表

create table Student(SID varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10));

insert into Student values('01' , '趙雷' , '1990-01-01' , '男');

insert into Student values('02' , '錢電' , '1990-12-21' , '男');

insert into Student values('03' , '孫風' , '1990-05-20' , '男');

insert into Student values('04' , '李雲' , '1990-08-06' , '男');

insert into Student values('05' , '周梅' , '1991-12-01' , '女');

insert into Student values('06' , '吳蘭' , '1992-03-01' , '女');

insert into Student values('07' , '鄭竹' , '1989-07-01' , '女');

insert into Student values('08' , '王菊' , '1990-01-20' , '女');

2.課程表

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');

3.教師表

create table Teacher(TID varchar(10),Tname nvarchar(10));

insert into Teacher values('01' , '張三');

insert into Teacher values('02' , '李四');

insert into Teacher values('03' , '王五');

4.成績表

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"課程成績高的學生的信息及課程分數

SELECT
m.sid,
sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,
sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,
n.*
FROM
sc m
left join student n on m.sid=n.sid
GROUP BY
m.sid
HAVING
a >b

學習心得:

一開始以為傳統的sql可以實現,比如子查詢之類的,但是發現不能比較前后兩列的數據,后來想把同一個學生的成績在一列展示,在網上找到一個解決方法

select stuName,
sum(decode(courseName,'語文',score,null)) as chineseScore,
sum(decode(courseName,'數學',score,null)) as mathScore,
sum(decode(courseName,'英語',score,null)) as englishScore
from stuScore group by stuName;
但是不能實現,報錯,具體的原因沒有找到

最后找到了一個可以實現的方法,先分組,然后用case...when...then...end,把同一個sid的數據在一行展示,這樣就可以用having進行判斷。

備注:

還有一種寫法

SELECT
a.SID ,a.score
FROM
( SELECT SID, score FROM sc WHERE cid = '01' ) a,
( SELECT SID, score FROM sc WHERE cid = '02' ) b
WHERE
a.score > b.score
AND a.SID = b.SID;

2.查詢同時存在"01"課程和"02"課程的情況

SELECT
m.sid,
sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,
sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,
n.*
FROM
sc m
LEFT JOIN student n ON m.sid = n.sid
GROUP BY
m.sid
HAVING
a IS NOT NULL
AND b IS NOT NULL

3.查詢同時存在"01"課程和"02"課程的情況和存在"01"課程但可能不存在"02"課程的情況(不存在時顯示為null)(以下存在相同內容時不再解釋)

SELECT
m.sid,
sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,
sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,
n.*
FROM
sc m
LEFT JOIN student n ON m.sid = n.sid
GROUP BY
m.sid
HAVING
( a IS NOT NULL AND b IS NOT NULL )
OR ( a IS NOT NULL AND b IS NULL )

4.查詢"01"課程比"02"課程成績低的學生的信息及課程分數
SELECT
m.sid,
sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,
sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,
n.*
FROM
sc m
LEFT JOIN student n ON m.sid = n.sid
GROUP BY
m.sid
HAVING
a <b

5.查詢同時存在"01"課程和"02"課程的情況和不存在"01"課程但存在"02"課程的情況
SELECT
m.sid,
sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,
sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,
n.*
FROM
sc m
LEFT JOIN student n ON m.sid = n.sid
GROUP BY
m.sid
HAVING
( a IS NOT NULL AND b IS NOT NULL )
OR ( a IS NULL AND b IS NOT NULL )

6.查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績

SELECT
sid,
a,
b,
c,
( a + b + c ) / 3
FROM
(
SELECT
m.sid,
sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,
sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,
sum( CASE m.cid WHEN '03' THEN m.score END ) AS c
FROM
sc m
LEFT JOIN student n ON m.sid = n.sid
GROUP BY
m.sid
) w
GROUP BY
sid
HAVING
( a + b + c ) / 3 >= 60

7.查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績
SELECT
sid,
a,
b,
c,
( a + b + c ) / 3
FROM
(
SELECT
m.sid,
sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,
sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,
sum( CASE m.cid WHEN '03' THEN m.score END ) AS c
FROM
sc m
LEFT JOIN student n ON m.sid = n.sid
GROUP BY
m.sid
) w
GROUP BY
sid
HAVING
( a + b + c ) / 3 < 60

學習心得:

主查詢如果想用子查詢得到的字段,必須在主查詢select里輸出,否則where條件或者having就不能用子查詢得到的字段

8.查詢在sc表存在成績的學生信息的SQL語句
SELECT
m.sid,
sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,
sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,
sum( CASE m.cid WHEN '03' THEN m.score END ) AS c,
n.*
FROM
sc m
LEFT JOIN student n ON m.sid = n.sid
GROUP BY
m.sid

9.查詢在sc表中不存在成績的學生信息的SQL語句
SELECT
*
FROM
student
WHERE
sid NOT IN ( SELECT sid FROM sc GROUP BY sid )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM