15.0、实验建表:

--父表

create table class(

id number(10)constraint class_id_pk primary key,

class_name varchar2(100) not null,

class_id varchar2(100) not null constraint class_class_id_uk unique

);

--父表数据

insert into class(id,class_name,class_id) values('1','1班','rom1');

insert into class(id,class_name,class_id) values('2','2班','rom2');

insert into class(id,class_name,class_id) values('3','3班','rom3');

insert into class(id,class_name,class_id) values('4','4班','rom4');

select * from class;

--子表:

create table student(

student_id number(10) constraint student_student_id_pk primary key,

student_name varchar2(100) not null unique,

class_id varchar2(100) not null,

constraint student_class_id_fk foreign key(class_id) references class(class_id)

);

--子表数据

insert into student(student_id,student_name,class_id) values('1','tom1','rom1');

insert into student(student_id,student_name,class_id) values('2','tom2','rom2');

insert into student(student_id,student_name,class_id) values('3','tom3','rom1');

insert into student(student_id,student_name,class_id) values('4','tom4','rom2');

select * from student;

15.1、多表查询的基本概念:

1、单表查询都有一个共同特点,在FROM子句里面只设置了一张数据表,如果现在需要从多个数据表里

取出数据,那么就属于多表查询,在FROM子句后面要设置多张数据表;

2、多表查询语句格式:

SELECT [DISTINCT] * | 列名称 [别名],列名称 [别名],...

FROM 表名称[别名],表名称[别名]

[WHERE 过滤条件(s)]

[ORDER BY 字段 [ASC | DESC],字段 [ASC | DESC],...];

3、笛卡尔积(全相乘):

(1)统计班级表 class 中的数据量:

select count(*) from class;

4

(2)统计学生表 student 中的数据量:

select count(*) from student;

4

(3)多表查询:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s,class c;

此时实现了多表查询,但是查询的结果一共产生了 16 行记录,实际上这 16 行记录等于 class 表的 4 行记录乘于 student 表的 4 行记录,

也就是相当于 student 表的全部记录被重复显示了4次,如果按照集合的概念来讲就相当于出现了一个乘积的概念,即两个集合发生了积的

关系,而这样积的关系在数据库上成为笛卡儿积问题,如果说现在要想消除掉笛卡儿积的问题,那么必须想办法为两张数据表设置关系;

(4)补充:

在进行列访问的时候发现都使用了表别名,这样做的好处是,当表的名称很长的时候,使用表别名可以很方便的访问表;

15.2、消除笛卡尔积:

1、只要是多表查询永远都存在笛卡儿积,消除笛卡尔积只是在显式上消除了笛卡儿积而已,所以只能在sql语句上优化以减轻笛卡

尔积对查询速度的影响,系统在设计的时候应尽可能不考虑使用多表查询;

2、全相乘:

(1)说明:

在多表查询中添加关联查询条件对两张表进行匹配,此方法效率低,此方法会在内存中生成一个非常大的临时表,十分费内存,而且

临时表里是没有索引的,大大降低了查询效率,在开发之中应该尽可能回避此方法。此方法和内连接的结果是一致的,只不过效率不

如内连接效率高;

查询的最终结果是不去除重复值的,包括null;

(2)查询班级和学生都存在的数据:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s,class c where s.class_id=c.class_id;

3、左连接(left join <表名> on <关联表达式>):

(1)说明:

1)语法:

select A.field1,A.field2,..., B.field3,B.field4 from <left table> A left join <right table> B on <expression>

2)左连接其实就可以看成左表是主表,右表是从表,左表不动,右表根据on后的条件一条条的去跟主表匹配,虽说右表也是读取一行行

记录,然后根据on后的条件对跟主表进行匹配,但是,左连接匹配条件字段使用索引的话,查询速度非常快,消耗内存也小,所以整体效

率相比于全相乘要快得多,全相乘没有使用索引。

对于左连接查询,如果右表中没有满足条件的行,则默认填充NULL。

查询的最终结果是不去除重复值的,包括null;

(2)查询学生所对应的班级:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s left join class c on s.class_id=c.class_id;

补充:以上结果得到的步骤:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s left join class c on 1=1;

4、右连接(right join <表名> on <关联表达式>):

(1)说明:

1)语法:

select A.field1,A.field2,..., B.field3,B.field4 from <left table> A right join <right table> B on <expression>

2)右连接查询跟左连接查询类似,只是右连接是以右表为主表,会将右表所有数据查询出来,而左表则根据条件去匹配,如果左表没有满足条件的行,

则左边默认显示NULL,左右连接是可以互换的。

查询的最终结果是不去除重复值的,包括null;

(2)查询班级所对应的学生:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s right join class c on s.class_id=c.class_id;

补充:以上结果得到的步骤:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s right join class c on 1=1;

5、内连接(inner join <表名> on <关联表达式>):

(1)说明:

1)语法:

select A.field1,A.field2,.., B.field3, B.field4 from <left table> A inner join <right table> B on <expression>

2)内连接查询就是取左连接和右连接的交集,如果两边不能匹配条件,则都不取出。

查询的最终结果是不去除重复值的,包括null;

(2)查询班级和学生都存在的数据:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s inner join class c on s.class_id=c.class_id;

6、全连接(full join <表名> on <关联表达式>):

(1)说明:

1)语法:

select A.field1,A.field2,..., B.field3,B.field4 from <left table> A full join <right table> B on <expression>

2)全连接会将两个表的所有数据查询出来,不满足条件的为NULL,全连接是左连接和右连接的并集;

查询的最终结果是不去除重复值的,包括null;

(2)查询学生和班级的所有数据信息:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s full join class c on s.class_id=c.class_id;

15.3、表连接的 order by 和 group by 的使用:

1、order by:

(1)对 class_name 进行升序操作:

select s.student_name, s.class_id as s_class_id, c.class_id as c_class_id, c.class_name from student s right join class c on s.class_id=c.class_id order by class_name asc;

2、group by:

(1)查询班级内的学生数:

select c.class_name,count(s.student_name) from student s right join class c on s.class_id=c.class_id group by c.class_name order by class_name asc;

-- 当没有学生时(null) count(s.student_name) 的结果为0

(2)统计学生所在的班级数:

select s.student_name,count(c.class_name) from student s right join class c on s.class_id=c.class_id group by s.student_name order by s.student_name asc;

15.4、补充:对表连接条件中有null值的匹配验证,匹配结果是否去除重复行的验证:

1、查看表结构:

(1)class表:

(2)student表:

2、查看表中的数据:

(1)class表:

(2)student表:

3、无过滤条件的左连接:

4、左连接:

5、右连接:

6、内连接:

7、全连接:

7、小结:

从以上截图可以发现左连接、右连接、内连接、全连接得到的最终结果是不去除重复值的,包括null,null和任何

值进行比较都没有结果,在表连接中,找不到匹配结果的用null代替;

15.5、总结:

1、没有关联字段或者关联条件的两张数据表是永远不可能实现多表查询的;

2、在进行多表查询这样的复杂查询操作时,强烈建议分步骤解决问题;

3、一般情况下如果是多个消除笛卡儿积的条件都会使用AND进行连接;

4、只要是多表查询永远都存在笛卡儿积,所以优秀的系统设计的时候应少用多表查询;

5、大部分情况下连表查询使用的都是内连接操作(等值连接);

6、对于表连接的最终结果是不去重的,包括null,如果在连接中没有值和连接条件进行匹配默认

用 null 填充,null和任何值进行比较都没有结果,也用 null 填充;

15、oracle多表查询的更多相关文章

  1. oracle系统表查询

    oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments -- 查询本 ...

  2. Oracle锁表查询和解锁方法

    数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remov ...

  3. oracle锁表查询

    ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 复制代码代码如下: --锁表查 ...

  4. oracle 字典表查询

    1.oracle 字典表查询 /*显示当前用户*/ show user 在sql plus中可用,在pl sql中不可用 /*查看所有用户名*/ select username,user_id,cre ...

  5. Oracle——多表查询

    本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一 ...

  6. Oracle 多表查询(1)

    一.基本概念 多表查询的语法如下: SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名] ,…]FROM 表名称 [别名], [表名称 [别名] ,…][WHERE 条件(S ...

  7. oracle锁表查询,资源占用,连接会话,低效SQL等性能检查

    查询oracle用户名,机器名,锁表对象 select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user ...

  8. Oracle 多表查询(2)

    四.统计函数及分组查询 1.统计函数 在之前学习过一个COUNT()函数,此函数的功能可以统计出表中的数据量,实际上这个就是一个统计函数,而常用的统计函数有如下几个: COUNT():查询表中的数据记 ...

  9. oracle 多表查询

    1.注意点 在查询过程中,不确定数据库表中的数据量,先查询数据量,数据量较大,则不能直接查询(select * from emp),如果数据量较大,直接查询容易造成死机或者数据读取较慢,如果较小可以查 ...

随机推荐

  1. Deepin深度应用商店和系统更新不正常的解决方法

    Deepin深度应用商店和系统更新不正常的解决方法 2020-02-04 10:25:09作者:i8520稿源:深度站 如果你的Deepin深度应用商店和系统更新不正常,可采用以下方法来解决问题. 解 ...

  2. IT菜鸟之交换机基础配置

    交换机属于二层设备(隶属于osi七层模型中的第二层:数据链路层,不识别不支持IP地址)  > 用户模式 用于登录设备 # 特权模式 用于查询设备配置 (config)# 全局模式 用于配置设备 ...

  3. JavaEE 前后端分离以及优缺点

    前端概念 前端是一切直接与用户交互的页面或软件(用户看得见.摸得着)的统称,比如各种网站网页.andorid 手机各种 App.苹果手机各种 app.微信小程序.网络游戏客户端等.所以,普通人使用计算 ...

  4. /usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:245: running exec setns .....

    docker创建容器时报错如下: containerd: start container" error="oci runtime error: container_linux.go ...

  5. Elasticsearch快速入门和环境搭建

    内容概述 什么是Elasticsearch,为什么要使用它? 基础概念简介 节点(node) 索引(index) 类型映射(mapping) 文档(doc) 本地环境搭建,创建第一个index 常用R ...

  6. Python+Selenium学习笔记5 - python官网的tutorial - 交互模式下的操作

    这篇笔记主要是从Python官网的Tutorial上截取下来,再加上个人理解 1. 在交互模式下,下划线'_'还可以表示上一步的计算结果 2.引号转义问题. 从下图总结的规律是,字符串里的引号如果和引 ...

  7. a标签点击跳转到新窗口打开目标资源

    点击a标签跳转到新窗口打开目标资源, <a href="http://gd.zjtcn.com/facs/c_t_p1_圆钉 50-75.html" target=" ...

  8. Harmony生命周期

    Harmony生命周期 系统管理或用户操作等行为,均会引起Page实例在其生命周期的不同状态之间进行转换.Ability类提供的回调机制能够让Page及时感知外界变化,从而正确地应对状态变化(比如释放 ...

  9. 使用nGraph的Intel&#174;Xeon&#174;上的高性能TensorFlow

    使用nGraph的IntelXeon上的高性能TensorFlow High-performance TensorFlow* on Intel Xeon Using nGraph 最近宣布了nGrap ...

  10. java 全端开源 电商系统 springboot uniapp 小程序 前后端分离 高可用

    Lilishop B2B2C商城系统 官方公众号 & 开源不易,如有帮助请点Star 所有jar包均可从maven中央仓库下载,无二次封装jar包,全端开源,无后门,无监控. 介绍 官网:ht ...