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.pswp.cn/news/443389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443389.shtml
英文地址,請注明出處:http://en.pswp.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;但是刷新之后發現還是沒有這個就很奇怪…