这周开始徒手练习sql语句 对着上篇的sql学习路径跟上一遍
现在上建表sql语句
|
|
|
SELECT * FROM SC -- class number SELECT SNO,COUNT(*) AS class_num,SUM(score) AS total_sum FROM SC GROUP BY SNO -- grade SELECT DISTINCT SC.SNO, Sname, B.class_num, B.total_sum FROM Student JOIN SC ON SC.SNO = Student.SNO JOIN (SELECT SNO, COUNT(*) AS class_num, SUM(score) AS total_sum FROM SC GROUP BY SNO) AS B ON B.SNO = Student.SNO
SELECT * FROM Teacher SELECT COUNT(*) FROM Teacher WHERE Tname LIKE '李%'
-- 要筛选目标 --学过老师的课的学号 姓名
-- 1001 02 03 04 05 07
SELECT SC.SNO FROM Course AS CO JOIN Teacher AS TA ON CO.TNO = TA.TNO JOIN SC ON SC.CNO = CO.CNO WHERE Tname = '叶平' -- 逻辑不对 找对应的 SELECT * FROM Student JOIN SC ON SC.SNO = Student.`SNO` WHERE SC.`CNO` != 002 SELECT DISTINCT Student.SNO, Sname FROM Student JOIN SC ON SC.SNO = Student.`SNO` WHERE SC.SNO NOT IN (SELECT SC.SNO FROM Course AS CO JOIN Teacher AS TA ON CO.TNO = TA.TNO JOIN SC ON SC.CNO = CO.CNO WHERE Tname = '叶平')
SELECT * FROM Student JOIN SC ON SC.SNO = Student.SNO WHERE CNO = '001' AND SC.SNO IN (SELECT SC.SNO FROM SC WHERE CNO = '002')
SELECT TNO FROM Teacher WHERE Tname = '叶平' SELECT SC.`SNO`, ST.Sname FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO JOIN Teacher AS TA ON TA.TNO = CO.TNO JOIN Student AS ST ON ST.SNO = SC.SNO WHERE TA.TNO = (SELECT TNO FROM Teacher WHERE Tname = '叶平')
SELECT * FROM SC WHERE CNO='002' SNO CNO score 1001 002 90.0 1002 002 68.0 1003 002 84.0 1004 002 35.0 1005 002 87.0 1007 002 89.0 SELECT * FROM SC WHERE CNO='001' SNO CNO score 1001 001 80.0 1002 001 73.0 1003 001 85.0 1004 001 59.0 1005 001 76.0 1006 001 31.0 1007 001 82.0 SELECT ST.Sname, SC.SNO FROM SC JOIN Student AS ST ON ST.SNO = SC.SNO WHERE CNO = '002' AND SCORE <ANY (SELECT SCORE FROM SC WHERE CNO = '001')
SELECT DISTINCT ST.SNO,ST.SNAME FROM SC JOIN Student AS ST ON ST.SNO = SC.SNO WHERE SCORE <60
SELECT ST.SNO,ST.SNAME FROM SC JOIN Student AS ST ON ST.SNO = SC.SNO GROUP BY ST.SNO HAVING COUNT(SC.`CNO`) <(SELECT COUNT(*) FROM Course)
SELECT DISTINCT ST.SNO,ST.SNAME FROM Student AS ST JOIN SC ON SC.SNO = ST.SNO WHERE CNO IN ( SELECT CNO FROM SC WHERE SC.`SNO` = '1001' )
SELECT AVG(SCORE) FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO JOIN Teacher AS TA ON TA.TNO = CO.TNO WHERE TA.TNAME = '叶平'
-- 分解成 数目和 CNO都相同
SELECT ST.SNAME,ST.SNO FROM SC JOIN Student AS ST ON SC.SNO = ST.SNO WHERE SC.CNO IN (
SELECT CNO FROM SC WHERE SNO = '1002' ) GROUP BY SNO HAVING COUNT(*) IN (SELECT COUNT(*) FROM SC WHERE SNO = '1002')
-- ERROR
SELECT * FROM SC WHERE CNO = '002' DELETE FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO JOIN Teacher AS TA ON TA.TNO = CO.TNO WHERE TNAME = '叶平' SELECT * FROM SC,Course,Teacher WHERE Course.`CNO`=SC.`CNO` AND Course.`TNO` = Teacher.`TNO` AND Tname='叶平' DELETE SC FROM Course,Teacher WHERE Course.`CNO`=SC.`CNO` AND Course.`TNO` = Teacher.`TNO` AND Tname='叶平' UNKNOWN TABLE 'SC' IN MULTI DELETE
-- 先建表 后删表中数据
CREATE TABLE TMP AS SELECT DISTINCT SC.CNO FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO JOIN Teacher AS TA ON TA.TNO = CO.TNO WHERE TNAME = '叶平' -- SELECT * FROM TMP DELETE FROM SC WHERE CNO = (SELECT CNO FROM TMP)
SELECT SC.`CNO` AS '课程班级号',CO.CNAME AS '课程名称',AVG(SC.SCORE)AS '均分',TA.TNAME AS '教师姓名' FROM SC JOIN Course AS CO ON CO.CNO = SC.`CNO` JOIN Teacher AS TA ON TA.TNO = CO.TNO GROUP BY SC.CNO ORDER BY AVG(SCORE) DESC
-- note: insert 和 select的嵌套使用
-- 上过003号课程的同学学号 -- 搞定没上过的同学学号
SELECT DISTINCT SNO FROM SC WHERE SNO NOT IN ( SELECT DISTINCT SNO FROM SC WHERE CNO='003') INSERT SC SELECT SNO, '002', (SELECT AVG(SCORE) FROM SC WHERE CNO = '002' GROUP BY CNO) FROM Student WHERE SNO NOT IN (SELECT DISTINCT SNO FROM SC WHERE CNO = '003')
SELECT SNO,CNO,SCORE FROM SC WHERE CNO = '004' SELECT SNO,CNO,SCORE FROM SC WHERE CNO = '001' SELECT SNO,CNO,SCORE FROM SC WHERE CNO = '006' -- 有难度题 总结在 查单个的时候 记得要和外面的表进行关联 否则无法出来结果 SELECT SNO AS '学生ID', (SELECT SCORE FROM SC WHERE CNO = '004' AND SC.SNO = T.SNO) AS '数据库', (SELECT SCORE FROM SC WHERE CNO = '001' AND SC.SNO = T.SNO) AS ' 企业管理 ', (SELECT SCORE FROM SC WHERE CNO = '006' AND SC.SNO = T.SNO) AS '英语', COUNT(*) AS ' 有效课程数 ', AVG(T.SCORE) AS ' 平均成绩 ' FROM SC AS T GROUP BY T.SNO ORDER BY AVG(T.SCORE) 学生ID 数据库 企业管理 英语 有效课程数 平均成绩 1006 72.0 31.0 \N 3 45.66667 1004 \N 59.0 59.0 3 47.33333 1005 \N 76.0 \N 2 72.50000 1002 69.0 73.0 \N 3 76.66667 1001 69.0 80.0 91.0 5 81.60000 1003 \N 85.0 \N 3 81.66667 1007 93.0 82.0 \N 3 91.00000
-- 先查最高分和最低分表 再连接起来即可
SELECT CNO,MAX(SCORE) FROM SC GROUP BY CNO SELECT CNO,MIN(SCORE) FROM SC GROUP BY CNO SELECT SC.CNO AS '课程ID', MAX_SC AS '最高分', MIN_SC AS '最低分' FROM SC JOIN (SELECT CNO, MAX(SCORE) AS MAX_SC FROM SC GROUP BY CNO) AS L ON L.CNO = SC.CNO JOIN (SELECT CNO, MIN(SCORE) AS MIN_SC FROM SC GROUP BY CNO) AS R ON R.CNO = SC.`CNO` GROUP BY SC.CNO
-- NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果。将NULL显示为0
-- case when then else end用法举例
-- 简单Case函数 when
-- 及格率查询 常用函数 case when
有难度题目
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END -- Case搜索函数 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END -- ------------------------------- SELECT COUNT(*),CNO FROM SC GROUP BY CNO SELECT COALESCE(AVG(SCORE),0) FROM SC GROUP BY CNO ORDER BY AVG(SCORE) SELECT COUNT(*) FROM SC GROUP BY CNO -- -------------------------------- SELECT CNO AS '科目编号', AVG(SCORE) AS '平均分', SUM( CASE WHEN IFNULL(SCORE, 0) >= 60 THEN 1 ELSE 0 END ) / COUNT(*) AS '科目及格率' FROM SC GROUP BY CNO ORDER BY SUM( CASE WHEN IFNULL(SCORE, 0) >= 60 THEN 1 ELSE 0 END ) / COUNT(*) DESC-- 科目编号 平均分 科目及格率 005 74.33333 1.0000 004 75.75000 1.0000 002 75.50000 0.8333 001 69.42857 0.7143 003 69.66667 0.6667 006 75.00000 0.5000 SELECT * FROM Course CNO Cname TNO 001 企业管理 02 002 马克思 01 003 OO&UML 04 004 数据库 03 005 数据分析 06 006 英语 05
SELECT SUM(CASE WHEN SC.CNO = '001' THEN SC.SCORE ELSE 0 END)/SUM(CASE WHEN SC.CNO='001' THEN 1 ELSE 0 END) AS '企业管理平均成绩', SUM(CASE WHEN SC.CNO = '001' AND IFNULL(SC.SCORE,0)>=60 THEN 1 ELSE 0 END)/SUM(CASE WHEN SC.CNO='001' THEN 1 ELSE 0 END)||'%' AS '企业管理及格率', SUM(CASE WHEN SC.CNO = '002' THEN SC.SCORE ELSE 0 END)/SUM(CASE WHEN SC.CNO='002' THEN 1 ELSE 0 END) AS '马克思平均成绩', SUM(CASE WHEN SC.CNO = '002' AND IFNULL(SC.SCORE,0)>=60 THEN 1 ELSE 0 END)/SUM(CASE WHEN SC.CNO='002' THEN 1 ELSE 0 END)||'%' AS '马克思及格率', SUM(CASE WHEN SC.CNO = '003' THEN SC.SCORE ELSE 0 END)/SUM(CASE WHEN SC.CNO='003' THEN 1 ELSE 0 END) AS 'OO&UML平均成绩', SUM(CASE WHEN SC.CNO = '003' AND IFNULL(SC.SCORE,0)>=60 THEN 1 ELSE 0 END)/SUM(CASE WHEN SC.CNO='003' THEN 1 ELSE 0 END)||'%' AS 'OO&UML及格率', SUM(CASE WHEN SC.CNO = '004' THEN SC.SCORE ELSE 0 END)/SUM(CASE WHEN SC.CNO='004' THEN 1 ELSE 0 END) AS '数据库平均成绩', SUM(CASE WHEN SC.CNO = '004' AND IFNULL(SC.SCORE,0)>=60 THEN 1 ELSE 0 END)/SUM(CASE WHEN SC.CNO='004' THEN 1 ELSE 0 END)||'%' AS '数据库及格率', SUM(CASE WHEN SC.CNO = '005' THEN SC.SCORE ELSE 0 END)/SUM(CASE WHEN SC.CNO='005' THEN 1 ELSE 0 END) AS '数据分析平均成绩', SUM(CASE WHEN SC.CNO = '005' AND IFNULL(SC.SCORE,0)>=60 THEN 1 ELSE 0 END)/SUM(CASE WHEN SC.CNO='005' THEN 1 ELSE 0 END)||'%' AS '数据分析及格率', SUM(CASE WHEN SC.CNO = '006' THEN SC.SCORE ELSE 0 END)/SUM(CASE WHEN SC.CNO='006' THEN 1 ELSE 0 END) AS '英语平均成绩', SUM(CASE WHEN SC.CNO = '006' AND IFNULL(SC.SCORE,0)>=60 THEN 1 ELSE 0 END)/SUM(CASE WHEN SC.CNO='006' THEN 1 ELSE 0 END)||'%' AS '英语及格率' FROM SC 企业管理平均成绩 企业管理及格率 马克思平均成绩 马克思及格率 OO&UML平均成绩 OO&UML及格率 数据库平均成绩 数据库及格率 数据分析平均成绩 数据分析及格率 英语平均成绩 英语及格率 69.42857 0.7143 75.50000 0.8750 69.66667 0.6667 75.75000 1.0000 74.33333 1.0000 75.00000 0.5000
SELECT MAX(TA.TNO) AS '教师ID',MAX(TA.TNAME) AS '教师姓名',SC.CNO AS '课程ID',MAX(CO.CNAME) AS '课程名称',IFnullAVG(SC.`score`) AS '平均成绩' FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO JOIN Teacher AS TA ON TA.TNO = CO.TNO GROUP BY SC.`CNO` ORDER BY AVG(SC.`score`) DESC
-- 学生ID 学生姓名 企业管理 马克思 OO&UML 数据库 数据分析 英语 平均成绩
SELECT * FROM SC WHERE CNO = '001' GROUP BY SNO ORDER BY SCORE DESC SELECT * FROM SC WHERE CNO = '002' GROUP BY SNO ORDER BY SCORE DESC SELECT * FROM SC WHERE CNO = '003' GROUP BY SNO ORDER BY SCORE DESC SELECT * FROM SC WHERE CNO = '004' GROUP BY SNO ORDER BY SCORE DESC SELECT * FROM SC WHERE CNO = '005' GROUP BY SNO ORDER BY SCORE DESC SELECT * FROM SC WHERE CNO = '006' GROUP BY SNO ORDER BY SCORE DESC SELECT SC.SNO AS '学生ID', ST.`Sname` AS '学生姓名', A_001.SCORE AS '企业管理', A_002.SCORE AS '马克思', A_003.SCORE AS 'OO&UML', A_004.SCORE AS '数据库', A_005.SCORE AS '数据分析', A_006.SCORE AS '英语', AVG(SC.SCORE) AS '平均分' FROM SC JOIN Student AS ST ON ST.SNO = SC.SNO LEFT JOIN (SELECT * FROM SC WHERE CNO = '001' GROUP BY SNO ORDER BY SCORE DESC) AS A_001 ON A_001.SNO = SC.SNO LEFT JOIN (SELECT * FROM SC WHERE CNO = '002' GROUP BY SNO ORDER BY SCORE DESC) AS A_002 ON A_002.SNO = SC.SNO LEFT JOIN (SELECT * FROM SC WHERE CNO = '003' GROUP BY SNO ORDER BY SCORE DESC) AS A_003 ON A_003.SNO = SC.SNO LEFT JOIN (SELECT * FROM SC WHERE CNO = '004' GROUP BY SNO ORDER BY SCORE DESC) AS A_004 ON A_004.SNO = SC.SNO LEFT JOIN (SELECT * FROM SC WHERE CNO = '005' GROUP BY SNO ORDER BY SCORE DESC) AS A_005 ON A_005.SNO = SC.SNO LEFT JOIN (SELECT * FROM SC WHERE CNO = '006' GROUP BY SNO ORDER BY SCORE DESC) AS A_006 ON A_006.SNO = SC.SNO GROUP BY SC.SNO
SELECT CNO,COUNT(*) FROM SC WHERE SCORE >= 85 GROUP BY CNO SELECT CNO,COUNT(*) FROM SC WHERE SCORE <85 AND SCORE >= 70 GROUP BY CNO SELECT CNO,COUNT(*) FROM SC WHERE SCORE <70 AND SCORE >= 60 GROUP BY CNO SELECT CNO,COUNT(*) FROM SC WHERE SCORE <60 GROUP BY CNO SELECT SC.`CNO`,CO.`Cname`,SC85.NUM AS '[100-85]',SC70.NUM AS '[85-70]',SC60.NUM AS '[70-60]',SCL60.NUM AS '[<60]' FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO LEFT JOIN (SELECT CNO,COUNT(*) AS NUM FROM SC WHERE SCORE >= 85 GROUP BY CNO ) AS SC85 ON SC.CNO = SC85.CNO LEFT JOIN (SELECT CNO,COUNT(*)AS NUM FROM SC WHERE SCORE <85 AND SCORE >= 70 GROUP BY CNO ) AS SC70 ON SC.CNO = SC70.CNO LEFT JOIN (SELECT CNO,COUNT(*)AS NUM FROM SC WHERE SCORE <70 AND SCORE >= 60 GROUP BY CNO ) AS SC60 ON SC.CNO = SC60.CNO LEFT JOIN (SELECT CNO,COUNT(*)AS NUM FROM SC WHERE SCORE <60 GROUP BY CNO ) AS SCL60 ON SC.CNO = SCL60.CNO GROUP BY SC.CNO CNO Cname [100-85] [85-70] [70-60] [<60] 001 企业管理 1 4 \N 2 002 马克思 3 1 1 1 003 OO&UML 3 1 \N 2 004 数据库 1 1 2 \N 005 数据分析 1 \N 2 \N 006 英语 1 \N \N 1
-- 排名问题 设置函数得
-- 解决问题:
SELECT (@rownum:=@rownum + 1) AS rank,A.AVG_SC FROM ( SELECT AVG(SCORE) AS AVG_SC FROM SC GROUP BY SNO ORDER BY AVG_SC DESC ) AS A ,(SELECT @rownum:=0) AS r
-- 注意格式 使用UNION
SELECT * FROM SC WHERE CNO = '001' UNION SELECT * FROM SC WHERE CNO = '002' (SELECT CO.Cname,SC.SCORE FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO WHERE SC.CNO = '001' ORDER BY SC.SCORE DESC LIMIT 0,3) UNION (SELECT CO.Cname,SC.SCORE FROM SC AS SC JOIN Course AS CO ON CO.CNO = SC.CNO WHERE SC.CNO = '002' ORDER BY SC.SCORE DESC LIMIT 0,3) UNION ALL (SELECT CO.Cname,SCORE FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO WHERE SC.CNO = '003' ORDER BY SCORE DESC LIMIT 0,3) UNION (SELECT CO.Cname,SCORE FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO WHERE SC.CNO = '004' ORDER BY SCORE DESC LIMIT 0,3) UNION (SELECT CO.Cname,SCORE FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO WHERE SC.CNO = '005' ORDER BY SCORE DESC LIMIT 0,3) UNION (SELECT CO.Cname,SCORE FROM SC JOIN Course AS CO ON CO.CNO = SC.CNO WHERE SC.CNO = '006' ORDER BY SCORE DESC LIMIT 0,3)
SELECT COUNT(*) AS '选修人数' FROM SC GROUP BY CNO
SELECT SNO,COUNT(*) FROM SC GROUP BY SNO HAVING COUNT(*) = 1
--
SELECT ST.SNO,ST.SNAME FROM SC JOIN Student AS ST ON ST.SNO = SC.SNO GROUP BY ST.SNO HAVING COUNT(*) = (SELECT COUNT(*) FROM SC GROUP BY SNO HAVING COUNT(*) = 1 )
SELECT COUNT(*) FROM Student AS ST WHERE SSEX = '男' SELECT COUNT(*) FROM Student AS ST WHERE SSEX = '女'
SELECT * FROM Student AS ST WHERE Sname LIKE '李%'
SELECT Sname,COUNT(*) FROM Student GROUP BY SNO HAVING COUNT(*) > 1
SELECT Sname,YEAR(SAGE) AS '出生名单' FROM Student WHERE YEAR(SAGE) = 1996 SELECT * FROM Student
SELECT CNO AS '课程编号',AVG(SCORE) AS '平均成绩' FROM SC GROUP BY CNO ORDER BY AVG(SCORE),CNO DESC