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

来源: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
更多相關文章
  • 無意睹到一篇舊文檔 SR0008:考慮使用 SCOPE_IDENTITY 代替 @@IDENTITY :https://msdn.microsoft.com/zh-cn/library/dd172121(v=vs.100).aspx 日常開發,我們如果在插入記錄的同時需要返回插入的IdentityI ...
  • 如果你初識MySql的話,那麼這些語法糖你有必要知道。 1.Sql創建資料庫 2.Sql創建數據表 3.創建存儲過程 4.關於批量更新和插入數據到mysql ...
  • 最近筆試面試特別多的都問到了資料庫索引,由於之前並沒有單獨做系統的複習,導致許多關於索引的知識點記憶的很模糊,今天整理下相關筆記(並沒有深挖,對於初學者還是可以看看的),僅供參考。 什麼是索引 資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。 例如這樣一個查詢:select * from ...
  • 簡介 對於資料庫運維人員來說創建session或者查詢時產生問題是常規情況,下麵介紹一種很有效且不藉助第三方工具的方式來解決類似問題。 最近開始接觸運維工作,所以自己總結一些方案便於不懂資料庫的同事解決一些不太緊要的資料庫問題。類似方法很多理論也很多,我就不做深究,就是簡單寫一個方案,便於菜鳥使用的 ...
  • 1. 資料庫文件被其他線程覆蓋或刪除在文件描述符關掉以後,繼續使用這個文件描述符訪問打開文件,獲取文件描述符fd(其實是一個整形)關閉文件打開sqlite文件,獲取文件描述符(碰巧也是)fd另一個線程繼續使用fd,寫文件sqlite文件被損壞在事務進行過程中,進行資料庫備份或恢覆在資料庫事務過程中,... ...
  • 這是 《MySQL 必知必會》 的讀書總結。也是自己整理的常用操作的參考手冊。 使用 MySQL 連接到 MySQL shell>mysql -u root -p Enter password:******顯示資料庫 mysql>SHOW DATABASES;選擇資料庫 mysql>USE myte... ...
  • Apache Hadoop 生態圈軟體下載地址:http://archive.apache.org/dist/hadoop/hadoop下載地址 http://archive.apache.org/dist/hadoop/common 安裝環境 虛擬機中的 CentOS 64位 需要安裝軟體: jd ...
  • 目錄: 創建新變數 變數重編碼 日期值 數據排序 數據集合併 數據子集 隨機取樣 創建新變數 算術運算函數:x%%y 【求餘 x mod y, 5%%2的結果為1】, x%/%y 【整數除法,5% / %2 結果為2】, ^或 ** 求冪 如下示例數據,在對象中增加平均、合計變數(場景不大合適,主要 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...