Oracle的前后连接,DQL之连接查询

简介

等值连接  非等值连接 特殊的自连接都属于内连接

  • 内延续:符合连接的准绳的数码被入选,不符合条件的数额被滤去
  • 外接连:外接连的结果集等于内几次三番的结果集加上相称不上的记录(一个也无法少)

目录结构:

又称多表查询,当查问的字段来自于四个表时,就会用到连年查询。

回顾:
一.单行函数
2.表连接
oracle中的表连接
内连接
等值连接
select e.id,e.first_name,d.name
from s_emp e,s_dept d
where e.dept_id = d.id;
select d.id,d.name dname,r.name rname
from s_dept d,s_region r
where d.region_id = r.id;
select e.id,e.first_name,r.name
from s_emp e,s_dept d,s_region r
where e.dept_id=d.id and d.region_id = r.id;
非等值连接
select e.id,e.first_name,e.salary,g.grade
from s_emp e,salgrade g
where e.salary between g.losal and g.hisal;
自连接
select distinct m.id,m.first_name
from s_emp e,s_emp m
where e.manager_997755.com澳门葡京 ,id = m.id;

如何促成外接连

997755.com澳门葡京 1

(+)  把(+)字段对面包车型大巴表的多少总体被匹配出来

select  distinactt m.id,m.first_name from s_emp e,s_emp m where  e.manager_id(+)=m.id;

(+)把首长表里的普通职员和工人用NULL相称(那是接连条件)

找普通职员和工人也要从领导表中找,因为领导表中有相对条件评释何人是理事,但是职员和工人表里未有那么些绝对条件。所以要把领导表中的多寡总体相配出来,所以(+)要加到员工表的字段上,这样领导表里的兼具数据就都被相称了(普通职员和工人相配的是NULL),要找普通职员和工人作时间,只要找职员和工人表里相称的manager_id是NULL的就能找到普通职员和工人(那是过滤条件)

select distinct m.id, m.first_name from s_emp e, s_emp m where e.manager_id(+)=m.id and e.manager_id is null;

997755.com澳门葡京 2

contents structure [-]

二.一、按时期分类:

sql玖贰正经:仅仅帮衬内连续

sql9玖行业内部:帮忙内接连+外连接+交叉连接

外连接
等值连接
select e.id,e.first_name,d.name
from s_emp e,s_dept d
where e.dept_id = d.id(+);
select d.id,d.name dname,r.name rname
from s_dept d,s_region r
where d.region_id = r.id(+);
非等值连接
select e.id,e.first_name,e.salary,g.grade
from s_emp e,salgrade g
where e.salary between g.losal(+) and g.hisal(+);
自连接
select m.id,m.first_name
from s_emp e,s_emp m
where e.manager_id(+) = m.id
and e.id is null;

演示一:

select  *  from s_dept;
select  *  from s_region;

(壹)内接连:供给出示各类部门的id  和机关呼应的名字  以及相应的地域名

select d.id, d.name, r.name from s_dept d, s_region r where d.region_id=r.id;

 997755.com澳门葡京 3

  显示了12条数据。

 

(2)业务扩展,创设新部门  id为拾0,name为test  region_id为NULL

 insert into  s_dept  values(100 ,‘test’,NULL);(表中的增加)

 997755.com澳门葡京 4 

再用地点的主意寻找就只找获得原来的,新扩充的找不到,因为region_id为NULL。

 

(3)所以用外接连使没有地面编号的机构也要显得出来,因为要把机关表里的有着机关同盟展现出来,那么就要把(+)加在地区表上

select d.id, d.name, r.name from s_dept d, s_region r where d.region_id=r.id(+)

997755.com澳门葡京 5

。。。。。。

997755.com澳门葡京 6 

Oracle的内外连接

2.二、按效益分类:

内连接:等值连接、非等值连接、自连接

外接连:左外连接、右外连接、全外连接

六续连接

  select d.id,d.name
      from s_emp e,s_dept d
          where e.dept_id(+) = d.id
             and e.id is null;

演示二:

(一)内接连:计算每一种职工的id  salary,并体现薪俸的薪金级别(用到s_emp和salgrade表)

select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal and s.hisal;

997755.com澳门葡京 7

  。。。。。。

997755.com澳门葡京 8

 

(贰)有1天把总老板的薪俸改为12500,超出了salgrade的总计范围。

update s_emp set salary=12500;

997755.com澳门葡京 9

再用地方的方式找,老董的就不见了!

select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal and s.hisal order by id;

997755.com澳门葡京 10

  。。。。。。

  997755.com澳门葡京 11

  从结果能够见到,未有了“id=一”的小业主的连串。

  

(3)所以要用外接连把超过总结范围的职工消息也要来得出来。因为要把职员和工人新闻表的全部新闻相配突显出来,所以要在salgrade对应的的字段上加(+),那里要加五个。

select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal(+) and s.hisal(+) order by id;

997755.com澳门葡京 12

内连接

三.一、等值连接:

1 多表等值连接的结果为多表的备位充数部分

二n表连接,至少须求n-一个几次三番条件

叁 多表的相继未有供给

肆1般要求为表起别称

伍方可搭配前面介绍的有所子句使用,比如排序、分组、筛选

简单来说询问

案例:查询职员和工人名和对应的单位名

SELECT last_name,department_name FROM employees,departments WHERE
employees.`department_id`=departments.`department_id`;

997755.com澳门葡京 13

为表起别称

1拉长语句的简洁度

2区分多个重名的字段

专注:如若为表起了小名,则查询的字段就不能够运用原来的表名去限制

案例:查询员工名、工种号、工种名

SELECT e.last_name,e.job_id,j.job_title FROM employees e,jobs j WHERE
e.`job_id`=j.`job_id`;

997755.com澳门葡京 14

两个表的逐壹能够替换

能够加筛选

案例:查询有奖金的职员和工人名、部门名

SELECT last_name,department_name,commission_pct FROM employees
e,departments d WHERE e.`department_id`=d.`department_id` AND
e.`commission_pct` IS NOT NULL;

997755.com澳门葡京 15

能够加分组

案例:查询每种城市的部门个数

SELECT COUNT 个数,city FROM departments d,locations l WHERE
d.`location_id`=l.`location_id` GROUP BY city;

997755.com澳门葡京 16

可以加排序

案例:查询各样工种的工种名和职工的个数,并且按职工个数降序

SELECT job_title,COUNT FROM employees e,jobs j WHERE
e.`job_id`=j.`job_id` GROUP BY job_title ORDER BY COUNT DESC;

997755.com澳门葡京 17

能够兑现三表连接

SELECT last_name,department_name,city FROM employees e,departments
d,locations l WHERE e.`department_id`=d.`department_id` AND
d.`location_id`Oracle的前后连接,DQL之连接查询。=l.`location_id` ORDER BY department_name DESC;

997755.com澳门葡京 18


总结

历次写外接连时,能够先写号内接连(写好内接连要搞清楚表和表之间关系以及业务逻辑),再增进(+),就是用NULL相配。因为外接连的结果集等于内延续的结果集加上相配不上的笔录。

(+)字段对面包车型大巴表的数量总体被相配出来

(+)只针对oracle数据库

可是全部数据库的语法机制是大致的,只是表现形式有变化 

  • 表连接:
    • 内连接:
      • 等值
      • 非等值
      • 自连接
    • 外连接:
      • 等值
      • 非等值
      • 自连接
  1. 等值连接
  2. 非等值连接
  3. 自连接

三.贰、非等值连接

SELECT salary,grade_level FROM employees e,job_grades g WHERE salary
BETWEEN g.`lowest_sal` AND g.`highest_sal`;

997755.com澳门葡京 19

壹.sql9九标准中的表连接
内连接:
select 字段列表
from 表1 [inner] join 表2
on 关联条件;

 额外补充

外连接

3.3、自连接

案例:查询职员和工人名和上边的名号

SELECT e.employee_id,e.last_name,m.employee_id,m.last_name FROM
employees e,employees m WHERE e.`manager_id`=m.`employee_id`;

997755.com澳门葡京 20

 select e.id,e.first_name,d.name
    from s_emp e inner join s_dept d
       on e.dept_id = d.id;

  三表连接:
  select 字段列表
    from 表1 join 表2 on 关联条件1
                   join 表3 on 关联条件2;
  select e.first_name,d.name,r.name
     from s_emp e join s_dept d on e.dept_id = d.id
          join s_region r on d.region_id = r.id; 

sql9九中规定的上下连接

  • 内连接:

    from a表,b表 where 连接条件成为9九专业:
    from a表 join b表 on 连接条件(过滤条件不可能写在1起)
    或然from a表 inner join b表 on 连接条件

  1. 外接连的特色
  2. 怎么样落实外接连

4.1、语法:

select 查询列表 from 表壹 小名 join 表二 外号 on 连接条件【where
筛选标准】【group by 分组】【having 筛选标准】【order by 排种类表】

外连接:
左外连接:内接连的结果集 + 左表相配不上的数量
select 字段列表
from 左表 left [outer] join 右表
on 关联条件;
select e.id,e.first_name,d.name
from s_emp e left join s_dept d
on e.dept_id = d.id;
右外连接:内连接的结果集 + 右表相配不上的数量
select 字段列表
from 左表 right [outer] join 右表
on 关联条件;
select e.id,e.first_name,d.name
from s_emp e right join s_dept d
on e.dept_id = d.id;
全外连接:内三番五次的结果集 + 两表相配不上的数量
select 字段列表
from 左表 full [outer] join 右表
on 关联条件;
select e.id,e.first_name,d.name
from s_emp e full join s_dept d
on e.dept_id = d.id;

示范:列出每一个机构的名字和相应的地点名

普通使用的:

select d.name, r.name from s_dept d, s_resgion r where d.region_id=r.id;

997755.com澳门葡京 21

 

  9九专业的:(一般不怎么用)

select d.name, r.name from s_dept d, join s_region r on d.region_id=r.id;

  997755.com澳门葡京 22

  • 外连接

    • 左外连接:a表发起连接,a表的数额总体被相配出来(通过NULL记录来任何合作)

    from a表 left outer join b表 on 连接条件;

   oracle使用的(+):

select d.name, r.name from s_dept d, s_region r where d.region_id=r.id(+);

  997755.com澳门葡京 23

 

99标准的:

select d.name, r.name from s_dept d left outer join s_region r on d.region_id=r.id;

997755.com澳门葡京 24

       

    • 右外连接:b表发起连接,b表的数额总体被相称出来

    from a表 right outer join b表 on 连接条件;

    • 全外连接:实际上只是三个逻辑概念,实际用旅途没什么用。全外连接的结果集等于左外连接的结果集加上右外连接的结果集,并且消除重复部分(正是左右两张表都全部金童玉女,a表b表书写顺序随便)

     oracle无法使用(+)达成全外连接

from  a表  full outer  join  b表  on  连接条件;

 997755.com澳门葡京 25

SQL9玖的上下连接

4.2、分类:

内连接:inner

外连接

左外:left

右外:right

全外:full(mysql不支持

穿插连接:cross

     select d.id,d.name
       from s_emp e right join s_dept d
          on e.dept_id = d.id
             where e.id is null;

oracle的全外连接

引用八个关键字union和union  all

  • union:能够统壹七个结实集,然后排重
  • union  all:能够统一多个结果集(不排重)

比如:

select  id from  s_emp  unoin ; 输出25条数据
select  id  from s_emp  unoin  all ; 输出50条数据

  

  1. SQL9九的内连接
  2. SQL99的内接连

4.3、内连接

select 查询列表 from 表一 外号 inner join 表2 外号 on 连接条件;

等值、非等值、自连接

一添加排序、分组、筛选

inner能够简单

三筛选标准放在where前面,连接条件放在on后边,升高分离性,便于阅读

四inner join连接和sql玖贰语法中的等值连接效果是1律的,都以询问多表的搅和

案例一.查询员工名、部门名

997755.com澳门葡京 26

案例二.查询名字中包涵e的职员和工人名和工种名

997755.com澳门葡京 27

案例三.”查询职员和工人名、部门名、工种名,并按机关名降序

997755.com澳门葡京 28

案例一、查询职员和工人的薪金级别

997755.com澳门葡京 29

案例一、查询职员和工人的名字、上级的名字

997755.com澳门葡京 30

2.集合运算(合并结果集)
union: 四个结实集取并集 并排重、排序
union all:五个结果集直接取并集
select id from s_emp union
select id from s_dept;
select id from s_emp union all
select id from s_dept;
intersect: 取八个结实集的参差不齐
select id from s_emp intersect
select id from s_dept;
minus: 第一个结实集 – 第二个结实集
select id from s_emp minus
select id from s_dept;
— 八个结果集的字段列表的多少和数据类型必须同盟
select id,first_name from s_emp minus
select id,name from s_dept;

一,Oracle中的内外连接

4.4、外连接

运用场景:用于查询一个表中有,另多个表未有的记录

特点:

一、外接连的询问结果为主表中的全体记录,假若从表中有和它万分的,则呈现相配的值,借使从表中未有和它非常的,则呈现null;外接连查询结果=内连接结果+主表中有而从表未有的笔录

二、左外连接,left join左侧的是主表;右外连接,right join左侧的是主表

三、左外和右外沟通四个表的次第,能够兑现平等的成效

四、全外连接=内连接的结果+表第11中学有但表二没有的+表第22中学有但表一未有的

查询哪个机构尚未职员和工人

左外

SELECT d.*,e.employee_id FROM departments d LEFT OUTER JOIN
employees e ON d.`department_id` = e.`department_id` WHERE
e.`employee_id` IS NULL;

右外

SELECT d.*,e.employee_id FROM employees e RIGHT OUTER JOIN
departments d ON d.`department_id` = e.`department_id` WHERE
e.`employee_id` IS NULL;

  select id,first_name from s_emp union
  select null,name from s_dept;

1.1,内连接

内接连正是符合条件的数码被入选,不符合条件的数码被过滤掉。

四.5、交叉连接

语法:select 查询列表 from 表1 小名 cross join 表二 外号;

特色:类似于笛Carl乘积(表壹有五条记下,表二有陆条记下,结果正是30条记下)

爱慕入微群众号:Java后端生活,干货文章第如今间送达!

997755.com澳门葡京 31

  1. 组函数和分组
    3.1 组函数
    一) 常用的组函数
    count(par|) : 总结1组数据的行数
    参数能够是其余类型 还足以是

    — 总结薪给高于1500的职员和工人数
    select count(*) from s_emp where salary>1500;
    max(par) : 总括壹组数据中的最大值
    min(par):总计壹组数据中的最小值
    参数能够是数字、字符串、日期类型
    — 列出最早和最晚入职的职工
    select max(to_char(start_date,’yyyy-mm-dd’)),
    min(to_char(start_date,’yyyy-mm-dd’))
    from s_emp;
    sum(par) : 总结1组数据的和
    avg(par) : 计算一组数据的平均值
    参数是数字类型
    — 列出销售部的总报酬和平均薪俸
    select sum(salary),avg(salary)
    from s_emp e,s_dept d
    where e.dept_id = d.id and d.name=’Sales’;

    贰) 组函数对null的处理: 忽略
    select count(commission_pct) from s_emp;
    三) 组函数 能够排重
    select sum(salary),sum(distinct salary) from s_emp;
    select count(salary),count(distinct salary) from s_emp;

一.1.壹 等值连接

先看看须求使用的表结构(在其他的例子中也大概被用上,其他代码也是):

997755.com澳门葡京 32997755.com澳门葡京 33

 1 table name:s_emp
 2 Name                Description
 3 ------------------  -------------
 4 ID                   员工编号
 5 LAST_NAME            名称
 6 FIRST_NAME           姓氏
 7 USERID               身份证号
 8 START_DATE           开始时间
 9 COMMENTS             评论内容
10 MANAGER_ID           上级编号
11 TITLE                标题
12 DEPT_ID              部门编号
13 SALARY               薪水
14 COMMISSION_PCT       提成

s_emp表(员工表)结构

997755.com澳门葡京 34997755.com澳门葡京 35

1 table name:s_dept
2 Name                Description
3 ------------------  -------------
4 ID                  部门编号
5 NAME                部门名称
6 REGION_ID           地区编号

s_dept表(部门表)结构

彰显各样职员和工人的数码 姓氏 部门名称

select e.id,e.first_name,d.name
        from s_emp e,s_dept d
            --使用'='号表示等值连接
               where e.dept_id=d.id;

3.2 分组
3.2.1 语法
group by 分组标准

一,1,2 非等值连接

997755.com澳门葡京 36997755.com澳门葡京 37

1 table name:salgrade
2 Name                Description
3 ------------------  -------------
4 GRADE                薪水级别
5 LOSAL                下区间
6 HISAL                上区间

salgrade表(薪酬级别表)结构

彰显各个职员和工人的数码 姓氏 薪酬 报酬级别

select e.id,e.first_name,e.salary,s.grade
       from s_emp e,salgrade s
            --也可以使用 where e.salary >= s.losal and e.salary <= s.hisal
            where e.salary between losal and hisal;
    .....
        where ....
           group by ...
             ...
               select
                 order by

  3.2.2 分组统计每个部门的人数
      select dept_id,count(*) cnt
         from s_emp
            group by dept_id;
      /* 分组语句中列出的字段必须是分组标准
          或者是组函数的参数*/
      select id,dept_id,count(*) cnt
         from s_emp
            group by dept_id;  -- 错误

  3.2.2 多列分组
     分组统计每个部门的人数,显式部门的名称和人数
     select e.dept_id,d.name,count(e.id) cnt
        from s_emp e join s_dept d on e.dept_id = d.id
            group by e.dept_id,d.name;


     分组统计每个部门的人数,列出人数超过2个的部门

     select dept_id,count(*) cnt
         from s_emp
            -- 错误:where子句中不能使用组函数
            -- where count(*)>2 
              group by dept_id;

 3.2.3 having子句
    分组后,根据条件筛选出符合条件的组
    select dept_id,count(*) cnt
        from s_emp
           where 1=1
             group by dept_id
                having count(*)>2
                   order by cnt;

    -- 语法顺序
    select 字段列表
        from 表名
           where 条件   -- 从表中根据条件筛选符合条件的行
             group by 分组标准  -- 根据分组标准分成多个组
                having 条件  -- 从分组结果中根据条件筛选符合条件的组
                   order by 排序标准 排序方式; 

     -- 执行顺序
     from
       where 
          group by
            having
              select
                 order by

1,1,3 自连接

来得全体长官的号码 姓氏

在s_emp表中,全数领导的数码都出现在manager_id一栏,根据那1天性大家来展开如下分析:

997755.com澳门葡京 38

故而代码如下:

select distinct m.id,m.first_name
       from s_emp e,s_emp m  
              where e.manager_id=m.id;

— 演练:列出平均薪俸大于一千 的单位的新闻
select dept_id,avg(salary) avgsal
from s_emp
group by dept_id
having avg(salary)>1000;

1.2 外连接

select d.id,d.name,avg(e.salary) avgsal
    from s_emp e,s_dept d
        where e.dept_id = d.id
            group by d.id,d.name
                having avg(e.salary)>1000
                    order by avgsal;

一.二.一 外连接的特色

读者须求留意外接连和内连接不是全然对峙的,它们的关联如下:

外接连的结果集=内延续的结果集+相配不上的多少。

  1. 子查询
    子查询指的是把一条select语句嵌入到另一条sql语句中
    施行时,先实行放到的子查询,然后再履行外层的sql语句
    4.1 where子句
    壹) 单行单列的子查询
    — 列出薪水比’Ben’高的职工的音信
    a. 列出’Ben’的工资
    select salary from s_emp where first_name=’Ben’;
    — 1100
    b. 列出薪水高于’Ben’的职员和工人的音信
    select id,first_name,salary from s_emp
    where salary>1100;
    c. 合并
    select id,first_name,salary from s_emp
    where salary>(
    select salary from s_emp where first_name=’Ben’
    );
    2) 多行单列的结果集
    子查询的结果集为多值时,不可能动用相比运算符
    急需使用处理多值的运算值,比如in、not in、any、all等
    (any、all要和比较运算符合营使用:>any、<all)
    — 使用子查询列出具有的理事的消息
    a) 列出高管的号码
    select distinct manager_id from s_emp;
    — null,1,2,3,6,7,8,9,10
    b) 依据编号,列出CEO的新闻
    select id,first_name,title from s_emp
    where id in(null,1,2,3,6,7,8,9,10);
    c) 合并
    select id,first_name,title from s_emp
    where id in(
    select distinct manager_id from s_emp);
    — 使用子查询列出普通职员和工人的新闻
    select id,first_name,title from s_emp
    where id not in(
    select distinct manager_id from s_emp
    where manager_id is not null);
    3) 使用exists
    — 列出有职员和工人的机构的新闻
    select * from s_dept d where exists(
    select * from s_emp e where e.dept_id=d.id
    );

1,2,二 怎样促成外接连

    通过在字段后拉长(+)来落到实处

       (+)字段所在的表的对面表的数额总体被选中
。除外,内三番五次中被过滤的多寡是由此NULL记录进行的相配。

   
比如依旧1,3,1的不胜案例,大家早已求出了首长的编号,那么员工的音信又该怎么求呢?

   
经过分析大家只要求用外接连得到表中全数职工的音讯,然后再减去领导的音信,得到的正是普通职员和工人的音讯了。

    997755.com澳门葡京 39

 通过地点的动图大家得以旁观,(+)字段对应表的全套数码都用null相称出来了,因而内接连也得以通过外连接来表明,比如上边包车型大巴1,3,1的案例也足以用如下的办法完毕:

select distinct m.id,m.first_name
       from s_emp e,s_emp m
               --通过is not null筛选得到实际数据
               where e.manager_id(+)=m.id and e.manager_id is not null;

 那样也足以得出领导的音讯。下边包车型大巴代码,能够显示普通职员和工人的音讯(上面包车型地铁代码和地点的代码恰好对峙是相反的):

select distinct m.id,m.first_name
       from s_emp e,s_emp m
               where e.manager_id(+)=m.id and e.manager_id is null;

4.2 having子句
— 列出平均薪俸高于公司平均报酬的单位的音信
select dept_id,avg(salary) from s_emp
group by dept_id
having avg(salary)>(
select avg(salary) from s_emp
);
4.3 from子句
八个select语句爆发的结果集,能够看成是叁个内视图也许匿名视图,只可以在脚下说话使用
select id,name,yearsal from
(select id,first_name name,12*salary+1000 yearsal from s_emp) e
where yearsal>15000;

二,SQL9九的左右连接

为了在相继数据库厂商之间赢得更加大的统壹性,U.S.A.国标学会(American
NationalStandards
Institute,ANSI)于19九零年公告了第捌个SQL标准,并于19八陆年通知了第3个本子,该版本现已被广泛地利用。ANSI在一九九伍年翻新了SQL标准的本子,即SQL九二和SQL2,并于壹玖玖八年再一次更新为SQL99和SQL三正式。在每3遍立异中,ANSI都在SQL中添加了新特点,并在言语中融为壹体了新的授命和效率。

Oracle的内外连接和SQL9九的内外连接能够相互转化。

--  列出工资高于本部门平均工资的员工的信息    
 a) 列出每个部门的编号及其平均工资
   select dept_id,avg(salary) avgsal from s_emp
        group by dept_id;  
   -- 相当于包含dept_id和avgsal两个字段的一张表  s
 b) 使用表连接(s_emp、s) 实现功能
    s_emp: id,first_name,salary
    s: avgsal
    关联字段:  s_emp.dept_id和s.dept_id
    select e.id,e.first_name,e.salary,s.avgsal
      from s_emp e,(
          select dept_id,avg(salary) avgsal
             from s_emp
               group by dept_id) s
           where e.dept_id = s.dept_id
              and e.salary > s.avgsal;

贰.一 SQL9玖的内接连

内接二连三唯有满足表连接条件的数码才会被选出。

 语法格式:

        from    a表    join    b表   on 表的连接条件  where 过滤条件;
        from    a表   [inner]  join    b表   on 表的连接条件  where 过滤条件;

s_dept表结构:

997755.com澳门葡京 40s_dept表(部门表)结构

s_dept表数据:

997755.com澳门葡京 41

s_region表结构:

997755.com澳门葡京 42997755.com澳门葡京 43

table name:s_region
Name                Description
------------------  -------------
ID                  地区编号
NAME                地区名称

s_region(地区新闻)表结构

s_region表数据:

997755.com澳门葡京 44

上面是内部连接的代码:

select distinct d.id,d.name,r.name
       from s_region r join s_dept d
               on r.id=d.region_id;

结果如下,能够观察结果只有前12行数据被匹配出来:

997755.com澳门葡京 45

上边那段代码和下边包车型客车均等:

select distinct d.id,d.name,r.name
       from s_region r,s_dept d
             where r.id=d.region_id;

4.4 select之后
外接连的另一种达成格局,并且更灵活
— 列出职员和工人及其所在单位的音信
select id,first_name,salary,(
select name from s_dept d where e.dept_id=d.id
) dname
from s_emp e;

二.二 SQL9九的外连接

-- 练习:列出所有和'Mark'在同一部门的员工的信息
select id,first_name,dept_id from s_emp
    where dept_id=
(select dept_id from s_emp where first_name='Mark');

 2.2.1 语法

from a表  left  [outer]  join   b表   on  表的连接条件    where  过滤条件;
from a表  right  [outer]  join   b表   on  表的连接条件    where  过滤条件;
from a表  full  [outer]  join   b表   on  表的连接条件    where  过滤条件;

left join 形式的延续称为左连接。

查询结果包罗join左边表中的具有记录以及左边表满意条件的记录。也正是a表中的全体数据都会被匹配出来,b表中符合条件的数额才会被相称出来。

right join 方式的接连称为右连接。

查询结果包罗join左侧表中的具有记录以及左手表中知足条件的记录。也等于b表中的全体数据都会被相称出来,a表中符合条件的数目才会被相称出来。

full join 方式的连年称为全连接。

询问结果包含join左边和右边的全套数码。也便是a表和b表的具有数据都会被般配出来。

 

本文为博主原创文章,转载请注解出处。

对象名_姓名缩写_座位号

xxxx_zsm_00

五.表的操作
伍.壹 表的始建和删除
5.一.一 标识符的命名
1) 由a-z、A-Z、0-9、_、$、#构成
2)必须用假名开始
三) 不能够和要紧字重名
四) 无法和任何的数据库对象重名
5) 1-30位
5.1.2 创建表
— 语法
create table 表名(
字段名 数据类型,
….
字段名 数据类型
);
create table testid_zsm_00(
id number,
name varchar2(20)
);
5.1.3 删除表
drop table 表名;
drop table testid_zsm_00;

5.贰 数据操作语句(DML)
— 创设一个测试表
多少个字段:
编号 数字
名字 字符串
入职日期 日期
create table emp_zsm_00(
id number(7),
name varchar2(20),
start_date date
);

5.2.1 插入语句(insert)  -- 一次一整行
  1) 语法
   insert into 表名[(字段列表)] values(值列表);
   字段列表的数量和顺序和值列表的数量和顺序必须一致
  2) 不省略字段列表
   -- 写入全部字段
   insert into emp_zsm_00(id,name,start_date)
         values(1,'test1','13-OCT-17');
   commit;
   -- 写入部分字段 ( 没有给值的字段必须允许为null )
   insert into emp_zsm_00(id,name)
         values(2,'test2');
   commit;
 3) 省略字段列表(相当于给出了全部字段,并且顺序和表结构一致)
     -- 给全部字段提供值
     insert into emp_zsm_00 values(3,'test3',sysdate);  
     commit;       
      insert into emp_zsm_00 values(4,'test4',
           to_date('2017-10-13','yyyy-mm-dd')); 
     commit;
     -- 给部分字段提供值
      insert into emp_zsm_00 values(5,'test5',null); 
     commit;

五.2.② 更新语句(update)
1) 语法
update 表名 set 字段 = 新值[,字段 = 新值,…][where 条件];
二) — 更新 把入职日期改为’2017-0一-20′
update emp_zsm_00 set start_date=’12-JAN-17′;

  3) -- 把id=1的名字改为'Ben',入职日期改为当前日期
      update emp_zsm_00 set name='Ben',
          start_date=sysdate where id=1;
      commit;

5.2.3 删除语句(delete) -- 整行删除
  1) 语法
    delete [from] 表名 [where子句];
  2) 删除表中全部数据
     delete from emp_zsm_00;
     rollback; -- 撤销没有提交的操作
  3) 带where子句的删除
     delete from emp_zsm_00 where name like 'test%';
     commit;

5.三 事务控制语句 (TCL)
select: 和工作非亲非故
ddl: 隐式提交的工作
dml: 暗中认可需求显式提交

5.3.1 事务控制语句的含义
  commit;     确认事务(提交所有未提交的操作)
  savepoint 保存点;  定义保存点
  rollback;   回滚事务(撤销所有未提交的操作)
  rollback to 保存点; 回顾到保存点的位置

5.3.2 事务的四大特性(ACID)
  1) 原子性:事务中的语句是一个不可分割的整体
    转账:
    账户表:account
    字段:id   balance
    A账户---> B账户  2000
    update account set balance = balance - 2000
              where  id='A';
    a
    update account set balance = balance + 2000
              where  id='B'; 
    b
    if a&&b
      commit;
    else
       rollback;

    要么全部成功,要么全部失败

 2)一致性
   事务执行的结果必须是使数据库从一种一致性状态变为另一种一致性状态

 3) 隔离性
    一个事务对数据的改变,在提交之前,对于其他的事务是不可见的。
 4)  持久性
   事务一旦提交,对数据的改变就是永久的

5.三.叁 部分成功 部分退步
— 删除表中全体数据 属于ddl语句,无法撤消
truncate table emp_zsm_00;

   insert into emp_zsm_00(id,name) values(1,'test1');
   savepoint a;
   insert into emp_zsm_00(id,name) values(2,'test2');
   savepoint b;
   insert into emp_zsm_00(id,name) values(3,'test3');
   savepoint c;
   insert into emp_zsm_00(id,name) values(4,'test4');
   select * from emp_zsm_00;
   rollback to b;
   commit;
   select * from emp_zsm_00;

练习:
1.利用select语句建表:
drop table emp_zsm_00;
create table emp_zsm_00 as select * from s_emp;
二.给全数’Carmen’的部属涨薪给
1) 查询’Carmen’的编号
二) 依照’Carmen’的编号 查询其麾下的号码
叁) 依据职员和工人编号 改工资
三.去除和’Ben’同单位的职工

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website