分组查询(group by)
分组查询:
select deptno,max(sal) from emp group by deptno;
2查询每个职位的平均工资
select deptno,avg(sal) from emp group by deptno;
3查询每个部门的人数
select deptno,count() from emp group by deptno;
4查询工资大于1000的员工,每个部门的最大工资
select deptno,max(sal) from emp where sal>1000 group by deptno;
多字段分组查询:group by 字段1,字段2;
1查询每个部门下每个主管的手下人数
select deptno, mgr, count() from emp where mgr is not null group by deptno,mgr;
2查询emp表中每个部门的编号,人数,工资总和,最后根据人数进行升序排序,如果人数一致,根据工资总和降序排序
select deptno,count(),sum(sal) from emp group by deptno order by count() asc,sum(sal) desc;
3查询工资在1000-3000之间的员工信息,每个部门的编号,平均工资,最低工资,最高工资,根据平均工资进行升序排序排列
select deptno,avg(sal),min(sal),max(sal) from emp where sal between 1000 and 3000 group by deptno order by avg(sal)
4查询含有上级领导的员工,每个职业的人数,工资的总和,平均工资,最低工资,最后根据人数进行降序排列,如果人数一致,根据平均工资进行升序排列
select job, count(),avg(sal),min(sal) from emp where mgr is not null group by job order by count() desc,avg(sal) asc;
各种关键字的顺序
select from 表名 where grouphaving order by limit
having(结合group by使用)
having一般要结合分组查询和聚合函数使用,用于给聚合函数的内容添加条件
聚合函数的条件不能写在where后面
普通字段的条件写在where后面,聚合函数的条件写在having后面
1查询每个部门的平均工资,要求平均工资大于2000(c是别名的用法)
select deptno,avg(sal) c from emp group by deptno having c >2000;
2查询每个分类的平均单价,要求平均单价低于100
select category_id ,avg(price) a from t_item group by category_id having a<100;
3查询category_id分类为238和917的两个分类的平均单价
select category_id,avg(price) from t_item where category_id in(238,917) group by category_id;
4查询emp表中每个部门的平均工资高于2000的部门编号,部门人数,平均工资,最后根据平均工资降序排列
select deptno,count(),avg(sal) a from emp group by deptno having a>2000 order by a desc;
5查询emp表中工资在1000-3000之间的员工,每个部门编号,工资总和,平均工资,过滤掉平均工资低于2000的部门,按照平均工资进行升序排序
select deptno,sum(sal), avg(sal) a from emp where sal between 1000 and 3000 group by deptno having a>=2000 order by a asc;
6查询emp表中每年入职的人数
select extract(year from hiredate) year,count() from emp group by year;
7查询每个部门的最高平均工资
select deptno,avg(sal) from emp group by deptno order by avg(sal) limit 0,1;
子查询(嵌套查询)
子查询可以写在where或having后面当做查询条件的值
写在from后面,当做一张新表(但是必须要有别名)
select ename from (select from emp where sal>1000) newtable;
写在创建表的时候
create table emp_20 as (select from emp where deptno=20);
1查询emp表中工资最高的员工信息
select from emp where sal=(select max(sal) from emp);
2查询emp表中工资大于平均工资的所有员工的信息
select from emp where sal>(select avg(sal) from emp);
3查询工资高于20号部门最大工资的员工信息
select from emp where sal>(select max(sal) from emp where deptno=20);
4查询工资高于20号部门最大工资的员工信息
select from emp where sal>(select avg(sal) from emp);
5查询和Jones相同工资的其他员工信息
select from emp where job=(select job from emp where ename='jones' and ename!='jones');
6查询工资最低的员工的同事们的信息(同事=相同job)
select from emp where job=(select job from emp where sal=(select min(sal) from emp)) and sal !=(select min(sal) from emp);
7查询最晚入职的员工信息
select from emp where hiredate=(select max(hiredate) from emp);
8查询名字为King的部门编号和部门名称(需要用到dept表)
select deptno,dname from dept where deptno=(select deptno from emp where ename='king');
9查询有员工的部门信息(编号和名称)
select deptno ,dname from dept where deptno in (select distinct deptno from emp);
10查询平均工资最高的部门信息
select from dept where deptno in (select deptno from emp group by deptno having avg(sal)=(select avg(sal) from emp group by deptno order by avg(sal) desc limit 0,1));
关联查询
同时查询多张表的数据称为关联查询
1查询每一个员工的名称和其对应的部门名称
select eename,ddname from emp e,dept d where edeptno=ddeptno;
2查询在new york工作的所有员工的信息
select e from emp e,dept d where edeptno=ddeptno and dloc='new york';
笛卡尔积
如果关联查询不写关联关系则查询到的数据是两张表的乘积,这个乘积称为笛卡尔积,笛卡尔是一种错误查询方式的结果,工作切记不要出现
等值连接和内连接
等值连接:
select from A,B where Ax=Bx and Aage=18;
内连接:
select from A join B on Ax=Bx where Aage=18;(将关联关系写在on后面)
1查询每个员工的名称和其对应的部门名称
select eename,ddname from emp e join dept d on edeptno=ddeptno;
外连接
使用外连接查询得到的数据层除了两张表的交集数据以外和另外一张主表的全部数据,哪个表为主表通过left/rigth控制, left以join左边表为主表 rigth以join右边表为主表
1查询所有员工的名称和其对应的部门名称
select eename,ddname from emp e left join dept d on edeptno=ddeptno;
按照你现在这两个表的设计来看,最简单的改法就是,把SmallClassID表中的BigClassName和EnBigClassName这两个字段去掉,换成BigClassID这个字段,存放它上级目录的ID,设置成外键字段,指向BigClass表中的主键。
然后你在代码里面生成目录的时候,先生成一级目录,例如:
Select
from
BigClass
这样就可以把一级节点都生成,然后再对每个一级节点生成其下级节点,比个给产品分类这个节点生成下级节点,可以用:
Select
from
SmallClass
where
BigClassID
=
46(即取当前节点对应的ID)
这样就可以查到它的子节点了。
这个是对你改动最小的,但是最好的实现方法是只用一张表去实现,设置一个ParentID的字段,存储其父节点的ID,也就是一个指向自己这张表的外键,然后用递归算法去生成目录,这样就比较灵活,不管有几级的目录都可以。
鼠标右键点击数据库所在目录(或者它上级目录,但是注意要能够继承权限)-〉选择“共享和安全”-〉选择“安全”选项卡-〉点击“添加”按钮-〉点击“高级”按钮-〉点击“立即查找(N)”按钮-〉找到前缀为“IUSR_”的用户名(格式为IUSR_计算机名)-〉选中此用户,点击确定-〉这样这个用户就被加进来了-〉在“Internet来宾帐户”的权限框中,除了默认的还要选中“写入权限”-〉“应用”或者“确定”即可。 提示:如果是WinXP系统下找不到“共享和安全”选项,需要先进行一下设置:“工具”-〉“文件夹选项”-〉“查看”-〉“默认使用简单共享(推荐)”,把这个选项去掉,再在文件夹上右键点击,就会出现安全这个选项。
以上就是关于数据库高级查询2全部的内容,包括:数据库高级查询2、数据库级联二级目录怎么实现、数据库数据写不进去等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)