1. 程式人生 > >【資料庫】SQL語句分析之Union聯結查詢

【資料庫】SQL語句分析之Union聯結查詢

         前言

小結

前言

小編最近在專案中接觸到一個超長的SQL語句,發現裡面的語法很豐富,可以拿出來記錄一下,當然也有將其中重複的部分進行刪減,方便博友們進行檢視分析。

展示SQL語句

    SQL語句查詢,作用是從兩張表 t_card_order 和 t_card_consume_info 中查詢出各自需要的欄位資訊。

      SELECT
            p.pay_time AS paymentCreateTime,
            p.thirdpart_trans_code AS thirdpartTransCode,
            o.id AS orderCode,
            '購卡' AS payType,           
            CASE o.card_type
              WHEN '1' THEN '儲值卡'
              WHEN '2' THEN '權益卡'
            END AS cardType
        FROM t_card_order o
          RIGHT JOIN t_order_payment p
            ON o.id = p.order_code
          LEFT JOIN t_movie_cinema c
            ON o.cinema_code = c.cinema_code
        WHERE            
            <if test="param.cinemaCodes != null">
                AND o.cinema_code in
                <foreach item="item" index="index" collection="param.cinemaCodes" open="
                  (" separator="," close=")">
                    #{item}
                </foreach>
            </if>           
            <choose>
                <when test="param.dateTag == 'week'">
                    AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(p.pay_time)
                </when>
                <when test="param.dateTag == 'oneMonth'">
                    AND DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= DATE(p.pay_time)
                </when>
                <when test="param.dateTag == 'threeMonth'">
                    AND DATE_SUB(CURDATE(), INTERVAL 3 MONTH) <= DATE(p.pay_time)
                </when>
            </choose>
        UNION
        SELECT
            info.create_time AS paymentCreateTime,
            info.transaction_id AS thirdpartTransCode,
            info.id AS orderCode,
            '充值' AS payType,
            CASE info.card_type
              WHEN '1' THEN '儲值卡'
              WHEN '2' THEN '權益卡'
            END AS cardType
        FROM t_card_consume_info info
        LEFT JOIN t_movie_cinema c
        ON info.cinema_code = c.cinema_code
        WHERE info.consume_type = 0
            AND consume_comment != '購卡'
            AND consume_comment != '綁卡首次充值' 

分析SQL語句

   一、union語句

    注意:使用union語句,聯結的兩張表之間的欄位個數、名稱必須保持一致,否則會報錯

     -- 第一張表中的欄位如下:
            p.pay_time AS paymentCreateTime,
            p.thirdpart_trans_code AS thirdpartTransCode,
            o.id AS orderCode,
            '購卡' AS payType,           
            CASE o.card_type
              WHEN '1' THEN '儲值卡'
              WHEN '2' THEN '權益卡'
            END AS cardType
    -- 第二張表中的欄位如下:
            info.create_time AS paymentCreateTime,
            info.transaction_id AS thirdpartTransCode,
            info.id AS orderCode,
            '充值' AS payType,
            CASE info.card_type
              WHEN '1' THEN '儲值卡'
              WHEN '2' THEN '權益卡'
            END AS cardType

  二、條件語句

      三種條件語句:case、if和choose whenti

     ---case條件語句 
            CASE o.card_type
              WHEN '1' THEN '儲值卡'
              WHEN '2' THEN '權益卡'
            END AS cardType
     ---if條件語句 
            <if test="param.cinemaCodes != null">
                AND o.cinema_code in
                <foreach item="item" index="index" collection="param.cinemaCodes" open="
                  (" separator="," close=")">
                    #{item}
                </foreach>
            </if>    
       ---choose when條件語句 
            <choose>
                <when test="param.dateTag == 'week'">
                    AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(p.pay_time)
                </when>
                <when test="param.dateTag == 'oneMonth'">
                    AND DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= DATE(p.pay_time)
                </when>
                <when test="param.dateTag == 'threeMonth'">
                    AND DATE_SUB(CURDATE(), INTERVAL 3 MONTH) <= DATE(p.pay_time)
                </when>
            </choose>

三、查詢結果圖

      欄位 為null值: orderCode、cardType等,產生的原因是左右外連線的結果:left join / right join

小結

通過一番總結,能夠讓自己對於SQL語句的查詢有更深刻的認識,同時也希望對大家有所幫助!

                                                                             感謝您的訪問!

相關推薦

資料庫SQL語句分析Union聯結查詢

         前言 小結 前言 小編最近在專案中接觸到一個超長的SQL語句,發現裡面的語法很豐富,可以拿出來記錄一下,當然也有將其中重複的部分進行刪減,方便博友們進行檢視分析。 展示SQL語句     SQL語句查詢,作用是從兩張表 t_ca

資料庫SQL語言全部關鍵字詳解

SQL語言基本定義 基本型別 SQL表中支援很多固有型別,包括: 型別 含義 char(n) 存放固定長度的字串,使用者指定長度為n。如果沒有使用n個長度則會在末尾新增空格。

Hibernate持久層框架使用SQL語句

除了上篇部落格介紹的HQL語句外,還可以使用SQL語句來進行資料的查詢。 具體如何使用這裡直接貼程式碼了: 首先建一個Sql.class類來測試一下 public class Sql { public static void main(String[] args) { // TO

資料庫SQL Server 2008建立定期自動備份任務

進入企業管理器 > 管理 > 資料庫維護計劃,右鍵單擊,新建維護計劃 點選下一步 選擇資料庫 下一步 下一步 更改備份時間,下一步 修改備份地址,及備份資料儲存的週期(否則資料備份會一直存在佔用空間

讀書筆記資料庫SQL必知必會

第1課 瞭解SQL 簡單介紹了sql,和dbms,無重點。 第2課 檢索資料 重點:select語句,distinct,limit,註釋 1. select 語句如果沒有明確排序查詢結果,那麼返回的資料沒有特定的順序。返回資料的順序可能是資料被新增到表中的順序,也可能不是。只要返回相同數目的行,就是正

NLPjieba原始碼分析關鍵字提取(TF-IDF/TextRank)

【一】綜述 利用jieba進行關鍵字提取時,有兩種介面。一個基於TF-IDF演算法,一個基於TextRank演算法。TF-IDF演算法,完全基於詞頻統計來計算詞的權重,然後排序,在返回TopK個詞作為關鍵字。TextRank相對於TF-IDF,基本思路一致,也是基於統計的思想,只不過其計算詞的權

NLPjieba原始碼分析分詞

【一】詞典載入 利用jieba進行分詞時,jieba會自動載入詞典,這裡jieba使用python中的字典資料結構進行字典資料的儲存,其中key為word,value為frequency即詞頻。 1. jieba中的詞典如下: jieba/dict.txt X光 3 n X光線 3

NLPjieba原始碼分析詞性標註

【一】詞性標註 詞性標註分為2部分,首先是分詞,然後基於分詞結果做詞性標註。 【二】jieba的詞性標註程式碼流程詳解 1. 程式碼位置 jieba/posseg/_init_.py 2. 流程分析 def cut(sentence, HMM=True): """

庫房——SQL語句優化

前言 前段時間接手庫房專案之後,有很多地方需要優化,從中也學到了很多東西,將在部落格中一一整理出來分享給大家。 實際案例:庫房系統中管理員許可權下的入庫管理中的入庫記錄頁面每次開啟時都載入的非常慢,長達三十多秒,網速慢的時候會達到一分鐘左右,這個問題非常影響庫房系統的功能使用,首先需要解

資料庫SQL語言基礎

SQL:結構化查詢語言,資料庫操作的國際標準語言。 SQL分為資料定義(CREATE、ALTER、DROP)、資料查詢(SELECT)、資料操縱(INSERT、DELETE、UPDATE) 資料控制(GRANT、REVOKE、COMMIT、ROLLBACK)。 SQL關

PostgreSQLsql語句 psql 常用命令

Select distinct rows by using  operator. Filter rows by using WHERE clause. Sort rows by using clause. Select rows based on various ope

MyBatissql語句中的按時間排序無效問題order by create_time desc

mybatis的mapper檔案中書寫sql語句,但是根據時間倒序查詢的order by create_time 突然無效了,這是為什麼?導致無效的原因:時間格式做了改變,時間欄位別名和原始欄位重名,導

JVMJVM原始碼分析Metaspace解密

概述 metaspace,顧名思義,元資料空間,專門用來存元資料的,它是jdk8裡特有的資料結構用來替代perm,這塊空間很有自己的特點,前段時間公司這塊的問題太多了,主要是因為升級了中介軟體所致,看到大家討論來討論去,看得出很多人對metaspace還是模稜

資料庫SQL server 評估期已過。有關如何升級的測試版軟體的資訊,請訪問..

一、前言        今天使用SQL server 2012 的時候,報出了這個錯誤:“評估期已過。有關如何升級的測試版軟體的資訊,請訪問…”。這種問題當然要百度一下啦。下面為大家講解,如何排除這個

資料庫SQL模糊查詢

SQL的模糊查詢是當不清楚資料庫中的具體關鍵詞時使用的一種查詢方式,最主要的關鍵詞時like,and與%。 like like用於在where子句中搜索列中的指定模式。 語法: SELE

SqlServerSql語句插入中文顯示亂碼

按照常例分析,出現亂碼的原因無非就是編碼字符集與解碼字符集不一致,但是對於“Sql語句插入中文顯示亂碼”我也只能分析到這了,沒有找到具體怎麼設定SqlServer的字符集,不過找到了一種能解決亂碼的方法。 方法1: 既然出現了中文亂碼,那資料庫中一定是字元型

資料庫SQL 技巧-持續更新

1.將多個值拼接在同一個欄位裡。 update Common_Customer set share_name=( select stuff( ( select ',' +cs.staff_name from view_customer cs where cs.

資料庫Oracle語句練習

1.找出各月倒數第3天受僱的所有員工. select * from emp where hiredate=last_day(hiredate)-2 10.找出早於12年前受僱的員工. select ename,job from emp where months_betwee

轉載SQL語句用一個表的數據更新另一個表

upd 擴展 serve new 定義函數 strong 特定 自定義函數 哪些 在Sqlserver的維護更新操作中,有時候涉及到Update操作,其中有一種情況是根據特定的條件,以一個表中的數據更新另一個表的數據,此時涉及到兩個表之間的關系以及操作,此處介紹2種更新方法

5、資料庫技術SQL語句中truncate,delete以及drop的區別

一、相同點     1、truncate和不帶where子句的delete、以及drop都會刪除表內的資料。     2、drop、truncate都是DDL語句(資料定義語言),執行後會自動提交。 二、不同點     1、 truncate 和 delete 只刪除資料不刪