子查詢(極客時間)

来源:https://www.cnblogs.com/wadmwz/archive/2019/07/07/11146317.html
-Advertisement-
Play Games

子查詢 子查詢就是嵌套在查詢中的查詢, 目的是為了進行更複雜的查詢, 同時可以理解查詢的過程. 子查詢也分為兩種, 一種是關聯子查詢, 一種是非關聯子查詢. 關聯子查詢與非關聯子查詢 子查詢的劃分是依據了子查詢是否執行多次來進行劃分的. 子查詢從數據表中查詢數據結果, 如果這個數據結果只執行一次, ...


子查詢

子查詢就是嵌套在查詢中的查詢, 目的是為了進行更複雜的查詢, 同時可以理解查詢的過程.

子查詢也分為兩種, 一種是關聯子查詢, 一種是非關聯子查詢.

關聯子查詢與非關聯子查詢

子查詢的劃分是依據了子查詢是否執行多次來進行劃分的.

子查詢從數據表中查詢數據結果, 如果這個數據結果只執行一次, 之後這個數據結果作為主查詢的條件進行執行, 這種就是非關聯子查詢.

同樣, 如果子查詢需要執行多次, 即採用迴圈的方式, 先從外部查詢開始, 每次傳入子查詢進行查詢, 之後結果反饋給外部, 這種嵌套方式就是關聯子查詢.

舉個例子, 創建五張表, player表是球員表, team表是球隊表, team_score是球隊比賽成績表, player_score是球員比賽成績表, height_grades是球員身高對應的等級表.

如果僅僅學習的話可以自己創建表, 看完之後自己出題自己來做, 沒必要非要上面的表, 如需下載請到 https://github.com/cystanford/sql_nba_data 去下載.

SELECT player_name, height FROM player WHERE height = (SELECT max(height) FROM player); // 查詢身高最高的球員信息

上面的子查詢就是非關聯子查詢, 查詢最高身高的子查詢僅僅執行了一次, 不依賴於外部查詢.


SELECT player_name, height, team_id FROM player AS a WHERE height > (SELECT avg(height) FROM player AS b WHERE a.team_id = b.team_id); // 查詢每個球隊中大於平均身高的球員信息

這個子查詢就是關聯子查詢了, 因為裡面的查詢球隊隊員平均身高依賴於外(主)查詢, 需要使用主查詢來獲取當前隊員是哪個球隊的.

EXISTS子查詢

關聯子查詢通常也和EXISTS一起使用, EXISTS子查詢用來判斷條件是否滿足, 滿足的話為TRUE, 不滿足的話為FALSE. 現在想查詢出場過的球員有哪些, 這個就需要到player_score中去查詢全部的球員Id, 有記錄表示出場過.

SELECT player_id, team_id, player_name FROM player WHERE EXISTS (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id); // EXISTS的關聯條件是寫在子查詢中的

有EXISTS, 自查就有NOT EXISTS, 也就是不存在, 與EXISTS是完全相反的結果.

與EXISTS有相同含義的還有IN, 這個下麵說.

集合比較子查詢

集合比較子查詢的作用是與另一個查詢結果集進行比較, 可以再子查詢中使用IN, ANY, ALL和SOME操作符.

現在想查詢出場過的球員有哪些, 可以這樣寫:

SELECT player_id, team_id, player_name FROM player WHERE player_id in (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id);  // in查詢出場過的球員

哪種效率更好取決於查詢表於關聯表的數據大小, 查詢表達, IN的效率高, 相反, EXISTS的效率高.

接下來說說ANY和ALL, 這兩個通常需要使用比較符, 比較符包括了(>)(=)(<)(>=)(<=)(<>)等.

要查詢比印第安納步行者(對應的twam_id是1002)中任何一個球員身高高的球員信息, sql如下

SELECT player_id, player_name, height FROM player WHERE height > ANY (SELECT height FROM player WHERE team_id = 1002); // 主要身高高於子查詢中的人一個一個就可以
SQL: SELECT player_id, player_name, height FROM player WHERE height > ALL (SELECT height FROM player WHERE team_id = 1002); // 身高高於球員中的任意一個球員的身高, 簡單的說就是比球隊中身高最高的球員還要高.

SELECT p1.* FROM player p1 WHERE p1.height = (SELECT MAX(height) FROM player p2 WHERE p1.team_id = p2.team_id); // 查詢每支球隊中, 身高最高的球員信息

ANY和ALL關鍵字必須與一個比較操作符在一起使用, 不適用起不到集合比較的作用, ANY和ALL就沒有任何意義.

子查詢作為計算欄位

想查詢每支球員的球員數

SELECT team_name, (SELECT count(*) FROM player WHERE player.team_id = team.team_id) AS player_num FROM team;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.主題管理 kafka-topics.sh工具腳本用於對主題操作,如創建、刪除、修改、分區數、副本數及主題級別的配置。 1.1創建名為kafka-test主題,有2個副本,3個分區 [hadoop@h201 kafka_2.12-0.10.2.1]$ bin/kafka-topics.sh --c ...
  • Oracle基礎學習筆記 最近找到一份實習工作,有點頭疼的是,有階段性考核,這...,實際想想看,大學期間只學過資料庫原理,並沒有針對某一資料庫管理系統而系統的學習,這正好是一個機會,於是乎用了三天時間學習了一下Oracle數據的相關內容,以下是我總結的一些知識點,有錯誤的地方請及時通知我改正。 一 ...
  • 特別提示 本說明中的mysql 是基於windwos平臺下的5.5 版本 安裝完成後 請到mysql中設置配置文件 鏈接分享:鏈接:https://pan.baidu.com/s/1tv4ulZW1iUVl0ukn5WtV6w 提取碼:rso9 (永久有效) 本篇教程的主要目的為 好記性不如爛筆頭 ...
  • mysql 表的完整性約束 [TOC] 約束概念 unsigned 設置某一個數字無符號 (整數類型 ,浮點類型不能是unsigned的) not null 某一個欄位不能為空(嚴格模式會影響非空設置的效果) default 給某個欄位設置預設值(設置預設值) unique 設置某一個欄位不能重覆 ...
  • mysql支持的數據類型 [TOC] 數據類型官方文檔 數值類型 數值類型表 | 類型 | 大小 | 範圍(有符號) | 範圍(無符號)unsigned約束 | 用途 | | | | | | | | TINYINT | 1位元組 | ( 128,127) | (0,255) | 小整數值 | | SM ...
  • 1.前言 記得從上大學的時候就已經聽說過這個詞語 以前的理解可能就是數據量超大很多嘛 到這幾年大數據這個詞語被人們談論得也越來越頻繁 也越來越想瞭解它的所以自己才會去學習 我覺得做任何事之前肯定有某種驅使你去瞭解它的過程 以下僅是自己個人的理解 2.什麼是大數據? 大數據不僅是數據量大 (G,TB, ...
  • 1.Redis伺服器 can not get resource from pool. 1000個線程併發還能跑,5000個線程的時候出現這種問題,查後臺debug日誌,發現redis 線程池不夠。剛開始設置的是: 順便也改了一下jdbc 的連接池參數,最大空閑和最大連接數都改成1000.在測一下。可 ...
  • SQL中的連接 關係型資料庫的核心之一就是連接, 而在不同的標準中, 連接的寫法上可能有區別, 最為主要的兩個SQL標準就是SQL92和SQL99了, 後面的數字表示的是標準提出的時間. SQL92中的連接 案例使用的表是球員表, 球隊表和身高級別表, 下載: 笛卡爾積 笛卡爾積是一個數學運算, 假 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...