数据库部分(MySql)_2

分组查询

  分组查询通常和聚合函数结合使用,查询条件中每个XXX就以XXX为分组的条件;

  格式:每个A的平均B

    select avg(B) from 表名 group by A;

having

  在where后面只能写普通字段的条件;在having后面写聚合函数的条件;having写在group by的后面,where写在最前面;

  案例: 查询每个部门的平均工资,只查询平均工资大于2000的。
  select deptno,avg(sal) a from emp group by deptno having a>2000;

SQL中各个关键字的顺序

  select ... from 表名 where ... group by ... having ... order by ... limit ... ;

子查询

  嵌套在SQL语句中的查询SQL语句称之为子查询;子查询可以由多层嵌套;子查询可写在where和having后面作为查询条件的值;

  写在创建表的时候  create table NEW表名 as (select X,Y from 表名);

  写在from后面当成一张新表使用(必须有别名)

    select X,Y from (select * from EMP) T;

  子查询格式:  select 字段名,字段名 from 表名1 字段名=(select avg(字段名) from 表名2);

1    案例:查询部门平均工资最高的部门信息
2      1)得到平均最高工资
3      select avg(工资) from EMP group by 部门编号 order by avg(工资) desc limit 0,1;
4      2)得到部门信息
5      select 部门编号 from EMP group by 部门编号 having avg(工资)=(select avg(工资) from EMP group by 部门编号 order by avg(工资) desc limit 0,1);
6      3)得到部门信息
7      select *from dept where 部门编号 in (select 部门编号 from EMP group by 部门编号 having avg(工资)=(select avg(工资) from EMP group by 部门编号 order by avg(工资) desc limit 0,1));

 

关联查询

  同时查询多张表的数据称为关联查询。

 1 案例:
 2     1)查询每个员工的姓名和相对应的部门名称
 3     select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
 4     2)查询每个商品的标题、商品单价和对应的分类名称
 5     select t1,title,t1.price,t2.name from t_item t1,t_item_category t2 where t1.category_id=t2.id;
 6     3)查询在new york工作的所有员工信息
 7     select e.* from emp e,dept d where e.deptno=d.deptno and d.loc='new york';
 8     4)查询所有的员工信息和对应的部门地点
 9     select e.*,d.loc from emp e,dept d where e.deptno=d.deptno;
10     5)查询员工信息、员工工资、对应的部门名称,要求工资大于2000
11     select e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno and e.sal>2000;

笛卡尔积

  关联查询如果不写关联关系,则查询结果为两张表的乘积;笛卡尔积是一种错误的查询结果,在工作中不能出现。

等值连接和内连接

  这两种连接方式都是关联查询的查询方式,效率相同;

  等值连接: select * from A,B where A.X=B.X and A.Y=XXX;

  内连接: select * from A join B on A.X=B.X where A.Y=XXX;

  外连接: select * from A left/right join B on A.X=B.X where A.Y=XXX;

  左外连接:以join右侧表为主表查询其所有数据和右侧表的交际数据;

  右外连接:以jion右侧表为朱彪查询其所有和左侧表的交集数据。

1     案例:查询所有员工的名字对应的部门名
2     select e.ename,d.dname from emp e left join dept d on e.deptno=d.deptno; 

猜你喜欢

转载自www.cnblogs.com/DebugTheWorld/p/9819888.html