diff --git "a/13 \345\274\240\345\276\267\345\272\267/20230301 \350\201\224\350\241\250\346\237\245\350\257\242.md" "b/13 \345\274\240\345\276\267\345\272\267/20230301 \350\201\224\350\241\250\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..f0e9d24af388c3f073e3b6360bb1c39382ef7ff5 --- /dev/null +++ "b/13 \345\274\240\345\276\267\345\272\267/20230301 \350\201\224\350\241\250\346\237\245\350\257\242.md" @@ -0,0 +1,183 @@ +# 联表查询 + +### 1.常用分组函数 + +``` +avg 求平均值 +sum 求总和 +max 求最大值 +min 求最小值 +count 统计总数 +``` + +### 2.内连接 + +1. 格式:inner join 表 on +2. 左连接:A left join B on +3. 右连接:A right join B on + +### 3.select子句 + +1. from:从哪些表中筛选 + + ``` + SELECT * + FROM t_employee; #表示从某个表中筛选数据 + ``` + + + +2. on:关联多表查询时,去除笛卡尔积 + + ``` + */ + SELECT * + FROM t_employee INNER JOIN t_department + ON t_employee.did = t_department.did; #1个关联条件 + ``` + + + +3. where:从表中筛选的条件 + + ``` + x #3、where子句,在查询结果中筛选#查询女员工的信息,以及女员工的部门信息SELECT *FROM t_employee INNER JOIN t_departmentON t_employee.did = t_department.didWHERE gender = '女'; + ``` + + + +4. group by:分组依据 + + ``` + #查询每一个部门的平均薪资 + SELECT did,ROUND(AVG(salary),2 ) + FROM t_employee + GROUP BY did; + ``` + + + +5. having:在统计结果中再次筛选(with rollup) + + + +6. order by:排序 + + ``` + #查询员工信息,按照薪资从高到低 + SELECT * FROM t_employee + ORDER BY salary DESC; + ``` + + + +7. limit:分页 + + ``` + limit子句是用于分页显示结果。 + limit m,n + n:表示最多该页显示几行 + m:表示从第几行开始取记录,第一个行的索引是0 + m = (page-1)*n page表示第几页 + + 每页最多显示5条,n=5 + 第1页,page=1,m = (1-1)*5 = 0; limit 0,5 + 第2页,page=2,m = (2-1)*5 = 5; limit 5,5 + 第3页,page=3,m = (3-1)*5 = 10; limit 10,5 + ``` + + + +# 作业 + +```sql +-- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ +SELECT student.Sname,student.Ssex,course.Cname FROM student +inner JOIN score on student.Sno=score.Sno +inner join course on course.Cno=score.Cno +; +-- 2,查询没有学生的教师的所有信息 +SELECT + distinct * +FROM + teacher + left JOIN course ON teacher.Tno = course.Tno + left JOIN score ON score.Cno = course.Cno + where score.Sno is null + ; +-- ① 查询Score表中的最高分的学生学号和课程号。 +SELECT Sno,Cno,MAX(Degree) FROM score; +-- ② 查询所有学生的Sname、Cno和Degree列。 +SELECT + Sname, + Cno, + Degree +FROM + student + LEFT JOIN score ON student.Sno = score.Sno; +-- ③ 查询所有学生的Sno、Cname和Degree列。 +SELECT + student.Sno,Sname,degree FROM student + inner JOIN score ON student.Sno = score.Sno; +-- ④ 查询所有学生的Sname、Cname和Degree列。 +SELECT + Sname,Cname,Degree FROM student + inner JOIN score ON student.Sno = score.Sno + INNER JOIN course on score.Cno=course.Cno + ; +-- ⑤ 查询“95033”班学生的平均分。 +SELECT + avg(Degree) FROM student + inner JOIN score ON student.Sno = score.Sno + where class=95033 + ; +-- ⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 +SELECT * FROM score WHERE Degree>(SELECT Degree FROM score WHERE Sno='109'AND Cno='3-105')and Cno='3-105'; +-- ⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 +-- ⑧ 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 +SELECT * FROM score WHERE Degree>(SELECT Degree FROM score WHERE Sno='109'AND Cno='3-105')and Cno='3-105'; +-- ⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 +SELECT Sno,Sname,Sbirthday FROM student WHERE year(Sbirthday)=(SELECT YEAR(Sbirthday) FROM student WHERE Sno='108'); +-- ⑩ 查询“张旭“教师任课的学生成绩。 +SELECT score.Degree FROM teacher +INNER JOIN course on teacher.Tno=course.Tno +INNER JOIN score ON course.Cno=score.Cno +WHERE Tname='张旭' +; +-- 11 查询选修某课程的同学人数多于5人的教师姓名。 +-- 12 查询出“计算机系“教师所教课程的成绩表。 +SELECT score.Degree FROM teacher +INNER JOIN course ON teacher.Tno=course.Tno +INNER JOIN score ON course.Cno=score.Cno +WHERE teacher.Depart='计算机系' +; +-- 13 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 + +-- 14 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 +-- 15 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. + +-- 16 查询成绩比该课程平均成绩低的同学的成绩表。 + +-- 17 查询所有任课教师的Tname和Depart. +SELECT Tname,Depart FROM teacher; +-- 18 查询所有未讲课的教师的Tname和Depart. + +-- 19 查询“男”教师及其所上的课程。 +SELECT * FROM teacher +INNER JOIN course ON teacher.Tno=course.Tno +WHERE Tsex='男' +; +-- 20 查询最高分同学的Sno、Cno和Degree列。 +SELECT * FROM score WHERE Degree in (SELECT MAX(Degree) FROM score); +-- 21 查询和“李军”同性别的所有同学的Sname. +SELECT Sname FROM student WHERE Ssex=(SELECT Ssex FROM student WHERE Sname='李军'); +-- 22 查询和“李军”同性别并同班的同学Sname. +SELECT Sname FROM student WHERE Ssex=(SELECT Ssex FROM student WHERE Sname='李军') AND class=(SELECT class FROM student WHERE Sname='李军'); +-- 23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 +SELECT score.Degree FROM score +INNER JOIN student ON score.Sno=student.Sno +INNER JOIN course ON score.Cno=course.Cno +WHERE Cname='计算机导论' AND Ssex='男' +; +``` + diff --git "a/13 \345\274\240\345\276\267\345\272\267/20230306 \345\255\220\346\237\245\350\257\242.md" "b/13 \345\274\240\345\276\267\345\272\267/20230306 \345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..7f0e39bf2256dadf9a9979cf0a33a3755fd50f77 --- /dev/null +++ "b/13 \345\274\240\345\276\267\345\272\267/20230306 \345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,41 @@ +# 子查询 + + + +# 作业 + +```sql +-- 在如图的数据表上完成以下题目 +-- +-- 1.查询出年龄比班上平均年龄大的学生的信息 +SELECT * FROM stuinfo WHERE stuAge>(SELECT avg(stuAge) FROM stuinfo); +-- 2.查询出每个学生的学号,姓名,性别和选修课程的最高分(stuMarks) +SELECT stuNO,stuName,stuSEX,max(score) FROM stuinfo left JOIN stumarks on stuinfo.stuNO=stumarks.stuID GROUP BY stuNO ; +1-- 3.查询出每个学生的学号,姓名,性别和考试平均分(stuExam) + +SELECT * FROM stuinfo LEFT JOIN stuexam on stuinfo.stuNO=stuexam.stuNO; +1-- 4.查询性别是男并且年龄大于等于20的学生的信息(用两种方法实现:普通查询和子查询) +SELECT * from stuinfo WHERE stuAge>=20 and stuSEX='男'; + +-- 5.查询出年龄比所有男生年龄都大的女生的信息 +SELECT * FROM stuinfo WHERE stuAge>(SELECT max(stuAge) from stuinfo WHERE stuSEX='男')and stuSEX='女'; +1-- 6.查询出所有选修课程都及格的学生的信息 (stuMarks) +SELECT * FROM stumarks WHERE score>=60 GROUP BY stuNO; +-- 7.查询出参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +SELECT * FROM stuinfo left JOIN stumarks on stuinfo.stuNO=stumarks.stuID GROUP BY stuNO ; +-- 8.查询出没有参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +SELECT * FROM stuinfo left JOIN stumarks on stuinfo.stuNO=stumarks.stuID WHERE score is null ; +-- 9.将有一门成绩成绩大于90分的学生的基本信息查询出来(stuMarks) +SELECT * FROM stuinfo left JOIN stumarks on stuinfo.stuNO=stumarks.stuID where score>90 ; +1-- 10.查询出平均成绩在80分以上的学生的基本信息(stuMarks) +-- +-- 11.查询出某同学所有考试成绩比“张秋利”同学所有分数都高的学生基本信息(stuMarks) +SELECT * FROM stumarks WHERE score>(SELECT max(score) FROM stuinfo left JOIN stumarks on stuinfo.stuNO=stumarks.stuID where stuName='张秋利') ; +1-- 12.查询出某同学所有考试成绩只需要比“张秋利”同学某个分数高的学生基本信息(stuMarks) +SELECT * FROM stumarks WHERE score>(SELECT max(score) FROM stuinfo left JOIN stumarks on stuinfo.stuNO=stumarks.stuID where stuName='张秋利') ; +-- 13.查询班上比所有男生年龄都要大的女生的信息 +SELECT * FROM stuinfo WHERE stuAge>(SELECT max(stuAge) from stuinfo WHERE stuSEX='男')and stuSEX='女'; +1-- 14.查询出只是比某个男生年龄大的女生的信息 +-- +``` +