了解SQL語(yǔ)句中關(guān)鍵字的書(shū)寫(xiě)順序與執(zhí)行順序十分重要,這十分有利于我們編寫(xiě)與理解SQL語(yǔ)句。
關(guān)鍵字書(shū)寫(xiě)順序(由上至下):
select
distinct
from
join
on
where
group by
having
union (all)
order by
limit
關(guān)鍵字執(zhí)行順序(由上至下):
from
on
join
where
group by
having
select
distinct
union (all)
order by
limit
筆試一
創(chuàng)建表數(shù)據(jù)
/* 學(xué)生表 */
CREATE TABLE Student(
s_id VARCHAR(20), /* 學(xué)生ID */
s_name VARCHAR(20) NOT NULL DEFAULT '', /* 學(xué)生姓名 */
s_birth VARCHAR(20) NOT NULL DEFAULT '', /* 出生日期 */
s_sex VARCHAR(10) NOT NULL DEFAULT '', /* 學(xué)生性別 */
PRIMARY KEY(s_id)
);
/* 課程表 */
CREATE TABLE Course(
c_id VARCHAR(20), /* 課程ID */
c_name VARCHAR(20) NOT NULL DEFAULT '', /* 課程名稱 */
t_id VARCHAR(20) NOT NULL, /* 教師ID */
PRIMARY KEY(c_id)
);
/* 教師表 */
CREATE TABLE Teacher(
t_id VARCHAR(20), /* 教師ID */
t_name VARCHAR(20) NOT NULL DEFAULT '', /* 教師姓名*/
PRIMARY KEY(t_id)
);
/* 成績(jī)表 */
CREATE TABLE `Score`(
s_id VARCHAR(20), /* 學(xué)生ID */
c_id VARCHAR(20), /* 課程ID */
s_score INT(3), /* 成績(jī)值 */
PRIMARY KEY(s_id,c_id)
);
/* 以下為測(cè)試數(shù)據(jù) */
truncate table teacher ;
truncate table student;
truncate table course;
truncate table score ;
insert into teacher values(1, '蒼老師');
insert into teacher values(2, '羅老師');
insert into teacher values(3, '武老師');
insert into student values(1, '李磊', '2001-01-01', '男');
insert into student values(2, '韓梅梅', '2001-01-01', '女');
insert into student values(3, '吉姆', '2001-01-01', '男');
insert into student values(4, '莉莉', '2001-01-01', '女');
insert into student values(5, '露西', '2001-01-01', '女');
insert into student values(6, '李明', '2001-01-01', '男');
insert into student values(7, '王大叔', '2001-01-01', '男');
insert into student values(8, '蘇珊', '2001-01-01', '女');
insert into course values(1, '生理衛(wèi)生', 1);
insert into course values(2, '法外狂徒', 2);
insert into course values(3, '維修電腦', 3);
insert into score values(4, 2, 55);
insert into score values(5, 1, 83);
insert into score values(3, 2, 38);
insert into score values(1, 2, 23);
insert into score values(8, 2, 75);
insert into score values(8, 1, 90);
insert into score values(3, 1, 42);
insert into score values(4, 3, 80);
insert into score values(6, 1, 60);
insert into score values(1, 3, 98);
insert into score values(2, 2, 100);
insert into score values(6, 3, 26);
insert into score values(4, 1, 91);
insert into score values(7, 1, 33);
insert into score values(5, 3, 50);
insert into score values(7, 3, 83);
insert into score values(7, 2, 64);
insert into score values(3, 3, 97);
insert into score values(5, 2, 33);
insert into score values(6, 2, 79);
insert into score values(2, 1, 99);
insert into score values(2, 3, 24);
insert into score values(8, 3, 78);
題目一:
查詢兩門以上不及格課程的同學(xué)的學(xué)號(hào),姓名及其平均成績(jī)。
思路:
首先通過(guò)子查詢?cè)诔煽?jī)表(score)中過(guò)濾出有兩門以上不及格課程的同學(xué)的學(xué)號(hào)(s_id),之后通過(guò)學(xué)號(hào)(s_id)完成成績(jī)表(score)與子查詢和學(xué)生表(student)的關(guān)聯(lián),再根據(jù)每個(gè)學(xué)號(hào)(s_id)進(jìn)行分組展示。
SQL語(yǔ)句:
SELECT
score.s_id AS '學(xué)號(hào)',
student.s_name AS '姓名',
AVG( score.s_score ) AS '平均成績(jī)'
FROM
score
JOIN ( SELECT score.s_id FROM score WHERE score.s_score < 60 GROUP BY score.s_id HAVING COUNT( score.s_id ) >= 2 ) AS querySID ON score.s_id = querySID.s_id
JOIN student ON score.s_id = student.s_id
GROUP BY
score.s_id
ORDER BY
score.s_id DESC;
結(jié)果:
題目二:
統(tǒng)計(jì)每門課程的學(xué)生選修人數(shù)(超過(guò)2人的課程才統(tǒng)計(jì)),輸出課程號(hào)、課程名和選修人數(shù),查詢結(jié)果按人數(shù)降序排序,若人數(shù)相同,按課程號(hào)升序排序。
思路:
通過(guò)課程號(hào)(c_id)關(guān)聯(lián)成績(jī)表(score)與課程表(course),成績(jī)表(score)中同一課程號(hào)(c_id)出現(xiàn)的次數(shù)代表了蓋課程的選修人數(shù),通過(guò)HAVING過(guò)濾超過(guò)2人的課程并分組展示排序后的結(jié)果。
SQL語(yǔ)句:
SELECT
course.c_id AS '課程號(hào)',
course.c_name AS '課程名',
COUNT( score.c_id ) AS '選修人數(shù)'
FROM
course
JOIN score ON course.c_id = score.c_id
GROUP BY
score.c_id
HAVING
COUNT( score.c_id ) > 2
ORDER BY
COUNT( score.c_id ) DESC,
course.c_id ASC;
題目三:
使用分段[100-85],[85-70],[70-60],[不及格]來(lái)統(tǒng)計(jì)各科成績(jī),分別統(tǒng)計(jì)各分?jǐn)?shù)段人數(shù)、課程號(hào)和課程名稱。
思路:
首先在成績(jī)表(score)中,通過(guò)課程號(hào)(c_id)分組查詢出該課程每個(gè)分?jǐn)?shù)段的成績(jī)數(shù)量(其中通過(guò)IF函數(shù),以成績(jī)區(qū)間作為判斷條件,并返回指定值0或1,通過(guò)SUM求和),并將該查詢結(jié)果與課程表(course)通過(guò)課程號(hào)(c_id)關(guān)聯(lián)。
SQL語(yǔ)句:
SELECT
course.c_id AS '課程號(hào)',
course.c_name AS '課程名稱',
score_result.`100-85`,
score_result.`85-70`,
score_result.`70-60`,
score_result.`不及格`
FROM
course
JOIN (
SELECT
score.c_id,
SUM(
IF
( score.s_score BETWEEN 85 AND 100, 1, 0 )) AS '100-85',
SUM(
IF
( score.s_score BETWEEN 70 AND 85, 1, 0 )) AS '85-70',
SUM(
IF
( score.s_score BETWEEN 60 AND 70, 1, 0 )) AS '70-60',
SUM(
IF
( score.s_score < 60, 1, 0 )) AS '不及格'
FROM
score
GROUP BY
score.c_id
) AS score_result ON course.c_id = score_result.c_id;
題目四:
查詢不同老師所教不同課程平均分從高到低顯示。
思路:
通過(guò)教師號(hào)(t_id)關(guān)聯(lián)教師表(teacher)與課程表(course),再通過(guò)課課程號(hào)(c_id)關(guān)聯(lián)成績(jī)表(score),之后根據(jù)不同老師所教不同課程分組展示平均成績(jī)并排序。
SQL語(yǔ)句:
SELECT
teacher.t_name AS '教師',
course.c_name AS '課程',
AVG( score.s_score ) AS '平均值'
FROM
teacher
JOIN course ON teacher.t_id = course.t_id
JOIN score ON course.c_id = score.c_id
GROUP BY
teacher.t_name,
course.c_name
Order BY
AVG( score.s_score ) DESC;
題目五:
查詢平均成績(jī)大于60的所有學(xué)生的學(xué)號(hào)、姓名和平均成績(jī)。
思路:
通過(guò)學(xué)號(hào)(s_id)關(guān)聯(lián)學(xué)生表(student)與成績(jī)表(score),并通過(guò)學(xué)號(hào)分組,通過(guò)HAVING過(guò)濾后,降序展示查詢的數(shù)據(jù)。
SQL語(yǔ)句:
SELECT
student.s_id AS '學(xué)號(hào)',
student.s_name AS '姓名',
AVG( score.s_score ) AS '平均成績(jī)'
FROM
student
JOIN score ON student.s_id = score.s_id
GROUP BY
student.s_id
HAVING
AVG( score.s_score ) > 60
ORDER BY
student.s_id DESC;