當前位置:首頁 » 編程語言 » sql資料庫分析

sql資料庫分析

發布時間: 2023-05-11 01:47:47

1. 數據分析人必掌握的資料庫語言-sql指南第六期

本篇文章繼續圍繞SQL的語法重點為大家介紹 連接 高級連接 的使用,以及 使用連接的注意事項



SQL最強大的功能之一就是能在數據查詢的執行中 連接(join)表 。連接是利用SQL的SELECT語句能執行的最重要的操作,很好地理解連接及其語法是學習SQL的極為重要的一點。在能夠有效地使用連接前,我們必須了解 關系表 以及 關系資料庫 設計的一些基礎知識。下面的介紹並不能涵蓋這一主題的所有內容,但作為入門已經夠了。


連接

理解關系表,最好是來看個例子。

有一個包含產品目錄的資料庫表,其中每類物品佔一行。

對於每一種物品,要存儲的信息包括產品描述、價格,以及生產該產品的供應商。

現在有同一供應商生產的多種物品,那麼在何處存儲供應商名、地址、聯系方法等供應商信息呢?將這些數據與產品信息分開存儲的理由是:

同一供應商生產的每個產品,其供應商信息都是相同的,對每個產品重復此信息既浪費時間又浪費存儲空間;

如果供應商信息發生變化,例如供應商遷址或電話號碼變動,只需修改一次即可;

如果有重復數據(即每種產品都存儲供應商信息),則很難保證每次輸入該數據的方式都相同。不一致的數據在報表中就很難利用。虛飢

關鍵是, 相同的數據出現多次不是一件好事 ,這是關系資料庫設計的基礎。

關系表的設計就是要 把信息分解成多個表 一類數據一個表 。各表通過某些共同的值互相關聯(所以才叫關系資料庫)。在這個例子中可建立兩個表:一個存儲供應商信息,另一個存儲產品信息。Vendors表包含所有供應商信息,每個供應商佔一行,具有唯一的標識。此標識稱為 主鍵 (primary key),可以是供應商ID或任何其他唯一值。Procts表只存儲產品信息,除了存儲供應商ID(Vendors表的主鍵)外,它不存儲其他有關供應商的信息。Vendors表的主鍵將Vendors表與Procts表關聯,利用供應商ID能從Vendors表中找出相應供應商的詳細信息。

這樣做的 好處 是:

供應商信息不重復,不會浪費時間和空間;

如果供應商信息變動,可以只更新Vendors表中的單個記錄,相關表中的數據不用改動;

由於數據不重復,使得處理數據和生成報表更簡單。

總之,關系數據可以有效地存儲,方便地處理。因此,關系資料庫的可伸縮性遠比非關系資料庫要好。


為什麼使用連接

連明譽攔接將數據分解為多個表實現 更有效 地存儲、 更方便 地處理,且 可伸縮性更好

可伸縮性:能夠適應不斷增激胡加的工作量而不失敗。

連接作為一種機制,能在一條SELECT語句中用來關聯表。使用特定的語法,可連接多個表返回一組輸出。


創建連接

分析 :上述SELECT語句中與之前的語句相同,都是指定檢索的列, 區別 在於該語句指定的兩列(prod_name,prod_price)在一個表中,而第一列(vend_name)在另一個表中。

FROM子句也有所區別。該FROM子句列出了兩個表:Vendors,Procts。這兩個表由SELECT語句的WHERE子句連接。WHERE子句指示DBMS將Vendors表中的vend_id與Procts表中的vend_id匹配起來。

這里使用了 完全限定列名 將Vendors.vend_id和Procts.vend_id兩列匹配。最終輸出了兩個不同表中的數據。



高級連接部分將介紹 如何使用表別名,另外的一些連接 ,以及 如何對被連接的表使用聚集函數


使用表別名

之前的文章已經給大家介紹了如何使用別名引用被檢索的表列。

SQL還可以 給表名起別名 ,目的是:

縮短SQL語句。

允許在一條SELECT語句中多次使用相同的表。

分析 :上述語句中的FROM子句的三個表都有別名。如此 省略了許多字元 。表別名還可以用於SELECT的列表、ORDER BY子句以及其他語句部分。

需要注意的是: 表別名只在查詢執行中使用 。與列別名不同,表別名不返回到客戶端。


使用不同類型的連接

接下來將給大家介紹四種其他類型的連接: 自連接 自然連接 內連接 外連接

①自連接

分析: 這是使用了 子查詢 的方案。對內部的SELECT語句做了一個簡單的檢索,返回Jim Jones工作公司的cust_name。該數據用於外部查詢的WHERE子句中,以檢索出為該公司工作的所有雇員。

下面看看使用了 連接 的方案。

分析:上述語句需要的兩個表實際上是相同的表,所以Customers表在FROM子句中出現了兩次。但這對於Customers的引用具有歧義,因為沒有指示DBMS引用的是哪個Customers表。

於是需要使用表別名解決該問題。Customers表 第一次出現為別名c1 第二次為c2 ,然後再將這些別名用作表名。如SELECT語句使用c1前綴明確給出所需列的全名。如果不這么做,DBMS將返回錯誤,因為名為cust_id、cust_name、cust_contact的列各有兩個。DBMS不知需要哪一列,即使它們都是同一列。

WHERE首先連接兩個表,再按第二個表中的cust_contact過濾數據,返回所需的數據。


②自然連接

內連接 返回所有的數據,其中 相同的列可多次出現 。而 自然連接排除多次出現 ,使每一列只返回一次。

一般通過對一個表使用通配符(SELECT *),而對其他的列使用明確的子集來實現自然連接。

分析: 上述語句中,通配符只對第一個表使用,而所有其他列都明確列出來,所以沒有出現重復的列被檢索出來。


③內連接

目前為止使用的連接稱為等值連接,是基於兩個表之間的相等測試。該連接也稱為內連接。

對該種連接還可以使用不同的語法,明確指定連接的類型。

分析 :該語句中的SELECT與之前的區別在於FROM 子句。此處兩個表之間的關系是以 INNER JOIN 指定的部分FROM子句,因此需要使用特定的 ON子句 而不是WHERE子句。但傳遞給ON的實際條件與WHERE相同。


④外連接

許多連接將一個表中的行與另一個表中的行相關聯,但有時候 需要包含沒有關聯的行 。例如,可能需要使用連接完成以下工作:

對每個顧客下的訂單進行計數,包括那些至今尚未下訂單的顧客;

列出所有產品以及訂購數量,包括沒有人訂購的產品;

計算平均銷售規模,包括那些至今尚未下訂單的顧客。

在上述例子中,連接包含了那些在相關表中沒有關聯行的行。這種連接稱為外連接,外連接分為 左外連接 右外連接

左外連接:取左邊的表的全部,而右邊的表按照條件顯示,不符合條件的顯示NULL。

右外連接:取右邊的表的全部,而左邊的表按照條件顯示,不符合條件的顯示NULL。

下面先給出一個簡單的 內連接 ,再給出 左外連接 ,大家對比著理解。

分析 :兩個語句都使用了 JOIN 關鍵字來指定連接類型,與內連接不同的是,左外連接包括沒有關聯行的行。因此在使用JOIN語法時,還需使用RIGHT或LEFT關鍵字來指定包括其所有行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT指出的是OUTER JOIN左邊的表)。

上述左外連接語句使用了LEFT OUTER JOIN 從FROM子句左邊的表(Customers)中選擇所有行。

若要從右邊的表選擇所有行,即使用 右外連接 ,則語句如下:

注意 :兩種基本的外連接形式,左外連接和右外連接。兩者的唯一差別是所關聯的表的順序。

此外,還有一種外連接,即 全外連接 。該連接檢索兩個表中的所有行並關聯可關聯的行。與左外連接或右外連接包含一個表的不關聯的行不同,全外連接包含兩個表的不關聯的行。


自連接、自然連接、內連接和外連接的區別

①自連接: 通常用於 兩張結構和數據內容完全一樣的表 ,在做數據處理時,對它們分別 重命名 來加以區分,然後再進行關聯。

②自然連接 :特點是要求兩個關系表中進行連接的必須是 相同屬性列 (名字相同),無需添加連接條件,且 在結果中消除了重復的屬性列

③內連接 :與自然連接相似,區別在於內連接 不要求兩屬性列同名 ,可以用 using或on 來指定某兩列欄位相同的連接條件。

④外連接 :可以解決自然連接時某些屬性不同導致這些元組被舍棄的問題,起到了 保留要舍棄的結果 的作用。


使用帶聚集函數的連接

之前給大家介紹過使用 聚集函數 來匯總數據,殊不知這些函數也可以與連接一起使用。

分析: 上述語句使用了 COUNT函數 。該語句使用INNER JOIN將Customers和Orders表相互關聯。GROUP BY子句按顧客分組,因此,函數調用COUNT(Orders.order_num)對每個顧客的訂單計數,將其作為num_ord返回。

分析: 上述語句使用 左外連接 包含所有顧客,包括了那些沒有任何訂單的顧客。



WHERE子句的重要性

需記住的是,在一條SELECT語句中連接幾個表時,相應的關系是在運行中構造的,因為在資料庫表中的定義沒有指示DBMS如何對表進行連接的內容。

要連接多個表,需要將它們並列於from之後, 關鍵 是要設置WHERE子句,確保它們之間的 關聯關系 必須給出,否則,查詢結果會成為笛卡爾積。

笛卡爾積:由沒有連接條件的表關系返回的結果為笛卡兒積。

分析 :上述語句輸出的結果便是 笛卡爾積 。返回的數據用每個供應商匹配了每個產品,包括了供應商不正確的產品(即使該供應商沒有產品)。


連接及其使用的要點

注意所使用的連接類型。一般我們使用內連接,但使用外連接也有效。

關於確切的連接語法,應該查看具體的文檔,看相應的DBMS支持何種語法(大多數DBMS使用這兩課中描述的某種語法)。

保證使用正確的連接條件(不管採用哪種語法),否則會返回不正確的數據。

應該總是提供連接條件,否則會得出笛卡兒積。

在一個連接中可以包含多個表,甚至可以對每個連接採用不同的連接類型。雖然這樣做是合法的,一般也很有用,但應該在測試它們前分別測試每個連接。這會使故障排除更為簡單。

以上就是本次介紹的連接和高級連接啦~

下一期將給大家介紹 組合查詢 插入數據 更新和刪除數據。

我們下期見!

2. SQL數據分析面試題

1、現有交易數據表user_goods_table,

老闆想知道每個用戶購買的外賣品類偏好分布,並找出每個用戶購買最多的外賣品類是哪個。

2、現有交易數據表user_sales_table,

老闆想知道支付金額在前20%的用戶。

3、現有用戶登錄表user_login_table,

老闆想知悔褲物道連續7天都登錄平台的重要用戶。

4、給定一張用戶簽到表user_attendence,表中包含三個欄位,分別是用戶ID:【user_id】碧液,日期:【date】,是否簽到:【is_sign_in】,0否1是。

4-1、計算截至當前(假設當前時間為2020-04-27),每個用戶已經連續簽到的天數:

要求輸出用戶ID【user_id】和連續簽到天數【recent_continuous_days】

4-2、計算有史以來 用戶最大連續簽到天數 :純培

要求輸出用戶ID【user_id】和最大連續簽到天數

3. 怎麼分析一個sql資料庫中的表格

兩種方式,一種是直接在sqlserver的列表中找到,另一種用寫語句的方式查詢猛高。
方法一:
1、納鎮登陸SQL SERVER Manager Studio。
2、在左邊的樹找到自己要查詢的資料庫。如圖:

3、點擊「表」,就能看到這個洞知粗庫中的所有表了。

4. SQLServer和Oracle資料庫分析(oraclesql性能分析)

分析原則:

1、具體問題具體分析(這是由於不同的應用系統,不同的測試目的,不同的性能關注點)

2、查找瓶頸時按以下順序,由易到難。

伺服器硬體瓶頸-〉網路瓶頸(對區域網,可以不考慮)-〉伺服器操作系統瓶頸(參數配置)-〉中間件瓶頸(參數配置,資料庫,web伺服器等)-〉應用瓶頸(SQL語句、資料庫設計、業務邏輯、演算法等)註:以上過程並不是每個分析中都需要的,要根據測試目的和要求來確定分析的深度。對一些要求低的,我們分析到應用系統在將來大的負載壓力(並發用戶數、數據量)下,系統的硬體瓶頸在哪兒就夠了。分段排除法很有效。

分析的信息來源:1、根據場景運行過程中的錯誤提示信息;

2、根據測試結果收集到的監控指標數據。

一、錯誤提示分析

分析實例:

1、Error:「10.10.10.30:8080〃:[10060]Connection

Error::Server「10.10.10.30〃

分析:

A、應用服務死掉(小用戶時:程序上的問題。程序上處理資料庫的問題)

B、應用服務沒有死(應用服務參數設置問題)

例:在許多客戶端連接Weblogic應用伺服器被拒絕,而在伺服器端沒有錯誤顯示,則有可能是Weblogic中的server元素的AeptBacklog屬性值設得過低。如果連接時收到消息,說明應提高該值,每次增加25%

C、資料庫的連接(1、在應用服務的性能參數可能太小了;2、資料庫啟動的最大連接數(跟硬體的內存有關)。)

分析:可能是以下原因造成

A、譽叢應用服務參慶掘櫻數設置太大導致伺服器的瓶頸;B、頁面中圖片太多;C、在程序處理表的時候檢查欄位太大多。

二.監控指標數據分析

1、最大並發用戶數:

應用系統在當前環境(硬體環境、網路環境、軟體環境(參數配置))下能承受的最大並發用戶數。在方案運行中,如果出現了大於3個用戶的業務操作失敗,或出現了伺服器shutdown的情況,則說明在當前環境下,系統承受不了當前並發用戶的負載壓力,那麼最大並發用戶數就是前一個沒有出現這種現象的並發用戶數。如果測得的最大並發用戶數到達了性能要求,且各伺服器資源情況良好,業務操作響應時間也達到了用戶要求,那麼可行。否則,再根據各伺服器的資源情況和業務操作響應時間進一步分析原因所在。

2、業務操作響應時間:

分析方案運行情況應從平均事務響應時間圖和事務性能摘要圖開始。使用「事務性能摘要」圖,可以確定在方案執行期間響應時間過長的事務。細分事務並分析每個頁面組件的性能。如果伺服器耗時過長,請使用相應的伺服器圖確定有問題的伺服器度量並查明伺服器性能下降的原因。如果網路耗時過長,請使用「網路監視器」圖確定導致性能瓶頸的網路問題

3、伺服器資源監控指標:內存:

1、UNIX資源監控中指標內存頁交換速率(Pagingrate),如散衡果該值偶爾走高,表明當時有線程競爭內存。如果持續很高,則內存可能是瓶頸。也可能是內存訪問命中率低。

2、Windows資源監控中,如果Process計數器和ProcessWorkingSet計數器的值在長時間內持續升高,同時Memory計數器的值持續降低,則很可能存在內存泄漏。

內存資源成為系統性能的瓶頸的徵兆:很高的換頁率();進程進入不活動狀態;交換區所有磁碟的活動次數可高;可高的全局系統CPU利用率;內存不夠出錯()。

處理器:

1、UNIX資源監控(Windows操作系統同理)中指標CPU佔用率(),如果該值持續超過95%,表明瓶頸是CPU。可以考慮增加一個處理器或換一個更快的處理器。如果伺服器專用於SQLServer,可接受的最大上限是80-85%合理使用的范圍在60%至70%。

2、Windows資源監控中,如果System大於2,而處理器利用率()一直很低,則存在著處理器阻塞。

CPU資源成為系統性能的瓶頸的徵兆:很慢的響應時間();CPU空閑時間為零();過高的用戶佔用CPU時間();過高的系統佔用CPU時間();長時間的有很長的運行進程隊列()。

磁碟I/O:

1、UNIX資源監控(Windows操作系統同理)中指標磁碟交換率(Diskrate),如果該參數值一直很高,表明I/O有問題。可考慮更換更快的硬碟系統。

2、Windows資源監控中,如果DiskTime和Avg.DiskQueueLength的值很高,而PageReads/sec頁面讀取操作速率很低,則可能存在磁碟瓶徑。

I/O資源成為系統性能的瓶頸的徵兆:過高的磁碟利用率(highdiskutilization);

太長的磁碟等待隊列(largediskqueuelength);

等待磁碟I/O的時間所佔的百分率太高(/O);

太高的物理I/O速率:largephysicalI/Orate(notsufficientinitself);

過低的緩存命中率(lowbuffercachehitratio(notsufficientinitself));

太長的運行進程隊列,但CPU卻空閑(largerunqueuewithidleCPU)。

4、資料庫伺服器:

SQLServer資料庫:

1、SQLServer資源監控中指標緩存點擊率(CacheHitRatio),該值越高越好。如果持續低於80%,應考慮增加內存。

2、如果FullScans/sec(全表掃描/秒)計數器顯示的值比1或2高,則應分析你的查詢以確定是否確實需要全表掃描,以及SQL查詢是否可以被優化。

3、NumberofDeadlocks/sec(死鎖的數量/秒):死鎖對應用程序的可伸縮性非常有害,並且會導致惡劣的用戶體驗。該計數器的值必須為0。

4、LockRequests/sec(鎖請求/秒),通過優化查詢來減少讀取次數,可以減少該計數器的值。

Oracle資料庫:

1、如果自由內存接近於0而且庫快存或數據字典快存的命中率小於0.90,那麼需要增加SHARED_POOL_SIZE的大小。

快存(共享SQL區)和數據字典快存的命中率:select(sum(pins-reloads))/sum(pins)fromv$librarycache;

select(sum(gets-getmisses))/sum(gets)fromv$rowcache;

自由內存:select*fromv$sgastatwherename=『freememory』。

2、如果數據的緩存命中率小於0.90,那麼需要加大DB_BLOCK_BUFFERS參數的值(單位:塊)。

緩沖區高速緩存命中率:selectname,valuefromv$sysstatwherenamein(『dbblockgets』,『consistentgets』『physicalreads』)HitRatio=1-(physicalreads/(dbblockgetsconsistentgets))。

3、如果日誌緩沖區申請的值較大,則應加大LOG_BUFFER參數的值。

日誌緩沖區的申請情況:selectname,valuefromv$sysstatwherename=『redologspacerequests』。

4、如果內存排序命中率小於0.95,則應加大SORT_AREA_SIZE以避免磁碟排序。

內存排序命中率:selectround((100*b.value)/decode((a.valueb.value),0,1,(a.valueb.value)),2)fromv$sysstata,v$sysstatbwherea.name=』sorts(disk)』andb.name=』sorts(memory)』

註:上述SQLServer和Oracle資料庫分析,只是一些簡單、基本的分析,特別是Oracle資料庫的分析和優化,是一門專門的技術,進一步的分析可查相關資料。

5. sql數據分析是啥意思

sql數據分析是結構化查詢語言。

結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統。

結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式。

所以具有完全不同底層結構的不同資料庫系統, 可以使用相同的結構化查詢語言作為數據輸入與管理的介面。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。

SQL具有數據定義、數據操縱、數據查詢和數據控制的功能。

1、SQL數據定義功能:能夠定義資料庫的三級模式結構,即外模式、全局模式和內模式結構。在SQL中,外模式又叫做視圖(View),全局模式簡稱模式(Schema),內模式由系統根據資料庫模式自動實現,一般無需用戶過問。

2、SQL數據操縱功能:包括對基本表和視圖的數據插入、刪除和修改,特別是具有很強的數據查詢功能。

3、SQL的數據控制功能:主要是對用戶的訪問許可權加以控制,以保證系統的安全性。

6. 數據分析人必掌握的資料庫語言-SQL指南第五期

本篇文章繼續圍繞SQL的語法重點為大家介紹 子查詢 的使用。



使用子查詢進行過濾

在SQL中SELECT語句用於查詢,之前所使用的所有SELECT語句都是簡單查詢,即從單個資料庫表中檢索數據的單條語句。然而SQL還可以創建子查詢,即嵌套在其他查詢中的查詢。

示例:

數據表:本次中清畝使用的資料庫表都是 關系表 。訂單存儲在兩個表中,每個訂單包含訂單編號、客戶ID、訂單日期,在Orders表中存儲為一行。各訂單的物品存儲在相關的OrderItems表中。Orders表不存儲顧客信息,只存儲顧客ID。顧客實際信息存儲在Customers表中。

若現在需要檢索出訂購RGAN01的所有顧客,應怎樣檢索? 步驟如下:

檢索包含物品RGAN01的所有訂單的編號。

檢索具有前一步驟列出的訂單編號的所有顧客的ID。

檢索前賣森一步驟返回的所有顧客ID的顧客信息。

上述每個步驟都可 單獨作為一個查詢 來進行。

可將一條SELECT語句返回的結果用於另一條SELECT語句的WHERE子句,也可使用 子查詢 來將3個查詢組合成一條語句。

第一個語句含義明確,是對prod_id為RGAN01的所有訂單物品檢索其order_num列。

分析: 通過該語句知道了哪個訂單包含要檢索的物品。

下一步查詢與上述語句檢索出的訂單20007和20008相關的顧客ID。此處可利用IN子句。

下面可結合上述兩個查詢,將第一個查詢變為子查詢。

分析:正旅在SELECT語句中, 子查詢總是從內向外處理 。在處理上述SELECT語句時,DBMS實際上執行了兩個操作。

首先執行了 圓括弧()內的查詢 ,此查詢返回兩個訂單號: 20007 20008 .

接著這兩個值以IN操作符要求的逗號分隔的格式傳遞給外部查詢的WHERE子句。 外部查詢變為:

該語句檢索的結果和前面硬編碼WHERE子句返回的結果相同。

由上述語句得出訂購物品RGAN01的所有顧客ID: 100004 100005 .下一步檢索這些顧客ID的顧客信息。

也可將其中的WHERE子句轉換為子查詢,就不用硬編碼這些顧客ID了。

分析: DBMS實際上必須執行三條SELECT語句才能完成上述語句。最裡面的子查詢返回訂單號,此列用於外面的子查詢的WHERE子句。外面的子查詢返回顧客ID列,此顧客ID列用於最外層查詢的WHERE子句。最外層查詢返回最終所需的數據。

由此可見,在WHERE子句中使用子查詢可編寫出功能強大靈活的SQL語句。對於能嵌套的子查詢的數目沒有限制,不過在實際應用中由於 性能的限制 ,不宜嵌套太多子查詢。

注意: 作為子查詢的SELECT語句只能查詢 單個列 ,檢索多個列將返回錯誤。另外使用子查詢並不總是執行該類數據檢索的最有效方法。


作為計算欄位使用子查詢

使用子查詢的另一方法是創建計算欄位。

示例: 需要顯示Customers表中每個顧客的訂單總數。訂單與相應的顧客ID都存儲在Orders表中。要執行這個操作,需要以下步驟:

從Customers表中檢索顧客列表。

對於檢索出的每個顧客,統計其在Orders表中的訂單數目。

這里我們可以應用之前介紹的 SELECT COUNT(*) 對表中的行進行計數,並通過一條WHERE子句來過濾某個特定的顧客ID,僅對該顧客的訂單進行計數。

如下對顧客1000001的訂單進行計數:

要對每個顧客執行COUNT(*)需要將其作為一個子查詢,如下:

分析: 該SELECT語句對Customers表中的每個顧客返回三列:cust_name、cust_state和orders。orders是一個 計算欄位 ,它由圓括弧中的子查詢建立。該子查詢對檢索出的每個顧客執行一次。此例中, 該子查詢執行了5次 ,因為檢索出了5個顧客。

子查詢中的WHERE子句與之前使用的WHERE子句略有不同,因為它使用了 完全限定列名 ,而不只是列名(cust_id)。它指定表名和列名(Orders.cust_id和Customers.cust_id)。下面的WHERE子句告訴SQL,比較Orders表中的cust_id和當前正從Customers表中檢索出的cust_id:

在有可能混淆列名時必須用一個 句點分隔表名和列名 。此例中,有兩個cust_id列:一個在Customers中,另一個在Orders中。若不採用完全限定名,DBMS會認為要對Orders表中的cust_id自身進行比較。因為:

上述語句總返回Orders表中訂單的總數,而該 結果不是我們想要的 ,如下:

由上可知,在構造語句時,若涉及到多個表,而不對同一列名加以區分則會引起DBMS拋出錯誤信息。

好的做法是,當在SELECT語句中操作多個表時, 使用完全限定列名來避免歧義

最後總結一下子查詢的特點:

子查詢必須括在圓括弧中。

子查詢的SELECT子句中只能有一個列,除非主查詢中有多個列,用於與子查詢選中的列相比較。

子查詢不能使用ORDER BY,不過主查詢可以。在子查詢中,GROUP BY可以起到同ORDER BY相同的作用。

返回多行數據的子查詢只能同多值操作符一起使用,比如IN操作符。

SELECT 列表中不能包含任何對BLOB、ARRAY、CLOB或者NCLOB類型值的引用。

子查詢不能直接用在聚合函數中。

BETWEEN操作符不能同子查詢一起使用,但是BETWEEN操作符可以用在子查詢中。

以上便是本次介紹的全部內容,下篇文章將為大家講解 連接 高級連接 的使用。

我們下期再見!

7. 分析資料庫性能的SQL

用於查看哪些實例的哪些操作使用了大量的臨時段SELECT to_number(decode(SID NULL SID)) sid 空返operation_type OPERATION trunc(EXPECTED_SIZE/ ) ESIZE trunc(ACTUAL_MEM_USED/ ) MEM trunc(MAX_MEM_USED/ ) MAX MEM NUMBER_PASSES PASS trunc(TEMPSEG_SIZE/ ) TSIZEFROM V$SQL_WORKAREA_ACTIVEORDER BY ; 查詢有熱塊查詢的SQL語句select hash_valuefrom v$sqltext a (select distinct a owner a segment_name a segment_type fromdba_extents a (select dbarfil dbablkfrom (select dbarfil dbablkfrom x$bh order by tch desc) where rownum < ) bwhere a RELATIVE_FNO = b dbarfiland a BLOCK_ID <= b dbablk and a block_id + a blocks > b dbablk) bwhere a sql_text like % ||b segment_name|| % and b segment_type = TABLE order bya hash_value a address a piece; 全表掃描select opname target b num_rows b tablespace_name count(target) from v$session_longops a all_all_tables bwhere a TARGET=b owner|| ||b table_namehaving count(target)> group by opname target b num_rows b tablespace_name 查看磁碟排序和緩基迅存排序次數selectto_char(sn snap_time yyyy mm dd hh ) time_ avg(newmen value oldmen value) sorts_memeory avg(newdsk value olddsk value) disk_sortfromstats$sysstat oldmen stats$sysstat newmen stats$sysstat newdsk stats$sysstat olddsk stats$snapshot snwhere newdsk snap_id=sn snap_idand olddsk snap_id=sn snap_id and newmen snap_id=sn snap_idand newdsk snap_id=sn snap_id and oldmen name= sorts (memory) and newmen name= sorts (memory) and olddsk name= sorts (disk) and newdsk name= sorts (disk) group byto_char(sn snap_time yyyy mm dd hh ) 執行最慢的前 個SQL???select * from (selectto_char(snap_time dd Mon HH :mi:ss ) mydate executions exec loadsloads parse_callsparse 搏虧此disk_reads reads buffer_getsgets rows_processed rows_proc sortssorts sql_text hash_valuefromperfstat stats$sql_summary sql perfstat stats$snapshot snwheresql snap_id >(select min(snap_id) min_snapfrom stats$snapshot where snap_time > sysdate $days_back)andsql snap_id = sn snap_idorder by $sortskey desc)tt where rownum< ; SQL緩存池的命中率查詢(pinhitratio gethitratio應該大於 %以上)select namespace gethitratio pinhitratio reloads invalidationsfrom v$librarycachewhere namespace in ( SQL AREA TABLE/PROCEDURE BODY TRIGGER ) 資料庫的常規參數我就不說了 除了V$parameter中的常規參數外 ORACLE還有大量的隱含參數 下面的語句就可以查詢到資料庫的所有隱含參數以及其值與參數的描述 SELECT NAME VALUE decode(isdefault TRUE Y N ) as Default decode(ISEM TRUE Y N ) as SesMod decode(ISYM IMMEDIATE I DEFERRED D FALSE N ) as SysMod decode(IMOD MODIFIED U SYS_MODIFIED S N ) as Modified decode(IADJ TRUE Y N ) as Adjusted descriptionFROM ( GV$SYSTEM_PARAMETERSELECT x inst_id as instance x indx+ ksppinm as NAME ksppity ksppstvl as VALUE ksppstdf as isdefault decode(bitand(ksppiflg/ ) TRUE FALSE ) as ISEM decode(bitand(ksppiflg/ ) IMMEDIATE DEFERRED FALSE ) as ISYM decode(bitand(ksppstvf ) MODIFIED FALSE ) as IMOD decode(bitand(ksppstvf ) TRUE FALSE ) as IADJ ksppdesc as DESCRIPTIONFROM x$ksppi x x$ksppsv yWHERE x indx = y indxAND substr(ksppinm ) = _ AND x inst_id = USERENV( Instance ))ORDER BY NAME 想知道現在哪個用戶正在利用臨時段嗎?這個語句將告訴你哪個用戶正在利用臨時段 SELECT b tablespace b segfile# b segblk# b blocks a sid a serial# a username a osuser a status c sql_textFROM v$session a v$sort_usage b v$sql cWHERE a saddr = b session_addrAND a sql_address = c address(+)ORDER BY b tablespace b segfile# b segblk# b blocks; 查看磁碟碎片select tablespace_name sqrt(max(blocks)/sum(blocks))*( /sqrt(sqrt(count(blocks)))) FSFIfrom dba_free_spacegroup by tablespace_name order by 查看錶空間的名稱及大小select t tablespace_name round(sum(bytes/( * )) ) ts_sizefrom dba_tablespaces t dba_data_files dwhere t tablespace_name = d tablespace_namegroup by t tablespace_name; 查看錶空間物理文件的名稱及大小select tablespace_name file_id file_name round(bytes/( * ) ) total_spacefrom dba_data_filesorder by tablespace_name; 查看回滾段名稱及大小select segment_name tablespace_name r status (initial_extent/ ) InitialExtent (next_extent/ ) NextExtent max_extents v curext CurExtentFrom dba_rollback_segs r v$rollstat vWhere r segment_id = v usn(+)order by segment_name 耗資源的進程(top session)select s schemaname schema_name decode(sign( mand) to_char(mand) Action Code # || to_char(mand) ) action statussession_status s osuser os_user_name s sid p spid s serial# serial_num nvl(s username [Oracle process] ) user_name s terminal terminal s program program st value criteria_valuefrom v$sesstat st v$session s v$process pwhere st sid = s sid and st statistic# = to_number( ) and ( ALL = ALL or s status = ALL ) and p addr = s paddr order by st value desc p spid asc s username asc s osuser asc 查看鎖(lock)情況select /*+ RULE */ ls osuser os_user_name ls username user_name decode(ls type RW Row wait enqueue lock TM DML enqueue lock TX Transaction enqueue lock UL User supplied lock ) lock_type o object_name object decode(ls lmode null Row Share Row Exclusive Share Share Row Exclusive Exclusive null)lock_mode o owner ls sid ls serial# serial_num ls id ls id from sys dba_objects o ( select s osuser s username l type l lmode s sid s serial# l id l id from v$session s v$lock l where s sid = l sid ) lswhere o object_id = ls id ando owner<> SYS order by o owner o object_name 查看低效率的SQL語句SELECT EXECUTIONS DISK_READS BUFFER_GETS ROUND((BUFFER_GETS DISK_READS)/BUFFER_GETS ) Hit_radio ROUND(DISK_READS/EXECUTIONS ) Reads_per_run SQL_TEXTFROM V$SQLAREAWHEREEXECUTIONS> AND BUFFER_GETS > AND (BUFFER_GETS DISK_READS)/BUFFER_GETS < ORDER BY DESC lishixin/Article/program/Oracle/201311/17408

8. sql數據分析需要學什麼

作為數據分析師,你首先需要從正在核巧查詢的資料庫中讀取數據。我們一般會採用這種方法:
了解SELECT語句的工作方式。這其中包括研究邏輯查詢處理的工作方式。邏輯查詢處理描述了資料庫引擎執行SELECT語句的子句的順序。了解它會引導你編寫更好,更准確的查詢。
研究聯接的工作方式
內部聯接是最有效的。左,右和完全外部聯接的效率較低,但有時必須使用它們。內部聯接可以導致行被過濾掉,外部聯接氏氏螞不能導致過濾。研究加入,因此你知道何時使用每種類型。只有最簡單的資料庫查詢才不涉及聯接。

了解如何使用GROUP BY子句進行聚合
了解窗口函數/有序分析函數。這些是在SQL中進行分析的縮影殲埋。最初很難將你的頭纏繞在它們周圍,但是這是值得的。一旦了解了它們,便會一直使用它們。
了解資料庫規范化。如果你了解規范化,你將了解為什麼架構師以這種方式構造資料庫的理論。這有助於編寫查詢並確定要聯接的表。
了解實體關系圖(ERD)的工作方式。大多數ERD是使用魚尾紋符號構建的。確保知道基數和可選性約束是如何工作的,這將幫助你解密連接表時要使用的連接類型。

一旦掌握了這些知識,就應該擴展到學習SQL的DML和DDL子類別。DML代表數據操作語言,SELECT語句是該語言的一部分。DDL代表數據定義語言,這是資料庫架構師用來創建表的語言。
本文禁止轉載或摘編
本文為我原創
大數據
數據分析
數據分析師
1
收藏
分享
推薦文章
35歲轉行數據分析師可以嗎?
學習 · 56閱讀
Excel之PowerQuery 提取單元格指定文字
學習 · 175閱讀
[簡述]答題驗證系統部署說明
學習 · 865閱讀

9. 如何用SQLyog來分析MySQL資料庫

用SQLyog來分析MySQL資料庫 SOLyog的下載 安裝以及使用很簡單 我去了相關網站下載 它只有 K位元組大小 它把兩個文件(一個可執行文件 exe和一個動態鏈接庫文件 dll)安裝到C:Program FilesSQLyog路徑下 然後運行可執行文件

安裝後沒有必要再訪問春指該網站了 我訪問該網站是得到了一個消息 說它的域名沒有設置(configured) 登記 或正在建設中 我不清楚這個問題是暫時的還是一直是這樣 該軟體是免費的 並且沒有標志廣告(banner ads) 所以它可能是一個特定的尚未最終定型的商業模型 最終可能還是要知森改負費的

資料庫 表格(table)和列樹(column tree)

該程序一啟動就開始詢問我搭判的登錄到MySOL伺服器的口令 我只需要輸入我的伺服器名字 用戶id和登錄密碼 所有其它的設置都是正確的默認值 然後(當我開始其它事務 重啟幾次 睡了一會之後) 我重新運行該程序 這時只需要再次輸入我的登錄密碼 該程序沒有保存密碼的選項 你可以認為這是該程序的一個bug 也可以說是程序的保密特性

一旦你登錄之後 界面就是很值得注意 MySOL伺服器上所有的資料庫都顯示在一個樹型控制項上 你只能訪問你在登錄時授權的那個資料庫 如果你點開代表授權給你的那個資料庫的樹型結構 你就可以看到一系列代表表格的節點 點開表格節點後 你就可以看到一系列顯示欄位名的節點和另一個代表索引的節點集合

索引界面絕對是個好東東 這樣你就可以CRUD查詢索引和關鍵字了 這相對前端資料庫如Microsoft Access來說是個提高 如果考慮到MySOL剛剛開始提供對主(primary)和非相關(foreign)關鍵字關系的支持 本程序這部分的設計是很成熟的 在右下方的面板上 有四個標簽頁 即 結果(Result) 消息(Message) 對象(Object)和歷史(History)

有什麼缺點?

我試圖發現該程序的缺點 不過只發現了一個 如果你在Win Dependency Walker下運行程序的 exe文件 你會發現它引用了DLG dll文件 而DLG dll又輪流引用AppHelp 實事上 CommDlg調用AppHelp 而當AppHelp沒有請求函數時 CommDlg這么做根本就是浪費資源

過於簡單?

在SQLyog FAQ上 有一種觀點認為該軟體沒有正式歸檔的必要 當然 FAQ(常見問題解答)本身就是一種歸檔 SQLyog的界面非常直觀 我建議你列印一份MySOL文檔(包括SQL特殊語法擴展) 我就是這么做的 它只用了一個半英寸的活頁封面

最後一步?

FAQ還讓人想到一個讓人耳朵起了老繭卻又是正確的Occam s Razor准則——一切超出必要的復雜性都是沒有必要的 我之所以到處 推銷 這個工具 就是因為它可以為我們提供一個可以管理MySOL伺服器上許多資料庫的 簡單的 圖形化的界面 它的速度極快 並且它的拷貝很小(可以放在一張軟盤上)

lishixin/Article/program/SQL/201404/30537

10. 如何用SQLyog來分析MySQL資料庫


用SQLyog來分析MySQL資料庫:
SOLyog的下載、安裝以及使用很簡單。我去了相關網站下載,它只有384K位元組大小。它把兩個文件(一個可執行文件.exe和一個動態鏈接庫文件.dll)安裝到C:Program FilesSQLyog路徑下。然後運行可執行如悄文件。
安裝後沒有必要再訪問該網站了,我訪問該網站是得到了一個消息,說它的域名沒有設置(configured)、登記、或正老悶在建設中。我不清楚這個問題是暫時的還是一直是這樣。該軟體是免費的,並且沒有標志廣告(banner ads),所以它可能是一個特定的尚未最終定型的商業模型。最終可能還是要負費的。
資料庫、表格(table)和列樹(column tree)
該程序一啟動就開始詢問我的登錄到MySOL伺服器的口令。我只需要輸入我的伺服器名字、用戶id和登錄密碼。所有其它的設置都是正確的默認值。然後(當我開始其它事務、重啟幾次、睡了一會之後),我重新運行該程序,這時只需要再次輸入我的登錄密碼。該程序沒有保存密碼的選項,你可以認為這是該程序的一個bug,也可以說是程序的保密特性。
一旦你登錄之後,界面就是很值得注意。MySOL伺服器上所有的資料庫都顯示在一個樹型控制項上。你只能訪問你在登錄時授權的那個資料庫。如果你點開代表授權給你的那個資料庫的樹型結構,你就可以看到一系列代表表格的節點。點開表格節點後,你就可以看到一系列顯示欄位名的節點和另一個代表索引的節點集合。
索引界面絕對是個好東東,這樣你就可以CRUD查詢索引和關鍵字了。這相對前端資料庫如Microsoft Access來說是個提高。如果考慮到MySOL剛剛開始提供對主(primary)和非相關(foreign)關鍵字關系的支持,本程序這部分的設計是很成熟的。在右下方的面板上,有四個標簽頁,即:結果(Result)、消息(Message)、對象(Object)和歷史(History)。
有什麼缺點?
我試圖發現該程序的缺點,不過只發現了一個。如果你在Win32 Dependency Walker下運行程序的.exe文件,你會發現它引用了COMDLG32.dll文件,而COMDLG32.dll又輪流引用AppHelp。實事上,CommDlg調用AppHelp,而當AppHelp沒有請求函數時,CommDlg這么做根本就是浪費資源。
過於簡單?
在SQLyog FAQ上,有一種觀點認為該軟體沒有正式歸檔的必要。當然,FAQ(常見問題解答)本身就是一種歸檔。SQLyog的界面非常直觀。我建議你列印一份MySOL文檔(包括SQL特殊語法擴展)。我就是這么做的,它只用了一個半英寸的活頁封面。
最後一步?
FAQ還讓人想到一個讓人耳朵起了老繭卻又是正確的Occam's Razor准則——一切超出必要的復雜性都是沒有必要的。我之所以到處「推銷」這個工具,就是因為它可以為我們提供一個可以管理MySOL服務渣含渣器上許多資料庫的、簡單的、圖形化的界面。它的速度極快,並且它的拷貝很小(可以放在一張軟盤上)。
SQLyog宣稱自己是一個查詢分析器,實際上它的功能遠遠不止這些。假如你正在使用MySOL,你可以在它的網站下載SQLyog(需要登記你的名字和電子郵件地址),然後切身感受一下它的其他功能。

熱點內容
ftp命令使用 發布:2025-07-18 18:13:05 瀏覽:45
辦稅密碼是什麼 發布:2025-07-18 18:12:32 瀏覽:487
linuxftp文件下載 發布:2025-07-18 18:12:30 瀏覽:941
互聯網網站伺服器搭建 發布:2025-07-18 18:01:06 瀏覽:478
安卓手機怎麼辮真偽 發布:2025-07-18 17:13:14 瀏覽:186
java後台json 發布:2025-07-18 17:12:21 瀏覽:680
手機游戲配置主要看哪些 發布:2025-07-18 17:00:47 瀏覽:148
微課源碼 發布:2025-07-18 16:34:44 瀏覽:1001
壓縮長抱枕 發布:2025-07-18 16:13:38 瀏覽:505
如何使用wifi熱點配置網路 發布:2025-07-18 16:06:25 瀏覽:970