MySQL基础(四)

数据库设计三范式

第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分

第二范式:建立在第一范式的基础上,非主键字段完全依赖主键,不能产生部分依赖 多对多,三张表,关系表两个外键

第三范式:建立在第二范式的基础上,所有非主键字段不能传递依赖于主键字段 一对多,两张表,多的表加外键

在实际开发中,以满足客户需求为主,有时候会拿冗余换执行速度

一对一表的设计:主键共享者外键唯一

练习题:查询各部门工资最高的人

select
    e.name, t.*
from 
    emp e
join
    (select deptno, max(sal) as maxsal from emp group by deptno) t
on 
    t.deptno = e.deptno and t.maxsal = e.sal;

练习题:不用max选出收入最高的人的两种方法

第一种:自连接  第二种:order+limit

select 
    sal
from
    emp
where
    sal not in(select distinct a.sal from emp a join emp b on a.sal < b.sal)

练习题: 列出薪酬高于公司平均薪酬的所有员工,所在部门,上级领导,雇员的薪资等级

select 
    e.name'员工', d.dname, l.ename'领导', s.grade
from 
    emp e
join 
    dept d
on
    e.deptno = d.deptno
left join
    emp l
on
    e.mgr = l.empo
join
    salgrade s
on
    e.sal between s.losal and s.hisal
where
    e.sal > (select avg(sal) from emp); 

练习题:列出薪酬等于部门30员工的薪酬的其他员工的姓名和薪酬

select 
    ename,sal
from
    emp
where 
    sal in (select distinct sal from emp where deptno = 30)
and
    deptno <> 30;

练习题:列出每个部门工作的员工数量,平均工资和平均服务期限

select 
    d.deptno, count(e.name), ifnull(avg(e.sal),0), ifnull(avg(timestampdiff(YEAR,hiredate,now())), 0)
from 
    emp e
right join 
    dept d
on
    e.deptno = d.deptno
group by
    d.deptno

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值