SQL多表关联查询

时间:2022-01-12 13:29:17
 
 1 --解锁SCOTT用户
 2 alter user scott account unlock
 3 --检索指定的列
 4 select job,ename,empno from emp;
 5 --带有表达是的select子句
 6 select sal*(1+0.2),sal from emp;
 7 --显示不重复的记录
 8 select distinct job from emp;
 9 --比较筛选   <> =
10 select empno,ename,sal from emp where sal>1000;
11 select empno,ename,JOB from emp;
12 select empno,ename,sal from emp where sal <>all(3000,950,800);
13 --特殊关键字筛选
14 --like  模糊查询
15 select empno,ename,job from emp where JOB like '%S';
16 --IN   --varchar
17 select empno,ename,job from emp where job in('PRESIDENT','MANAGER','ANALYST');
18 --NOT IN
19 select empno,ename,job from emp where job not  in('PRESIDENT','MANAGER','ANALYST') ;
20 --BETWEEN   -numer ,inter
21 select empno,ename,sal from emp where sal between 2000 and  3000;
22 --NOT BETWEEN
23 select empno,ename,sal from emp where sal  NOT between 2000 and  3000;
24 --IS NULL/  is not null
25 select * from emp where comm is NOT  null;
26 --逻辑筛选
27 --and   ,or,not       关系 于  -或  --非
28 select empno,ename,sal from emp where (sal>=2000  and sal<=3000 ;
29 select empno,ename,sal from emp where sal<2000  or sal>3000 ;
30 --分组查询
31 select deptno,job from emp group by deptno,job order by deptno ;
32 select deptno as 部门编号,avg(sal) as 平均工资 from emp group by deptno;
33 select deptno as 部门编号,avg(sal) as 平均工资 from emp group by deptno having avg(sal)>2000; --group by 子条件 having 
34 --排序查询Order by;  desc:逆序  asc默认
35 select deptno,empno,ename from emp order by deptno,EMPNO;

 

 
在创建关系型数据表时,根据数据库范式的要求,为了降低数据的冗余,提供数据维护的灵活性
将数据分成多个表进行存储,实际工作当中,需要多个表的信息,需要将多个表合并显示
  SQL多表关联查询

 

 1 --内连接
 2 select e.empno as 员工编号, e.ename as 员工名称, d.dname as 部门 
 3 from emp e inner join dept d on e.deptno=d.deptno;         
 4  
 5 --左外连接
 6 insert into emp(empno,ename,job) values(9527,'EAST','SALESMAN');
 7         
 8 select e.empno,e.ename,e.job,d.deptno,d.dname from emp e left join dept d
 9 on e.deptno=d.deptno;
10 --右外连接
11 select e.empno,e.ename,e.job,d.deptno,d.dname from emp e right join dept d
12 on e.deptno=d.deptno;
13 
14 --完全连接
15 select e.empno,e.ename,e.job,d.deptno,d.dname from emp e full join dept d
16 on e.deptno=d.deptno;
17 
18 --自然连接(共有的属性,会去除重复列)
19 select empno,ename,job,dname from emp natural join dept where sal>2000;
20 
21 事务如果不提交,会一直写入以下表空间;
22 redo(记录日志表空间)  undo(记录日志备份表空间)
23 提交:  commit    回滚: rollback
24 
25 --右外连接过滤
26 select * from emp e right join dept d on e.deptno=d.deptno
27 where e.deptno is null;
28 --左外连接过滤
29 select * from emp e left join dept d on e.deptno=d.deptno
30 where d.deptno is null;
31 --全外连接过滤
32 select * from emp e full join dept d on e.deptno=d.deptno 
33 where d.deptno is null or e.deptno is null;
34 
35 
36 /*自连接(self join)是SQL语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。
37 在emp中的每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理。*/
38 select em2.enname 管理者,em1.enname  下属员工 from  emp em1 left  join  emp em2 on  em1.mgr=em2.empno order by em1.mgr;
39 
40  /*交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数*/
41        select count(*)  from dept cross join emp;  

 ROWNUM伪列

 1 select rownum,empno,ename  from emp where deptno=20;
 2 --返回emp表中前5个员工消息
 3 select rownum seq,empno,ename,sal from emp where rownum<=5;
 4 
 5 --查询emp表中2条到第5条的数据
 6 select rownum seq,empno,ename,sal from emp where rownum>=2 and rownum<=5;
 7 
 8 /*ROWNUM列值会被重置所致,比如在取第1行,where子条件不成立,第1行被丢弃,
 9 但是取下一行时,ROWNUM会被重置为1,而不是2, 导致,ROWNUM永远无法取到正确的值
10 无法返回 任何行数据*/
11 select * from emp;
12 select seq,empno,ename,sal from (select rownum seq,empno,ename,sal from emp)
13 where seq>=2 and seq<=5
 
外键约束的作用 
外键是该表是另一个表之间联接的字段 外键必须为另一个表中的主键 外键的用途是确保数据的完整性。它通常包括以下几种: 实体完整性,确保每个实体是唯一的(通过主键来实施)
 
1 域完整性,确保属性值只从一套特定可选的集合里选择
2 关联完整性,确保每个外键或是NULL(如果允许的话)或含有与相关主键值相配的值    

有外键约束的表CRUD操作

  1   增加数据:先插入外表,再插入主表
  2   删除数据:先删除主表再删除外表,
  3   有对应记录的值,不能修改当前列;