怎么樣的理解才是完全理解SQL(二)

如果我們從集合論(關系代數)的角度來看,一張數據庫的表就是一組數據元的關系,而每個?SQL?語句會改變一種或數種關系,從而產生出新的數據元的關系(即產生新的表)。

我們學到了什么?
思考問題的時候從表的角度來思考問題提,這樣很容易理解數據如何在?SQL?語句的“流水線”上進行了什么樣的變動。

4、?靈活引用表能使?SQL?語句變得更強大

靈活引用表能使?SQL?語句變得更強大。一個簡單的例子就是?JOIN?的使用。嚴格的說?JOIN?語句并非是?SELECT?中的一部分,而是一種特殊的表引用語句。?SQL?語言標準中表的連接定義如下:
<table?reference?>?::=?
<table?name?>
|?<derived?table?>
|?<joined?table?>?
就拿之前的例子來說:
FROM?a,?b?
a?可能輸如這樣的連接:a1?JOIN?a2?ON?a1.id?=?a2.id?
將它放到之前的例子中就變成了:FROM?a1?JOIN?a2?ON?a1.id?=?a2.id,?b?

盡管將一個連接表用逗號跟另一張表聯合在一起并不是常用作法,但是你的確可以這么做。結果就是,最終輸出的表就有了?a1+a2+b?個字段了。

(譯者注:原文這里用詞為?degree??,譯為維度。如果把一張表視圖化,我們可以想象每一張表都是由橫縱兩個維度組成的,橫向維度即我們所說的字段或者列,英文為columns;縱向維度即代?表了每條數據,英文為?record?,根據上下文,作者這里所指的應該是字段數。)

在?SQL?語句中派生表的應用甚至比表連接更加強大,下面我們就要講到表連接。

我們學到了什么?

思考問題時,要從表引用的角度出發,這樣就很容易理解數據是怎樣被?SQL?語句處理的,并且能夠幫助你理解那些復雜的表引用是做什么的。

更重要的是,要理解?JOIN?是構建連接表的關鍵詞,并不是?SELECT?語句的一部分。有一些數據庫允許在?INSERT?、?UPDATE?、?DELETE?中使用?JOIN?。

5、?SQL?語句中推薦使用表連接

我們先看看剛剛這句話:
FROM?a,?b?
高級?SQL?程序員也許學會給你忠告:盡量不要使用逗號來代替?JOIN?進行表的連接,這樣會提高你的?SQL?語句的可讀性,并且可以避免一些錯誤。

利用逗號來簡化?SQL?語句有時候會造成思維上的混亂,想一下下面的語句:
FROM?a,?b,?c,?d,?e,?f,?g,?h?
WHERE?a.a1?=?b.bx?
AND?a.a2?=?c.c1?
AND?d.d1?=?b.bc?
...?

我們不難看出使用?JOIN?語句的好處在于:
安全。?JOIN?和要連接的表離得非常近,這樣就能避免錯誤。更多連接的方式,JOIN?語句能去區分出來外連接和內連接等。

我們學到了什么?

記著要盡量使用?JOIN?進行表的連接,永遠不要在?FROM?后面使用逗號連接表。

6、?SQL?語句中不同的連接操作

SQL?語句中,表連接的方式從根本上分為五種:
EQUI?JOIN
SEMI?JOIN
ANTI?JOIN
CROSS?JOIN
DIVISION
EQUI?JOIN

這是一種最普通的?JOIN?操作,它包含兩種連接方式:

INNER?JOIN(或者是?JOIN?)
OUTER?JOIN(包括:?LEFT?、?RIGHT、?FULL?OUTER?JOIN)

SEMI?JOIN

這種連接關系在?SQL?中有兩種表現方式:使用?IN,或者使用?EXISTS。“?SEMI??”在拉丁文中是“半”的意思。這種連接方式是只連接目標表的一部分。這是什么意思呢?再想一下上面關于作者和書名的連接。我們想象一下這樣的情況:我們不?需要作者?/?書名這樣的組合,只是需要那些在書名表中的書的作者信息。那我們就能這么寫:

Using?IN?
FROM?author
WHERE?author.id?IN?(SELECT?book.author_id?FROM?book)?

Using?EXISTS
FROM?author
WHERE?EXISTS?(SELECT?1?FROM?book?WHERE?book.author_id?=?author.id)?


盡管沒有嚴格的規定說明你何時應該使用?IN?,何時應該使用?EXISTS?,但是這些事情你還是應該知道的:

1,IN比?EXISTS?的可讀性更好

2,EXISTS?比IN?的表達性更好(更適合復雜的語句)

3,二者之間性能沒有差異(但對于某些數據庫來說性能差異會非常大)

因為使用?INNER?JOIN?也能得到書名表中書所對應的作者信息,所以很多初學者機會認為可以通過?DISTINCT?進行去重,然后將?SEMI?JOIN?語句寫成這樣:

SELECT?DISTINCT?first_name,?last_name
FROM?author
JOIN?book?ON?author.id?=?book.author_id?


這是一種很糟糕的寫法,原因如下:

SQL?語句性能低下:因為去重操作(?DISTINCT?)需要數據庫重復從硬盤中讀取數據到內存中。(譯者注:?DISTINCT?的確是一種很耗費資源的操作,但是每種數據庫對于?DISTINCT?的操作方式可能不同)。

沈陽463美容醫院程序提醒:這么寫并非完全正確:盡管也許現在這么寫不會出現問題,但是隨著?SQL?語句變得越來越復雜,你想要去重得到正確的結果就變得十分困難。

轉載于:https://www.cnblogs.com/chaorenman/p/4157686.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375434.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375434.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375434.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Scala學習筆記-環境搭建以及簡單語法

關于環境的搭建&#xff0c;去官網下載JDK8和Scala的IDE就可以了&#xff0c;Scala的IDE是基于Eclipse的。 下面直接上代碼&#xff1a; 這是項目目錄&#xff1a; A是scala寫的&#xff1a; package first import scala.collection.mutable.ListBufferobject A {def main(args…

UVa 12169 (枚舉+擴展歐幾里得) Disgruntled Judge

題意&#xff1a; 給出四個數T, a, b, x1,按公式生成序列 xi (a*xi-1 b) % 10001 (2 ≤ i ≤ 2T) 給出T和奇數項xi&#xff0c;輸出偶數項xi 分析&#xff1a; 最簡單的辦法就是直接枚舉a、b&#xff0c;看看與輸入是否相符。 1 #include <cstdio>2 3 const int maxn …

使用Beautifulsoup爬取藥智網數據

使用Beautifulsoup模塊爬取藥智網數據 Tips&#xff1a;1.爬取多頁時&#xff0c;先用一頁的做測試&#xff0c;要不然ip容易被封 2.自己常用的處理數據的方法&#xff1a; regre.compile(正則表達式) datareg.sub(要替換的字符串,data) 代碼&#xff08;其實沒多少&#xff09…

冪集 返回某集合的所有子集

冪集。編寫一種方法&#xff0c;返回某集合的所有子集。集合中不包含重復的元素。 說明&#xff1a;解集不能包含重復的子集。 示例: 輸入&#xff1a; nums [1,2,3]輸出&#xff1a; [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]來源&#xff1a;力扣&#xff08;LeetCode…

iOS標準時間與時間戳相互轉換

本文轉載至 http://blog.sina.com.cn/s/blog_a843a8850101dzqd.html [cpp] view plaincopy 設置時間顯示格式: NSString* timeStr "2011-01-26 17:40:50"; NSDateFormatter *formatter [[[NSDateFormatter alloc] init] autorelease]; [formatter s…

JavaScript設計模式 Item 3 --封裝

在JavaScript 中&#xff0c;并沒有對抽象類和接口的支持。JavaScript 本身也是一門弱類型語言。在封裝類型方面&#xff0c;JavaScript 沒有能力&#xff0c;也沒有必要做得更多。對于JavaScript 的設計模式實現來說&#xff0c;不區分類型是一種失色&#xff0c;也可以說是一…

【WCF安全】WCF 自定義授權[用戶名+密碼+x509證書]

1.x509證書制作(略) 2.直接貼代碼 ----------------------------------------------------------------------服務端------------------------------------------------------------------------------------------- WCF服務 1 using System;2 using System.Collections.Generi…

openMVS-編譯

opencv4 編譯 會有問題&#xff0c;可以重新下載 opencv3 編譯并指定好路徑。 OpenCV_DIRyour opencv3 build install path cmake -DCMAKE_BUILD_TYPERelease -DVCG_ROOT"$main_path/vcglib" ..

ASP.NET Web API 數據提供系統相關類型及其關系

轉載于:https://www.cnblogs.com/frankyou/p/4932651.html

openMVG跑自定義數據出錯

使用自己拍攝的圖片跑 openMVG 的 turtor_demo.py 時&#xff0c;出現錯誤&#xff0c;沒有生成 sfm_data.bin DSC01988" model "DSC-RX100M6" doesnt exist in the database Please consider add your camera model and sensor width in the database.原因時數…

windows server 2003下安裝iis6+php

參照http://www.myhack58.com/Article/sort099/sort0100/2012/35579.htm 這篇文章&#xff0c;即可&#xff01; 前 面我寫了《windows安裝PHP5.4Apache2.4Mysql5.5》的安裝教程&#xff0c;本地實現是很簡單的&#xff0c;但是有人還是喜歡用IIS來配置 PHP環境&#xff0c;部分…

將 JAR 轉為 EXE – JSMOOTH 的使用教程(第二期)(轉載)

http://www.iteknical.com/convert-jar-to-exe-phase-ii-jsmooth-use-tutorial/轉載于:https://www.cnblogs.com/leinuo2016/p/4932790.html

“”要求左值

錯誤 C2102 “&”要求左值 wrong code typedef struct CodeData {void *ptr_;CodeData(void*ptr) : ptr_(ptr){} } CodeData;typedef struct Data {int data_;data(int data) : data_(data){} } Data;// 這里出錯&#xff0c;因為&后面是臨時變量&#xff0c;不能取地…

winform自定義文件程序-- 不允許所請求的注冊表訪問權(ZSSQL)

常見問題1&#xff1a; 不允許所請求的注冊表訪問權 win7、win8 雙擊程序文件ZSSQL時候會出現 不允許所請求的注冊表訪問權 的彈窗異常 解決方法&#xff1a;ZSSQL.exe 右鍵 屬性--兼容性--以管理員身份運行此程序 轉載于:https://www.cnblogs.com/DemoLee/p/4173324.html

UITabBarController使用總結

剛看了幾天教程就開始跟著開發了&#xff0c;以前也沒學過C&#xff0c;太痛苦了~只能看看大神的博客&#xff0c;自己再總結學習一下了。 1.首先新建一個TabBarViewController繼承于UITabBarController。然后什么都不用寫&#xff0c;相當于裝各個tab頁的容器。 2.給每個視圖都…

Auto-Configuration Error: Cannot find gcc or CC

bazel 編譯的時候出錯 首先 echo $CC 檢查&#xff0c;若輸出無值&#xff0c;則 export CCcc

Effective Modern C++英文版及中文翻譯

https://pan.baidu.com/s/1uqEBGHn3dcVON18oRK5LNQ 提取碼&#xff1a;gqqv 中文版不用看了&#xff0c;譯者估計自己都不怎么用c11\14&#xff0c;翻譯的巨垃圾。

第一個 mac 程序 Create-JSON-Model

第一個 mac 程序 Create-JSON-Model 效果圖 數據 {"ID":null,"name":"Doe","first-name":"John","age":25,"hobbies":["reading","cinema",{"sports":["volley-bal…

php中utf8 與utf-8

php中utf8 與utf-8 原文:php中utf8 與utf-8相信很多程序員剛開始也會有這樣的疑惑&#xff0c;如題&#xff0c;我也是。 其實&#xff0c;他們可以這樣來區分。 一、在php和html中設置編碼&#xff0c;請盡量統一寫成“UTF-8”,這才是標準寫法&#xff0c;而utf-8只是在…

編譯vtk

https://vtk.org/Wiki/VTK/Configure_and_Build#On_Windows