Oracle DB使用连接显示多个表中的数据
Oracle DB使用连接显示多个表中的数据• 编写SELECT语句,以使用等值联接和非等值联接访问多个表中的数据• 使用自联接将表联接到自身• 使用OUTER联接查看通常不满足联接条件的数据• 生成两个或多个表中所有行的笛卡尔积• JOIN的类型及其语法• 自然联接:– USING子句– ON子句• 自联接• 非等值联接• OUTER联接:– LEFT OUTER联接– RIGHT OUTER联接– FULL OUTER联接• 笛卡尔积– 交叉联接获取多个表中的数据有时需要使用多个表中的数据。如两个独立表中的数据:• 雇员ID 在EMPLOYEES表中。• 部门ID 在EMPLOYEES和DEPARTMENTS两个表中。• 部门名称在DEPARTMENTS表中。要生成该报表,需要将EMPLOYEES表和DEPARTMENTS表链接起来,然后访问这两个表中的数据。联接类型符合SQL:1999 标准的联接包括:• 自然联接:– NATURAL JOIN子句– USING子句– ON子句• OUTER联接:– LEFT OUTER JOIN– RIGHT OUTER JOIN– FULL OUTER JOIN• 交叉联接要联接各个表,可以使用符合SQL:1999 标准的联接语法。附注• 在Oracle9i之前的发行版中,该联接语法与美国国家标准协会(ANSI) 的标准不同。与以前发行版中的Oracle 专用联接语法相比,符合SQL:1999 的联接语法没有任何性能优势。使用SQL:1999 语法将表联接起来使用联接可查询多个表中的数据:SELECT table1.column, table2.columnFROM table1[NATURAL JOIN table2] |[JOIN table2 USING (column_name)] |[JOIN table2 ON (table1.column_name = table2.column_name)]|[LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)]|[CROSS JOIN table2];在该语法中:• table1.column表示从中检索数据的表和列• NATURAL JOIN根据相同的列名联接两个表• JOIN table2 USING column_name根据列名执行等值联接• JOIN table2 ON table1.column_name = table2.column_name根据ON子句中的条件执行等值联接• LEFT/RIGHT/FULL OUTER用于执行OUTER联接• CROSS JOIN用于返回两个表的笛卡尔积限定不确定的列名• 使用表前缀可以限定多个表中的列名。• 使用表前缀可以提高性能。• 可以使用表别名来代替完整表名前缀。• 表别名是表的短名称:– 使SQL 代码变得更短,因而占用更少的内存• 使用列别名可区分具有相同名称但位于不同表中的列。联接两个或更多表时,需要使用表名来限定列的名称,以避免混淆。如果不使用表前缀,则SELECT列表中的DEPARTMENT_ID列可能来自DEPARTMENTS表,也可能来自EMPLOYEES表。因此需要添加表前缀来执行查询。如果两个表中没有相同的列名,则无需限定列。但是,使用表前缀可以提高性能,因为这等于告知Oracle Server 查找这些列的确切位置。但是,使用表名限定列名可能非常耗时,特别是当表名较长时。可改为使用表别名。就像列别名是列的另一个名称一样,表别名也是表的另一个名称。表别名有助于使SQL 代码变得更短,因而占用更少的内存。先指定表全名,然后是一个空格,再后面是表别名。例如,EMPLOYEES表的别名可以是e,而DEPARTMENTS表的别名可以是d。准则• 表别名的长度最多为30 个字符,但越短越好。• 如果在FROM子句中使用了某个特定表名的表别名,则必须在整个SELECT语句中使用该表别名代替该表名。• 表别名应是有意义的名称。• 表别名仅对当前的SELECT语句有效。创建自然联接• NATURAL JOIN子句以两个表中具有相同名称的所有列为基础。• 它从两个表中选择在所有相匹配列中具有相同值的那些行。• 如果名称相同的列具有不同的数据类型,则返回一个错误。可以根据两个表中具有相匹配的数据类型和名称的那些列,对表执行自动联接。使用NATURAL JOIN关键字可以完成此操作。注:只能对两个表中具有相同名称和数据类型的那些列执行联接。如果列的名称相同但数据类型不同,那么NATURAL JOIN语法将导致产生一个错误。使用自然联接检索记录hr@TEST0924> DESC departmentsName Null? Type----------------------------------------------------- -------- ------------------------------------DEPARTMENT_ID NOT NULL NUMBER(4)DEPARTMENT_NAME NOT NULL VARCHAR2(30)MANAGER_ID NUMBER(6)LOCATION_ID NUMBER(4)hr@TEST0924> DESC locationsName Null? Type----------------------------------------------------- -------- ------------------------------------LOCATION_ID NOT NULL NUMBER(4)STREET_ADDRESS VARCHAR2(40)POSTAL_CODE VARCHAR2(12)CITY NOT NULL VARCHAR2(30)STATE_PROVINCE VARCHAR2(25)COUNTRY_ID CHAR(2)hr@TEST0924> SELECT department_id,department_name, location_id, city FROM departments NATURAL JOIN locations ;DEPARTMENT_ID DEPARTMENT_NAME LOCATION_ID CITY------------- ------------------------------ ----------- ------------------------------60 IT 1400 Southlake<上一个:High Waits on 'Db File Sequential Read' Due to Table Lookup Following Index Access
下一个:Oracle DB使用子查询来解决查询
- 更多Oracle疑问解答:
- 运行exp备份oracle数据库提示oracle-12154错误
- 有没有,生产Oracle Rman 备份脚本的工具啊!
- 初学orcle,希望有大大帮忙解说一下详细步骤,从登录oracle到创建表的过程
- oracle语句问题:一张user表,三个字段,id,name,time,插入记录比如:张三2007,李四2008,张三2011
- 如何写一个ORACLE触发器同步两个表中的数据?
- oracle 如何查看一个服务器上有多少个数据库.
- oracle 创建包的时候错误 求解
- oracle 重复列的问题
- oracle 中如何查处2星期前的数据
- 请教oracle数据库安装中的问题
- 请问谁能提供给我标准的oracle ERP的数据库表结构并详细说明各表主要的作用?
- 安装oracle遇到的问题 invalid entry CRC (expected 0x3e12e795 but got 0x9db0e9fd)
- 我的是ORACLE 10G,在RMAN中如何按指定的时间恢复数据文件啊?
- oracle为什么没有自动增长列
- oracle快捷键都有哪些啊?