1. 程式人生 > >一個sql問題深入理解左連線

一個sql問題深入理解左連線

資料準備

  • 1.新建一個學生表t_student 如下 del_falg = ‘1’ ,’表示邏輯刪除’
    學生表

  • 2.新建課程表 t_course
    課程表

  • 3.新建 學生選課表 r_course_student
    課程學生中間表

  • 4.上面的表結構並不複雜,需要關注的一個點是 4號學生已經被刪除了,當然他的選課關係表也刪除了

SELECT t.name 學生姓名  ,cs.cid 課程id , t.del_flag 學生刪除標誌,cs.del_flag 學生課程關係刪除標誌 FROM t_student  t
LEFT JOIN r_course_student cs ON t.id = cs.sid
AND cs.del_flag = '0' WHERE t.del_flag = '0'

查詢sql1

SELECT t.name 學生姓名  ,cs.cid 課程id , t.del_flag 學生刪除標誌,cs.del_flag 學生課程關係刪除標誌 FROM t_student  t
LEFT JOIN r_course_student cs ON t.id = cs.sid AND cs.del_flag = '0' AND t.del_flag = '0'

結果2

發現錯誤

可以發現,已經被刪除的學生 和選課資訊被查詢出來了,為什麼?
就是主表的條件寫在on後面導致的。

左連線遵循的一個原則是,主表的資訊一定會顯示出來,而從表可能沒有主表所對應的記錄,相應的列就置為null ,第一條sql滿足我們預期的結果,下面分析一下 兩條sql的執行過程。

過程分析

  • 第一條:

    • 1.t.id = cs.sid AND cs.del_flag = ‘0’通過這個條件生成中間臨時表
    • 2.通過WHERE t.del_flag = ‘0’ 對臨時表進行篩選,返回正確結果
  • 第二條:

    • ON t.id = cs.sid AND cs.del_flag = ‘0’ AND t.del_flag = ‘0’生成 臨時表,但是連線原則是主表的記錄一定會被查詢出來,所以不論on後面的條件對主表怎樣過濾,都是無效的,無效的,無效的,所以造成了錯誤的結果。。

結論

  • 1.使用連線時,on後面一定不要接過濾主表的條件,否則可能造成難以預料的後果,過濾主表的條件應該放在where後面,對生成的中間結果集進行過濾。當生成中間結果集後,就已經沒有連線的概念了,這個中間資料就像是一張全新的表一樣。
  • 2.過濾從表的條件(也包括連線條件)可以儘量寫在on後面,這樣在生成中間表時,就少了很多不必要的資料、

相關推薦

一個sql問題深入理解連線

資料準備 1.新建一個學生表t_student 如下 del_falg = ‘1’ ,’表示邏輯刪除’ 2.新建課程表 t_course 3.新建 學生選課表 r_course_student 4.上面的表結構並不複雜,需要關注的一個點是

SQL資料庫查詢 連線、右連線、內連線 例項

例子 Table A aid   adate  1      a1  2      a2  3      a3 TableB bid bdate  1    b1  2    b2  4    b4  兩個表a,b相連線,要取出id相同的欄位  select * fro

SQL中的連線與右連線,內連線有什麼區別

例子,相信你一看就明白,不需要多說A表(a1,b1,c1) B表(a2,b2) 左連線: select A.*,B.* from A left outer join B on(A.a1=B.a2)結果

深入理解資料庫連線池DBCP

1.DBCP簡介    DBCP(DataBase connection pool),資料庫連線池。是 apache 上的一個 java 連線池專案,也是 tomcat 使用的連線池元件。單獨使用dbcp需要2個包:commons-dbcp.jar,commons-pool.

SQL 和LINQ 連線 , 右連線, 內連線 語法對照

LINQ 語法 TSQL 左聯接  var equipmentType = from a in ctx.TB_EquipmentType                                 join b in ctx.TB_User on a.Create

sql查詢之連線,右連線,內連線以及全外連線的使用(測試常見面試題歐)

**表資料:** /* SQLyog v10.2 MySQL - 5.1.62-community : Database - sience ************************************************************

深入理解SQL的四種連線-連線、右外連線、內連線、全連線

1、內聯接(典型的聯接運算,使用像 = 或 <> 之類的比較運算子)。包括相等聯接和自然聯接。 內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。 2、外聯接。外聯接

深入理解SQL的四種連接-外連接、右外連接、內連接、全連接

查詢 顯式 關系 之間 分析 select語句 通過 nts sele 1、內聯接(典型的聯接運算,使用像 = 或 <> 之類的比較運算符)。包括相等聯接和自然聯接。 內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 studen

深入理解SQL的四種連線

1、內聯接(典型的聯接運算,使用像 =  或 <> 之類的比較運算子)。包括相等聯接和自然聯接。     內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。       2、外

深入理解Spark》之 結構化流(spark streaming+spark SQL 處理結構化資料)的一個demo

最近在做關於spark Streaming + spark sql 結合處理結構化的資料的業務,下面是一個小栗子,有需要的拿走! ​ package com.unistack.tamboo.compute.process.impl; import com.alibaba.

深入理解SQL的四種連接,外連接,右外連接,內連接,全連接

str 列選擇 支持 條件 笛卡爾 比較運算 from 一個表 基表 1、內聯接(典型的聯接運算,使用像 = 或 <> 之類的比較運算符)。包括相等聯接和自然聯接。 內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 student

mybatis深入理解之 # 與 $ 區別以及 sql 預編譯

tcl nec from esql 校驗 ntp code 理解 替換字符串 mybatis 中使用 sqlMap 進行 sql 查詢時,經常需要動態傳遞參數,例如我們需要根據用戶的姓名來篩選用戶時,sql 如下: select * from user where nam

深入理解SQL Server 2005 中的 COLUMNS_UPDATED函數

clas arch size else 方式 它的 語句 存在 順序 原文:深入理解SQL Server 2005 中的 COLUMNS_UPDATED函數 概述 COLUMNS_UPDATED函數能夠出現在INSERT或UPDATE觸發器中AS關鍵字後的任何位置,用來

一個簡單的內存分配器-《深入理解計算機操作系統》

nbsp 都是 開始 一個數 合並 區分 兩個 由於 方便   我相信很多人都知道《深入理解計算機操作系統》這本書,並且很多人都會對它研讀。實際本人剛開始看的時候,只是加深了對操作系統的理解,別的到是沒有感覺的到, 但是在看到公司的軟件框架裏面對於內存堆的管理,才發現和書上

SQL查詢連線、右連線、內連線

1、左連線的定義:是以左表為基礎,根據ON後給出的兩表的條件將兩表連線起來。結果會將左表所有的查詢資訊列出,而右表只列出ON後條件與左表滿足的部分。左連線全稱為左外連線,是外連線的一種。 下邊以A表和B表為例子,A、B之間的左連線條件為:ano=bno;查詢語句為:SELECT * FROM `

動態代理:如何深入理解和分析,不如手寫一個(原始碼包分析、樓主親測)

如何分類Java語言? Java是靜態的強型別語言,但是因為提供了類似反射等機制,也具備了部分動態語言的能力。 一、動態代理的簡單描述 動態代理是一種方便執行時動態構建代理、動態處理代理方法呼叫的機制,很多場景都是利用類似的機制做到的,比如用來包裝RPC呼叫、面向切面的程式設

【JavaScript進階】深入理解JavaScript中ES6的Promise的作用並實現一個自己的Promise

  1.Promise的基本使用 1 // 需求分析: 封裝一個方法用於讀取檔案路徑,返回檔案內容 2 3 const fs = require('fs'); 4 const path = require('path'); 5 6 7 /** 8 * 把一個回

深入理解TCP/IP協議-TCP建立與終止連線

轉載自  深入理解TCP/IP協議-TCP建立與終止連線   一、引言   TCP 是一個面向連線的協議。無論哪一方向另一方傳送資料之前,都必須先在雙方之間建立一條連線。連線建立與終止的狀態變化圖如下:   二、三次握手建立連線

深入理解Java虛擬機器(七)位元組碼執行引擎(棧幀、動態連線、方法呼叫)

執行引擎是Java虛擬機器最核心的組成部分之一。“虛擬機器”是一個相對於“物理機”的概念,這兩種機器都有程式碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器的執行引擎則是由自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執

LEFT JOIN 資料庫連線查詢SQL

 -- 普通查詢 SELECT T1.NAME , T2.ORDERNO   FROM TABLE_NAME1 T1 , TABLE_NAME T2  WHERE T1.ID = T2.T1_ID    AND T1.STATUS =