1 小時 SQL 極速入門(二)

来源:https://www.cnblogs.com/injet/archive/2018/12/03/10061372.html
-Advertisement-
Play Games

上篇我們說了 SQL 的基本語法,掌握了這些基本語法後,我們可以對單表進行查詢及計算分析。但是一個大的系統,往往會有數十上百張表,而業務關係又錯綜複雜。我們要查的數據往往在好幾張表中,而要從多張表中來獲取信息就需要用到表聯結了。 先說說什麼是聯結,聯結就是用一條 SELECT 語句從多個表中查詢數據 ...


eeee.jpg

上篇我們說了 SQL 的基本語法,掌握了這些基本語法後,我們可以對單表進行查詢及計算分析。但是一個大的系統,往往會有數十上百張表,而業務關係又錯綜複雜。我們要查的數據往往在好幾張表中,而要從多張表中來獲取信息就需要用到表聯結了。

先說說什麼是聯結,聯結就是用一條 SELECT 語句從多個表中查詢數據。通過聯結,讓多張表中的數據互相關聯起來。聯結又分為內聯結、左外聯結、右外聯結、全外聯結。別怕,我知道有些初學者看到這幾個概念就頭大,不過請繼續往後看,看完後你肯定能看明白。在實際中,內聯結和左聯結應該是使用最多的,我幾乎沒用到過右連接與全外聯結。

對初學者來說,在這裡迷惑的原因是去記這些概念,這是沒必要的,我們只要在實際中抱著問題去用一次就可以完全掌握了。

下麵我們就開始:
我們有下麵三張表,一張訂單表存放訂單頭信息,包括訂單號、訂單類型、訂單數量、訂單狀態信息。
ORDER_HEADER.png

一張訂單明細表,存儲訂單的詳細信息。包含訂單號、訂單類型、工序號、工序名稱、工序狀態、物料號、工位號

ORDER_DETAIL.png

一張物料表,存儲訂單工序用到的物料。包含物料號、物料名稱。

PRODUCT.png

內聯結

我們先觀察一下,訂單頭信息中只包含訂單的數量、狀態信息。訂單明細表中包含著訂單的詳細信息,如工序信息,每道工序用到的物料,每道工序的名稱,在哪個工位操作等信息。假如我們現在要查詢訂單號、訂單數量、工序號、工序名稱、工位等信息,只有一張表我們是查不到的,那麼我們就要把這兩張表結合起來。

SELECT
  oh.orderno,
  oh.order_type,
  oh.quantity,
  od.order_line_no,
  od.order_line_name,
  od.workcenter
FROM
  order_header oh
INNER JOIN order_detail od
ON
  oh.orderno     =od.orderno
AND oh.order_type=od.order_type

解釋下:我們用INNER JOIN 表示內連接,在 INNER JOIN 後寫上我們需要關聯的表,oh 和 od 表示別名,方便後面書寫,不然後面我們就要用到表的全稱來寫了。這裡我們要關聯到訂單明細表 order_detail,去取出訂單詳細信息。後面跟上 ON 關鍵字,表示條件,這裡 ON 後面有兩個條件。表示我們通過訂單號和訂單類型來把兩個表中的數據關聯起來,通過訂單表中的訂單號和訂單類型作為條件來查找訂單明細表中同樣訂單號和訂單類型的訂單的詳細信息。

我們看下結果:

JOIN1.png

可以看到,我們查出了訂單 1001 ,1002, 1003, 1004, 1005五個訂單的總數量,各個工序的名稱,在哪個工位生產等信息。

細心的讀者可能會註意到,在訂單表中還有一個 1008 的訂單,為什麼沒有查出來?那就接著往下看

左聯結

相比於內聯結,左聯結使用 LEFT JOIN 來表示。我們先不看概念,我們直接把剛纔的 SQL 語句改成左聯結來看一下結果。

SELECT
  oh.orderno,
  oh.order_type,
  oh.quantity,
  od.order_line_no,
  od.order_line_name,
  od.workcenter
FROM
  order_header oh
LEFT JOIN order_detail od
ON
  oh.orderno     =od.orderno
AND oh.order_type=od.order_type;

結果如下圖:

LEFTJOIN.png

對比內聯結的結果,我們發現了什麼,我們發現最下麵多了一行,1008 訂單,而1008 後面的幾個欄位為空。我們看一下訂單明細表會發現沒有 1008 這個訂單。

這樣子我們就明白了,內聯結是兩張表中都存在才能關聯出來。而左聯結的意思就是我們的主表中的所有行都會展示出來,如果在聯結的表中找不到對應的,會預設為 null.

右聯結

知道了左聯結,右聯結也就清楚了,右連接呢會把我們關聯的表中的所有行都展示出來,不管主表中有沒有匹配的行。右聯結關鍵字為 RIGHT JOIN

SELECT
  oh.orderno,
  oh.order_type,
  oh.quantity,
  od.order_line_no,
  od.workcenter
FROM
  order_header oh
RIGHT JOIN order_detail od
ON
  oh.orderno     =od.orderno
AND oh.order_type=od.order_type;

RIGHTJOIN.png

可以看到,RIGHT JOIN 把關聯的訂單明細表中的所有行都顯示了出來,但是訂單主表中並沒有 1006 和 1007 兩個訂單,所以這兩行顯示為 null

多表聯結

多表聯結就是超過兩張表的聯結,上面我們關聯了訂單表和訂單明細表,現在我們想知道每道工序用到的物料,就需要關聯到物料表。我們看到訂單明細表中有 productid 欄位,我們用這個關聯到 product 表中。同時,後面我們也用了 ORDER BY 進行排序。

SELECT
  oh.orderno,
  oh.order_type,
  oh.quantity,
  od.order_line_no,
  od.workcenter,
  p.productno,
  p.product_name
FROM
  order_header oh
INNER JOIN order_detail od
ON
  oh.orderno =od.orderno
INNER JOIN product1 p
ON
  od.productid   =p.ID
AND oh.order_type=od.order_type
ORDER BY
  orderno,
  order_line_no

JOIN2.png

註意

在使用聯結時一定要註意聯結條件,如果 聯結條件不正確,就會得到不正確的結果。而且要註意,聯結條件是必須的。

UNION 與 UNION ALL

UNION 與 UNION ALL 表示並集,可以把兩個 SELECT 查詢的結果合併成一個,前提是兩個 SELECT 所查詢的列數量和欄位類型一致。不同的是 UNION 會去除重覆行,而 UNION ALL 不會去除重覆行。

如果我們有兩張表,都存有相似的信息。比如我們在一個其他表中也存儲的有訂單信息。舉個慄子,order_header_bak 表中存有如下兩條數據。
ORDERBAK.png

我們用 UNION ALL 試一下

SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header
UNION ALL
SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header_bak;

UNIONALL.png

看到查出了 8 條信息,1001 訂單有兩條一樣的信息。
我們用 UNION 試一下

SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header
UNION
SELECT
  orderno,
  order_type,
  order_status
FROM
  order_header_bak

UNION.png

看到只有 7 條數據了, 1001 訂單隻有一行數據。


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

-Advertisement-
Play Games
更多相關文章
  • 1、定義方式:在[]內用逗號分隔開多個任意類型的值l l=['a','b','c'] l=list(['a','b','c']) ​ 類型轉換 l=list('hello') l=list({'x':1,'y':2}) print(l) ​ 2,常用操作+內置的方法 同字元串相似 ​ (1),追加& ...
  • 1. Method 請求方法,表明客戶端希望伺服器對資源執行的動作; 1.1 GET 向伺服器請求資源。 1.2 HEAD 和GET方法的行為類似,但伺服器在響應中只返迴首部,不會返回實體的主體部分。這就允許客戶端在未獲取實際資源的情況下,對資源的首部進行檢查。 可以做到: 不獲取資源的情況下瞭解資 ...
  • 【通用命令】 1.創建文件夾 mkdir -p xxx 2.解壓包 tar -zxvf xxxx.tar.gz 3.縮文件 tar zcvf 壓縮包名稱.tar.gz 要壓縮的文件 4.動命令 mv 文件 移動到的位置 5添加服務 chkconfig --ad 6賦權 chmod -R 777 xx ...
  • 忘記root密碼 如果不小心忘記了root密碼,那麼mysql就不能再登錄了,這時就要重置root密碼才行。通過下麵的步驟,我們可以重新設置root密碼。 1、退出mysql [root@localhost src]# service mysqld stop 停止mysqld: [確定] [root ...
  • 1. 啟動過程中的記憶體初始化 首先我們來看看start_kernel是如何初始化系統的, start_kerne定義在 "init/main.c?v=4.7, line 479" 其代碼很複雜, 我們只截取出其中與記憶體管理初始化相關的部分, 如下所示 table th:nth of type(1){ ...
  • diff 命令是 linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中列印每一個行的改動。最新版本的diff還支持二進位文件。diff程式的輸出被稱為補丁 (patch),因為Linux系統中還有一個patch程式,可以根據diff的輸出將 ...
  • 前言:本篇博客是博主踩過無數坑,反覆查閱資料,一步步搭建完成後整理的個人心得,分享給大家~~~ 本文所需的安裝包,都上傳在我的網盤中,需要的可以打賞博主一杯咖啡錢,然後私密博主,博主會很快答覆呦~ 00.組件版本和配置策略 00-01.組件版本 Kubernetes 1.10.4 Docker 18 ...
  • (+)在等號的左邊表示右連接; (+)在等號的右邊表示左連接。 右連接 RIGHT JOIN 左連接 Left join ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...