mysql练手

1、根据图创建下列表格

  没有外键的表先创建,创建顺序为teacher,class,course,student

CREATE TABLE class (
	cid INT NOT NULL auto_increment PRIMARY KEY,
	caption CHAR (32) NOT NULL
) ENGINE = INNODB DEFAULT charset = utf8;

INSERT INTO score (caption)
VALUES
	('三年二班'),
	('一年三班'),
	('三年一班') ;

2、查询“生物”课程比“物理”课程成绩高的所有学生的学号

CREATE VIEW vw1 AS SELECT
	score.student_id AS "学号",
	student.sname AS "姓名",
	course.cname AS "科目",
	number AS "生物分数"
FROM
	score
LEFT JOIN course ON course.cid = score.course_id
LEFT JOIN student ON score.student_id = student.sid
WHERE
	course.cname = '生物';

CREATE VIEW vw2 AS SELECT
	score.student_id AS "学号",
	student.sname AS "姓名",
	course.cname AS "科目",
	number AS "物理分数"
FROM
	score
LEFT JOIN course ON course.cid = score.course_id
LEFT JOIN student ON score.student_id = student.sid
WHERE
	course.cname = '物理';

SELECT
	*
FROM
	vw1
INNER JOIN vw2 ON vw1.学号 = vw2.学号
WHERE
	vw1.生物分数 > vw2.物理分数;

3、查询平均成绩大于60分的同学的学号和平均成绩

SELECT
	score.student_id AS "学号",
	student.sname AS "姓名",
	sum(score.number) AS "总分数",
	avg(score.number) AS gva
FROM
	score
LEFT JOIN course ON course.cid = score.course_id
LEFT JOIN student ON score.student_id = student.sid
GROUP BY
	student_id
HAVING
	gva > 60;

4、查询所有同学的学号、姓名、选课数、总成绩

SELECT
	score.student_id AS "学号",
	student.sname AS "姓名",
	sum(score.number) AS "总成绩",
	count(score.course_id) AS '课程数'
FROM
	score
LEFT JOIN course ON course.cid = score.course_id
LEFT JOIN student ON score.student_id = student.sid
GROUP BY
	student_id

5、查询姓“李”的老师的个数

SELECT
	count(tname) AS "个数"
FROM
	teacher
WHERE
	tname LIKE "波%" ;

6、查询没学过“叶平”老师课的同学的学号、姓名

  思路:没学过某个老师,我可以找到学过这个老师的学生,并在学生表判断,排除这些学过的就是没学过了

    (学生学的课程id in (先找叶平老师教的课程id))

    最后只要排除 not in这群学生就可了

SELECT
	*
FROM
	student
WHERE
	sid NOT IN (
		SELECT DISTINCT
			student_id
		FROM
			score
		WHERE
			course_id IN (
				SELECT
					cid
				FROM
					course
				LEFT JOIN teacher ON teacher_id = tid
				WHERE
					tname = "波多"
			)
	)

 

 7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名

  思路:先查出所有学了 001 或 002 的学生 course_id  in (001,002)

    然后group by  学生id,having进行科目数统计,等于2的就是符合条件的

SELECT
	student_id,
	sname
FROM
	student
LEFT JOIN score ON student_id = student.sid
WHERE
	course_id IN (1, 2)
GROUP BY
	student_id
HAVING
	count(student_id) = 2;

8、查询学过“叶平”老师所教的所有课的同学的学号、姓名

SELECT
	*
FROM
	student
WHERE
	student.sid IN (
		SELECT DISTINCT
			student_id
		FROM
			score
		WHERE
			course_id IN (
				SELECT
					cid
				FROM
					course
				LEFT JOIN teacher ON teacher.tid = course.teacher_id
				WHERE
					teacher.tname = '饭岛'
			)
	);

9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名

SELECT
	id1,
	NAME
FROM
	(
		SELECT
			student_id AS id1,
			number AS number1,
			student.sname AS NAME
		FROM
			score
		LEFT JOIN student ON student.sid = score.student_id
		WHERE
			score.course_id = 1
	) AS A
LEFT JOIN (
	SELECT
		student_id AS id2,
		number AS number2
	FROM
		score
	LEFT JOIN student ON student.sid = score.student_id
	WHERE
		score.course_id = 2
) AS B ON A.id1 = B.id2
WHERE
	number1 > number2;

10、查询有课程成绩小于60分的同学的学号、姓名

SELECT DISTINCT
	student.sid,
	sname
FROM
	student
LEFT JOIN score ON student.sid = score.student_id
WHERE
	student.sid IN (
		SELECT
			student_id
		FROM
			score
		WHERE
			number < 60
	);

11、查询没有学全所有课的同学的学号、姓名

SELECT
	sid,
	sname
FROM
	student
WHERE
	sid IN (
		SELECT
			student_id
		FROM
			score
		GROUP BY
			student_id
		HAVING
			count(student_id) = 3
	);

12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名

  思路:先找到001同学的course---一个元组

      course_id in 元组  ---student id元组

      sid in student id元组

SELECT DISTINCT
	sid,
	sname
FROM
	student
WHERE
	sid IN (
		SELECT
			student_id
		FROM
			score
		WHERE
			course_id IN (
				SELECT
					course_id
				FROM
					score
				WHERE
					student_id = 1
			)
	)
AND sid != 1;

13、查询至少学过学号为“001”同学所有课的其他同学学号和姓名

        先找到和001的学过的所有人

        然后个数 = 001所有学科     ==》 其他人可能选择的更多
SELECT
	student.sid,
	sname,
	count(course_id)
FROM
	score
LEFT JOIN student ON student.sid = score.student_id
WHERE
	course_id IN (
		SELECT
			course_id
		FROM
			score
		WHERE
			student_id = 1
	)
AND student_id != 1
GROUP BY
	student_id
HAVING
	count(student_id) = (
		SELECT
			count(course_id)
		FROM
			score
		WHERE
			student_id = 1
	);

14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名

  思路:总课程数=002课程总数  --》student_id集

     每位同学符合002同学学过课程的数目=002课程总数  》》student_id

     去两  --》交集

SELECT
	student.sid,
	sname,
	count(course_id)
FROM
	score
LEFT JOIN student ON student.sid = score.student_id
WHERE
	student.sid IN (
		SELECT
			student_id
		FROM
			score
		GROUP BY
			student_id
		HAVING
			count(course_id) = (
				SELECT
					count(course_id)
				FROM
					score
				WHERE
					student_id = 2
			)
	)
AND course_id IN (
	SELECT
		course_id
	FROM
		score
	WHERE
		student_id = 2
)
AND student_id != 2
GROUP BY
	student_id
HAVING
	count(student_id) = (
		SELECT
			count(course_id)
		FROM
			score
		WHERE
			student_id = 2
	);

15、删除学习“叶平”老师课的SC表记录

  思路:delete from  where 条件

    条件:老师--》》课程id_list-->>course_id in id_list

DELETE
FROM
	score
WHERE
	course_id in (
		SELECT
			cid
		FROM
			course
		LEFT JOIN teacher ON teacher.tid = course.teacher_id
		WHERE
			tname = "苍空"
	)
原文地址:https://www.cnblogs.com/xinsiwei18/p/5860527.html