MySQL--關於MySQL的那些練習題

以前聯繫了一些MySQL的查詢相關知識,如今補充做爲一個記錄,省得本身忘記。sql

致謝博主:https://blog.csdn.net/dehu_zhou/article/details/52881587函數

#建表語句與測試數據
--建立測試數據
create table Student(
S varchar(10),
Sname varchar(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' , '女');
 
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);

create table Course(
Cid varchar(10),
Cname varchar(10),
Tid varchar(10)
);
 
insert into Course values('01' , '語文' , '02');
insert into Course values('02' , '數學' , '01');
insert into Course values('03' , '英語' , '03');
 
create table Teacher(
Tid varchar(10),
Tname varchar(10)
);
 
insert into Teacher values('01' , '張三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');

  練習題:測試

    題一:查詢"01"課程比"02"課程成績高的學生的信息及課程分數。  優化

--分析過程:
--基表:學生的信息(Student),課程分數(SC) --條件: #1.成績本身比本身; #2.查詢學生的信息; #方法1:使用內鏈接,並做爲子查詢條件進行查詢 SELECT t2.*, t1.`01分數`, t1.`02分數` FROM ( SELECT a.Sid, a.score AS '01分數', b.score AS '02分數' FROM SC a INNER JOIN SC b ON a.Sid = b.Sid and a.Cid='01' and b.Cid='02' WHERE a.score > b.score ) t1, Student t2 where t1.Sid=t2.Sid; #方法2:使用三層內鏈接連續使用 #考點:三層嵌套內鏈接 SELECT a.*, b.score AS '01分數', c.score AS '02分數' FROM Student a INNER JOIN SC b ON a.Sid = b.Sid AND b.Cid = '01' INNER JOIN SC c ON a.Sid = c.Sid AND c.Cid = '02' WHERE b.score > c.score;

    二、查詢"01"課程比"02"課程成績低的學生的信息及課程分數spa

#與題目1一致,修改爲績比較條件

SELECT
	a.*, b.score AS '01分數',
	c.score AS '02分數'
FROM
	Student a
INNER JOIN SC b ON a.Sid = b.Sid
AND b.Cid = '01'
INNER JOIN SC c ON a.Sid = c.Sid
AND c.Cid = '02'
WHERE
	b.score < c.score;

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

#考點,group by 子句以及having的條件刪選

SELECT
	a.*, b.avg_score
FROM
	Student a,
	(
		SELECT
			t.Sid,
			round(avg(t.score), 2) AS avg_score
		FROM
			SC t
		GROUP BY
			t.Sid
		HAVING
			avg(t.score) > 60
	) b
WHERE
	a.Sid = b.Sid;

#+外鏈接版本
SELECT
	t1.*,t2.avg_score
FROM
	(
		SELECT
			t.Sid,
			round(avg(t.score), 2) AS avg_score
		FROM
			SC t
		GROUP BY
			t.Sid
		HAVING
			avg(t.score) > 60
	) t2
LEFT JOIN Student t1 ON t2.Sid = t1.Sid;


#外鏈接凝練版本
SELECT
	t1.*, round(avg(t.score), 2) AS avg_score
FROM
	SC t
RIGHT JOIN Student t1 ON t.Sid = t1.Sid
GROUP BY
	t.Sid
HAVING
	avg(t.score) > 60;

    四、查詢平均成績小於60分的同窗的學生編號和學生姓名和平均成績code

SELECT
	t1.*, round(avg(t.score), 2) AS avg_score
FROM
	SC t
RIGHT JOIN Student t1 ON t.Sid = t1.Sid
GROUP BY
	t.Sid
HAVING
	avg(t.score) < 60;

    五、查詢全部同窗的學生編號、學生姓名、選課總數、全部課程的總成績  blog

SELECT
	b.Sname,
	a.Sid,
	count(DISTINCT a.Cid) as '選課總數',
	sum(a.score) as '總成績'
FROM
	SC a
LEFT JOIN Student b ON a.Sid = b.Sid
GROUP BY
	a.Sid;

    六、查詢"李"姓老師的數量 排序

select count(*) from Teacher a where a.Tname like '李%';

    七、查詢學過"張三"老師授課的同窗的信息 ci

  

SELECT
	a.Tname,
	b.Cid,
	d.*
FROM
	Teacher a,
	Course b,
	SC c,
	Student d
WHERE
	a.Tname = '張三'
AND a.Tid = b.Tid
AND b.Cid = c.Cid
AND c.Sid = d.Sid;

#方法2:使用三層內鏈接連續使用
SELECT
	a.*
FROM
	Student a
INNER JOIN SC b ON a.Sid = b.Sid
INNER JOIN Course c ON b.Cid = c.Cid
INNER JOIN Teacher d ON c.Tid = d.Tid
WHERE
	d.Tname = '張三'
GROUP BY
	1,2,3,4;  #按照查詢(select後面的)的1,2,3,4字段來分組


#方法3:方法2基礎上補充
SELECT
	a.*
FROM
	Student a
LEFT JOIN (
	SELECT
		a.*
	FROM
		Student a
	INNER JOIN SC b ON a.Sid = b.Sid
	INNER JOIN Course c ON b.Cid = c.Cid
	INNER JOIN Teacher d ON c.Tid = d.Tid
	WHERE
		d.Tname = '張三'
	GROUP BY
		1,2,3,4
) t ON a.Sid = t.Sid
WHERE
	t.Sid IS NOT NULL;

    八、查詢沒學過"張三"老師授課的同窗的信息 

#方法1:直接對原來學過張三老師課程的學生信息進行not in

SELECT
	*
FROM
	Student t
WHERE
	t.Sid NOT IN (
		SELECT
			d.Sid
		FROM
			Teacher a,
			Course b,
			SC c,
			Student d
		WHERE
			a.Tname = '張三'
		AND a.Tid = b.Tid
		AND b.Cid = c.Cid
		AND c.Sid = d.Sid
	);
#NOT IN 與 NOT EXISTS的用法區別
SELECT
	*
FROM
	Student t
WHERE
	 not EXISTS (
		SELECT
			*			#此處返回的是整個結果集,若是單挑sid,則返回的結果與預期結果不一致
		FROM
			Teacher a,
			Course b,
			SC c,
			Student d
		WHERE
			a.Tname = '張三'
		AND a.Tid = b.Tid
		AND b.Cid = c.Cid
		AND c.Sid = d.Sid
		AND d.Sid = t.Sid   #此處爲結果集的判斷
	);

  九、查詢學過編號爲"01"而且也學過編號爲"02"的課程的同窗的信息

SELECT
	c.*,a.score as '01分數',b.score as '02分數'
FROM
	Student c
INNER JOIN SC a ON c.Sid = a.Sid
INNER JOIN SC b ON a.Sid = b.Sid
AND a.Cid = '01'
AND b.Cid = '02';

  十、查詢學過編號爲"01"可是沒有學過編號爲"02"的課程的同窗的信息 

#重要,我沒有作出來
##方法:連續的左鏈接,篩選出差別結果
SELECT
	*
FROM
	Student a
LEFT JOIN SC b ON a.Sid = b.Sid
AND b.Cid = '01'
LEFT JOIN SC c ON a.Sid = c.Sid
AND c.Cid = '02'
WHERE
	b.Cid = '01'
AND c.Cid IS NULL;

  十一、查詢沒有學全全部課程的同窗的信息 

SELECT
	*
FROM
	Student b
LEFT JOIN SC a ON a.Sid = b.Sid
GROUP BY
	a.Sid
HAVING
	count(a.cid) < 3;

#完善方法
SELECT
	a.*
FROM
	Student a
LEFT JOIN SC b ON a.Sid = b.Sid
LEFT JOIN (
	SELECT
		COUNT(1) anum
	FROM
		Course
) c ON 1 = 1  #經過子查詢和恆真條件篩選
GROUP BY
	1, 2, 3, 4
HAVING
	MAX(c.anum) > COUNT(b.Cid);

    十二、查詢至少有一門課與學號爲"01"的同窗所學相同的同窗的信息

SELECT DISTINCT
	b.*
FROM
	Student b
LEFT JOIN SC c ON b.Sid = c.Sid
AND c.Cid IN (
	SELECT
		a.Cid
	FROM
		SC a
	WHERE
		a.Sid = '01'
);

#方法2:
SELECT
	a.*
FROM
	Student a
INNER JOIN SC b ON a.Sid = b.Sid
WHERE
	EXISTS (
		SELECT
			1    
		FROM
			SC
		WHERE
			Sid = '01'
		AND Cid = b.Cid
	)
GROUP BY
	1, 2, 3, 4;

#方法3::經過組裝cid字段比對進行篩選
#重點:GROUP_CONCAT(cid ORDER BY cid) 函數的用法
#1.須要配合group by 子句使用
#2.內部字段的排序的用法

SELECT DISTINCT
	t.*
FROM
	Student t
INNER JOIN SC t1 ON t.Sid = t1.Sid
WHERE
	t.Sid IN (
		SELECT
			t3.Sid
		FROM
			(
				SELECT
					sid,
					GROUP_CONCAT(cid ORDER BY cid) AS cid_list
				FROM
					SC a
				WHERE
					a.sid = '01'
				GROUP BY
					sid
			) t2
		RIGHT JOIN (
			SELECT
				sid,
				GROUP_CONCAT(cid ORDER BY cid) AS cid_list
			FROM
				SC a
			GROUP BY
				sid
		) t3 ON t2.cid_list = t3.cid_list
		WHERE
			t2.sid IS NOT NULL
	);

    1四、查詢沒學過"張三"老師講授的任一門課程的學生姓名 

SELECT
	t.*, t1.Tid
FROM
	Student t
LEFT JOIN (
	SELECT
		a.*, d.Tid
	FROM
		Student a
	LEFT JOIN SC b ON a.sid = b.sid
	LEFT JOIN Course c ON c.Cid = b.Cid
	LEFT JOIN Teacher d ON c.Tid = d.Tid
	AND d.Tname = '張三'
	WHERE
		d.Tid IS NOT NULL
) t1 ON t.Sid = t1.sid
WHERE
	t1.tid IS NULL;

    1五、查詢兩門及其以上不及格課程的同窗的學號,姓名及其平均成績 

SELECT
	*
FROM
	Student t
LEFT JOIN (
	SELECT
		sid,
		round(avg(score), 1) AS avg_score
	FROM
		SC a
	WHERE
		a.score < 60
	GROUP BY
		sid
	HAVING
		count(*) > 1
) t1 ON t.Sid = t1.sid
WHERE
	t1.avg_score IS NOT NULL;
#優化
SELECT
	a.Sid       ,
	a.Sname       ,
	round(avg(score), 1) AS avg_score
FROM
	Student a
INNER JOIN SC b ON a.Sid = b.Sid
GROUP BY
	1,
	2
HAVING
	SUM(
		CASE
		WHEN b.Score >= 60 THEN
			0
		ELSE
			1
		END
	) >= 2;

    1六、檢索"01"課程分數小於60,按分數降序排列的學生信息

SELECT
	a.*
FROM
	Student a
LEFT JOIN SC b ON a.Sid = b.Sid
AND b.Cid = '01'
WHERE
	b.score < 60
ORDER BY
	b.Cid DESC;

    1七、按平均成績從高到低顯示全部學生的全部課程的成績以及平均成績

select t.*, round((s01+s02+s03)/3,2) as avs from (
SELECT a.*
	,SUM(CASE WHEN b.Cid='01' THEN b.score ELSE 0 END) AS s01 
	,SUM(CASE WHEN b.Cid='02' THEN b.score ELSE 0 END) AS s02 
	,SUM(CASE WHEN b.Cid='03' THEN b.score ELSE 0 END) AS s03
FROM Student a
LEFT JOIN SC b
ON a.Sid=b.Sid
GROUP BY 1,2,3,4
) t ORDER BY avs desc;


select * from Student t 
LEFT JOIN (
	select a.Sid
		,max(case when a.Cid='01' THEN a.score ELSE 0 END) as s01
		,max(case when a.Cid='02' THEN a.score ELSE 0 END) as s02
		,max(case when a.Cid='03' THEN a.score ELSE 0 END) as s03
		,round(avg(case when a.score is null then 0 else a.score end),2) as avs 
	from SC a group BY a.Sid ) t1
on t.Sid = t1.Sid
;

    1八、查詢各科成績最高分、最低分和平均分:以以下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率

#-- --及格爲>=60,中等爲:70-80,優良爲:80-90,優秀爲:>=90
#考察重點再分組

select 
	a.cid,b.Cname,max(a.score),min(a.score),avg(a.score)
	,concat(ROUND(count(IF(a.score >=60 ,1,null))/count(1) * 100,2),'%') as '及格率'
	,concat(ROUND(sum(case when a.score >= 70 and a.score < 80  then 1 else 0 end)/count(1) * 100,2),'%') as '中等率'
	,concat(ROUND(sum(case when a.score >= 80 and a.score < 90 then 1 else 0 end)/count(1) * 100,2),'%') as '優良率'
	,concat(ROUND(sum(case when a.score >= 90 then 1 else 0 end)/count(1) * 100,2),'%') as '優秀率'
from SC a  
INNER JOIN Course b on a.Cid = b.Cid group by 1,2;

    1九、按各科成績進行排序,並顯示排名

#單科排序方法,自定義變量
SET @rn:=0;
SELECT a.*,@rn:=@rn+1 as '排名'
FROM(
select a.*,b.score from Course a INNER JOIN SC b on a.Cid = b.Cid where a.Cid='01' ORDER BY a.Cid,b.score desc
)a ;
#按科目排序方法,經過自鏈接比對排序規則
SELECT
	a.*, count(b.Cid) + 1 AS tp
FROM
	SC a
LEFT JOIN SC b ON a.Cid = b.Cid
AND a.score < b.score
GROUP BY
	a.Sid,
	a.Cid
ORDER BY
	a.Cid,
	a.score DESC;

    20、查詢學生的總成績並進行排名

SET @ct := 0;
 
SELECT
	(@ct := @ct + 1) AS '排名',
	b.Sname,
	ifnull(sum(a.score), 0) AS '總成績'
FROM
	SC a
RIGHT JOIN Student b ON a.Sid = b.Sid 
GROUP BY
	a.Sid
ORDER BY
	sum(a.score) DESC;

    2一、查詢不一樣老師所教不一樣課程平均分從高到低顯示 

##沒有統計未參考學生的平均分
select d.Tname,c.Cname,ROUND(sum(b.score)/count(a.Sid),2) as '科目平均分'
from Student a LEFT JOIN SC b on a.Sid = b.Sid 
LEFT JOIN Course c on c.Cid = b.Cid
LEFT JOIN Teacher d on c.Tid = d.Tid
where b.Cid is not null group by b.Cid  ORDER BY sum(b.score)/count(a.Sid) desc;


SELECT a.*,b.Cname,AVG(c.Score) ascore
FROM Teacher a
INNER JOIN Course b
ON a.Tid=b.Tid
INNER JOIN SC c
ON b.Cid=c.Cid
GROUP BY 1,2,3
ORDER BY ascore DESC ;
#統計未參考學生的平均分
select 
sum(case when b.cid = '01' then b.score else 0 end)/count(distinct a.Sid) as avg_01,
sum(case when b.cid = '02' then b.score else 0 end)/count(distinct a.Sid) as avg_02,
sum(case when b.cid = '03' then b.score else 0 end)/count(distinct a.Sid) as avg_03 

 from Student a LEFT JOIN SC b on a.Sid = b.Sid;

    2二、查詢全部課程的成績第2名到第3名的學生信息及該課程成績

#核心爲題19按科目的成績排序
SELECT
	c.Sname,
	d.cid,
	d.score,
	d.tp
FROM
	Student c
INNER JOIN (
	SELECT
		a.*, count(b.Cid) + 1 AS tp
	FROM
		SC a
	LEFT JOIN SC b ON a.Cid = b.Cid
	AND a.score < b.score
	GROUP BY
		a.Sid,
		a.Cid
	HAVING
		count(b.Cid) + 1 IN (2, 3)
) d ON c.Sid = d.sid;

    2三、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所佔百分比 

select  t.*,c.Cname
,concat(round(t.bjg/sum(t.bjg+t.pt+t.lh+t.yx)* 100 ,2),'%') as bl_bjg 
,concat(round(t.pt/sum(t.bjg+t.pt+t.lh+t.yx)* 100 ,2),'%') as bl_pt
,concat(round(t.lh/sum(t.bjg+t.pt+t.lh+t.yx)* 100 ,2),'%') as bl_lh
,concat(round(t.yx/sum(t.bjg+t.pt+t.lh+t.yx)* 100 ,2),'%') as bl_yx

from (
select cid
,sum(case when a.score < 60 then 1 else 0 end) as 'bjg'
,sum(case when a.score > 60 and a.score <= 70 then 1 else 0 end) as 'pt'
,sum(case when a.score > 70 and a.score <= 80 then 1 else 0 end) as 'lh'
,sum(case when a.score > 80 then 1 else 0 end) as 'yx'
 from SC a group by a.cid ) t 
LEFT JOIN Course c  on t.cid =c.cid
GROUP BY t.cid 
;

#直接計算
SELECT a.Cid
       ,a.cname
       ,SUM(CASE WHEN b.score<=100 AND b.score>85 THEN 1 ELSE 0 END) AS 'yx'
       ,SUM(CASE WHEN b.score<=85  AND b.score>70 THEN 1 ELSE 0 END) AS 'lh'
       ,SUM(CASE WHEN b.score<=70  AND b.score>60 THEN 1 ELSE 0 END) AS 'jg'
       ,SUM(CASE WHEN b.score<=60  AND b.score>0 THEN 1 ELSE 0 END) AS 'bjg'   
       ,SUM(CASE WHEN b.score<=100 AND b.score>85 THEN 1 ELSE 0 END)/COUNT(1) AS 'yx%'
       ,SUM(CASE WHEN b.score<=85  AND b.score>70 THEN 1 ELSE 0 END)/COUNT(1) AS 'lh%'
       ,SUM(CASE WHEN b.score<=70  AND b.score>60 THEN 1 ELSE 0 END)/COUNT(1) AS 'jg%'
       ,SUM(CASE WHEN b.score<=60  AND b.score>0 THEN 1 ELSE 0 END)/COUNT(1) AS 'bjg%'
FROM Course a
INNER JOIN SC b
ON a.Cid=b.Cid
GROUP BY 1,2 ;

    2四、查詢學平生均成績及其名次 

set @mc := 0;
select t.* ,@mc := @mc + 1 as '名次' from (
select c.Sid,c.Sname,sum(b.score)/3 as pjf  from Course a LEFT JOIN SC b on a.Cid = b.Cid 
RIGHT JOIN Student c on b.Sid =c.Sid group by b.Sid ORDER BY pjf desc ) t ;


#方法2
SELECT a.*
    ,COUNT(b.Sid)+1
FROM (
    SELECT a.*,AVG(CASE WHEN b.SCore IS NULL THEN 0 ELSE b.SCore END) AS aSCore
    FROM Student a
    LEFT JOIN SC b
    ON a.Sid=b.Sid
    GROUP BY 1,2,3,4
     )a
LEFT JOIN(
    SELECT a.*,AVG(CASE WHEN b.SCore IS NULL THEN 0 ELSE b.SCore END) AS aSCore
    FROM Student a
    LEFT JOIN SC b
    ON a.Sid=b.Sid
    GROUP BY 1,2,3,4
     )b
ON a.aSCore<b.aSCore
GROUP BY 1,2,3,4,5 ;

    2五、查詢各科成績前三名的記錄

##題22 方法的同種類型

SELECT
	c.Sname,
	d.cid,
	d.score,
	d.tp
FROM
	Student c
INNER JOIN (
	SELECT
		a.*, count(b.Cid) + 1 AS tp
	FROM
		SC a
	LEFT JOIN SC b ON a.Cid = b.Cid
	AND a.score < b.score
	GROUP BY
		a.Sid,
		a.Cid
	HAVING
		count(b.Cid) + 1 <4
) d ON c.Sid = d.sid order by d.cid;


SELECT a.*,COUNT(b.cid)+1 AS ascore
FROM SC a
LEFT JOIN SC b
ON a.cid=b.cid AND a.score<b.score
GROUP BY 1,2,3
HAVING ascore<=3
ORDER BY a.cid,ascore ;

    26查詢每門課程被選修的學生數 

SELECT a.* ,COUNT(b.sid)
FROM Course a
LEFT JOIN SC b
ON a.cid=b.cid
GROUP BY 1,2,3 ;

    2七、查詢出只有兩門課程的所有學生的學號和姓名  

SELECT
	a.*
FROM
	Student a
LEFT JOIN SC b ON a.Sid = b.Sid
GROUP BY
	b.Sid
HAVING
	count(b.cid) = 2;

    2八、查詢男生、女生人數 

SELECT
	a.Ssex,
	count(a.Sid)
FROM
	Student a
GROUP BY
	a.Ssex;  

#2九、查詢名字中含有"風"字的學生信息 select * from Student a where a.Sname like '%風%';
#30、查詢同名同性學生名單,並統計同名人數 select * from Student a group by a.Sname HAVING count(a.Sname)>1; #3一、查詢1990年出生的學生名單(注:Student表中Sage列的類型是datetime) SELECT * FROM Student WHERE YEAR(sage)=1990 ;

    #3二、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號

SELECT a.*,AVG(b.Score) as ore
FROM Course a
LEFT JOIN SC b
ON a.cid=b.cid
GROUP BY 1,2,3
ORDER BY  ore DESC,a.cid ;

    3三、查詢平均成績大於等於85的全部學生的學號、姓名和平均成績 

SELECT
	a.Sid,
	a.Sname,
	sum(
		CASE
		WHEN b.score IS NULL THEN
			0
		ELSE
			b.score
		END
	) / 3 AS avgsc
FROM
	Student a
LEFT JOIN SC b ON a.Sid = b.Sid
GROUP BY
	a.Sid
HAVING
	avgsc > 85;

    3四、查詢課程名稱爲"數學",且分數低於60的學生姓名和分數 

SELECT
	a.*, b.score
FROM
	Student a
LEFT JOIN SC b ON a.Sid = b.sid
LEFT JOIN Course c ON b.Cid = c.Cid
WHERE
	 b.score  < 60
AND c.Cname = '數學' or c.Cname is null;

    3五、查詢全部學生的課程及分數狀況; 

SELECT
	c.cname,a.*,b.score
FROM
	Student a
LEFT JOIN SC b ON a.Sid = b.Sid
LEFT JOIN Course c on b.Cid = c.Cid
ORDER BY
	c.cname,
	a.Sid,
	b.Cid;

    3六、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;

SELECT DISTINCT
	b.Sname,
	c.Cname,
	a.score
FROM
	Student b
LEFT JOIN SC a ON a.Sid = b.Sid
LEFT JOIN Course c ON c.Cid = a.Cid
WHERE
	a.score > 70;

    #37 不及格的

SELECT DISTINCT
	b.Sname,
	c.Cname,
	a.score
FROM
	Student b
LEFT JOIN SC a ON a.Sid = b.Sid
LEFT JOIN Course c ON c.Cid = a.Cid
WHERE
	a.score < 60 or a.score is null;

    #38查詢課程編號爲01且課程成績在80分以上的學生的學號和姓名;

SELECT DISTINCT
	b.Sname,
	c.Cname,
	a.score
FROM
	Student b
LEFT JOIN SC a ON a.Sid = b.Sid
LEFT JOIN Course c ON c.Cid = a.Cid
WHERE
	a.score > 80 and a.Cid='01';

    3九、求每門課程的學生人數 

SELECT
	a.Cid,
	count(a.Sid)
FROM
	SC a
GROUP BY
	a.Cid;

    40、查詢選修"張三"老師所授課程的學生中,成績最高的學生信息及其成績

#方法1:排序獲取結果
SELECT
	*
FROM
	Student a
LEFT JOIN SC b ON a.Sid = b.Sid
LEFT JOIN Course c ON b.Cid = c.Cid
LEFT JOIN Teacher d ON c.Tid = d.Tid
WHERE
	d.Tname = '張三'
ORDER BY
	b.score DESC
LIMIT 1;

#方法2: 經過內鏈接最大值匹配
SELECT a.*,b.score
FROM Student a
INNER JOIN SC b
ON a.Sid=b.Sid
INNER JOIN(
    SELECT c.Cid ,MAX(c.score) AS maxscore FROM Teacher a
    INNER JOIN Course b
    ON a.Tid=b.Tid
    INNER JOIN SC c
    ON b.Cid=c.Cid
    WHERE a.Tname='張三'
    GROUP BY c.Cid )c
ON b.Cid=c.Cid AND b.score=c.maxscore ;

    4一、查詢不一樣課程成績相同的學生的學生編號、課程編號、學生成績 

SELECT DISTINCT
	c.Sname,
	c.Sid,
	a.Cid,
	d.cname,
	a.score
FROM
	Student c
LEFT JOIN SC a ON a.Sid = c.Sid
INNER JOIN SC b ON a.sid = b.Sid
LEFT JOIN Course d ON a.Cid = d.Cid
WHERE
	a.Cid != b.Cid
AND a.score = b.score;

#方法2
SELECT a.sid
    ,a.cid
    ,a.SCore
FROM SC a
INNER JOIN (
    SELECT a.SCore
        ,b.sid
        ,COUNT(1)
    FROM SC a
    INNER JOIN Student b
    ON a.sid=b.sid
    GROUP BY a.SCore,b.sid
    HAVING COUNT(1)>1
)b
ON a.sid=b.sid AND a.SCore=b.SCore ;

    4二、查詢每門功成績最好的前兩名 ,同22

SELECT
	c.Sname,
	d.cid,
	d.score,
	d.tp
FROM
	Student c
INNER JOIN (
	SELECT
		a.*, count(b.Cid) + 1 AS tp
	FROM
		SC a
	LEFT JOIN SC b ON a.Cid = b.Cid
	AND a.score < b.score
	GROUP BY
		a.Sid,
		a.Cid
	HAVING
		count(b.Cid) + 1 <3
) d ON c.Sid = d.sid order by d.cid;

    4三、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列  

SELECT
	a.Cid,
	a.Cname,
	count(b.Sid)
FROM
	Course a
LEFT JOIN SC b ON a.Cid = b.Cid
GROUP BY
	b.Cid
HAVING
	count(b.Sid) > 5
ORDER BY
	count(b.Sid) DESC,
	b.Cid;

    

    

#方法3::經過組裝cid字段比對進行篩選#重點:GROUP_CONCAT(cid ORDER BY cid) 函數的用法#1.須要配合group by 子句使用#2.內部字段的排序的用法
SELECT DISTINCTt.*FROMStudent tINNER JOIN SC t1 ON t.Sid = t1.SidWHEREt.Sid IN (SELECTt3.SidFROM(SELECTsid,GROUP_CONCAT(cid ORDER BY cid) AS cid_listFROMSC aWHEREa.sid = '01'GROUP BYsid) t2RIGHT JOIN (SELECTsid,GROUP_CONCAT(cid ORDER BY cid) AS cid_listFROMSC aGROUP BYsid) t3 ON t2.cid_list = t3.cid_listWHEREt2.sid IS NOT NULL);

相關文章
相關標籤/搜索