1、连接查询
- 内连接查询
- 与单表查询相似,都是使⽤select语句
- 可以把多张表放到select后边,并⽤逗号隔开
- 还可以结合as取别名,⽅便引⽤
- 如果要查询多个表中的字段,⽆重名的情况下,可以省略表的指定
- ⾮等值连接 迪卡尔积
-
-- 内连接中的非等值链接。 select * from grade,subject; -- 内连接中的等值连接 select * from grade g,subject s where g.GradeId= s.GradeId; -- 内连接 select * from grade g inner join subject s on g.GradeId=s.GradeId; -- 练习1 查询所有课程的名称和年级名称 select s.SubjectName,g.GradeName from subject s inner join grade g on s.GradeId=s.GradeId; -- 练习2 查询学生姓名,课程名称,考试分数 select s.StudentName,sub.SubjectName,r.StudentResult from student s inner join result r on s.StudentNo=r.StudentNo inner join subject sub on r.SubjectNo=sub.SubjectNo;
-
外连接
- 左连接
- 从左表中返回所有数据,即便在右表中没有匹配的⾏
-
-- 左连接 -- 查询所有年级学的课程 select g.GradeName,s.SubjectName from grade g left join subject s on g.GradeId =s.GradeId;
- 右连接
- 从右表中返回所有的记录,即使在左表中没有匹配的⾏
-
-- 右连接 -- 查询所有年级学的课程 select g.GradeName,s.SubjectName from grade g right join subject s on g.GradeId =s.GradeId;
- 左连接
- join对比
- inner join 表中有⾄少有⼀个匹配的,则返回行。
- left join 不论右表是否有匹配,都会返回左表的所有的行。
- right join 不论左表是否有匹配,都会返回右表的所有的行。
2、排序 order by
- 对select语句查询到的结果,按某些字段进行排序。
- 升序asc 和 降序desc 默认是升序asc。
-
-- 排序 -- 查询数据库结构-1的所有考试结果,并按成绩由高到低排序 -- 显示姓名,课程名称,分数 select s.StudentName,sub.SubjectName,r.StudentResult from student s inner join result r on s.StudentNo= r.StudentNo inner join subject sub on sub.SubjectNo=r.SubjectNo where sub.SubjectName="数据库结构-1" order by r.StudentResult desc;
3、limit 常⽤于分页显示
-
limit [m,] n
- 限制select返回结果的⾏数。
- m 制定第⼀个返回记录的偏移量。
- n 制定返回记录⾏的最⼤数⽬。
-
-- limit -- 返回成绩表中前5条记录 select * from result limit 5; select * from result limit 0,5; -- 查询数据库结构-2的所有考试结果,并按成绩由高到低排序 -- 显示学号,学生姓名,考试分数查询前5名 select s.StudentNo,s.StudentName,r.StudentResult from student s inner join result r on s.StudentNo= r.StudentNo inner join subject sub on sub.SubjectNo=r.SubjectNo where sub.SubjectName="数据库结构-2" order by r.StudentResult desc limit 0,5;
4、子查询
- 在查询语句中的where 条件中,⼜嵌套了另外⼀个查询语句
- ⼦查询的结果⼀般都集合,建议使⽤in
-
-- 子查询 -- 查询课程为高等数学-2 且分数不小于80的学生编号和姓名 -- 方式一 select s.StudentNo,s.StudentName from student s inner join result r on s.StudentNo= r.StudentNo inner join subject sub on sub.SubjectNo=r.SubjectNo where sub.SubjectName="高等数学-2" and r.StudentResult >= 80;
-
-- 方式二(子查询方式) -- 第一步先查询出高等数学的课程编号 select sub.SubjectNo from student sub where sub.StudentName="高等数学-2"; -- 第二步查询课程编号为2的且分数大于等于80的学生编号 select r.StudentNo from result r where r.SubjectNo=2 and r.StudentResult>=80; -- 第三步根据学生编号查询学生姓名 select s.StudentNo,s.StudentName from student s where s.StudentNo in (select r.StudentNo from result r where r.SubjectNo=2 and r.StudentResult>=80); -- 最终的 select s.StudentNo,s.StudentName from student s where s.StudentNo in ( select r.StudentNo from result r where r.SubjectNo=( select sub.SubjectNo from student sub where sub.StudentName="高等数学-2") and r.StudentResult>=80);
5、统计函数
- count() 返回满⾜select 条件的记录的总和数。
- sum() 返回列的总和。
- avg() 返回列平均值。
- max() 返回列的最⼤值。
- min() 返回列的最⼩值。
-
-- 统计函数 -- 1、计数count -- 查询result表中有多少条记录 select count(*) from result; -- 2、求和sum -- 求成绩大于98分的所有成绩的和 select sum(StudentResult) from result where StudentResult>98; -- 3、求平均成绩 avg -- 求成绩表中的平均成绩 select avg(StudentResult) from result; -- 4、求最大值 max select max(StudentResult) from result; -- 5、求最小值 min select min(StudentResult) from result;
6.分组 group by
- 可以对所有 数据进⾏⼀个分组统计
- 分组的依据字段是可以有多个的,并依次分组
- 与having 结合使⽤ 进⾏分组后的数据筛选
-
-- 分组group by -- 按不同课程分组,分别计算出其平均分,最高分,最低分 -- 对于低于80平均分的不显示 select sub.SubjectName,avg(r.StudentResult),max(r.StudentResult),min(r.StudentResult) from subject sub inner join result r on sub.SubjectNo=r.SubjectNo group by sub.SubjectName having avg(r.StudentResult)>=80;
标签:join,sub,--,数据库,查询,StudentNo,StudentResult,select From: https://www.cnblogs.com/hsk991213/p/17790054.html