Oracle 多表查询 --笛卡尔集--左连接--右连接--1999 语法--满外连接

Oracle 多表查询总结

笛卡尔集现象
笛卡尔集会在下面条件下产生:
– 省略连接条件
– 连接条件无效
– 所有表中的所有行互相连接
为了避免笛卡尔集, 可以在where加入有效的连接条件。

Oracle 连接:
使用连接在多个表中查询数据。

  • 在where子句中写入连接条件。
  • 在表中有相同列时,在列名之前加上表名前缀。

如下没有连接条件,产生笛卡尔集现象。
select employees.employee_id,departments.department_id from employees,departments;
如下加了连接条件,没有产生笛卡尔集现象。
select employees.employee_id,departments.department_id from employees,departments where employees.employee_id = departments.department_id;

等值连接
主键:唯一,非空
外键

select employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id from employees, departments where employees.department_id = departments.department_id;
区分重复的列名

  • 使用表名前缀在多个表中区分相同的列。
  • 在不同表中具有相同列名的列可以用表的别名加以区分。

表的别名:

  • 使用别名可以简化查询。
  • 使用表名前缀可以提高执行效率。

select e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id from employees e , departments d where e.department_id = d.department_id;

连接多个表:
连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。

非等值连接
select e.last_name, e.salary, j.grade_level from employees e, job_grades j where e.salary between j.lowest_sal and j.highest_sal;

外连接:
(1)使用外连接可以查询不满足连接条件的数据。
(2)外连接的符号是 (+)。
select e.last_name, e.department_id, d.department_name from employees e, departments d where e.department_id(+) = d.department_id;
右外连接:
select employees.employee_id, departments.department_id from employees, departments where employees.employee_id(+)=departments.department_id;

左外连接:
select employees.employee_id, departments.department_id from employees, departments where employees.employee_id=departments.department_id(+) ;

内连接和外连接(1):
(1)内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
(2)外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 外连接的where子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+).

select worker.last_name || ' works for ' || manager.last_name from employees worker, employees manager where worker.manager_id = manager.employee_id;

叉集:
(1)使用CROSS JOIN 子句使连接的表产生叉集。
(2)叉集和笛卡尔集是相同的。

select last_name, department_name from employees cross join departments ;

自然连接:

  • natural join 子句,会以两个表中具有相同名字的列为条件创建等值连接。
  • 在表中查询满足等值条件的数据。
  • 如果只是列名相同而数据类型不同,则会产生错误。

注意:返回的是,两个表中具有相同名字的列的“且,交集”,而非“或,并集”。即:比如employees类和departments类都有department_id和manager_id,返回二者都相同的结果。

select department_id,department_name, location_id,city from departments natural join locations;

使用using子句创建连接:

  • natural join 子句创建等值连接时,可以使用 using 子句指定等值连接中需要用到的列。
  • 使用 using 可以在有多个列满足条件时进行选择。
  • 不要给选中的列中加上表名前缀或别名。
  • join 和 using 子句经常同时使用。

select e.employee_id,e.last_name,d.location_id from employees e join departments d using (department_id);

使用使用ON 子句创建连接(常用):

• 自然连接中是以具有相同名字的列为连接条件的。
• 可以使用 ON 子句指定额外的连接条件。
• 这个连接条件是与其它条件分开的。
• ON 子句使语句具有更高的易读性。

select e.employee_id,e.last_name,e.department_id, d.department_id,d.location_id from employees e join departments d on (e.department_id = d.department_id);

使用 ON 子句创建多表连接:
select employee_id,city,department_name from employees e join departments d on d.department_id = e.department_id join locations l on d.location_id = l.location_id;

内连接和外连接(2):
• 在SQL里面: 在1999中,内连接只返回满足连接条件的数据。
• 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右) 外连接。
• 两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为‘满外连接’。

—sql 1999语法
左外连接:
select e.last_name, e.department_id, d.department_name from employees e left join departments d on (e.department_id = d.department_id) ;

右外连接:
select e.last_name, e.department_id, d.department_name from employees e right join departments d on (e.department_id = d.department_id) ;

满外连接:
select e.last_name, e.department_id, d.department_name from employees e full join departments d on (e.department_id = d.department_id);

Oracle 的多表查询就到这里,使用等值和不等值连接在SELECT 语句中查询多个表中的数据,使用自连接,使用外连接查询不满足连接条件的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 数据库-分组函数总结

Oracle 分组函数 分组函数作用于一组数据,并对一组函数返回一个值。 组函数类型: avg,count,max,min,sum 可以对数值型数据使用avg和sum函数。 select avg(salary),min(salary),max(salary),sum(salary)…

在notepad++中配置java编译环境

在notepad中配置java编译环境 (1)首先,下载安装了Notepad,在菜单栏那里找到Plugin Manager,有一些版本是没有中文的,所有只有Plugin Manager,如果连Plugin Manager都没有,你则需要去…

Java 基础数据类型

Java 基础数据类型 Java的两大数据类型:基本数据类型、引用类型。 Java语言提供了八种基本数据类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 整形:byte&#xf…

Java获取系统时间

Java获取系统时间 Java获取系统时间 在java 中,有很多种方法都可以获取到系统的当前时间,但也需要到对应的类,不同的类自然有不同的方法。这里为大家介绍获取系统当前时间的四种方式。 1. 通过Calendar类来获取当前时间 需要引用…

Java单例模式的几种实现方式

Java单例模式的几种实现方式 在Java 中,单例类只能有一个实例,必须创建自己的唯一实例,单例类必须给所有其他对象提供这一实例。Java 单例模式有很多种实现方式,在这里给大家介绍单例模式其中的几种。分别是饿汉式,懒…

Java 中抽象类与接口

Java 抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这个类就是抽象类。 抽象类不能创建…

Java 中的进程与线程的实现

了解进程与线程: 进程: 当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程 中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单 位一般而言,进程包含如下三个特征&…

Java集合工具类:Collections

Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里 提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象实现同步控制等方法。 一、 排序操作 如下示例: public class CollectionsSor…

Java异常处理throws/throw

Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)。 • Runtime异常:所有的RuntimeException类及其子类的实例; • Checked异常:不是RuntimeException类及其子类的异常实例。 只有Java语言提供…

JDBC 连接MYSQL数据库

1. 加载驱动 Class.forName("com.mysql.jdbc.Driver");com.mysql.jdbc 包名 Driver 驱动名,驱动包需要引入进来 mysql com.mysql.jdbc.Driveroracle oracle.jdbc.driver.OracleDriversqlserver com.microsoft.sqlserver.jdbc.SQLServerDriver …

JSP 之输出九九乘法表

JSP是一种建立在Servlet规范提供的功能之上的动态网页技术,允许在网页文件中嵌入java代码和jsp标记。Java 服务器页面 (Java Server Page ,JSP) 扩展名为 .jsp。 1.jsp的执行过程 Jsp文件在用户第一次请求时,会被编译成Servlet,然后由这个Se…

Java 重写与重载

方法的重写: 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不能抛出新的检查异常或者比被重写方法申…

Java新增

在实践项目中我们有可能需要做到新增功能,新增一张表,或是新增多张表。这里我新增的是一张表。 这里主要描述DAO层与Servlet 层: DAO 层: public class UserDaoImpl implements UserDao {private Connection con null;private P…

JSP根据状态动态改变数据表格按钮

有时候在开发的过程中会遇到需要根据状态ID 来动态改变数据表格的按钮&#xff0c;下面我主要讲述两种表格根据ID改变按钮的方式。 下面这种我是用EL 表达式获取表格中的值&#xff1a; <table class"table table-striped table-bordered table-hover" id"s…

Java 模糊查询

在学习Java 这门语言过程中&#xff0c;会遇到无数的知识点与错误&#xff0c;最重要的是我们能够在茫茫的代码中找到突破口&#xff0c;并用心去汲取精华。 在很多时候我们会用到模糊查询&#xff0c;这里是我在编码过程中用到的模糊查询。 JSP &#xff1a; <input value…

Java删除表

Java删除表 这里页面我用了layui 框架做删除的&#xff0c;这里需要引入layui 的css 与js 插件&#xff0c;这里写出主要的代码。 Jsp &#xff1a; //监听行工具事件table.on(tool(test), function(obj){var data obj.data; //获得当前行数据var date1 data.classifyColum…

原始分页

Jsp &#xff1a; <div style"float: right;">当前为${currentPage}页&#xff0c;共有${totalRow}条数据&#xff0c;共${totalPage}页 <select style"border-radius: 18px;" id"pageSize" name"pageSize" onchange"c…

根据银行卡号判断银行卡是否正确与归属银行

校验过程&#xff1a; 1.从卡号的最后一位数字开始&#xff0c;逆向将奇数位&#xff08;1&#xff0c;3&#xff0c;5 等等相加&#xff09; 2.从卡号最后一位数字开始&#xff0c;逆向将偶数位数字&#xff0c;先乘以2&#xff0c;如果乘积为两位数&#xff0c;将个位数字相加…

根据年月日判断第多少天,星期几

1. 根据年月日判断第多少天 Scanner是SDK1.5新增的一个类,可使用该类创建一个对象。 Scanner scannernew Scanner(System.in);  然后scanner对象调用下列方法&#xff08;函数&#xff09;,读取用户在命令行输入的各种数据类型   next.Byte(),nextDouble(),nextFloat,nextIn…

解决MySQLyog 导入数据库文件没有反应

之前我在MySQL 中新建了一个数据库&#xff0c;名为“onlineclassroom” 的数据库&#xff0c;但是在将外部的.sql 文件导入进来之后发现&#xff0c;数据库没有反应&#xff0c;也看不到表数据&#xff0c;以为是没有刷新问题&#xff0c;但是刷新之后发现还是没有这个就很奇怪…