oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

 

 

多表连接查询

内连接(inner join

目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来。

等值连接(join...on(...=...)

--选出雇员的名字和雇员所在的部门名字

--(1)必须明确的指出重复字段属于哪个表

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

 

--(2)新语法:join...on(...=...)

select ename, dname from emp join dept on ( emp.deptno = dept.deptno);

非等值连接(join...on(...>...)

--求每个人的薪水值,名字和他的薪水处于第几个级别

--(1)不使用连接查询

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

--或者

select ename, sal, grade from emp, salgrade where sal >= losal and sal <= hisal;

 

--(2)新语法:join...on(...between...and...)

select ename, grade from emp e join salgrade s on (e.sal between s.losal and s.hisal);

 

--(3)三表连接:取出雇员名字,他的部门名称,和薪水等级其中名字第二个字母包含A的不要取出

 

select ename, dname, grade from emp e join dept d on (e.deptno = d.deptno) join salgrade s on (e.sal between s.losal and s.hisal) where ename not like ‘_A%‘;

 

从上面的例子也可以看出,比较的对象不仅可以是具体的数据,字段名也可以作为比较的对象;一个join...on(...xxx...)只能连接两张表,要连接两张表以上,写多个join...on(...xxx...)即可,之间用空格隔开。

自然链接(natural join...)

自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。

--自动将emp表中的deptno和dept表中的deptno做了连接

select emp.ename,dept.dname from emp natural join dept;

交叉链接(cross join...

交叉连接,交叉连接即返回这两个表的笛卡尔积。

select * from emp cross join dept;

 

外连接(outer join)

目的:将两张表中不能产生连接的数据也查询出来。注意和内连接的区别:内连接只查询符合连接条件的记录,外连接则把不能产生连接的数据也查询出来。

右外连接(right join... on(...=...) 

概念:right join关键字右边的表有一条(多条)不能产生连接的数据没有在连接查询中显示出来,要想把他显示出来,就要用到右连接。

--求每个雇员的名字,他所在部门的名称,全部选出来,并且把多余的部门也选出来(有一个部门没有员工)

select ename, dname from emp e right  join dept d on (e.deptno = d.deptno);

 

 

 

左外连接left join...on(...=...)...

概念:right join关键字左边的表有一条(多条)不能产生连接的数据没有在连接查询中显示出来,要想把他显示出来,就要用到左连接。

--求这个人的名字,他经理人的名字,并且把没有经理的员工也选出来

select e1.ename, e2.ename from emp e1 left join emp e2 on (e1.mgr = e2.empno);

 

 

全外连接(full join...on(...=...)...

概念:把full join关键字左边右边没有连接的记录都查询出来。

select ename, dname from emp e full join dept d on (e.deptno = d.deptno);

 

自连接

概念:为同一张表起不同的别名,然后当成两张表来用。

--求这个人的名字,他经理人的名字(经理也是员工,经理编号就是员工编号)

 

select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno)

 

小结

join后跟要连接的表,on后跟连接条件,将连接条件和过滤条件分开。

--SQL1992旧写法

select ename,dname from emp e,dept d where e.deptno = d.deptno and e.ename not like ‘%A%‘;

 

--SQL1999新写法

select ename,dname from emp e join dept d on(e.deptno = d.deptno) where e.ename not like ‘%A%‘;

 

 

子查询

子查询是一个 SELECT 语句,它嵌套在一个 SELECT语句、DELETE 语句、UPDATE 语句或嵌套在另一子查询中。

--求谁挣的钱最多

select ename, sal from emp where sal = (select max(sal) from emp);

 

--求按照部门进行分组之后挣钱最多的那个人的名字,部门编号

--(1)只求挣钱最多的一个人的名字和部门编号

select ename,deptno from emp where sal = ((select max(m_max) from (select deptno,max(sal) m_max

from emp group by deptno )));

 

--(2)求出每个部门挣钱最多的人的名字和部门编号

select e.deptno,e.ename from emp e join (select deptno,max(sal) max_sal from emp group by deptno) t on (t.deptno = e.deptno and t.max_sal = e.sal);

 

思路:

1.先求出每个部门的最大工资和部门号,根据部门号分组

2.把第一步的结果当成一张表t,表t有max_sal,deptno两个字段

3.连接查询表t和表emp,求出挣钱最多的那个人的名字,部门编号

--求每个部门的平均薪水等级是多少

select deptno ,grade from salgrade s join

(select deptno, avg(sal) s_avg from emp group by deptno) t

on (t.s_avg between s.losal and s.hisal );

分析:

1.求出每个部门的平均薪水

2.把第一步的结果当成一张表t,表t有avg_sal,deptno两个字段

3.连接查询表t和表salgrade表,求出grade,dept

小结

子查询的关键是将子查询的结果当成一张表。

视图

授权

默认情况下scott用户没有创建视图的权限,需要授权。

 

#使用oracle用户登录linux

[[email protected] ~]$ sqlplus / as sysdba;

......

SQL> grant create table ,create view to scott;

 

 

视图的概念

在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。

简单的理解,视图就是一个子查询或者就是一张表,视图中的表叫虚表,实际数据依然在实际当中的表里面。

创建视图

CREATE VIEW view_name AS

SELECT column_name(s)

FROM table_name

WHERE condition

 

--求平均薪水的等级最低的部门名称

--分析:(1)先求出每个部门的平均薪水等级,结果当成表t1

---------(2)从t1中求出平均薪水等级最低的部门编号

---------(3)根据(2)中查询出的部门编号连接查询dept表得出部门名称

select dname from dept where deptno = (

 

  select deptno from (

 

    select t1.deptno, s.grade from salgrade s join

   

    (select avg(sal) s_avg,deptno from emp group by deptno) t1 on (t1.s_avg between s.losal and

     s.hisal)

 

    ) where grade = (

 

      select min(grade) from (

 

        select t1.deptno, s.grade from salgrade s join

       

        (select avg(sal) s_avg,deptno from emp group by deptno) t1 on (t1.s_avg between s.losal and

  s.hisal)

 

      )

  )

)

 

在上面的例子中,有两部分子查询是同样的sql语句,我们可以将这个子查询创建为视图,从而简化sql语句。

create view v$_dept_sal_grade as  (

        select t1.deptno, s.grade from salgrade s join

        (select avg(sal) s_avg,deptno from emp group by deptno) t1 on (t1.s_avg between s.losal and

    s.hisal)

)

上面的sql语句就可以简化为:

select dname from dept where deptno = (

 

  select deptno from v$_dept_sal_grade where grade = (

 

      select min(grade) from v$_dept_sal_grade

  )

)

可见,通过创建视图,大大简化了sql语句。

时间: 2024-08-23 11:54:40

oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图的相关文章

ORACLE 多表连接与子查询

Oracle表连接 SQL/Oracle使用表连接从多个表中查询数据 语法格式: select 字段列表from table1,table2where table1.column1=table2.column2; 说明: 在where子句中指定连接条件 当被连接的多个表中存在同名字段时,必须在该字段前加上"表名"作为前缀. 连接的类型 Oracle8i之前的表连接: 等值连接(Equijoin) 非等值连接(Non-Equijoin) 外连接(Outer join):-->左外连

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两

mysql表连接,子查询以及if判断

创建表: CREATE TABLE emp ( ename varchar(10) DEFAULT NULL, hiredate date DEFAULT NULL, sal decimal(10,2) DEFAULT NULL, deptno int(2) DEFAULT NULL, age int(3) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CREATE TABLE dept ( deptno int(2) DEFAULT NUL

oracle sql 基础(二):select 语句

为了从数据库中查询数据,你需要用SQL语言中使用最多的SELECT语句.我们分别介绍SELECT语句的基础语法.子查询.从多表中查询数据,然后再进行实例解析. 一.SELECT语句的基础语法 SELECT语句就像叠加在数据库表上的过滤器,即选择查询用于定位数据库特定的列和行.下面是SELECT语句的基础语法.  SELECT [ALL|DISTINCT SELECT_LIST FROM {table_name|view_name} [WHERE search_condition] [GROUP

ORACLE SQL单行函数(二)【weber出品必属精品】

11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type ----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1) 12.dual的作用: 1. 查询数据库系统日期 2. 进行四则运算 SQL> select sysdate from dual; ---这里查询数据库系统日期 SYSDATE ---

Oracle SQL性能优化系列

1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行an

python基础篇(二)

python基础篇(二) if:else,缩进和循环控制 A:if的基础格式和缩进 B:循环判断 C:range()函数和len()函数 D:break,contiue和pass语句 for,while循环 函数基础 A:函数的定义和返回值 B:返回值的三种情况 C:函数的注释 函数的进阶(命名空间和作用域) A:内置命名空间 B:全局命名空间 C:局部命名空间 D:全局作用域 E:局部作用域 F:函数的嵌套和作用域链. G:函数名的本质 闭包 ?一:if:else和缩进 A:if的基础格式和缩

shell脚本编程之基础篇(二)

shell脚本编程之基础篇(二) ============================================================================== 概述: ============================================================================== 退出状态 ★进程使用退出状态来报告成功或失败 ◆0 代表成功,1-255代表失败 ◆$? 变量保存最近的命令退出状态 (查看:echo $?)