Oracle_多表查詢

<a name="sql多表查詢"></a>

SQL多表查詢

<a name="等值和不等值連接查詢"></a>

等值和不等值連接查詢

  • 從多個(gè)表中獲取數(shù)據(jù):如果在查詢的時(shí)候光督,直接從多個(gè)表中獲取數(shù)據(jù)雕憔。沒有添加條件判斷酬蹋,會出現(xiàn)“笛卡爾積”錯(cuò)誤
  • 笛卡爾積錯(cuò)誤
    • 笛卡爾集會在下面條件下產(chǎn)生
      • 省略連接條件
      • 連接條件無效
      • 所有表中的所有行互相連接
    • 為了避免笛卡爾集萧吠, 可以在 WHERE 加入有效的連接條件左冬。
  • Oracle 連接多表查詢
    • 在 WHERE 子句中寫入連接條件。
    • 在表中有相同列時(shí)纸型,在列名之前加上表名前綴
SELECT  table1.column, table2.column
FROM  table1, table2
WHERE table1.column1 = table2.column2;

<a name="等值連接"></a>

等值連接
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;
  • 區(qū)分重復(fù)的列名(使用表名或者表的別名)
    • 使用表名前綴在多個(gè)表中區(qū)分相同的列拇砰。
    • 在不同表中具有相同列名的列可以用表的別名加以區(qū)分。
  • 連接 n個(gè)表,至少需要 n-1個(gè)連接條件狰腌。 例如:連接三個(gè)表除破,至少需要兩個(gè)連接條件。
-- 練習(xí):查詢出公司員工的 last_name, department_name, city
SELECT last_name, department_name, city
FROM employees e ,departments d ,locations l
WHERE e.department_id = d.department_id AND d.location_id = l.location_id 

<a name="非等值連接"></a>

非等值連接
-- EMPLOYEES表中的列工資應(yīng)在JOB_GRADES表中的最高工資與最低工資之間
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;

<a name="內(nèi)連接琼腔、外連接左(或右)-外連接瑰枫、滿外連接"></a>

內(nèi)連接、外連接(左(或右) 外連接丹莲、滿外連接)

  • 內(nèi)連接: 合并具有同一列的兩個(gè)以上的表的行, 結(jié)果集中不包含一個(gè)表與另一個(gè)表不匹配的行
  • 外連接: 兩個(gè)表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 光坝,這種連接稱為左(或右) 外連接。沒有匹配的行時(shí), 結(jié)果表中相應(yīng)的列為空(NULL). 外連接的 WHERE 子句條件類似于內(nèi)部連接, 但連接條件中沒有匹配行的表的列后面要加外連接運(yùn)算符, 即用圓括號括起來的加號(+).

<a name="內(nèi)連接"></a>

內(nèi)連接
SELECT e.last_name, d.department_name 
FROM employees e, departments d
WHERE e.department_id = d.department_id
-- SQL1999語法的方式
SELECT e.last_name, d.department_name 
FROM employees e 
INNER JOIN departments d ON e.department_id = d.department_id

<a name="外連語法"></a>

外連語法
  • 使用外連接可以查詢不滿足連接條件的數(shù)據(jù)甥材。

  • 外連接的符號是 (+)盯另。

  • 右外連接

SELECT  table1.column, table2.column
FROM  table1, table2
WHERE table1.column(+) = table2.column;

-- 示例
SELECT e.last_name, d.department_name 
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id

-- SQL1999方式
SELECT e.last_name, d.department_name 
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) 
  • 左外連接
SELECT  table1.column, table2.column
FROM  table1, table2
WHERE table1.column = table2.column(+);

-- 示例
SELECT e.last_name, d.department_name 
FROM employees e, departments d
WHERE e.department_id = d.department_id(+)

-- SQL1999方式
SELECT e.last_name, d.department_name 
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) 

<a name="滿外連接"></a>

滿外連接
  • 在SQL: 1999中,內(nèi)連接只返回滿足連接條件的數(shù)據(jù)
  • 兩個(gè)表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行洲赵,這種連接稱為左(或右) 外連接鸳惯。
  • 兩個(gè)表在連接過程中除了返回滿足連接條件的行以外還返回兩個(gè)表中不滿足條件的行 ,這種連接稱為滿 外連接叠萍。
-- 滿外連接
SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
FULL OUTER JOIN departments d
ON   (e.department_id = d.department_id)

<a name="自連接"></a>

自連接
  • 自連接可以把表本身作為連接的表
-- 練習(xí):查詢出 last_name 為 ‘Chen’ 的員工的 manager 的信息
SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker , employees manager
WHERE worker.manager_id = manager.employee_id  AND INITCAP(worker.last_name) = 'Chen'

<a name="叉集了解"></a>

叉集(了解)
  • 使用CROSS JOIN 子句使連接的表產(chǎn)生叉集芝发。
  • 叉集和笛卡爾集是相同的。
SELECT last_name, department_name
FROM   employees
CROSS JOIN departments

<a name="自然連接"></a>

自然連接

  • NATURAL JOIN 子句苛谷,會以兩個(gè)表中具有相同名字的列為條件創(chuàng)建等值連接后德。
  • 在表中查詢滿足等值條件的數(shù)據(jù)。
  • 如果只是列名相同而數(shù)據(jù)類型不同抄腔,則會產(chǎn)生錯(cuò)誤

返回的是瓢湃,兩個(gè)表中具有相同名字的列的“且、交集”赫蛇,而非“或绵患,并集”。即:比如employee類和department類都有
department_id和manager_id悟耘,返回二者都相同的結(jié)果落蝙。

SELECT department_id, department_name,
       location_id, city
FROM   departments
NATURAL JOIN locations

<a name="使用using創(chuàng)建連接"></a>

使用USING創(chuàng)建連接

  • 在NATURAL JOIN 子句創(chuàng)建等值連接時(shí),可以使用 USING 子句指定等值連接中需要用到的列。
  • 使用 USING 可以在有多個(gè)列滿足條件時(shí)進(jìn)行選擇筏勒。
  • 不要給選中的列中加上表名前綴或別名移迫。
  • JOIN 和 USING 子句經(jīng)常同時(shí)使用。
  • 有局限性:但若多表的連接列列名不同管行,此法不合適
select  last_name,department_name 
from employees 
join departments using (department_id);

<a name="使用on-子句創(chuàng)建連接-常用"></a>

使用ON 子句創(chuàng)建連接 (常用)

  • 自然連接中是以具有相同名字的列為連接條件的厨埋。
  • 可以使用 ON 子句指定額外的連接條件。
  • 這個(gè)連接條件是與其它條件分開的捐顷。
  • 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 創(chuàng)建多表連接
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市迅涮,隨后出現(xiàn)的幾起案子废赞,更是在濱河造成了極大的恐慌,老刑警劉巖叮姑,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唉地,死亡現(xiàn)場離奇詭異,居然都是意外死亡传透,警方通過查閱死者的電腦和手機(jī)渣蜗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旷祸,“玉大人耕拷,你說我怎么就攤上這事⊥邢恚” “怎么了骚烧?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闰围。 經(jīng)常有香客問我赃绊,道長,這世上最難降的妖魔是什么羡榴? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任碧查,我火速辦了婚禮,結(jié)果婚禮上校仑,老公的妹妹穿的比我還像新娘忠售。我一直安慰自己,他們只是感情好迄沫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布稻扬。 她就那樣靜靜地躺著,像睡著了一般羊瘩。 火紅的嫁衣襯著肌膚如雪泰佳。 梳的紋絲不亂的頭發(fā)上盼砍,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音逝她,去河邊找鬼浇坐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛黔宛,可吹牛的內(nèi)容都是我干的近刘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼宁昭,長吁一口氣:“原來是場噩夢啊……” “哼跌宛!你這毒婦竟也來了酗宋?” 一聲冷哼從身側(cè)響起积仗,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜕猫,沒想到半個(gè)月后寂曹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡回右,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年隆圆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翔烁。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渺氧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬屹,到底是詐尸還是另有隱情侣背,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布慨默,位于F島的核電站贩耐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厦取。R本人自食惡果不足惜潮太,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虾攻。 院中可真熱鬧铡买,春花似錦、人聲如沸霎箍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朋沮。三九已至蛇券,卻和暖如春缀壤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纠亚。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工塘慕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒂胞。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓图呢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骗随。 傳聞我的和親對象是個(gè)殘疾皇子蛤织,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 多表查詢 笛卡爾積: 笛卡爾積會在下面條件下產(chǎn)生: 連接的類型: oracle的連接 SQL99的連接 等值連接:...
    我可能是個(gè)假開發(fā)閱讀 578評論 0 4
  • 1. SQL 簡介 SQL 的目標(biāo) 理想情況下,數(shù)據(jù)庫語言應(yīng)允許用戶: 建立數(shù)據(jù)庫和關(guān)系結(jié)構(gòu) 完成基本數(shù)據(jù)管理任務(wù)...
    板藍(lán)根plank閱讀 2,333評論 0 11
  • Oracle-SQL 這是對Oracle-SQL知識點(diǎn)詳細(xì)介紹的文章系列鸿染,其他文章如下: Oracle-SQL系列...
    GuaKin_Huang閱讀 2,220評論 1 7
  • 平素里指蚜,我是一個(gè)不善于人交流的人,更別說與人理論爭執(zhí)涨椒。 昨天中午摊鸡,破天荒,為了一點(diǎn)占理的事情蚕冬,和一個(gè)比自己大一點(diǎn)的...
    水默雪嶺閱讀 548評論 2 6
  • 祝福2017的考生: 六月免猾,有一份期待,曾經(jīng)固守曾經(jīng)孤獨(dú)曾經(jīng)也有諸多的無奈囤热,記憶里寫滿黎明后的英語也寫縷縷人生革命...
    青檸YoonA閱讀 202評論 1 3