一、創建四張表
Student表結構
CREATE TABLE `student` (
`S` varchar(10) NOT NULL,
`Sname` varchar(10) DEFAULT NULL,
`Sage` varchar(10) DEFAULT NULL,
`Ssex` varchar(10) DEFAULT NULL,
PRIMARY KEY (`S`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
SC表結構
CREATE TABLE `sc` (
`S` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`C` varchar(10) DEFAULT NULL,
`score` int(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
teacher表結構
CREATE TABLE `teacher` (
`T` varchar(10) NOT NULL,
`Tname` varchar(10) DEFAULT NULL,
PRIMARY KEY (`T`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
course表結構
CREATE TABLE `course` (
`C` varchar(10) NOT NULL,
`Cname` varchar(10) DEFAULT NULL,
`T` varchar(10) DEFAULT NULL,
PRIMARY KEY (`C`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
二、基本sql語句,涵蓋常用
1.查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
SELECT sc.s, AVG(sc.score) avg_score from sc group by s; #第一步:操作sc成績表,sc成績表按照s去重後,求平均值賦給字段avg_score,產生出一個新表
SELECT *from (select sc.s, AVG(sc.score) avg_score from sc group by s) A LEFT JOIN student B on A.s = B.s WHERE A.avg_score>=60; #第二步:將sc去重後的新表A和student表B做左連接,產生出一個總表
SELECT A.s, A.avg_score,B.Sname from (select sc.s, AVG(sc.score) avg_score from sc group by s) A LEFT JOIN student B on A.s = B.s WHERE A.avg_score>=60; #第三步:左連接後產生的總表,取出所需字段
2.查詢1990年出生的學生數量
SELECT COUNT(student.S) FROM student WHERE student.Sage LIKE '%1990%';
3.查詢"01"課程比"02"課程成績低的學生的信息及課程分數
SELECT *FROM sc WHERE sc.c='01'; #第一步:從sc表查詢01課程的所有信息
SELECT *FROM sc WHERE sc.c='02'; #第二步:從sc表查詢02課程的所有信息
SELECT a.s,a.score,b.score FROM (SELECT *FROM sc WHERE sc.c='01') a LEFT JOIN (SELECT *FROM sc WHERE sc.c='02') b on a.s=b.s WHERE a.score<b.score; #第三步:將上述兩張表連接起來,做判斷取字段
4.查詢sc表不存在成績的學生姓名
SELECT DISTINCT(sc.s) FROM sc; #第一步:sc表按照s字段去重
SELECT student.Sname FROM student WHERE student.S NOT IN (SELECT DISTINCT(sc.s) FROM sc); #第二步:查詢student表中s字段不存在第一步中的
5.查詢學過"張三"老師授課的學生姓名
SELECT teacher.T FROM teacher WHERE teacher.Tname='張三' #第一步:從teacher表中查找張三對應的課程編號
SELECT sc.S FROM sc WHERE sc.C = (SELECT teacher.T FROM teacher WHERE teacher.Tname='張三'); #第二步:從sc表中查有這個課程編號的學生編號
SELECT student.Sname FROM student WHERE student.S IN (SELECT sc.S FROM sc WHERE sc.C = (SELECT teacher.T FROM teacher WHERE teacher.Tname='張三')); #第三步:從student表中查詢學生編號存在第二步中的學生名稱
6.查詢01課程分數大於60分的按分數降序排序,前3條(基本查詢)
SELECT *FROM sc WHERE sc.score>60 AND sc.C='01' ORDER BY sc.score DESC LIMIT 3;
7.查詢學過“張三”老師授課的最高成績學生姓名和分數
方法一:SELECT MAX(a.score) FROM (SELECT sc.S,sc.score FROM sc WHERE sc.C = (SELECT teacher.T FROM teacher WHERE teacher.Tname='張三')) a LEFT JOIN student b ON a.s=b.s; #按照5進行分析,將5中第二步的表和student表連接,連接後直接查最大score
方法二:SELECT a.score,b.Sname,b.s FROM (SELECT sc.S,sc.score FROM sc WHERE sc.C = (SELECT teacher.T FROM teacher WHERE teacher.Tname='張三')) a LEFT JOIN student b ON a.s=b.s ORDER BY score DESC LIMIT 1; #按照5進行分析,將5中第二步的表和student表連接,連接後按score的字段進行降序排序,取第一條
8.基礎insert,updata,delete
UPDATE sc SET score='90' WHERE sc.s='01' AND sc.c='01';
INSERT INTO teacher (T,Tname) VALUES ('04','鄭六'); #注意table名稱,key都不需要引號,不然會報錯
DELETE FROM teacher WHERE t='04'