学习目标:
- 掌握select语句的基本语法
- 熟练使用聚合函数计算
- 能理解分组需求进行分组计算
- 掌握表的多种连接方式
- 能根据数据模型进行多表联接查询
一、select基本语句
-- select语句
select 【distinct】 列|表达式|函数 -- 4 什么
FROM 数据源 -- 1 从哪里
WHERE 表达式 -- 2 选择条件 的行
GROUP BY 分组 -- 3 建立分组的字段
HAVING 分组后的结果过滤 -- 5
ORDER BY 排序关键字 -- 6 asc、降序 desc
LIMIT n[,m]
二、常用的聚合函数
- 求和 sum(expr)
- 求平均值 AVG( expr)
- 求最大值 MAX(expr)
- 求最小值 MIN(expr)
- 计数 count(*) 所有的行数 、 count(列名) 指定列中非空的数量
三、查询应用
1.获取服装类商品的最高团购价、最低团购价、平均团购价、数量 以及销售数量合计。(服装类商品的ategoryID18)。
分三步:
第一步: From 打开Product
select *
from product
第二步:Where 选择满足条件的行
select *
from product p
where p.categoryID = 15 -- like
第三步:select 查询的聚合函数
SELECT
MAX(p.currentPrice),
MIN(p.currentPrice),
AVG(p.currentPrice),
COUNT(*),
SUM(p.salesCount) -- 3
FROM
product p
WHERE
p.categoryID = 15 -- like
第四步:美化SQL,完善标题
SELECT
MAX(p.currentPrice) 最高团购价,
MIN(p.currentPrice) 最低团购价,
AVG(p.currentPrice) 平均团购价 ,
COUNT(*) 数量,
SUM(p.salesCount) 销售数量合计 -- 3
FROM
product p
WHERE
p.categoryID = 15; -- like
2.显示不同类型的商品数量和平均团购价, 按照商品数量升序排列,如果商品数量相同,则按平均团购价降序排列。
第一步:from 打开表
select * from product
第二步:group by 建立每种类型的分组
select *
from product p
group by p.categoryID
第三步:select 分组计算
SELECT
p.categoryID 类型 ,
COUNT(*) 商品数量,
AVG(p.currentPrice) 平均团购价 -- 3
FROM
product p -- 1
GROUP BY
p.categoryID -- 2
第四步:order by 对查询结果排序
SELECT
p.categoryID 类型 ,
COUNT(*) 商品数量,
AVG(p.currentPrice) 平均团购价 -- 3
FROM
product p -- 1
GROUP BY
p.categoryID -- 2
ORDER BY
COUNT(*),
AVG(p.currentPrice) DESC; -- 4
第五步:美化和完善标题
3.显示有商家信息的每一种类型的商品数量和平均团购价,按照商品数量升序排列,如果商品数量相同,则按照平均团购价降序排列,但仅显示平均团购价大于100元的分组信息。
SELECT
categoryID 类型,
COUNT(*) 数量,
AVG(p.currentPrice) 平均团购价
FROM
product p
WHERE
p.shopID IS NOT NULL
GROUP BY
categoryID
HAVING
AVG(p.currentPrice) > 100
ORDER BY
COUNT(*),
AVG(p.currentPrice);
四、联接查询
1.数据模型
2.内连接(等值连接、自然连接)
-- 1.使用笛卡尔积,where筛选满足条件行
SELECT *-- DISTINCT c.customerName
FROM customer c,orders o
where c.customerID = o.customerID; -- 等值连接
-- 2.使用join……on 条件表达式
SELECT *
FROM customer c
INNER JOIN orders o
ON c.customerID = o.customerID;
-- 3.使用join……using,要求联接表有同名字段,查询结果同名列不重复
SELECT *
FROM customer c
JOIN orders o USING(customerID) ;
-- 4.自然连接Natural JOIN,要求联接表有同名字段,查询结果同名列不重复
SELECT *
FROM customer c
NATURAL JOIN orders o ;
3.练习:连接customer、orders、ordersDetail三个表
-- 新知学习
-- 连接查询:
-- 笛卡尔积
SELECT *
FROM customer c,orders o; -- n*m
-- 内连接
-- 1.使用笛卡尔积,where筛选满足条件行
SELECT *-- DISTINCT c.customerName
FROM customer c,orders o
where c.customerID = o.customerID; -- 等值连接
-- 2.使用join……on 条件表达式
SELECT *
FROM customer c
INNER JOIN orders o
ON c.customerID = o.customerID;
-- 3.使用join……using,要求联接表有同名字段,查询结果同名列不重复
SELECT *
FROM customer c
JOIN orders o USING(customerID) ;
-- 4.自然连接Natural JOIN,要求联接表有同名字段,查询结果同名列不重复
SELECT *
FROM customer c
NATURAL JOIN orders o ;
练习:连接customer、orders、ordersDetail三个表
-- 练习连接 c\o\od
SELECT *
FROM customer c,orders o,ordersdetail od
WHERE c.customerID = o.customerID AND o.ordersID = od.ordersID;
SELECT *
FROM customer c
JOIN orders o ON c.customerID = o.customerID
JOIN ordersdetail od ON o.ordersID = od.ordersID;
小结:(利弊)
-- 1.内连接
SELECT DISTINCT c.customerName,ordersID
FROM customer c
join orders o
ON c.customerID = o.customerID;
-- 外连接
-- 1.左外连接,
-- 左表为主表数据一个不落,右表没有匹配数据则为null
SELECT DISTINCT c.customerName,ordersID
FROM customer c
LEFT join orders o
ON c.customerID = o.customerID;
-- 2.右外连接,
-- 右表为主表数据一个不落,左表没有匹配数据则为null
SELECT *
FROM ordersdetail od
RIGHT JOIN product p
ON p.productID = od.productID;
-- 3.全外连接(没有直接实现的语句)
-- 左外 UNION 右外
SELECT *
FROM ordersdetail od
left JOIN product p
ON p.productID = od.productID -- 左外
UNION -- 并
SELECT *
FROM ordersdetail od
RIGHT JOIN product p
ON p.productID = od.productID; -- 右外
1.可以看到多个表的字段
2.易于实现
3.效率不高(费时费空间),不适合大数据量
上一篇:项目二 联接查询
下一篇:2.2 胜景网联接查询任务一