多表查询

1.什么是多表查询?
一次select语句需要查询的内容来自于不止一张表。
同时从多张表中查询数据。

单表查询:
select id,last_name,salary
from s_emp
where salary > 1400 and dept_id in(41,42)
order by salary desc,id asc;
单表查询能查到的数据是有限的。

查询所有员工的id、last_name?
select id,last_name
from s_emp;

查询所有部门的id、name?
select id,name
from s_dept;

查询所有员工id、last_name以及所在部门的
id和name?
select id,last_name,id,name
from s_emp,s_dept;

语法:
select ...
from 表1,表2,表3.....
where ...
order by ....;

出现字段名冲突时,要使用 表名.列名 的形式,
声明可能出现冲突的字段来自于哪张表。
select s_emp.id,last_name,s_dept.id,name
from s_emp,s_dept;

还可以给表名起一个别名。
起到的别名可以在整个select语句中代替表名使用。
语法:
select 别名1.字段,别名2.字段......
from 表1 别名1,表2 别名2;

查询所有员工的id、last_name以及
所在部门的id、name?
select s1.id,s1.last_name,s2.id,s2.name
from s_emp s1,s_dept s2;

2.消除笛卡尔积
笛卡尔积是数学运算中集合进行乘法运算所产生的结果集。

A = { 1 , 2 , 3 }
B = { a , b }

计算:A x B = {(1,a),(1,b),(2,a),(2,b)
(3,a),(3,b)}
一共有2x3=6个结果。

数据库进行多表查询,就会产生笛卡尔积。

表1:学生姓名表
学号 姓名
1 张三
2 李四
3 王五
-------------------
表2:学生成绩表
学号 分数
1 80
2 90
3 70
要求:查询所有学生的id、姓名以及成绩?

1 张三 1 80
1 张三 2 90
1 张三 3 70

2 李四 1 80
2 李四 2 90
2 李四 3 70

3 王五 1 80
3 王五 2 90
3 王五 3 70

思路:
使用where关键字增加、指定查询条件,
从笛卡尔积中把不需要的数据筛除出去。

1)等值连接
将两张表中产生关联的字段使用等号进行连接。
查询所有员工的id、last_name以及
所在部门的id、name?
字段:s_emp.dept_id = s_dept.id

select s1.id,s1.last_name,s2.id,s2.name
from s_emp s1,s_dept s2
where s1.dept_id = s2.id;

2)不等值连接
大于
大于等于
小于
小于等于
逻辑比较符:between in

查询所有员工id、last_name以及
工资收入等级?
select e.id,e.last_name,g.name
from s_emp e,s_gender g
where e.salary between g.minSal and g.maxSal;

或者:where e.salary >=g.minSal
and e.salary <= g.maxSal;

表1:员工表
id salary
1 900
2 1300
3 2100

表2:工资等级表
最小值 最大值 等级名称
0 1000 蓝领
1000 1500 白领
1500 2500 金领

结果:
员工ID 员工工资 最小值 最大值 等级名称
1 900 0 1000 蓝领
1 900 1000 1500 白领
1 900 1500 2500 金领
2 1300 0 1000 蓝领
2 1300 1000 1500 白领
2 1300 1500 2500 金领
3 2100 0 1000 蓝领
3 2100 1000 1500 白领
3 2100 1500 2500 金领

3)外连接
a)左外连接
查询所有员工的id、last_name以及
所在部门的id、name?
select s1.id,s1.last_name,s2.id,s2.name
from s_emp s1,s_dept s2
where s1.dept_id = s2.id;

SQL:insert into s_emp(id,last_name)
values(999,'_briup');

查询所有员工的id、last_name以及
所在部门的id、name?要求把没有部门的员工
也显示出来?
思路:让员工表 左外连接 到部门表。

左外连接:
A左外连接到B,就可以查出来没有B的A。

语法:
1)标准SQL
一套规范、标准
拿到任何一款关系型数据库中执行。
select...
from 表1 left [outer] join 表2
on 连接条件;

select e.id,e.last_name,d.id,d.name
from s_emp e left join s_dept d
on e.dept_id = d.id;
两张表顺序不能颠倒。

2)Oracle特色语法
符号:(+)
原则:把(+)放在数据较少的一方。
语法和多表查询的语法一致。
select e.id,e.last_name,d.id,d.name
from s_emp e,s_dept d
where e.dept_id = d.id(+);

练习:
查询所有员工信息和部门信息,
要求把没有员工的部门也显示出来?
select e.id,e.last_name,d.id,d.name
from s_emp e,s_dept d
where e.dept_id(+)= d.id;

b)右外连接
右外连接和左外连接就是相反的。
A表左外连接到B表,相当于B表右外连接到A表。

语法:
select...
from 表1 right [outer] join 表2
on 连接条件;

左外连接:
select e.id,e.last_name,d.id,d.name
from s_emp e left join s_dept d
on e.dept_id = d.id;
右外连接:
select e.id,e.last_name,d.id,d.name
from s_dept d right join s_emp e
on e.dept_id = d.id;
以上两种写法是等价的。

练习:
先向数据库中插入一条数据:
insert into s_dept(id,name)
values(1000,'Teaching');
commit;

查询所有员工的id、last_name以及对应部门的
id、name?要求把没有员工的部门也查询出来?
使用左外连接和右外连接两种方式。

c)全连接
等同于同时包含左外连接和右外连接。
相当于A表同时左右外连接到B表,
或A、B两表互为左/右外连接。

语法:
select ...
from 表1 full join 表2
on 连接条件;

查询所有员工的信息和部门信息?
要求把所有没有员工的部门
以及没有部门的员工全部都显示出来?
select e.id,e.last_name,d.id,d.name
from s_emp e full join s_dept d
on e.dept_id = d.id;

全连接没有Oracle特色语法,
如果要使用全连接,必须写标准SQL。

4)自连接
一张表自己和自己产生关联。
一张表,查询的时候当成多张表使用。

查询所有员工的id、last_name以及
对应经理的id、last_name?
要求把没有经理的员工也显示出来?
关系:员工的manager_id = 经理的id;
select s1.id,s1.last_name,s2.id,s2.last_name
from s_emp s1,s_emp s2
where s1.manager_id = s2.id(+);

编号 姓名 经理编号
1 张三 7
2 李四 9
....
7 王五 10
9 赵六 10

5)集合连接
查询前20条数据 - 查询前10条数据

3.Oracle数据库中的伪列
伪列不用来存储数据,所以不是一个真正意义的字段。
也不存在于任何一张表中。
伪列出现在每一次select查询语句的结果中。

1)rowid
标识当前数据的物理存储位置。
select id,last_name,rowid
from s_emp;
2)rownum
标识当前查询结果中数据的标号。
注意:rownum必须从1开始。
先有查询结果,再有rownum字段。
select id,last_name,rownum
from s_emp;

查询员工表中前十条数据?
select id,last_name
from s_emp
where rownum <= 10;

查询员工表中第11-20条数据?
select id,last_name
from s_emp
where rownum>=11 and rownum <=20;

select id,last_name,salary
from (select id,last_name,rownum as rn
from s_emp) e
where rn >=11 and rn <=20;

Oracle学习笔记<4>的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  3. Oracle学习笔记——点滴汇总

    Oracle学习笔记——点滴汇总 http://www.botangdb.com/ Oracle GI = Grid Infrastructure = ASM + Cluster

  4. Oracle学习笔记之四sp1,Oracle 11g的常用函数

    从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i)    分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...

  5. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  6. Oracle学习笔记—数据字典和常用命令(转载)

    转载自: oracle常用数据字典和SQL语句总结 Oracle常用命令大全(很有用,做笔记) 一.Oracle数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一 ...

  7. oracle学习笔记(一)用户管理

    --oracle学习第一天 --连接 @后面连接数据库实例,具体连接到那个数据库 conn scott/tiger@MYORA1; --修改密码 passw; --显示用户 show user; -- ...

  8. 吴裕雄--天生自然 oracle学习笔记:oracle理论学习详解及各种简单操作例子

    1. 数据库的发展过程 层次模型 -->网状模型 -->关系模型 -->对象关系模型 2. 关于数据库的概念 DB:数据库(存储信息的仓库) DBMS:数据库管理系统(用于管理数据库 ...

  9. Oracle 学习笔记 11 -- 视图 (VIEW)

    本次必须学习一个全新的概念-- 视图 (VIEW).在前面的笔记中曾提到过,数据对象包含:表.视图.序列.索引和同义词.前面的笔记都是对表的想剖析,那么本次笔记就对视图的世界进行深入的剖析. 视图是通 ...

  10. oracle学习笔记1(环境搭建)

    学习的开始先剧透一下,本人有点笨,本来想用oracle vbox,装个red hat+oracle,但是虚拟机一直报错,0x00000000内存不能written.所以便想到其他的办法,刚好接触了go ...

随机推荐

  1. Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截

    原文链接:https://blog.csdn.net/qq_38762313/article/details/85234594 全局异常拦截器:       解决写每个接口都需要去做容错而添加try{ ...

  2. JavaScript —— 正则表达式元字符

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. PHP算法[转]

    这里是用PHP写的几个基础算法,算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重 要的,经典名句:算法+数据结构=程序.作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序 ...

  4. Linux学习笔记之磁盘与文件系统的管理

    三.Linux磁盘与文件系统的管理 MBR扇区(512B) 磁盘的分区组成 Boot sector    扇区(用来装引导程序) Super block   记录inode与Block的信息 Inod ...

  5. Dev控件

    在DevExpress程序中使用PopupContainerEdit和PopupContainer实现数据展示 使用PopupContainerEdit和PopupContainerControl制作 ...

  6. HDU4035 Maze 期望DP+树形DP(好题)

    题意:有一个树形的迷宫,有N个房间(标号为1~N)以及N-1条通道将它们连通,一开始在1号房间,每进入一个房间i,有k[i]的概率被陷阱杀死回到房间1,有s[i]的概率找到出口逃离迷宫,如果没有找到出 ...

  7. STM32F103系列命名规则

    对于STM32F103xxyy系列:第一个x代表引脚数:T-36pin,C-48pin,R-64pin,V-100pin,Z-144pin:第二个x代表Flash容量:6-32K,8-64K,B-12 ...

  8. gcc开启C99或C11标准支持

    开启C99支持 gcc -std=c99 forc99.c 开启C11支持 gcc -std=c1x forc11.c 或 gcc -std=c11 forc11.c

  9. 【leetcode】668. Kth Smallest Number in Multiplication Table

    题目如下: 解题思路:几乎和[leetcode]719. Find K-th Smallest Pair Distance 的方法一样.只不过一个是减法一个是乘法,还有一点区别是[leetcode]7 ...

  10. hashmap:cr:csdn

    HashMap相关问题 1.你用过HashMap吗?什么是HashMap?你为什么用到它? 用过,HashMap是基于哈希表的Map接口的非同步实现,它允许null键和null值,且HashMap依托 ...