Mysql 条件查询

group

作用

  把行按字段分组

语法

  group by 列1,列2

select deptnu,job,count(deptnu) from employee group by deptnu,job

 

 

适用场景

  常用于统计场合,一般和聚合函数连用

having

作用

  对查询的结果进行筛选操作

语法

  having 条件 或者 having 聚合函数 条件

select job,count(deptnu) from employee group by job having job='文员'

适用场景

  一般跟在group by 之后

union

作用

  合并多个查询结果集

语法

(select * from employee where job='董事长' order by sal limit 99999) union (select * from employee where job='经理' order by sal desc limit 99999)

注意事项

  1. 合并的结构集,查询的“字段数”必须一致
  2. 查询语句相对应的字段类型,最好保持一致
  3. 用到order by 必须加上limit(最大条数),最外边需要用括号括起来 

高级查询实战

2张表

员工表

DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `empno` int(11) NOT NULL COMMENT '雇员编号',
  `ename` varchar(20) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(20) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(11) DEFAULT NULL COMMENT '雇员上级编号',
  `hiredate` date DEFAULT NULL COMMENT '雇用日期',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '薪资',
  `deptnu` int(11) DEFAULT NULL COMMENT '部门编号',
  PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表';

SET FOREIGN_KEY_CHECKS = 1;


部门表
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptnu` int(255) NOT NULL COMMENT '部门编号',
  `dname` varchar(255) DEFAULT NULL COMMENT '部门名称',
  `addr` varchar(255) DEFAULT NULL COMMENT '部门地址',
  PRIMARY KEY (`deptnu`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门表';

SET FOREIGN_KEY_CHECKS = 1;

1、查出至少一个员工的部门,显示部门编号、部门名称、部门位置、人数

select deptnu,count(1) from employee group by deptnu;



select a.*,b.num from dept a,(select deptnu,count(1) num from employee group by deptnu) b where a.deptnu=b.deptnu and b.num>1

2、查出薪资比猪八戒高的所有员工

select * from employee where sal>(select sal from employee where ename='猪八戒')

3、查出所有员工的姓名及上级的姓名

select a.ename,ifnull(b.ename,'boss') leader from employee a left join employee b on a.mgr=b.empno

4、查出受雇日期早于直接上级的所有员工的编号、姓名、部门名称

select a.empno,a.ename,d.dname from employee a left join employee b on a.mgr=b.empno left join dept d on a.deptnu=d.deptnu where a.hiredate<b.hiredate

5、查出部门名称和这些部门的员工信息,同时查出那些没有员工的部门

select a.dname,b.* from dept a left join employee b on a.deptnu=b.deptnu

6、查出所有文员的姓名和部门名称,所在部门的总人数

select b.ename,a.dname,c.renshu from dept a,employee b,(select deptnu,count(1) renshu from employee group by deptnu) c where a.deptnu=b.deptnu and b.job='文员' and b.deptnu=c.deptnu

7、查出最低薪资大于1500的各种工作及从事此工作的员工人数

select job,count(1) renshu from employee group by job having min(sal)>1500

 

posted @ 2020-11-16 22:24  陈彦斌  阅读(151)  评论(0编辑  收藏  举报