Mysql数据库的选择查询

选择查询—分组查询

语法:select 字段列表/表达式

​ from 表名字

​ where 条件

​ group by 分组条件字段 having 分组查询之后筛选条件

select 查询列
from 表1 别名【连接类型】
jion 表2 别名
on 链接条件
【where 筛选条件】
【group by 分组】
【having 分组后筛选】
【order by排序】

解释:对数据按照某一个字段条件进行分组,然后按组单独处理数据

​ 对数据分类处理

语法中的两个条件:

​ where 条件:在分组之前进行数据筛选

​ having 条件:在分组之后进行数据筛选

关键:组函数/聚合函数的使用

​ count(字段) 统计查询数据的条数

​ sum(字段) 求和

​ avg(字段) 求平均值

​ max(字段) 求最大值

​ min(字段) 求最小值

​ 分组处理的语法

备注:只要进行分组查询,那么查询语句中的组函数计算的是每一个一个组的信息,不是查询到的所有

不进行分组,组函数对应的是所有的数据处理

– 聚合函数的使用

– 统计订单信息

– 语法 count(x)根据x进行数据统计

– count(distinct x)根据x进行统计,并且去重

SELECT * FROM w_list
SELECT COUNT(DISTINCT s_id) FROM w_list

– 统计S4供应商提供的订单

SELECT COUNT(*) FROM w_list WHERE s_id='S4'

– 求和函数的查询

– 查询一个月公司需要发多少钱的工资

SELECT w_id,p_id,p_wages FROM w_people 

SELECT SUM(p_wages) FROM w_people

– 平均值函数

– 获取公司所有员工的平均工资

SELECT AVG(p_wages) FROM w_people  

– 求最大值和最小值

– 获取工资最高的人的信息/工资最低的人的信息

SELECT MAX(p_wages) FROM w_people ;
SELECT MIN(p_wages) FROM w_people ;
SELECT MAX(p_wages),MIN(p_wages) FROM w_people ;

– 获取公司工资水平最大差距

SELECT MAX(p_wages)-MIN(p_wages) FROM w_people ;

– 获取仓库号是WH5的员工的最高工资和最低工资以及平均工资

SELECT COUNT(w_id) FROM w_wwarehouse WHERE w_id='WH5'
SELECT MAX(w_area) FROM w_wwarehouse
GROUP BY w_id='WH5'

– 获取每一个仓库对应员工的平均工资,总工资数,最高工资最低工资

SELECT w_id, COUNT(w_id) FROM w_wwarehouse 
 GROUP BY w_id  -- 获取每一个仓库的人数
SELECT w_id,AVG(w_area) FROM w_wwarehouse
 GROUP BY w_id  -- 获取平均工资
SELECT w_id,MAX(w_area) FROM w_wwarehouse
 GROUP BY w_id  -- 获取最高工资
SELECT w_id,MIN(w_area) FROM w_wwarehouse
 GROUP BY w_id  -- 获取最低工资

– 计算公司总共有多少平仓库面积

SELECT SUM(w_area) FROM w_wwarehouse

– 计算上海仓库的平均面积

SELECT AVG(w_area)

– 获取仓库最大的面积,最小面积,平均面积

SELECT MAX(w_area),MAX(w_area),AVG(w_area)FROM w_wwarehouse

– 每一个仓库大于等于1230的所有员工的平均工资

SELECT w_id, COUNT(*) ,AVG(p_wages) FROM w_people 
 WHERE p_wages>=1230 GROUP BY w_id;

– 每一个仓库工资大于等于1230的员工的平均资格中的平均工资大于1300的组

SELECT w_id,AVG(p_wages),COUNT(*) FROM w_people
 WHERE p_wages>=1230 GROUP BY w_id
 HAVING AVG(p_wages)>1300;

– 获取每一个城市仓库总面积,要求面积小于400不参与统计

SELECT w_city, SUM(w_area),COUNT(*) 
FROM w_wwarehouse
WHERE w_area>=400 
GROUP BY w_city

– 获取工资总数大于3000的仓库编号和员工平均工资,最高工资

SELECT w_id,AVG(p_wages),MAX(p_wages)
FROM w_people
GROUP BY w_id
HAVING SUM(p_wages)>3000

多表查询

多个数据表关联获取想要的数据,然后形成一张表

联表查询

解释:多个表关联查询获取的数据形成一个表

多表查询的关键:表与表之间的练习—主外键

联表查询的分类:

内连接:inner join 严格的链接查询,只获取满足条件的

外连接:lefe/right outer join 不严格的查询,主表获取所有信息,附表获取满足条件的

交叉链接:cross join 获取满足条件的信息,也获取表中的不满足条件的信息

集合查询:union

联表查询的条件:

先梳理数据库表的关系

 w_list(p_id,s_id,l_id#,l_date)
  w_people(w_id,p_id#,p_wages)
  w_supplier(s_id#,s_name,s_add)
  w_wwarehouse(w_id#,w_city,w_area)

表之间的关系

E-R图【entry-relative实体联系图】

实体:每一个表就是一个实体,对应一个业务数据

联系:关系,表示一个实体与另一个实体的关系

关系分类:一对一,一对多,多对一,多对多(转化成一对多,出现中间表)

属性:实体中包含的描述字段的信息

E-R图有什么元素:

实体:矩形

属性:椭圆

联系:菱形

关联:实线

主码:后面加#

外键:下划线

通过E-R图可以确定哪些表可以关联

找到主表—起始表,其他的都是副表,向主表靠拢

– 获取每一个员工对应的仓库所属城市,对应面积

– 分析:

– 主表—员工信息;副表—仓库信息

– 内连接语法:select 表1.字段,表2.字段 from 主表 inner join 副表 on 表1.主外键关联条件

SELECT peo.w_id,peo.p_id,peo.p_wages,wh.w_id,wh.w_city,wh.w_area
 FROM w_people peo INNER JOIN w_wwarehouse wh
 ON peo.w_id=wh.w_id
SELECT peo.w_id,peo.p_id,peo.p_wages,wh.w_id,wh.w_city,wh.w_area
 FROM w_people peo JOIN w_wwarehouse wh
 ON peo.w_id=wh.w_id

SELECT peo.w_id,peo.p_id,peo.p_wages,wh.w_id,wh.w_city,wh.w_area
 FROM w_people peo,w_wwarehouse wh
 WHERE peo.w_id=wh.w_id

-- 获取员工对应的订单信息,供应商信息,仓库信息  
SELECT w_people.*,w_wwarehouse.*,w_list.*,w_supplier.*
 FROM w_people INNER JOIN w_wwarehouse ON w_people.w_id=w_wwarehouse.w_id
  INNER JOIN w_list ON w_people.p_id=w_list.p_id
  INNER JOIN w_supplier ON w_list.s_id=w_supplier.s_id
  
-- 获取每一个仓库所对应的员工信息
SELECT w_wwarehouse.*,w_people.*
 FROM w_wwarehouse LEFT JOIN w_people ON w_wwarehouse.w_id=w_people.w_id

外连接

左外连接:left outer join on 左边是主表,对于主表,不获取匹配信息,不匹配也能获取,没有信息用null填充

右外连接:right outer join on 右边是主表

-- 获取每一个订单对应的供应商信息
SELECT w_list.*,w_supplier.*
FROM w_list LEFT OUTER JOIN w_supplier ON w_list.s_id=w_supplier.s_id

-- 获取每一个供应商对应的订单信息
SELECT w_supplier.*,w_list.*
FROM w_supplier RIGHT OUTER JOIN w_list ON w_supplier.s_id=w_list.s_id

-- 获取每一个员工对应的订单信息
SELECT w_people.*,w_list.*
FROM w_people LEFT OUTER JOIN w_list ON w_people.p_id=w_list.p_id

-- 获取每一个订单对应的员工信息
SELECT w_list.*,w_people.*
FROM w_list LEFT OUTER JOIN w_people ON w_list.p_id=w_people.p_id

-- 获取每一个员工的订单信息以及所属供应商信息
SELECT w_people.*,w_list.*,w_supplier.*
FROM w_people INNER JOIN w_list ON w_people.p_id=w_list.p_id
INNER JOIN w_supplier ON w_list.s_id=w_supplier.s_id

-- 交叉联接  cross join  获取笛卡尔积
-- 数据上看,表A的条数*表B的条件
-- 主表中的每一条信息都与副表中的信息合并,主表与副表的信息两两对应组合
SELECT w_wwarehouse.*,w_people.* 
FROM w_wwarehouse CROSS JOIN w_people
SELECT COUNT(*) FROM w_wwarehouse CROSS JOIN w_people

集合查询(并集,交集,差集)

union 并集

INTERSECTS 交集 8.0之后支持

except 差集 8.0之后支持

-- 查看平均工资大于1300,并且面积大于400的仓库信息
SELECT w_id wh FROM w_people GROUP BY w_id HAVING AVG(p_wages)>=1400
UNION
SELECT w_id wh FROM w_wwarehouse WHERE w_area>=400

子查询(多条查询语句的组合查询)

一个查询语句的结果作为另一个查询语句的条件或者表

注意:子查询作为from后的表,无要求

​ 子查询作为条件,要求子查询select后面的字段只能有一个

单值查询:子查询的结果就一个值,使用单值的条件判断 = <> < > like

多值查询:子查询的结果不止一个,用 in 做判断

- 例如
SELECT w_id wh FROM w_wwarehouse WHERE w_area>=400
 AND w_id IN
 (SELECT w_id wh FROM w_people GROUP BY w_id HAVING AVG(p_wages)>=1400)

分页查询 limit关键字

有两种语法格式

ORDER BY 字段(主键) limit 值,表示去前几条数据

ORDER BY 字段(主键) limit x,y 表示从表中第x条开始取y条数据【分页查询】

-- 获取前五个员工信息

SELECT * FROM w_people ORDER BY p_id LIMIT 3

-- 获取从第五条开始获取两条

SELECT * FROM w_people ORDER BY w_id LIMIT 2,4

– 分页查询:每一列显示条数

– 考虑:每一列显示条数,4+当前是第几页

– select 字段 from 表 order by 字段 limit 页数-1*每页条数,条数

SELECT * FROM w_people ORDER BY w_id LIMIT 4,2


数据库—查询*

查询分类:

投影查询:基本查询:查看所有字段和信息

​ 表达式:进行运算符操作

​ 去重:对结果进行去重和别名

函数查询:数学相关

​ 字符串

​ 日期

​ 其他

选择查询:where条件查询

​ 条件运算符+逻辑运算符

​ 组函数和分组函数

复杂查询:联表(主外键关系)

​ 子查询

​ 集合查询

​ 分页查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值