Java之路-MySql6范式和多表查询

一、范式
范式是指设计数据库时 , 需要遵循的一些规范 。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF , 又称完美范式) 。 我们日常需要遵循到第三范式
第一范式(1NF):第一范式每一列不可再拆分 , 称为原子性
第二范式(2NF): , 第二范式就是在第一范式的基础上所有列完全26/26依赖于主键列
第三范式(3NF):任何非主列不得传递依赖于主键 , 所谓传递依赖 , 指的是如果存在''A→B→C''的决定关系 , 则C传递依赖于A 。
Java之路-MySql6范式和多表查询
文章图片
二、多表查询
多表查询指多个表的数据整合成一张表展示 。 比如我们的员工表和部门表组成一个既可以看到员工信息又能看到部门信息的员工部门表 。
Java之路-MySql6范式和多表查询
文章图片
常见的多表查询的分类如上图所示
Java之路-MySql6范式和多表查询
文章图片
1.内连接
用左边表的记录去匹配右边表的记录 , 如果符合条件的则显示 。 如:从表.外键=主表.主键
1.1.隐式内连接
隐式内连接:看不到JOIN关键字 , 条件使用WHERE指定
格式:SELECT字段名FROM左表,右表WHERE条件
select*fromemp,deptwhereemp.`dept_id`=dept.`id`;
1.2.显式内连接
隐式内连接:使用INNERJOIN...ON语句,可以省略INNER
格式:SELECT字段名FROM左表[INNER]JOIN右表ON条件
select*fromempeinnerjoindeptdone.`dept_id`=d.`id`wheree.`name`='唐僧';
2.外连接
外联接可以是左外联接、右外联接 。
2.1.左外连接
用左边表的记录去匹配右边表的记录 , 如果符合条件的则显示;否则 , 显示NULL , 使用LEFTOUTERJOIN...ON , OUTER可以省略
格式:SELECT字段名FROM左表LEFT[OUTER]JOIN右表ON条件
select*fromdeptdleftjoinempeond.`id`=e.`dept_id`;
2.2.右外联接
用右边表的记录去匹配左边表的记录 , 如果符合条件的则显示;否则 , 显示NULL , 使用RIGHTOUTERJOIN...ON , OUTER可以省略
格式:SELECT字段名FROM左表RIGHT[OUTER]JOIN右表ON条件
select*fromdeptrightjoinempondept.`id`=emp.`dept_id`;
3.子查询
一个查询的结果做为另一个查询的条件 , 有查询的嵌套 , 内部的查询称为子查询 , 比如查询工资最高的员工信息
--1查询最高的工资是多少9000
SELECTMAX(salary)FROMemp;
-2查询员工信息 , 并且工资等于9000的
SELECT*FROMempWHEREemp.`salary`=9000;
--一条sql就完成这个操作 。 子查询
SELECT*FROMempWHEREemp.`salary`=(SELECTMAX(salary)FROMemp);
3.1.子查询的结果是单行单列时
子查询可以作为条件 , 使用运算符去判断 。 运算符:>>=<<==
SELECT*FROMempWHEREemp.salary<(SELECTAVG(salary)FROMemp);
3.2.子查询的结果是多行单列时
SELECT*FROMempWHEREdept_idIN(SELECTidFROMdeptWHERENAME='财务部'ORNAME='市场部');
3.3.子查询的结果是多行多列时
SELECT*FROMdeptt1,(SELECT*FROMemp
Java之路-MySql6范式和多表查询】WHEREemp.`join_date`>'2011-11-11')t2WHEREt1.id=t2.dept_id;