学习目标:
很久没有练习写sql了,现在根据题库练习几题,并以后随时看看,知道sql的一些常用语法,特殊技巧
学习内容:
以上面的表为例,练习sql题目和答案如下:
CREATE TABLE class
(
cid
INT not null,
caption
VARCHAR(11) NOT null
);
CREATE TABLE student
(
sid
INT NOT NULL,
sname
VARCHAR(11) NOT null,
gender
char(1) DEFAULT '男' NOT NULL,
class_id
INT,
PRIMARY KEY(sid
)
);
create table teacher
(
tid
int not null,
tname
VARCHAR(11) not null,
PRIMARY key(tid
)
);
CREATE TABLE course
(
cid
INT NOT NULL,
cname
VARCHAR(11) NOT null,
teacher_id
int NOT NULL,
PRIMARY KEY(cid
)
);
CREATE TABLE score
(
sid
INT NOT NULL,
student_id
INT NOT null,
course_id
int NOT NULL,
number
INT not null,
PRIMARY KEY(sid
)
);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (1, 1, 1, 60);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (2, 1, 2, 59);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (3, 2, 1, 98);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (4, 2, 2, 100);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (5, 3, 1, 43);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (6, 3, 2, 99);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (7, 3, 3, 65);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (8, 4, 3, 46);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (9, 4, 4, 89);
INSERT INTO `ins_cashier
`.`score
`(`sid
`, `student_id
`, `course_id
`, `number
`) VALUES (10, 5, 4, 54);
SELECT a
.student_id
FROM (
SELECT student_id
, number
FROM score
WHERE course_id
= 1
) a
, (
SELECT student_id
, number
FROM score
WHERE course_id
= 2
) b
WHERE a
.student_id
= b
.student_id
AND a
.number
< b
.number
;
SELECT student_id
, avg(number
) AS a
FROM score
GROUP BY student_id
HAVING a
> 60;
select * FROM course c
, teacher t
WHERE c
.teacher_id
= t
.tid
;
select * FROM course c
LEFT JOIN teacher t
on c
.teacher_id
= t
.tid
;
SELECT a
.student_id
, a
.countNum
, a
.sumNum
, b
.sname
FROM (
SELECT student_id
, count(course_id
) AS countNum
, SUM(number
) AS sumNum
FROM score
GROUP BY student_id
) a
LEFT JOIN student b
ON a
.student_id
= b
.sid
;
select count(tname
) FROM teacher
WHERE tname
like "李%";
SELECT s
.student_id
, st
.sname
FROM score s
, student st
WHERE st
.sid
= s
.student_id
AND s
.student_id
NOT IN (
SELECT DISTINCT s
.student_id
FROM score s
WHERE s
.course_id
IN (
SELECT c
.cid
FROM teacher t
, course c
WHERE t
.tid
= c
.teacher_id
AND tname
= '苍空'
)
)
GROUP BY s
.student_id
SELECT a
.sid
, a
.sname
FROM student a
INNER JOIN (
SELECT s
.student_id
FROM (
SELECT *
FROM score
WHERE course_id
IN (1, 3)
) s
GROUP BY s
.student_id
HAVING count(s
.student_id
) = 2
) b
ON b
.student_id
= a
.sid
;
SELECT s
.sid
, s
.sname
FROM student s
JOIN (
SELECT a
.student_id
FROM score a
WHERE a
.course_id
IN (
SELECT c
.cid
FROM teacher t
, course c
WHERE c
.teacher_id
= t
.tid
AND t
.tname
= '波多'
)
GROUP BY a
.student_id
HAVING COUNT(a
.student_id
) = (
SELECT count(c
.cid
)
FROM teacher t
, course c
WHERE c
.teacher_id
= t
.tid
AND t
.tname
= '波多'
)
) c
ON c
.student_id
= s
.sid
;
SELECT st
.sid
, st
.sname
FROM (
SELECT a
.student_id
FROM (
SELECT s
.student_id
, s
.number
FROM score s
WHERE s
.course_id
= 1
) a
, (
SELECT s
.student_id
, s
.number
FROM score s
WHERE s
.course_id
= 2
) b
WHERE a
.student_id
= b
.student_id
AND a
.number
> b
.number
) b
, student st
WHERE st
.sid
= b
.student_id
;
SELECT st
.sid
, st
.sname
FROM (
SELECT sc
.student_id
FROM score sc
GROUP BY sc
.student_id
HAVING MIN(sc
.number
) < 60
) scc
, student st
WHERE st
.sid
= scc
.student_id
;
SELECT st
.sid
, st
.sname
FROM (
SELECT sc
.student_id
FROM score sc
GROUP BY sc
.student_id
HAVING count(sc
.student_id
) = (
SELECT count(cid
)
FROM course
)
) a
, student st
WHERE st
.sid
= a
.student_id
;
SELECT st
.sid
, st
.sname
FROM student st
, (
SELECT DISTINCT s
.student_id
FROM score s
WHERE s
.course_id
IN (
SELECT sc
.course_id
FROM score sc
WHERE sc
.student_id
= 1
)
) a
WHERE st
.sid
= a
.student_id
;
SELECT st
.sid
, st
.sname
FROM student st
, (
SELECT DISTINCT sc2
.student_id
FROM score sc2
WHERE sc2
.student_id
!= 1
AND sc2
.course_id
IN (
SELECT sc
.course_id
FROM score sc
WHERE sc
.student_id
= 1
)
) sc3
WHERE sc3
.student_id
= st
.sid
SELECT st4
.sid
, st4
.sname
FROM student st4
, (
SELECT sc2
.student_id
FROM score sc2
WHERE sc2
.course_id
IN (
SELECT sc
.course_id
FROM score sc
WHERE sc
.student_id
= 2
)
AND sc2
.student_id
!= 2
GROUP BY sc2
.student_id
HAVING count(sc2
.student_id
) = (
SELECT count(sc
.course_id
)
FROM score sc
WHERE sc
.student_id
= 2
)
) sc5
WHERE st4
.sid
= sc5
.student_id
;
DELETE FROM score
WHERE course_id
IN (
SELECT co
.cid
FROM teacher te
, course co
WHERE te
.tid
= co
.teacher_id
AND te
.tname
= '苍空'
);
INSERT INTO score
(student_id
, course_id
, number
)
SELECT a
.student_id
, 2, b
.avgNum
FROM (
SELECT DISTINCT sc4
.student_id
FROM score sc4
WHERE sc4
.student_id
NOT IN (
SELECT sc3
.student_id
FROM score sc3
WHERE sc3
.course_id
= 2
)
) a
, (
SELECT avg(number
) AS avgNum
FROM (
SELECT *
FROM score sc
WHERE sc
.course_id
= 2
) sc2
GROUP BY sc2
.course_id
) b
SELECT sc
.student_id
, SUM(IF(`course_id
` = 1, number
, NULL)) AS 生物
, SUM(IF(`course_id
` = 2, number
, NULL)) AS 体育
, SUM(IF(`course_id
` = 3, number
, NULL)) AS 物理
, COUNT(course_id
) AS 有效课程
, avg(number
) AS 平均分
FROM (
SELECT *
FROM score
WHERE course_id
IN (1, 2, 3)
) sc
GROUP BY sc
.student_id
SELECT student_id
,
SUM(CASE `course_id
` WHEN (SELECT cid
FROM course
WHERE cname
= "生物") THEN number
ELSE null END) as '生物',
SUM(CASE `course_id
` WHEN (SELECT cid
FROM course
WHERE cname
= "体育") THEN number
ELSE null END) as '体育',
SUM(CASE `course_id
` WHEN (SELECT cid
FROM course
WHERE cname
= "物理") THEN number
ELSE null END) as '物理'
FROM score
GROUP BY student_id
SELECT sc
.course_id
AS 课程ID
, MAX(sc
.number
) AS 最高分
, MIN(sc
.number
) AS 最低分
FROM score sc
GROUP BY sc
.course_id
SELECT sc
.course_id
, avg(sc
.number
) AS avgNum
, SUM(IF(number
>= 60, 1, 0)) / count(1) AS pass
FROM score sc
GROUP BY sc
.course_id
ORDER BY avgNum
ASC, pass
DESC
select sc
.course_id
,SUM( IF(number
>=60,1,0) ) ,SUM( IF(number
<60,1,0) ),count(1) FROM score sc
GROUP BY sc
.course_id
;
SELECT a
.course_id
, a
.avgNum
, t
.tname
FROM (
SELECT sc
.course_id
, AVG(sc
.number
) AS avgNum
FROM score sc
GROUP BY sc
.course_id
ORDER BY avgNum
DESC
) a
, course c
, teacher t
WHERE a
.course_id
= c
.cid
AND c
.teacher_id
= t
.tid
;
SELECT s1
.* FROM score s1
WHERE
(
SELECT COUNT(1) FROM score s2
WHERE
s1
.course_id
=s2
.course_id
AND s1
.number
<= s2
.number
)<=3
ORDER BY s1
.course_id
,s1
.number
DESC;
SELECT a
.student_id
, a
.course_id
,a
.number
FROM (
SELECT s1
.student_id
, s1
.course_id
, s1
.number
, s2
.course_id
AS course_id2
, s2
.number
AS number2
FROM score s1
, score s2
WHERE s1
.course_id
= s2
.course_id
AND s1
.number
<= s2
.number
) a
GROUP BY a
.course_id
,a
.number
HAVING count(1) <=3 ORDER BY a
.course_id
, a
.number
DESC
SELECT count(sc
.student_id
) FROM score
as sc
GROUP BY sc
.course_id
;
SELECT s
.sid
, s
.sname
FROM student s
, (
SELECT sc
.student_id
, count(sc
.student_id
) AS countNum
FROM score sc
GROUP BY sc
.student_id
HAVING countNum
= 1
) a
WHERE s
.sid
= a
.student_id
SELECT st
.gender
, COUNT(1)
FROM student st
GROUP BY st
.gender
;
SELECT * FROM student
WHERE sname
like "陈%";
SELECT st1
.sid
, st1
.sname
, st1
.gender
, count(1) AS countNum
FROM student st1
, student st2
WHERE st1
.sname
= st2
.sname
GROUP BY st1
.sid
HAVING countNum
>= 2
SELECT sc
.course_id
, avg(sc
.number
) AS avgNum
FROM score sc
GROUP BY sc
.course_id
ORDER BY avgNum
ASC, sc
.course_id
DESC
SELECT a
.student_id
, st
.sname
, a
.avgNum
FROM student st
, (
SELECT sc
.student_id
, avg(sc
.number
) AS avgNum
FROM score sc
GROUP BY sc
.student_id
HAVING avgNum
> 60
) a
WHERE st
.sid
= a
.student_id
;
SELECT st
.sname
, sc
.student_id
, sc
.number
FROM score sc
, course co
, student st
WHERE co
.cname
= '生物'
AND sc
.course_id
= co
.cid
AND st
.sid
= sc
.student_id
AND sc
.number
< 60
SELECT sc
.student_id
,st
.sname
FROM score sc
,student st
WHERE st
.sid
= sc
.student_id
and sc
.course_id
= 1 and sc
.number
>=80
SELECT count(DISTINCT(student_id
)) FROM score
SELECT st
.sname
, sc
.student_id
, sc
.course_id
, sc
.number
FROM score sc
, student st
WHERE st
.sid
= sc
.student_id
AND sc
.course_id
IN (
SELECT co
.cid
FROM teacher te
, course co
WHERE te
.tid
= co
.teacher_id
AND te
.tname
= '苍空'
)
ORDER BY sc
.number
DESC
LIMIT 0, 1
SELECT sc
.course_id
,count(1) countNum
FROM score sc
GROUP BY sc
.course_id
SELECT s1
.* FROM score s1
WHERE
(
SELECT COUNT(1) FROM score s2
WHERE
s1
.course_id
=s2
.course_id
AND s1
.number
<= s2
.number
)<=3
ORDER BY s1
.course_id
,s1
.number
DESC;
SELECT a
.student_id
, a
.course_id
,a
.number
FROM (
SELECT s1
.student_id
, s1
.course_id
, s1
.number
, s2
.course_id
AS course_id2
, s2
.number
AS number2
FROM score s1
, score s2
WHERE s1
.course_id
= s2
.course_id
AND s1
.number
<= s2
.number
) a
GROUP BY a
.course_id
,a
.number
HAVING count(1) <=2 ORDER BY a
.course_id
, a
.number
DESC
SELECT student_id
FROM score
GROUP BY student_id
HAVING COUNT(student_id
)>=2
SELECT sc
.course_id
, count(sc
.student_id
) AS countNum
FROM score sc
GROUP BY sc
.course_id
HAVING countNum
= (
SELECT COUNT(1)
FROM student
)
SELECT *
FROM student st
WHERE st
.sid
NOT IN (
SELECT DISTINCT sc
.student_id
FROM score sc
WHERE sc
.course_id
IN (
SELECT c
.cid
FROM teacher t
, course c
WHERE t
.tid
= c
.teacher_id
AND t
.tname
= '苍空'
)
)
SELECT sc
.student_id
, SUM(IF(number
< 60, 1, 0)) AS fail
, avg(number
) AS avgNum
FROM score sc
GROUP BY sc
.student_id
HAVING fail
>= 2;
SELECT sc
.student_id
FROM score sc
WHERE sc
.course_id
= 1
AND sc
.number
< 60
ORDER BY sc
.number
DESC
DELETE FROM score
WHERE student_id
= 8 and course_id
= 1;
这些sql,时不时的练练手,还是有用的。
【完】
正在前往BAT的路上修行
转载请注明原文地址: https://lol.8miu.com/read-24470.html