国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQL 50 題(MySQL 版,包括建庫建表、插入數(shù)據(jù)等完整過程,適合復習 SQL 知識點)

這篇具有很好參考價值的文章主要介紹了SQL 50 題(MySQL 版,包括建庫建表、插入數(shù)據(jù)等完整過程,適合復習 SQL 知識點)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

① 本文整理了經(jīng)典的 50 道 SQL 題目,文本分為建庫建表、插入數(shù)據(jù)以及 SQL 50 題這三個部分。
② 這些題目許多博主也整理過,但本人不太了解這些題目具體的出處。第一次了解這些題目是本科期間老師出的題目。如果有網(wǎng)友知道這些題目的最原始出處,可以在評論評論區(qū)中告知。
③ 本文所使用的 MySQL 版本為 5.5,雖然版本有一點舊,但是對 SQL 知識點的復習沒有太大的影響(除了一些舊版沒有的函數(shù))。
④ 由于本文旨在對 SQL 基礎知識進行復習,并且所涉及的數(shù)據(jù)量也十分的小,所以在編寫 SQL 語句時,并未過多考慮 SQL 優(yōu)化的方面。如果讀者有其它的解法或者發(fā)現(xiàn)錯誤之處,可在評論區(qū)留言,筆者在看到后會及時更新!

1.建庫建表

(1)建庫:創(chuàng)建一個名為 sqlpractice 的數(shù)據(jù)庫。
(2)建表:建立 student、course、teacher 和 score 這 4 張表。它們的字段以及之間的關系如下圖所示。
sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題
(3)建庫建表的完整 SQL 語句如下所示。

# 建庫
create database sqlpractice;
use sqlpractice;

# 建立 Student 學生表
CREATE TABLE Student(
s_id VARCHAR(20),
s_name VARCHAR(20) NOT NULL,
s_birth VARCHAR(20) NOT NULL, 
s_sex VARCHAR(10) NOT NULL,
PRIMARY KEY(s_id)	# 主鍵
);

# 建立 Course 課程表
CREATE TABLE Course(
c_id VARCHAR(20),
c_name VARCHAR(20) NOT NULL,
t_id VARCHAR(20) NOT NULL,
PRIMARY KEY(c_id)	# 主鍵
);

# 建立 Teacher 教師表
CREATE TABLE Teacher(
t_id VARCHAR(20),
t_name VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(t_id)	# 主鍵
);

# 建立 Score 分數(shù)表
CREATE TABLE Score(
s_id VARCHAR(20),
c_id VARCHAR(20),
s_score INT(3),
PRIMARY KEY(s_id, c_id)  # 聯(lián)合主鍵
);

# 添加外鍵
# 語法:ALTER TABLE 從表 ADD FOREIGN KEY(外鍵字段) REFERENCES 主表(主鍵字段)
ALTER TABLE Course ADD FOREIGN KEY(t_id) REFERENCES Teacher(t_id)
ALTER TABLE Score ADD FOREIGN KEY(s_id) REFERENCES Student(s_id)
ALTER TABLE Score ADD FOREIGN KEY(c_id) REFERENCES Course(c_id)

2.插入數(shù)據(jù)

(1)向上面創(chuàng)建的 4 張表中插入測試數(shù)據(jù)的 SQL 語句如下所示(需要注意表之間的關系,以免插入數(shù)據(jù)失?。?/p>

# 分別向四張表中插入數(shù)據(jù)
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', '女');

INSERT INTO Teacher VALUES('01', '張三');
INSERT INTO Teacher VALUES('02', '李四');
INSERT INTO Teacher VALUES('03', '王五');

INSERT INTO Course VALUES('01', '語文', '02');
INSERT INTO Course VALUES('02', '數(shù)學', '01');
INSERT INTO Course VALUES('03', '英語', '03');

INSERT INTO Score VALUES('01', '01', 80);
INSERT INTO Score VALUES('01', '02', 90);
INSERT INTO Score VALUES('01', '03', 99);
INSERT INTO Score VALUES('02', '01', 70);
INSERT INTO Score VALUES('02', '02', 60);
INSERT INTO Score VALUES('02', '03', 80);
INSERT INTO Score VALUES('03', '01', 80);
INSERT INTO Score VALUES('03', '02', 80);
INSERT INTO Score VALUES('03', '03', 80);
INSERT INTO Score VALUES('04', '01', 50);
INSERT INTO Score VALUES('04', '02', 30);
INSERT INTO Score VALUES('04', '03', 20);
INSERT INTO Score VALUES('05', '01', 76);
INSERT INTO Score VALUES('05', '02', 87);
INSERT INTO Score VALUES('06', '01', 31);
INSERT INTO Score VALUES('06', '03', 34);
INSERT INTO Score VALUES('07', '02', 89);
INSERT INTO Score VALUES('07', '03', 98);

(2)檢驗插入數(shù)據(jù)是否成功

SELECT * FROM Student;
SELECT * FROM Course;
SELECT * FROM Teacher;
SELECT * FROM Score;

Student 表
sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

Course 表

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

Teacher 表

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

Score 表

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.SQL 50 題

3.1.?SQL 01——查詢"01"課程比"02"課程成績高的學生的信息及課程分數(shù)

# 本題需要比較"01"課程比"02"課程的成績,故在 where 中將 score 表中的字段 s_score 使用 2 次(即分別對應"01"課程的成績和"02"課程的成績)
# 所以可以使用為 s_score 表取別名的方式來多次使用 score 表中的字段
SELECT
	student.*,
	score1.s_score 
FROM
	student,
	score AS score1,
	score AS score2 
WHERE
	student.s_id = score1.s_id 
	AND score1.s_id = score2.s_id # student, score1, score2 表連接的條件是它們的 s_id 均相等
	AND score1.c_id = '01' 
	AND score2.c_id = '02' 
	AND score1.s_score > score2.s_score;

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.2.SQL 02——查詢"01"課程比"02"課程成績低的學生的信息及課程分數(shù)

SELECT
	student.*,
	score1.s_score 
FROM
	student,
	score AS score1,
	score AS score2 
WHERE
	student.s_id = score1.s_id 
	AND score1.s_id = score2.s_id # student, score1, score2 表連接的條件是它們的 s_id 均相等
	AND score1.c_id = '01' 
	AND score2.c_id = '02' 
	AND score1.s_score < score2.s_score;

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.3.SQL 03——查詢平均成績大于等于 60 分的同學的學生編號、學生姓名和平均成績

# 1.創(chuàng)建臨時表 ss
EXPLAIN SELECT
	student.s_id,
	student.s_name,
	ss.avg_score 
FROM
	student,
	(SELECT s_id, AVG(s_score) AS avg_score FROM score GROUP BY s_id) AS ss 
WHERE
	student.s_id = ss.s_id 
	AND ss.avg_score >= 60;

# 2.先進行內(nèi)連接,然后再分組
SELECT
	student.s_id,
	s_name,
	round(AVG(score.s_score), 2) as avg_score
FROM
	student
	INNER JOIN score ON student.s_id = score.s_id 
GROUP BY
	student.s_id,
	s_name 
HAVING
	AVG(score.s_score) >= 60

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.4.?SQL 04——查詢平均成績小于 60 分的同學的學生編號和學生姓名和平均成績(包括有成績的和無成績的)

# isnull(exper) 判斷 exper 是否為空,是則返回 1,否則返回 0
# ifnull(exper1, exper2) 判斷 exper1 是否為空,是則用 exper2 代替
# nullif(exper1, exper2) 如果 expr1 = expr2 成立,那么返回值為 NULL,否則返回值為 expr1。
SELECT
	student.s_id,
	s_name,
	round(AVG(score.s_score), 2) as avg_score
FROM
	student
	LEFT OUTER JOIN score ON student.s_id = score.s_id 
GROUP BY
	student.s_id,
	s_name 
HAVING
	AVG(IFNULL(score.s_score,0)) < 60

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.5.SQL 05——查詢所有同學的學生編號、學生姓名、選課總數(shù)、所有課程的總成績

SELECT
	student.s_id,
	student.s_name,
	COUNT(DISTINCT c_id) AS totalCourses,
	SUM(s_score) AS totalScores 
FROM
	student
	# 由于要查詢所有的學生,故無論其是否有課程信息都要查詢,所以使用 LEFT OUTER JOIN
	LEFT OUTER JOIN score ON student.s_id = score.s_id 
GROUP BY
	student.s_id,
	student.s_name;

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.6.SQL 06——查詢"李"姓老師的數(shù)量

# 1.模糊查詢
SELECT
	COUNT(*) 
FROM
	teacher 
WHERE
	t_name LIKE '李%'

# 2.正則表達式查詢,字符 '^' 匹配以特定字符或者字符串開頭的文本
SELECT
	count(*) 
FROM
	teacher 
WHERE
	t_name REGEXP '^李'

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.7.?SQL 07——查詢學過"張三"老師授課的同學的信息

# 1.使用多表連接(score, course, teacher)找到上張三老師課的同學的 s_id,然后再根據(jù) s_id 從 student 表中查詢同學信息
SELECT
	student.* 
FROM
	student 
WHERE
	s_id IN (
		SELECT
			s_id 
		FROM
			score,
			course,
			teacher 
		WHERE
			teacher.t_name = '張三' 
			AND teacher.t_id = course.t_id 
			AND course.c_id = score.c_id 
	)

# 2.多層嵌套子查詢(當數(shù)據(jù)量較大時,一般不推薦使用子查詢)
# 在 student 表中根據(jù)上過張三老師教的課的學生 s_id 來查詢他們的信息
SELECT
	student.* 
FROM
	student 
WHERE
	student.s_id IN (
			# 在 score 表中根據(jù)張三老師教的課程 c_id 來查找上這些課的學生 s_id
			SELECT DISTINCT
				s_id 
			FROM
				score 
			WHERE
				score.c_id IN (
					# 在 course 表中根據(jù)張三老師的 t_id 查詢他所教的課程 c_id
					SELECT 
						c_id 
					FROM 
						course 
					WHERE 
						course.t_id = (
							# 在 teacher 表中查詢張三老師的 t_id
							SELECT 
								t_id 
							FROM 
								teacher 
							WHERE 
								t_name = '張三'
						)
				)
	)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.8.SQL 08——查詢沒學過"張三"老師授課的同學的信息

SELECT
	student.* 
FROM
	student 
WHERE
	student.s_id NOT IN (
			SELECT DISTINCT
				s_id 
			FROM
				score 
			WHERE
				score.c_id IN (
					SELECT 
						c_id 
					FROM 
						course 
					WHERE 
						course.t_id = (
							SELECT 
								t_id 
							FROM 
								teacher 
							WHERE 
								t_name = '張三'
						)
				)
	)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.9.SQL 09——查詢學過編號為"01"并且也學過編號為"02"的課程的同學的信息

SELECT
	student.* 
FROM
	student 
WHERE
	student.s_id IN (
		SELECT
			s1.s_id 
		FROM
			score AS s1,
			score AS s2 
		WHERE
			s1.s_id = s2.s_id 
			AND s1.c_id = '01' 
			AND s2.c_id = '02' 
	)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.10.?SQL 10——查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息

SELECT
	stu.s_id,
	stu.s_name,
	stu.s_birth,
	stu.s_sex 
FROM
	student AS stu
	JOIN score AS sc ON stu.s_id = sc.s_id
	JOIN course AS co ON co.c_id = sc.c_id 
WHERE
	co.c_id = '01' 
	AND stu.s_id NOT IN (
		# 查詢學過編號為 "02" 的課程的同學 id
		SELECT
			stu.s_id
		FROM
			student AS stu
			JOIN score AS sc ON stu.s_id = sc.s_id
			JOIN course AS co ON co.c_id = sc.c_id 
		WHERE
			co.c_id = '02' 
	)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.11.SQL 11——查詢沒有學全所有課程的同學的信息

# 下面的課程數(shù)量 3 也可以用 (SELECT count(*) FROM course) 來代替
SELECT
	* 
FROM
	student 
WHERE
	s_id IN (SELECT s_id FROM score GROUP BY s_id HAVING count(c_id) < 3)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.12.SQL 12——查詢至少有一門課與學號為"01"的同學所學相同的同學的信息

# 不包括學號為 '01' 學生自己
SELECT
	* 
FROM
	student 
WHERE
	s_id IN (
		SELECT DISTINCT s_id FROM score 
		WHERE c_id IN (SELECT c_id FROM score WHERE s_id = '01') 
			  AND s_id != '01'
	)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.13.?SQL 13——查詢和"01"號的同學學習的課程完全相同的其他同學的信息

SELECT
	* 
FROM
	student 
WHERE
	s_id IN (
		SELECT
			s_id 
		FROM
			score 
		WHERE
			# 保證學習的課程相同
			c_id IN (SELECT DISTINCT c_id FROM score WHERE s_id = '01') 
			AND s_id != '01' 
		GROUP BY
			s_id 
		HAVING
			# 保證學習的課程數(shù)量相同
			count(c_id) = (select count(*) from score where s_id = '01')
	)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.14.SQL 14——查詢沒學過"張三"老師講授的任一門課程的學生姓名

SELECT
	s_name 
FROM
	student 
WHERE
	s_id NOT IN (
		# 查詢學習過"張三"老師講授的任一門課程的學生 id
		SELECT
			s_id 
		FROM
			score 
		WHERE
			c_id IN ( 
				# 查詢由姓名為張三的老師所講授的課程 id
				SELECT
					c_id 
				FROM
					course 
				WHERE
					t_id IN (SELECT t_id FROM teacher WHERE t_name = '張三')
			)
	)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.15.?SQL 15——查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績

SELECT
	stu.s_id,
	stu.s_name,
	tmp_t.avg_score 
FROM
	student AS stu
	INNER JOIN 
		(
			SELECT 
				s_id, 
				round(avg(s_score), 2) AS avg_score 
			FROM 
				score 
			WHERE 
				s_score < 60 
			GROUP BY 
				s_id 
			HAVING 
				count(s_score) >= 2
		) AS tmp_t 
	ON 
		stu.s_id = tmp_t.s_id

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.16.SQL 16——檢索"01"課程分數(shù)小于60,按分數(shù)降序排列的學生信息

SELECT
	stu.* 
FROM
	student AS stu
	INNER JOIN score ON stu.s_id = score.s_id 
WHERE
	c_id = '01' 
	AND 
	s_score < 60 
ORDER BY
	s_score DESC

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.17.SQL 17——按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績

SELECT
	s_id,
	max(CASE c_id WHEN '01' THEN s_score ELSE 0 END) AS '01',
	max(CASE c_id WHEN '02' THEN s_score ELSE 0 END) AS '02',
	max(CASE c_id WHEN '03' THEN s_score ELSE 0 END) AS '03',
	avg(s_score) AS avg_score 
FROM
	score 
GROUP BY
	s_id 
ORDER BY
	avg_score DESC

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.18.?SQL 18——查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程名稱,最高分,最低分,平均分,及格率,中等率,優(yōu)良率,優(yōu)秀率。及格為 60-70,中等為 71-80,優(yōu)良為 81-90,優(yōu)秀為 >= 91。

SELECT
	sc.c_id AS "課程ID",
	c.c_name AS '課程名稱',
	MAX(sc.s_score) AS "最高分",
	MIN(sc.s_score) AS '最低分',
	AVG(sc.s_score) AS '平均分',
	SUM(IF (sc.s_score BETWEEN 60 AND 70, 1, 0)) / COUNT(*) as '及格率',
	SUM(IF (sc.s_score BETWEEN 71 AND 80, 1, 0)) / COUNT(*) as '中等率',
	SUM(IF (sc.s_score BETWEEN 81 AND 90, 1, 0)) / COUNT(*) as '優(yōu)良率',
	SUM(IF (sc.s_score >= 91, 1, 0)) / COUNT(*) as '優(yōu)秀率' 
FROM
	score AS sc
	JOIN course AS c ON sc.c_id = c.c_id 
GROUP BY
	sc.c_id

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.19.?SQL 19——按各科成績進行排序,并顯示排名,成績重復時合并名次

SELECT
	sc1.c_id,
	sc1.s_id,
	sc1.s_score,
	count(sc2.s_score) + 1 AS rank 
FROM
	score AS sc1 LEFT JOIN score AS sc2 
	ON sc1.s_score < sc2.s_score
	   AND sc1.c_id = sc2.c_id 
GROUP BY
	sc1.c_id,
	sc1.s_id,
	sc1.s_score 
ORDER BY
	sc1.c_id,
	rank

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.20.?SQL 20——查詢學生的總成績并進行排名,總分重復時不保留名次空缺

SELECT
    stu.s_id,
    stu.s_name,
    total_score,
    (
			SELECT COUNT(DISTINCT total_score) 
			FROM (SELECT SUM(s_score) AS total_score FROM score GROUP BY s_id) AS sub 
			WHERE total_score >= tmp.total_score
		) AS rank
FROM
    student as stu
    INNER JOIN (
        SELECT
            s_id,
            SUM(s_score) AS total_score
        FROM
            score
        GROUP BY
            s_id
    ) AS tmp ON stu.s_id = tmp.s_id
ORDER BY
    total_score DESC;

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.21.SQL 21——查詢不同老師所教不同課程平均分,并從高到低顯示

SELECT
	teacher.t_id,
	t_name,
	round(avg(s_score), 2) AS avg_score 
FROM
	teacher,
	course,
	score 
WHERE
	teacher.t_id = course.t_id 
	AND course.c_id = score.c_id 
GROUP BY
	teacher.t_id,
	t_name,
	score.c_id 
ORDER BY
	avg(score.s_score) DESC

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.22.SQL 22——查詢所有課程的成績第 2 名到第 3 名的學生信息及該課程成績

# 1.分別對每門課程進行查詢,然后再合并查詢結果,但是如果課程太多,該方法就不太合適
SELECT
	t1.* 
FROM
	(
		SELECT
			st.*,
			c.c_id,
			c.c_name,
			sc.s_score 
		FROM
			student st
			LEFT JOIN score sc ON sc.s_id = st.s_id
			INNER JOIN course c ON c.c_id = sc.c_id 
			AND c.c_id = "01" 
		ORDER BY
			sc.s_score DESC 
			LIMIT 1,
			2 
	) as t1

UNION ALL

SELECT
	t2.* 
FROM
	(
		SELECT
			st.*,
			c.c_id,
			c.c_name,
			sc.s_score 
		FROM
			student st
			LEFT JOIN score sc ON sc.s_id = st.s_id
			INNER JOIN course c ON c.c_id = sc.c_id 
			AND c.c_id = "02" 
		ORDER BY
			sc.s_score DESC 
			LIMIT 1,
			2 
	) as t2

UNION ALL

SELECT
	t3.* 
FROM
	(
		SELECT
			st.*,
			c.c_id,
			c.c_name,
			sc.s_score 
		FROM
			student st
			LEFT JOIN score sc ON sc.s_id = st.s_id
			INNER JOIN course c ON c.c_id = sc.c_id 
			AND c.c_id = "03" 
		ORDER BY
			sc.s_score DESC 
			LIMIT 1,
			2 
	) as t3

# 2.一次性查詢,需要注意的是 row_number() 在 MySQL 8.0 中才支持
SELECT
	c_id,
	student.*,
	s_score 
FROM
	student
	INNER JOIN (
			SELECT 
				s_id, 
				s_score, 
				c_id, 
				row_number() over (PARTITION BY c_id ORDER BY s_score DESC) AS rank 
			FROM 
				score
	) AS tmp_t ON tmp_t.s_id = student.s_id 
WHERE
	tmp_t.rank IN (2, 3)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.23.?SQL 23——統(tǒng)計各科成績各分數(shù)段人數(shù):課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所占百分比

SELECT
	score.c_id,
	course.c_name,
	sum(CASE WHEN s_score BETWEEN 0 AND 60 THEN 1 ELSE 0 END) AS '[0-60]人數(shù)',
	sum(CASE WHEN s_score BETWEEN 61 AND 70 THEN 1 ELSE 0 END) AS '[61-70]人數(shù)',
	sum(CASE WHEN s_score BETWEEN 71 AND 85 THEN 1 ELSE 0 END) AS '[71-85]人數(shù)',
	sum(CASE WHEN s_score BETWEEN 86 AND 100 THEN 1 ELSE 0 END) AS '[86-100]人數(shù)',
	round(sum(CASE WHEN s_score BETWEEN 0 AND 60 THEN 1 ELSE 0 END) / count(*), 2) AS '[0-60]人數(shù)所占百分比',
	round(sum(CASE WHEN s_score BETWEEN 61 AND 70 THEN 1 ELSE 0 END) / count(*), 2) AS '[61-70]人數(shù)所占百分比',
	round(sum(CASE WHEN s_score BETWEEN 71 AND 85 THEN 1 ELSE 0 END) / count(*), 2) AS '[71-85]人數(shù)所占百分比',
	round(sum(CASE WHEN s_score BETWEEN 86 AND 100 THEN 1 ELSE 0 END) / count(*), 2) AS '[86-100]人數(shù)所占百分比' 
FROM
	score LEFT JOIN course 
	ON score.c_id = course.c_id 
GROUP BY
	score.c_id,
	course.c_name

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.24.SQL 24——查詢學生平均成績及其名次

# 在 MySQL 8 中可以使用 rank 函數(shù)來實現(xiàn)排名
SELECT
    stu.s_id,
    stu.s_name,
    round(avg(sc.s_score), 2) AS average_score,
    (
		SELECT COUNT(DISTINCT avg_score) 
		FROM (SELECT AVG(s_score) AS avg_score FROM score GROUP BY s_id) AS sub 
		WHERE avg_score >= AVG(sc.s_score)
	) AS rank
FROM
    student as stu
    INNER JOIN score as sc ON stu.s_id = sc.s_id
GROUP BY
    stu.s_id,
    stu.s_name
ORDER BY
    average_score DESC;

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.25.SQL 25——查詢各科成績前三名的記錄

# 1.分別對每科進行查詢,然后再合并查詢結果,但是如果課程太多,該方法就不太合適
(SELECT c_id, s_score FROM score WHERE c_id = '01' ORDER BY s_score DESC LIMIT 3) UNION ALL
(SELECT c_id, s_score FROM score WHERE c_id = '02' ORDER BY s_score DESC LIMIT 3) UNION ALL
(SELECT c_id, s_score FROM score WHERE c_id = '03' ORDER BY s_score DESC LIMIT 3)

# 2.一次性查詢出結果
SELECT DISTINCT
	tmp_t.c_id,
	tmp_t.s_score 
FROM
	(
		SELECT DISTINCT
			student.*,
			sc1.c_id,
			sc1.s_score,
			count(DISTINCT sc2.s_score) + 1 AS rank 
		FROM
			score AS sc1
			LEFT JOIN score AS sc2 ON sc1.c_id = sc2.c_id 
			AND sc1.s_score < sc2.s_score
			LEFT JOIN student ON sc1.s_id = student.s_id 
		GROUP BY
			sc1.c_id,
			sc1.s_id 
		ORDER BY
			sc1.c_id,
			sc1.s_score DESC 
	) AS tmp_t 
WHERE
	tmp_t.rank BETWEEN 1 AND 3

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.26.SQL 26——查詢每門課程被選修的學生數(shù)

SELECT
	c_id,
	count( s_id ) AS '選修該門課程的學生數(shù)' 
FROM
	score 
GROUP BY
	c_id

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.27.SQL 27——查詢出只有兩門課程的全部學生的學號和姓名

SELECT
	student.s_id,
	student.s_name 
FROM
	student,
	score 
WHERE
	student.s_id = score.s_id 
GROUP BY
	s_id 
HAVING
	count(c_id) = 2

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.28.SQL 28——查詢男生、女生人數(shù)

SELECT
	sum(CASE WHEN s_sex = '男' THEN 1 ELSE NULL END) AS '男生人數(shù)',
	sum(CASE WHEN s_sex = '女' THEN 1 ELSE NULL END) AS '女生人數(shù)' 
FROM
	student

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.29.SQL 29——查詢名字中含有"風"字的學生信息

# 1.使用模糊匹配
SELECT
	* 
FROM
	student 
WHERE
	s_name LIKE '%風%'

# 2.使用正則表達式
SELECT
	* 
FROM
	student 
WHERE
	s_name REGEXP '風'

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

在 MySQL 中,LIKE 操作符用于在文本字段中搜索特定的模式。如果需要在文本字段中匹配通配符本身,可以使用反斜杠字符轉義通配符。例如,如果要在一個名為 ’mytable’ 的表中查找包含下劃線字符的字符串,可以使用以下查詢:
SELECT * FROM mytable WHERE mycolumn LIKE '%\_%' ESCAPE '\';
在上面的查詢中,ESCAPE 關鍵字指定了轉義字符為反斜杠,因此我們在通配符前添加了一個反斜杠字符。這將告訴 MySQL 僅匹配下劃線字符本身,而不是作為通配符進行匹配。

3.30.?SQL 30——查詢同姓名同性別學生名單,并統(tǒng)計同名人數(shù)

SELECT
	stu1.s_name,
	tmp_t.cnt AS '同名人數(shù)' 
FROM
	student AS stu1
	LEFT JOIN (
		SELECT s_name, s_sex, count(*) AS cnt 
		FROM student 
		GROUP BY s_name, s_sex
	) AS tmp_t 
	ON stu1.s_name = tmp_t.s_name AND stu1.s_sex = tmp_t.s_sex 
WHERE
	tmp_t.cnt > 1

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.31.SQL 31——查詢 1990 年出生的學生名單

# 1.使用模糊匹配
SELECT
	* 
FROM
	student 
WHERE
	s_birth LIKE '1990%'

# 2.使用正則表達式
SELECT
	* 
FROM
	student 
WHERE
	s_birth REGEXP '^1990'

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.32.?SQL 32——查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列

SELECT
	score.c_id,
	course.c_name,
	round(avg(s_score), 2) AS avg_score 
FROM
	score, course
where score.c_id = course.c_id
GROUP BY
	c_id
ORDER BY
	avg_score DESC,
	c_id ASC

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.33.SQL 33——查詢平均成績大于等于 85 的所有學生的學號、姓名和平均成績

SELECT
	student.s_id,
	student.s_name,
	round(avg(s_score), 2) AS '平均成績' 
FROM
	student
	INNER JOIN score ON student.s_id = score.s_id 
GROUP BY
	score.s_id,
	student.s_id,
	student.s_name 
HAVING
	avg(score.s_score) > 85

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.34.SQL 34——查詢課程名稱為"數(shù)學",且分數(shù)低于 60 的學生姓名和分數(shù)

SELECT
	s_name,
	s_score 
FROM
	student,
	score 
WHERE
	student.s_id = score.s_id 
	AND c_id IN (SELECT c_id FROM course WHERE c_name = '數(shù)學') 
	AND s_score < 60

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.35.SQL 35——查詢所有學生的課程及分數(shù)情況

SELECT
	student.s_id,
	student.s_name,
	course.c_name,
	score.s_score 
FROM
	student,
	course,
	score 
WHERE
	student.s_id = score.s_id 
	AND score.c_id = course.c_id 
ORDER BY
	s_id

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.36.SQL 36——查詢?nèi)魏我婚T課程成績在 70 分以上的姓名、課程名稱和分數(shù)

SELECT
	student.s_name,
	course.c_name,
	score.s_score 
FROM
	student,
	score,
	course 
WHERE
	student.s_id = score.s_id 
	AND score.c_id = course.c_id 
	AND s_score > 70

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.37.SQL 37——查詢不及格的課程的學生姓名、課程名稱和分數(shù)

SELECT
	student.s_name,
	course.c_name,
	score.s_score 
FROM
	student,
	score,
	course 
WHERE
	student.s_id = score.s_id 
	AND score.c_id = course.c_id 
	AND s_score < 60

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.38.SQL 38——查詢課程編號為 01 且課程成績在 80 分以上的學生的學號和姓名

SELECT 
	student.s_id, 
	s_name 
FROM 
	student, 
	score 
WHERE 
	student.s_id = score.s_id 
	AND c_id = '01' 
	AND s_score >= 80

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.39.SQL 39——求每門課程的學生人數(shù)

SELECT
	c_name,
	count(s_id) AS '學生人數(shù)' 
FROM
	score,
	course 
WHERE
	score.c_id = course.c_id 
GROUP BY
	score.c_id

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

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

# 這里默認的是一門老師只教授一門課程
SELECT
	student.*,
	score.s_score 
FROM
	student,
	score 
WHERE
	student.s_id = score.s_id 
	AND c_id IN (SELECT c_id FROM course WHERE t_id IN (SELECT t_id FROM teacher WHERE t_name = '張三')) 
ORDER BY
	s_score DESC 
	LIMIT 1

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.41.SQL 41——查詢不同課程成績相同的學生的學生編號、課程編號、學生成績

SELECT
	sc1.s_id,
	sc1.c_id,
	sc2.c_id,
	sc1.s_score,
	sc2.s_score 
FROM
	score AS sc1,
	score AS sc2 
WHERE
	sc1.s_id = sc2.s_id 
	AND sc1.s_score = sc2.s_score 
	AND sc1.c_id != sc2.c_id

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.42.?SQL 42——查詢每門課程成績最好的前兩名

SELECT
	sc1.c_id,
	sc1.s_id,
	count(sc2.s_score) + 1 AS rank 
FROM
	score AS sc1
	LEFT JOIN score AS sc2 ON sc1.c_id = sc2.c_id 
	AND sc1.s_score < sc2.s_score 
GROUP BY
	sc1.c_id,
	sc1.s_score,
	sc1.s_id 
HAVING
	count(sc2.s_score) < 2 
ORDER BY
	sc1.c_id,
	rank

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.43.SQL 43——統(tǒng)計每門課程的學生選修人數(shù)(超過 5 人的課程才統(tǒng)計),要求輸出課程號和選修人數(shù),查詢結果按人數(shù)降序排列,若人數(shù)相同,按課程號升序排列

SELECT 
	c_id, 
	count(*) AS '選修人數(shù)' 
FROM 
	score 
GROUP BY 
	c_id 
HAVING 
	count(*) > 5 
ORDER BY
	'選修人數(shù)' DESC,
	c_id ASC

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.44.SQL 44——查詢至少選修兩門課程的學生學號

SELECT s_id FROM score GROUP BY s_id HAVING count(c_id) >= 2

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.45.SQL 45——查詢選修了全部課程的學生信息

SELECT
	* 
FROM
	student 
WHERE
	# SELECT count(*) FROM course) 查詢的是總課程的數(shù)量
	s_id IN (SELECT s_id FROM score GROUP BY s_id HAVING count(c_id) = (SELECT count(*) FROM course))

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.46.?SQL 46——查詢各學生的年齡

# 1.按照年份來計算
SELECT
	s_id,
	s_name,
	(YEAR(now()) - YEAR(s_birth)) AS age 
FROM
	student

/*
2.使用 timestampdiff()
(1) TIMESTAMPDIFF(): 第一個參數(shù)設置時間單位,可以精確到年(YEAR)、天(DAY)、小時(HOUR),分鐘(MINUTE)和秒(SECOND)。對于比較
	的兩個時間,時間小的放在前面,時間大的放在后面。
(3) datediff(): 返回值是相差的天數(shù),無法定位到小時、分鐘和秒。
*/
SELECT
	s_id,
	s_name,
	timestampdiff(YEAR, s_birth, now()) AS age 
FROM
	student

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.47.SQL 47——查詢本周過生日的學生

# week(時間): 默認從 0 開始,表示星期天為一個星期的第一天,國外算法
# week(時間, 1): 從 1 開始,表示星期一為一個星期的第一天,國內(nèi)算法
SELECT
	s_id,
	s_name 
FROM
	student 
WHERE
	WEEK (s_birth) = WEEK (now(), 1)

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.48.SQL 48——查詢下周過生日的學生

SELECT
	s_id,
	s_name 
FROM
	student 
WHERE
	WEEK (s_birth) = WEEK (now(), 1) + 1

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.49.SQL 49——查詢本月過生日的學生

SELECT
	s_id,
	s_name 
FROM
	student 
WHERE
	MONTH (s_birth) = MONTH (now())

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題

3.50.SQL 50——查詢下月過生日的學生

SELECT 
    s_id, 
    s_name 
FROM 
    student 
WHERE 
    (MONTH(s_birth) = (((MONTH(NOW()) + 12) % 12) + 1))

sql數(shù)據(jù)庫程序題,MySQL 數(shù)據(jù)庫,MySQL,數(shù)據(jù)庫,SQL,SQL 50題文章來源地址http://www.zghlxwxcb.cn/news/detail-725438.html

到了這里,關于SQL 50 題(MySQL 版,包括建庫建表、插入數(shù)據(jù)等完整過程,適合復習 SQL 知識點)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包