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(...=...)...)
概念:left 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
[oracle@localhost ~]$ 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语句。
oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图的更多相关文章
- MS sql server 基础知识回顾(二)-表连接和子查询
五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...
- ylb:SQL 表的高级查询-多表连接和子查询
ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...
- MySQL多表查询之外键、表连接、子查询、索引
MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...
- 读《程序员的SQL金典》[3]--表连接、子查询
一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...
- ORACLE 多表连接与子查询
Oracle表连接 SQL/Oracle使用表连接从多个表中查询数据 语法格式: select 字段列表from table1,table2where table1.column1=table2.co ...
- MySQL开发——【联合查询、多表连接、子查询】
联合查询 所谓的联合查询就是将满足条件的结果进行拼接在同一张表中. 基本语法: select */字段 from 数据表1 union [all | distinct] select */字段 fro ...
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- mysql学习笔记-- 多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- MySQL学习笔记——多表连接和子查询
多表连接查询 # 返回的是两张表的乘积 SELECT * FROM tb_emp,tb_dept SELECT COUNT(*) FROM tb_emp,tb_dept # 标准写法,每个数据库都能这 ...
随机推荐
- myeclipse中如何修改Servlet模板_day01
参考网址:https://jingyan.baidu.com/article/0eb457e536d5a503f1a90593.html 如果你在web项目下创建一个Servlet类,那么它会自带很多 ...
- PHP:__get()、__set()、__isset()、__unset()、__call()、__callStatic()六个魔术方法
哎呀呀,今天小仓鼠学到了魔术方法,简称魔法,哈哈哈哈,神经病啊~ 平时在面试的时候,也会遇到问魔术方法有哪些的问题哦!今天我们来了解一下下~ 1.__get() 形式: __get($objName) ...
- CopyTranslator-复制即翻译的外文辅助阅读翻译解决方案
英语/English 复制即翻译的外文辅助阅读翻译解决方案 请尽快更新到,这是你没有体验过的全新版本,只需3分钟,你就会跟我一样,爱上这个软件. 如果您觉得软件对您有所帮助,不用follow,不用fo ...
- 创建React工程:React工程模板
这是本人初学React做的学习笔记;讲的不是很深,只算是简单的进行介绍. 这是一个小系列.都是在同一个模板中搭建的,但是代码是不能正常执行的. >>index.js <!DOCTYP ...
- SVN建立分支、代码合并以及常用操作
在项目开发的过程中,现在遇到这样一个问题: 现在是9月份,在同一个项目中我要开发A.B两个模块,A模块是11月份上线,B模块是12月份上线,但是SVN上的trunk(主干)上的代码必须是上线的. 假设 ...
- 【转】Data URL和图片,及Data URI的利弊
Data URL给了我们一种很巧妙的将图片“嵌入”到HTML中的方法.跟传统的用img标记将服务器上的图片引用到页面中的方式不一样,在Data URL协议中,图片被转换成base64编码的字符串形式, ...
- 的NodeJS异步数据库函数需要同步的答案 +
我是新来的NodeJS和我写,需要从我去过的所有的函数应该是在这种情况下,读QUERY我的MySQL数据库,并返回代码,我非常希望服务器能够对其他事件作出回应而这个地方是轨迹查询请求.然而,它并不特别 ...
- P1089 津津的储蓄计划
题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在 ...
- PHP获取当前页面完整路径URL
//PHP获取当前页面完整路径URL 1 <?php function getFullUrl(){ # 解决通用问题 $requestUri = ''; if (isset($_SERVER[' ...
- C#获取包括一二级汉字的拼音 首字母
C#获取包括一二级汉字的拼音 首字母 声母 汉字拼音转换 using System; using System.Collections.Generic; using System.Linq; usin ...