分类汇总查询数据
聚合函数
运行在行组上,计算和返回单个值的函数
Mysql中常见的聚合函数
| 函数名称 | 作用 |
|---|---|
| COUNT() | 返回某列的行数 |
| SUM() | 返回某列值的和 |
| AVG() | 返回某列的平均值 |
| MAX() | 返回某列的最大值 |
| MIN() | 返回某列的最小值 |
例:查询student表中一共有多少条记录
例:查询student表中的sno列一共有多少记录
例:查询a01学科的平均分
GROUP BY子句
可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分类汇总表
语法:
SELECT 字段1 FROM 表名 [ WHERE 条件表达式 ] [ GROUP BY 字段名 [ HAVING 条件表达式 ] ];
注意:
1.HAVING用于在分类的基础上筛选条件
2.SELECT子句中的列名必须是分组列或列函数
例:求sc表中每个同学degree字段的平均值
例:统计student表中男、女生人数
例:统计各系男女生人数
例:查询选修了3门以上课程的学生学号
对查询结果进行排序
可以利用ORDER BY 关键字对查询结果按照有关或多个字段进行升序(ASC)或降序(DESC)排列
语法:
SELECT 字段名1 [ ,字段名2…] FROM 表名 ORDER BY 字段名1 [ASC|DESC] ,字段名2 [ASC|DESC]…;
默认排序方式为升序
例:查询student表的所有记录,按照sno字段降序的方式排列
限制查询结果的数量
语法:
SELECT 字段名1,字段名2… FROM 表名 LIMIT [ OFFSET,] 记录数;
例:查询student表中的前四条记录
例:查询student表中sno字段从第5位个第八位的记录,采用降序排列
limit4,4指的是从第4个起(不包含第4个),限制4个记录
子查询(嵌套查询)
一个查询语句嵌套在另一个查询语句的内部
语法:
SELECT 字段1 [ ,字段2…] FROM 表名 WHERE 条件(SELECT 字段 FROM 表名 );
在执行查询语句时,首先执行子查询的语句,子查询的结果作为外层查询的条件,子查询只执行一次
一般情况下子查询都可以被多表连接查询替代,子查询的关系相对较复杂,尽量使用多表连接查询
子查询可以嵌套多层
子查询要放在比较操作符的右边
1.子查询返回结果为单列单值时
| 操作符 | 含义 |
|---|---|
| = | 等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| <> | 不等于 |
例:查询了选修大学英语的学生学号
先查询出来大学英语的课程号,再根据课程号查选修的学生学号
2.子查询返回结果为单列多值时
| 操作符 | 含义 |
|---|---|
| in | 等于列表中的某一个值 |
| any | 与列表中的任意值比较 |
| all | 与表中的所有值比较 |
例:查询选修了大学英语课程的学生姓名
嵌套了两个子查询,先查出大学英语的课程号,然后再查出选修大学英语课程的学生学号,根据学号再查出学生的姓名,因为子查询返回的是单列多行的值,又是要与记录一一对应相等,所以用in关键字
当然也可以用多表连接的方法查询
多表连接查询
在进行数据库数据查询的时候很多时候都需要用到两张及以上的表一块进行查询。
例如:查询某个同学的成绩,需要从student表中查到学号跟姓名,在sc表中查到学号和学科成绩,两张表通过学号sno进行连接查询。
交叉连接
是两个表之间做笛卡尔积操作,又叫笛卡儿连接,得到的结果集的行数是两个表的行数的乘积。
语法:
SELECT * FROM 表1 CROSS JOIN 表2;
例:使用交叉连接查询系部表和学生表中的所有数据
假设有student表中有5条记录,department中有6条记录,则会查询出来5*6=30条记录。
可以看出这样的查询存在着大量的错误信息,在实际开发中一般不会用到此类查询
内连接
多张表通过连接条件中共享列的值进行比较连接,列出与连接条件匹配的数据行,组成新的记录。
只有满足条件的记录才会出现在查询结果中
语法:
SELECT 字段1 [,字段2…] FROM 表1 [ INNER ] JOIN 表2 ON 表1.关系字段 = 表2.关系字段;
注意:
1.inner join 用于连接两个表
2.inner可以省略
3.on用来指定连接条件
例:查询学生的学号,姓名,课程号,成绩
注意:
1.根据两表的公共字段相等的原则进行连接
2.在多表查询中,所有的列必须明确,多张表中有重复的列时需要用表名或别名来限定,例:student.sno或A.sno
3.一旦使用表的别名来代替某张表,在连接的时候必须使用表的别名,不能再用表名,否则会报错
4.连接条件还可换成where,效果一样,区别:inner join on:连接查询;where:等值查询
5.内连接的查询结果只包含符合连接条件和查询条件的数据,想显示表中的所有字段需要使用外连接
外连接
左外连接
语法:
SELECT 字段1 [ ,字段2…] FROM 左表1 LEFT [ OUTER ] JOIN 右表2 ON 表1.关系字段 = 表2.关系字段;
OUTER可省略
会从左表中返回所有的值,即使右表中没有匹配
如果左表中的记录在右表中不存在,则在查询中显示为NULL
例:查询所有学生的成绩,包括没有成绩的同学(运用左外连接查询)
分析:
1.所有学生–>student表
2.成绩–>sc表(sc表中并不是所有学生,只是有成绩的学生)
3.运用left join左连接将两表进行连接
例:查询没有成绩的学生(在上一题后加上一个where条件判断就可以了)
右外连接
语法:
SELECT 字段1 [ ,字段2…] FROM 左表1 RIGHT [ OUTER ] JOIN 右表2 ON 表1.关系字段 = 表2.关系字段;
OUTER可省略
会从右表中返回所有的值,即使左表中没有匹配
如果右表中的记录在左表中不存在,则在查询中显示为NULL
例:查询所有学生的成绩,包括没有成绩的同学(运用右外连接查询)
自连接
自己表跟自己表进行连接(自己连接自己)
将一个物理表在逻辑上分成了两张表(哈哈,也就是把一个表看成是两张表)
例:假设有一种雇员表emp,字段内容如下:
查询每个雇员的编号,姓名,经理姓名
将emp表在逻辑上分成了两张表:职工表和经理表,连接条件为职工表的经理号与经理表的工号相等
总结
今天复习了对查询数据进行排序,分组,限制,还有常见聚合函数的使用,子查询,一个查询语句套一个,其实思路想清楚了也不复杂的哈,然后复习了多表连接查询,交叉查询,内连接,外连接,自连接,其实语法什么的都很相似,多多练习就会了,就是自连接有点不容易理解,自己连接自己,需要好好想想,你学到了吗?哈哈那就下次见喽