1. SQL讀書筆記——SQL中的連接(1)

来源:http://www.cnblogs.com/yona0826/archive/2016/10/12/5954350.html
-Advertisement-
Play Games

《SQL學習指南》中的第5章 1.連接: 在某種機制下,需要將多個表中的數據進行整合到一起,即同一個查詢的結果集中包含來自兩個或者兩個以上的表,這種機制被稱為連接(join). 1.1 ANSI連接語法 本文采用的都是符合SQL92版本的ANSI SQL標準,所有的主流資料庫都採用了SQL92的連接 ...


 

《SQL學習指南》中的第5章    1.連接:      在某種機制下,需要將多個表中的數據進行整合到一起,即同一個查詢的結果集中包含來自兩個或者兩個以上的表,這種機制被稱為連接(join).    1.1 ANSI連接語法      本文采用的都是符合SQL92版本的ANSI SQL標準,所有的主流資料庫都採用了SQL92的連接語法。由於這些資料庫都出現SQL92標準發佈之前,同時存在一些舊的連接語法,如下所示:      例子1:      SELECT e.fname, e.lname, d.`name`      FROM employee e , department d      WHERE e.dept_id = d.dept_id;          推薦使用SQL92標準 的連接方式,不推薦使用上面的連接方式,主要原因是:      1)連接條件和過濾條件被分隔到兩個子句中(ON子句和WHERE子句),使得查詢語句更利於理解;      2)每兩個表的連接條件都在ON子句中列出,容易找出連接條件;      3)SQL92標準可以在各種資料庫中通用,而舊的語法在不同的數據中的表現可能略有不同; 
         1.2 笛卡爾積      例子 1: 直接使用from連接employee 和 department表      方式一:      SELECT e.fname, e.lname, d.`name`      FROM employee e JOIN department             一個有18個雇員和3個部門,會產生54行數據,由於查詢沒有明確的指定兩個表是如何連接的造成的,這時會預設兩張表置換。這樣的連接被稱為交叉連接(cross join).  1.3 內連接            1)兩表連接      例子1: 查詢每個雇員所屬的部門信息        SELECT e.fname, e.lname, d.`name`      FROM employee e JOIN department d           ON e.dept_id = d.dept_id            結果如圖所示
     

 

           此時通過描述上面兩個表是通過何種方式關聯的,是通過dept_id來關聯兩個表的。      如果在一個表中的dept_id列中存在某個值,但該值在另一張表的dept_id列中不存在,那麼此時相關的行的連接會失敗,在結果集中的相關行的連接會失敗,在結果集中將會排除包含該值的行,這種類型的連接被稱為內連接     若想要包含某個表中的所有行,並不需要考慮該表的每一行都與另一張表匹配,那麼可以使用外連接       2)多表內連接      -- 例子2.查詢Woburn支行中所有熟練櫃員(在2007年以前入職的櫃員)開設的賬戶   SELECT a.account_id, a.product_cd,a.open_date FROM account a INNER JOIN employee e ON a.open_emp_id = e.emp_id INNER JOIN branch b ON e.assigned_branch_id = b.branch_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch';   結果如圖所示:

 

     現在FROM子句中包含3個表,兩種連接類型和兩個ON子句,看上去連接的順序是account表,employee表,然後branch表,那麼如果交換employ表和account表的連接順序會出現什麼情況呢?       SELECT a.account_id, a.product_cd,a.open_date FROM employee e INNER JOIN account a ON a.open_emp_id = e.emp_id INNER JOIN branch b ON e.assigned_branch_id = b.branch_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch';   結果如圖所示---無改變 那麼在更換employee和branch的順序呢?   SELECT a.account_id, a.product_cd,a.open_date FROM branch b INNER JOIN account a ON a.open_branch_id = b.branch_id INNER JOIN employee e ON a.open_emp_id = e.emp_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch';   結果如圖所示---無改變   那麼更換ON語句的位置呢   SELECT a.account_id, a.product_cd,a.open_date FROM branch b INNER JOIN account a INNER JOIN employee e ON a.open_branch_id = b.branch_id ON a.open_emp_id = e.emp_id WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') AND b.`name` = 'Woburn Branch';   結果如圖所示---報錯!錯誤原因:ON語句連接關係要緊跟 JOIN語句      例子二多種表達方式的原因:SQL是一種非過程化的語言,也就是說只需要描述要獲取的數據對象, 而執行過程是資料庫伺服器負責(我只要結果集*_*)(但是左連接,右連接的問題,還不是很確定,稍後還要進行測試一下)   3)子查詢作為結果集的內連接 例子二中的另一個版本:使用“連接 ”連接子查詢,也就是將子查詢的結果集作為查詢表進行連接   1)       SELECT e.emp_id FROM employee e WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller');   2)  SELECT b.branch_id FROM  branch b WHERE b.`name` = 'Woburn Branch';   3)  SELECT a.account_id, a.product_cd,a.open_date FROM account a INNER JOIN (SELECT e.emp_id FROM employee e WHERE e.start_date < '2007-01-01' AND (e.title = 'Teller' OR e.title = 'Head Teller') ) em ON a.open_emp_id = em.emp_id INNER JOIN (SELECT b.branch_id FROM  branch b WHERE b.`name` = 'Woburn Branch') br ON a.open_branch_id = br.branch_id;   4)自連接 例子3.列出雇員的姓名同時列出主管的姓名:   SELECT emp.emp_id AS emp_id,CONCAT(emp.fname,' ',emp.lname) AS em, e.emp_id AS super_em_id,CONCAT(e.fname,' ',e.lname) AS super_em FROM employee e INNER JOIN employee emp ON e.emp_id = emp.superior_emp_id;   結果如圖所示:          上面查詢實現了對錶自身進行連接,自連接,employee表中包含了指向自身的外鍵(superior_emp_id) 同時,employee表一共18行,但此查詢返回了17行,這是由於銀行的總經理MIchael Smith並沒 自己的主管,它的superior_emp_id列為null,因此在改行上的內連接失敗,在結果集中並不會顯示。   5)不等連接 例子4.假如執行經理決定舉辦一次面向銀行櫃員的象棋比賽,現在要創建所有對弈者的列表      SELECT CONCAT(e.fname,' ',e.lname) as TEAM_A, 'VS', CONCAT(emp.fname,' ',emp.lname) as TEAM_B FROM employee e INNER JOIN employee emp ON e.emp_id < emp.emp_id WHERE e.title = 'Teller' AND emp.title = 'Teller'; 結果如圖所示:  

 

                         
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇討論在UWP開發中使用WebView控制項時常見的問題,以及一些小技巧。 WebView是實際開發中常用的控制項,很多大家抱怨的套網頁的應用都是通過WebView來實現的。這裡要澄清一個問題,套網頁的應用並不一定是差的應用,很多網頁採用了響應式設計,假設網頁不存在複雜的交互,提取網頁的正文部分嵌入W ...
  • Android studio 作為谷歌的親兒子,同時之前使用的ADT,谷歌已經發佈了不再繼續維護的“宣言”,因此,它成為了我們的首選。 那麼我們該如何開始呢? 下載AndroidStudio最新版,眾所周知,因為網路的限制,我們無法直接到Google官網去下載,或者網速很慢,因此採用http://w ...
  • 原生Picker和仿iOS的Picker都是上下或左右滑動到固定區域來選擇選項: 顯示數量少,如果當前選項距離需要的選項比較遠就得滑很多次; 滑動不好控制,一不小心就滑過了需要往相反方向慢慢滑回來,很煩人。 ZBLibrary中的GridPicker每頁顯示多行多列,大大增加了顯示數量;將滑動選擇... ...
  • 一、初始化 二、常見的屬性 1、segmentedControlStyle屬性:設置基本的樣式 2、momentary屬性:設置在點擊後是否恢複原樣 。 3、numberOfSegments屬性:只讀,獲取總選項數。 4、apportionsSegmentWidthsByContent屬性:設置是否 ...
  • 現在開始具體 處理每一個導航頁面的邏輯,首先看第二個導航頁 本文地址:http://www.cnblogs.com/wuyudong/p/5949775.html,轉載請註明出處。 這裡需要實現綁定sim卡序列號的功能,註意添加相應的許可權:uses-permission android:name=" ...
  • 從安卓手機端以get和post的方式提交數據到伺服器端,伺服器端進行判斷,並返回相應的結果給安卓手機 ...
  • 分享一下自己在學習iOS開發過程中整理的一些比較常見的知識點。內容門檻較低,比較適合初學,歡迎各大程式開發愛好者交流。分享內容中存在錯誤還望能指導指導!! 隨筆說明: 集合Object-c部分基礎知識點、常用的方法 隨筆定義: 可當做查詢工具 隨筆持續完善,後續會整理swift. 如果需要PDF版本 ...
  • https://i.cnblogs.com/EditPosts.aspx?opt=1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...