一個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'
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'
發現錯誤
可以發現,已經被刪除的學生 和選課資訊被查詢出來了,為什麼?
就是主表的條件寫在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 =