mysql之分组查询

注:mysql中不区分大小写,一般关键字用大写,自己写的用小写就可以

分组查询

1、select sum(salary) from person GROUP BY dept_id #按照部门分组后,求各个部门总的工资数。如果一个部门为空,那么单独作为一组

2、select sum(salary),dept_id from person GROUP BY dept_id #加上每个部门的id

3、select sum(salary) from person; #求出person表中所有人的工资

4、select sum(salary) as w,dept_id from person GROUP BY dept_id HAVING w>20000  #查询出哪个部门总工资高于两万的

5、select max(salary),dept_id from person group by dept_id; #找出每个部门工资最大的那个人

6、select avg(salary),dept_id from person group by dept_id; #找出每个部门的平均工资

7、select avg(salary),dept_id,GROUP_CONCAT(name) from person group by dept_id; #找出每个部门的平均工资,并显示每个组内所有的人

8、select avg(salary) as w,dept_id,GROUP_CONCAT(name) from person group by dept_id HAVING w>5000; 找出平均工资大于5k的部门,并显示每个部门内所有的人

where 与 having区别:
#执行优先级从高到低:where > group by > having 
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

分页查询

1、

原表格:

select * from person LIMIT 0,4;  #id为1-4的分为一页

select * from person LIMIT 0,4等价于select * from person LIMIT 4

SQL语句的执行顺序:

select name, max(salary)  5 查找数据

from person     1 先拿数据                

  

where name is not null     2 再判断,通过条件过滤一下

  

group by name    3 分组

  

having max(salary) > 5000  4分组之后再根据条件进行过滤

  

order by max(salary)  6 对数据进行排序

limit 0,5  7 分页

多表联合查询

1、select * from person,dept; #笛卡尔乘积,两个表的数据结果相乘

2、select * from person p,dept d where p.dept_id=d.did; #这样加条件之后就无数据重复了,如果person中由没有部门或者是部门不在dept中的话,那么就不再显示了,同理如果dept中有person中没有的,那么也不会在这里显示的

只有表A和表B中共有的数据才会显示出来

3、select * from person left join dept on person.dept_id=dept.did #左连接查询,特点就是左边的表数据全出来,如果能跟右边的表匹配出来那么就显示,如果匹配不          出来,只显示左边表中的匹配不出来的数据,此时person为基准表

以一张表为基准,符合条件的就拿过来,不符合条件的那么扔掉,优点是基准表的所有数据都会显示出来

4、select * from person right join dept on  person.dept_id=dept.did  #同理右连接,也可以将person和dept调换位置以实现右关联,此时dept为基准表

5、select * from person inner join dept on person.dept_id=dept.did #内连接

多表联合查询和内连接是一样的

6、select * from person left join dept on person.dept_id=dept.did #同理右连接

union         #将重复的数据去掉实现全连接
    select * from person right join dept on person.dept_id=dept.did #内连接

7、select * from person left join dept on person.dept_id=dept.did #同理右连接

union all         #不去重实现全连接
    select * from person right join dept on person.dept_id=dept.did #内连接

问题:查询出 教学部 年两大于20岁 并且工资小于1万的员工 并按照工资进行降序排序

8、问题一步步分解

 1)select * from dept where dname = ‘教学部‘

2)select did from dept where dname = ‘教学部‘

3)select * from person where age>20 and dept_id=1;  #选出第二张表中年龄大于20且部门id为1的人

4)select * from person where age>20 and dept_id=(select did from dept where dname = ‘教学部‘);   #选出第二张表中年龄大于20且部门id为1的人

5)select * from person where age>20 and dept_id=(select did from dept where dname = ‘教学部‘) and salary<10000 order by salary desc;  #在括号里的成为子查       询

问题2: 查询每个部门中最高员工工资和最低工资是多少,并显示部门名称

解析:每个部门就是要分组了,根据部门分组;显示部门名称:因为person中只有部门对应的数字,而在dept表中有数字对应的部门,所以得用多表联合查询

1)select max(salary),min(salary) from person group by dept_id

2)select max(salary),min(salary),dname from person left join dept on person.dept_id=dept.did group by dept_id

select avg(age),dname from person left join dept on person.dept_id=dept.did group by dept_id  #求每个组的平均年龄

子语句查询:

1、select * from (select * from person) as aaa

问题1:查找最大工资哪个人的姓名和薪水

select * from person where salary = (select max(salary) from person)

问题2:求工资高于所有人员平均工资的人员

select * from person where salary>(select avg(salary) from person)

问题3:查询平均年龄在20岁以上的部门名

同理在person中只有部门名对应的数字,在dept中有数字对应的部门名,所以要用到联合查询

1)select * from person where (select avg(age) from person)>20

2)select dept_id from person where (select avg(age) from person)>20  #只是查询出了person中平均年龄大于20岁的部门代表的数字

3)select dname from person left join dept on (select avg(age) from person)>20 group by dname   #有问题的。。。不对

对于问题3别人的方法:

select dept_id from person GROUP BY dept_id HAVING avg(person.age) > 20  #就只能查到部门所对应的数字

问题4:查询教学部下的员工信息

select * from person where dept_id = (select did from dept where dname =‘教学部‘);

2019.01.06 晚

20:16 距离睡觉还有好长时间

good night

haijing in HZ

原文地址:https://www.cnblogs.com/YiYA-blog/p/10230172.html

时间: 2024-08-11 10:12:35

mysql之分组查询的相关文章

MySQL时间分组查询

表TESTER 字段:id -- INT    date  -- TIMESTAMP 1.如何按年.月.日分组查询? select DATE_FORMAT(date,'%Y-%m-%d') time, count(*) count from TESTER group by year(date), month(date), day(date); 其中year().month().day()分别是提取date中的年.月.日字段. 2.时间分组查询的效率? 在不建立索引时,我100W行数据进行测试,用

MySQL之分组查询(GROUP BY)

在 MySQL SELECT 语句中,允许使用 GROUP BY 子句,将结果集中的数据行根据选择列的值进行逻辑分组,以便能汇总表内容的子集,实现对每个组而不是对整个结果集进行整合. 语法格式如下: GROUP BY { <列名> | <表达式> | <位置> } [ASC | DESC] 语法说明如下: <列名>:指定用于分组的列.可以指定多个列,彼此间用逗号分隔. <表达式>:指定用于分组的表达式.通常与聚合函数一块使用,例如可将表达式 CO

mysql的分组查询

1.设置数据库为严格模式: 2.数据准备 # 创建一张部门表 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varch

mysql分组查询时,讲多个值合并在一行显示

mysql根据字段进行分组查询时,相同字段的数据,只会显示一个,如果要想让这个字段的所有数据,显示在一行里,可以在查询时用GROUP_CONTAT函数,默认数据合并以逗号,分开

mysql 按天分组查询

Mysql按天分组(按日分组) select day (日期字段), SUM( 用于合计的字段)from 表group by day (日期字段) 一.年度查询 查询 本年度的数据 SELECT * FROM blog_article WHERE year( FROM_UNIXTIME( BlogCreateTime ) ) = year( curdate( )) 二.查询季度数据 查询数据附带季度数 SELECT ArticleId, quarter( FROM_UNIXTIME( `Blog

mysql 分组查询问题 group_concat

这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug. 偶然间想起了 sql语句中分组查询.突然才明白 就是进行分组查询.按照店铺分组 然后里边的详细商品用 group_concat函数进行组合 select 店铺ID,group_concat(shangPinID) shangPinIDs  from 购物车 group by 店铺ID 其中 sh

Oracle和MySQL分组查询GROUP BY

Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段必须在GROUP BY后边出现,否则会报错:“ORA-00979: not a GROUP BY expression”.而MySQL则不同,如果SELECT出来的字段在GROUP BY后面没有出现,那么会随机取出一个值,而这样查询出来的数据不准确,语义也不明确.所以,作者建议在写SQL语句的时候,

MySQL单表查询之分组查询

分组查询 mysql> select countrycode as total fromCity where id<10; +-------+ | total | +-------+ | AFG  | | AFG  | | AFG  | | AFG  | | NLD  | | NLD  | | NLD  | | NLD  | | NLD  | +-------+ 9 rows in set (0.00 sec) mysql> select countrycode,count(*) ast

MySQL对数据表进行分组查询(GROUP BY)

MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVING 条件表达式] [WITH ROLLUP] 属性名:是指按照该字段的值进行分组. HAVING 条件表达式:用来限制分组后的显示,符合条件表达式的结果将被显示. WITH ROLLUP:将会在所有记录的最后加上一条记录.加上的这一条记录是上面所有记录的总和. GROUP BY关键字可以和GROU