一、聚合查询
函数 | 说明 |
COUNT([DISTINCT] expr) | 返回查询到的数据的数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
--统计班级共有多少同学
select count(*) from student;
-- 统计数学成绩总分
SELECT SUM(math) FROM exam_result;
-- 不及格 < 60 的总分,没有结果,返回 NULL
SELECT SUM(math) FROM exam_result WHERE math < 60;
-- 统计平均总分
SELECT AVG(chinese + math + english) 平均总分 FROM exam_result;
-- 返回英语最高分
SELECT MAX(english) FROM exam_result;
-- 返回 > 70 分以上的数学最低分
SELECT MIN(math) FROM exam_result WHERE math > 70;
SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段 ” ,其他字段若想出现在 SELECT 中则必须包含在聚合函数中。
--准备测试表及数据:职员表,有id(主键)、name(姓名)、role(角色)、salary(薪水)
create table emp(id int primary key auto_increment,name varchar(20) not null,role varchar(20) not null,salary numeric(11,2)
);insert into emp(name, role, salary) values
('马云','服务员', 1000.20),
('马化腾','游戏陪玩', 2000.99),
('孙悟空','游戏角色', 999.11),
('猪无能','游戏角色', 333.5),
('沙和尚','游戏角色', 700.33),
('隔壁老王','董事长', 12000.66);
查询每个角色的最高工资、最低工资和平均工资
select role,max(salary),min(salary),avg(salary) from emp group by role;
select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)<1500;
二、联合查询
联合查询是多表查询的一种方式,在保证多个SELECT语句的查询字段数相同的情况下,合并多个查询的结果。
UNION是实现联合查询的关键字
ALL表示保存所有的查询结果。
DISTINCT是默认值,可以省略,表示去除完全重复的记录。
SELECT 字段列表 FROM 表A ……
UNION
SELECT 字段列表 FROM 表B ……;
返回表A查询和表B查询的并集(并进行去重处理)
除此之外,若要对联合查询的记录进行排序等操作,需要使用圆括号“()”包裹每一个SELECT语句,在SELECT语句内或在联合查询的最后添加ORDER BY语句。并且若要排序生效,必须在ORDER BY后添加LIMIT限定联合查询排序的数量,通常推荐使用大于表记录数的任意值。
实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
三、连接查询
(1)交叉连接
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积。 例如,商品分类表中有3个字段,4条记录;商品表中有5个字段,10条商品信息,那么交叉连接后的笛卡尔积就等于 4*10条记录数,每条记录中含有3+5个字段。
SELECT 查询字段 FROM 表1 CROSS JOIN 表2;
CROSS JOIN用于连接两个要查询的表。
通过该语句可以查询两个表中所有的数据组合。
select c.id cid, c.name cname, g.id gid, g.name gname
from sh_goods_category AS c
cross join sh_goods AS g;
(2)内连接
可以选取出同时存在于两张表中的数据,即两张表的交集数据
分为隐式内连接和显示内连接,两者只是书写方式不同,得到的结果是完全相同的
隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件列表;
显式内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件列表 [WHERE 判断语句] ;
INNER可以省略
ON用于指定内连接的查询条件。
在不设置ON时,与交叉连接等价
关键字ON与WHERE的异同点
相同点:都用于完成条件的限定。
不同点:于WHERE是限定已全部查询出来的记录,那么在数据量很大的情况下,此操作会浪费很多性能,所以此处推荐使用ON实现内连接的条件匹配
(3)左外连接
左外连接是外连接查询中的一种,也可以将其称为左连接。
它用于返回连接关键字(LEFT JOIN)左表中所有的记录,以及右表中符合连接条件的记录。
当左表的某行记录在右表中没有匹配的记录时,右表中相关的记录将设为空值。
SELECT 查询字段 FROM 表1 LEFT [OUTER] JOIN 表2 ON 匹配条件;
查询表1的所有数据,其中包含表1和表2交集部分的数据
关键字“LEFT [OUTER] JOIN”左边的表(表1)被称为左表,也可称为主表。
关键字右边的表(表2)被称为右表,也可称为从表。
OUTER在查询时可以省略。
(4)右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件列表;
查询表2的所有数据包含表1和表2交集部分的数据
右连接查询正好与左连接相反。
因此,在应用外连接时仅调整关键字(LEFT或RIGHT JOIN)和主从表的位置,即可实现左连接和右连接的互换使用。
总结
外连接是最常用的一种查询数据的方式,分为左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)。
外连接与内连接的区别是,内连接只能获取符合连接条件的记录,而外连接不仅可以获取符合连接条件的记录,还可以保留主表与从表不能匹配的记录。
四、子查询
子查询(Sub Query)也可以称为嵌套查询,是一种嵌套在其它SQL查询的Where子句中的查询;包含子查询的语句称为外部语句
1、子查询必须包含在()内
2、一般子查询的SELECT语句只有一个字段,除非外部语句中有多个列需要与子查询的列进行比较
3、子查询不可以直接应用在聚合函数中,子查询也无法使用ORDER BY
4、Ntext、text、image数据类型不可以在子查询的选择列表中使用
5、关键字DISTINCT不能与包含GROUP BY的子查询一起使用
SELECT name FROM sh_goods_category
WHERE id = (SELECT category_id FROM sh_goods
WHERE name='智能手机');