一、关联查询

1、最常用的联表查询有左关联(left join)、右关联(right join)、内关联(inner join),但实际上关联查询一共有七种,另外四种是在这三种基础上衍生出来的。如下图所示。

               

 

 

 

2、关联查询一般的操作步骤

(1)分析需求,分析查询的字段来自哪些表。

(2)确定使用哪种连接查询方式。(七种任选)

(3)确定交叉点(即两张表中,那个数据是相同的),即确定判断条件

 

3、三种连接查询示例

  注:左表是result,右表是student。

(1)内连接。

  任务:在students表和result表中studentNo相等的数据中,将student表中的studentNo、studentName、studentResult 和result表中的subjectNo返回。

 因为studentNo在两张表中都有数据,因此需要声明这个字段来自于哪张表。

SELECT s.studentNo,studentName,subjectNo,studentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNo = r.studentNo     ----也可以使用where代替on,但是join后面一般用on

 

(2)右连接

  任务:在student表中,查询与result表中studentNo的相等的数据,并将student表中的studentNo、studentName、studentResult 和result表中的subjectNo返回。

SELECT s.studentNo,studentName,subjiectNo,studentResult
FROM result AS r
RIGHT JOIN  student AS s
ON s.studentNo = r.studentNo

 

(3)左连接

  任务:在result表中,查询与result表中studentNo的相等的数据,并将student表中的studentNo、studentName、studentResult 和result表中的subjectNo返回。

SELECT s.studentNo,studentName,subjiectNo,studentResult
FROM result AS r
LEFT JOIN  student AS s
ON s.studentNo = r.studentNo

  左连接、右连接、内连接的区别

操作  描述
inner join 如果两张表中有一个满足条件,就返回结果
left join 会将右表中所有值返回,即使在右表中没有匹配
right join 会将左表中所有值返回,即使左表中没有匹配

 

4、多表联合查询

  多表联合查询的核心是将多张表两两进行联合并将每两张表查询的结果作为左表或者右表

 

二、自连接查询

1、 即在同一张表中查询信息,但是将一张表当做两张表使用。通常适用于表信息互相耦合、嵌套的情况。

 

三、分页和排序

1、排序关键字

  升序:asc

  降序:desc

2、分页关键字

  limit a,b  --a:起始行,b:页面大小,a和b满足:假如是显示第n页,则应为 limit (n-1)b, b;

 

四、子查询

1、子查询的本质:在where语句中嵌套一个子查询语句

2、例子

  任务:查询 “数据库结构-1”的所有考试结果(包括学号、科目编号、成绩),降序排列

  (1)如果使用连接查询,SQL语句如下

SELECT studentNo,r.subjectNo,studentResult
FROM `result` AS r
INNER JOIN `subject` AS s
ON r.subjectNo = s.subjectNo
WHERE studentNme = '数据库结构-1'
ORDER BY studentRuslt DESC

  (2)如果使用子查询,SQL语句如下

SELECT studentNo,subjectNo,studentResult
FROM result
WHERE subjectNo = (
    SELECT subjectNo FROM `subject` WHERE subjectName = '数据库结构-1'
)

  子查询执行的顺序是:由内而外

3、子查询一般效率较低,在使用的时候要考虑性能问题。

 

五、MySQL的函数

1、常用函数

  可以参考官方文档。此处只列举常用函数。

(1)数学类&字符串类
  略,可参考官方文档。
(2)时间类
  CURRENT_DATE() --获取当前日期   NOW() --获取当前时间   LOCALTIME() --获取本地时间

 

2、聚合函数

(1)常用函数

1、统计函数
  COUNT(列名) --统计函数,会过滤列中的空值
  COUNT(1) --不会过滤空值
  COUNT(*)    --不会过滤空值
    三者的区别:当列为主键时,COUNT(列名)的效率最高;当列不是主键主键时,OCUNT(1)效率最高;当表中只有一列时,COUNT(*)效率最高。
2、求平均、和、最高、最低
  SUN()、AVG()、MAX()、MIN()

 

(2)分组函数

  GROUP BY

  表结构:学科表(subject),成绩表(result),关联的主键(subjectNo--学科编号)

  任务:以学科为分组,将平均分大于80的学科的学科编号、平均分、最高分、最低分查出来。

SELECT subjectNo,AVG(studentRusult) as 平均分,MAX(studentResult) as 最高分,MIN(studentResult) as 最低分
FROM result as r
INNER JOIN `subject` as sub
ON r.`subejectNo`=sub.`subjectNo`
GROUP BY r.subjectNo   --通过这个字段来分组
HAVING 平均分>80

  注意:where使用在GROUP BY之前,HAVING使用在GROUP BY之后,两者都是实现过滤功能。

 

六、SELECT汇总

 

 

 

  

 

 

 

 

  

 posted on 2021-10-13 23:04  佩剑君子  阅读(4216)  评论(0编辑  收藏  举报