数据库3

                                                      数据库3

--当要查询的数据来自于不同的表,需要实现 多表联查

--92语法  99语法

--内连接 :有where ,满足条件才显示,不满足不显示

--92语法 select 数据 from 表1,表2,表3...;

--笛卡尔积  对乘效果

select * from emp,dept;

--查询所有员工的信息,以及所在的部门信息

--数据: 员工信息  部门信息

--来源: emp dept

--等值连接

select empno,ename,emp.deptno,dname from emp,dept where emp.deptno = dept.deptno;

--注意:当使用同名字段时候,需要指明字段出处

--非等值连接

--查询员工信息以及每个员工的薪资等级

select empno,ename,sal,grade from emp,salgrade where sal between losal and hisal;

--2500这个薪资在几等级

select grade from salgrade where 2500 between losal and hisal;

select * from salgrade;

--自连接  一张表,当多张表使用

--查询有上级的员工的员工信息,以及这个员工的上级信息

--数据:员工信息 上级信息

--来源: 员工表 emp e1  上级表 emp e2

select * from emp e1,emp e2 where e1.mgr = e2.empno;

--外连接

--左外连接|左连接  右外连接|右连接 :主表在逗号的左边叫做左连接,主表在逗号的右边叫做右连接

--主表: 主表中的数据无论是否满足连接条件都要显示

--查询所有员工信息,以及这个员工的上级信息

--员工表作为主表

select * from emp e2,emp e1 where e1.mgr = e2.empno(+);--右链接

select * from emp e1,emp e2 where e1.mgr = e2.empno(+);--左连接

select * from emp e1,emp e2 where e1.mgr = e2.empno(+) and e1.deptno in(10,20) order by e1.empno desc;

-- 找出30部门的员工名称及部门名称

select ename,dname from emp e,dept d where e.deptno  = d.deptno  and  e.deptno= 30;

-- 找出 所有部门的员工数 及部门名称

--需求:所有部门都要,部门表中所有的数据都要  部门表作为主表存在

select dname,count(empno) from emp e,dept d where e.deptno = d.deptno group by dname;

-- 找出所有有员工的部门名称以及员工数

select dname,count(1) from emp e,dept d where e.deptno = d.deptno group by dname;

select dname,c 人数 from dept d,(select deptno,count(1) c from emp group by deptno) e where d.deptno = e.deptno;

select * from emp,dept where emp.deptno(+) = dept.deptno;

--先把每一个部门的部门编号和部门人数求出来

select deptno,count(1) from emp group by deptno;

--上面这个结果集与部门表进行连接

select dname,nvl(c,0) 人数 from dept d,(select deptno,count(1) c from emp group by deptno) e where d.deptno = e.deptno(+);

--查询员工信息 e1,部门信息 d,薪资等级 s,上级信息 e2

select dname 部门名称, e1.ename 员工名称, grade 薪资等级, e2.ename 上级名称

  from emp e1, dept d, salgrade s, emp e2

where e1.deptno = d.deptno

  and e1.sal between losal and hisal

  and e1.mgr = e2.empno;

-- 非等值连接 > < != <>between and

--查询员工姓名,工资及等级

--900 属于哪个等级

select ename,sal,grade from emp e ,salgrade s where sal between losal and hisal;

select grade from salgrade where 900 between losal and hisal;

-- 自连接: 特殊的等值连接 (来自于同一张表)

----找出 存在上级的员工姓名 及上级名称

-- 数据来源: emp e, emp m

-- 字段: e.ename, m.ename

-- 条件: e.mgr=m.empno

select e.ename,m.ename from emp e, emp m where e.mgr = m.empno;

-- 外连接

--找出 所有部门的员工数 及部门名称

select dname,nu from dept d,(select  count(1) nu,deptno from emp group by deptno ) e  where d.deptno(+) = e.deptno;


--99语法

--select 数据 from 数据来源1 join 数据来源2;

--笛卡尔积  对乘  cross join  --交叉连接

  --交叉连接 cross join --->笛卡尔积

 -- 自然连接(主外键、同名列) natural join -->等值连接

 -- join using连接(同名列) -->等值连接

  --[inner]join on 连接 -->等值连接 非等值 自连接 (解决一切) 关系列必须区分

 --left|right [outer] join on|using -->外连接

 --full join on|using -->全连接 满足直接匹配,不满足 相互补充null ,确保 所有表的记录 都至少出现一次

select * from emp,dept; --92

select * from emp e cross join dept d ; --99

select * from emp natural join dept; --自然连接

select empno,deptno from emp e natural join dept d;

--注意;如果使用相同名字段 不能指明出处

select empno,deptno from emp e join dept d using(deptno);--join..using

--注意;如果使用相同名字段 不能指明出处

--非等值连接

--A join B on 连接条件 join c on 连接条件 可以做等值连接 可以做非等值连接

select * from emp e join dept d on e.deptno = d.deptno where e.deptno =30;

--注意;如果使用相同名字段 不能指明出处

--查询员工信息,薪资等级

select grade,count(empno)

  from emp e

  join salgrade s

    on e.sal between losal and hisal

  join dept d

    on e.deptno = d.deptno

    where e.deptno in(10,30) group by grade

    having grade != 1 order by grade;

--员工信息,上级信息

select * from emp e1 join emp e2 on e1.mgr = e2.empno;

--内连接(inner)join

--外连接 left join 左连接  right join右链接  全连接full join 两边的表都作为主表

--主表 主表在join的左边,叫做左连接 left join  主表在join的右边,叫做左连接 right join

select * from emp e1 left join emp e2 on e1.mgr = e2.empno;

--视图

--视图是虚拟表,操作视图其实数据还是在对应的表中,使用视图最大的好处可以简化select语句代码

--不是所有的账号都有权限创建视图

--需要授权  1)切换到管理员账号sys  2) grant dba to 账户名;授权  回收权限revoke dba from 账号名;

--创建视图

--create or replace view 视图名 as select语句 [with read only];

--drop view 视图名; 删除视图

--update 表名 set 字段=值 [,....] where 过滤行记录;

--索引

--是数据库的对象之一,是透明的,有没有索引,sql都一样

--大量的数据的查询,如果数据量比较小,如果不是大量做查询,二十大量的执行增删改的操作,反而会降低效率,因为需要维护索引

--字典的目录

--create index 索引名 on表名 (字段列表...)

--drop index 索引名

--表设计

--三范式的规范

--表的名称, 字段,类型,要求(约束)

--表和表之间的关系  一对一    一对多|多对一(主外键)  多对多(中间表)

--创建表 和添加约束

--先创建表,后续为这个表的什么字段添加约束

--创建表的同时添加约束

      --创建表 字段后直接添加约束  1)默认的约束名    2)指定约束名

      --      字段定义完成之后,统一为不同的字段的添加约束


--DDL 定义语句    创建表 create 删除表drop  修改alter

--创建表

--create table 表名(

      --字段名 类型  约束,

      --字段名 类型  约束,

    -- 字段名 类型 ,

    --约束;

    --约束....

--)

--追加约束

--当有主从表关系的两张表

--1.删除表时候

      --1)默认先删除从表后删除主表            2)删除主表并同时删除主外键约束 cascade constraints


--2.删除主表中的数据的时候,

      --这个主表数据如果没有被从表中的数据引用,可以直接删除

      --这个主表数据如果已经被从表中的数据引用,需要处理

                                  --1)先删除从表中引用了的数据  再删除主表的这个数据     

                                  --2) 添加外键约束的时候 on delete set null,当主表数据被删除时,从表引用这条数据的外键字段值为null                                             

                                  --3) on delete cascade 删除主表数据的时候级联删除从表中引用了的这些数据

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容