日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sql嵌套查询返回多个字段_list4 SQL复杂查询

發(fā)布時間:2024/9/3 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql嵌套查询返回多个字段_list4 SQL复杂查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

子查詢返回結果形式不同:

標量子查詢(結果集只有一行一列)
列子查詢(結果集只有一列多行)
行子查詢(結果集有一行多列)
表子查詢(結果集一般為多行多列)

子查詢在主查詢中出現的位置不同:

select后面:
僅僅支持標量子查詢
from后面:
支持表子查詢
where或having后面:★
標量子查詢(單行) √
列子查詢 (多行) √
行子查詢
exists后面(相關子查詢)
表子查詢

子查詢和操作符:

單行操作符<,>,=,<=,>=,<>和標量子查詢一起使用;
any,all,in,not in和列子查詢一起使用,=any形式也可;

SELECT查詢養(yǎng)成去重的習慣SELECT distinct;


視圖和子查詢

視圖和子查詢是SQL查詢語句中功能性和靈活性更強的語句,可以理解成小模塊。那么,學習這種具有獨立功能的模塊,應該做到以下幾點——
是什么。如何使用。為什么用。注意事項。舉例說明。
子查詢涉及到更多的條件,條件之間彼此牽連,難在分析清楚條件中內含的嵌套邏輯。
這一部分進階促使我意識到復雜SQL查詢需要更多的實戰(zhàn)和練習,才能加深理解,提高熟練度,要結合更多的案例才有可能駕輕就熟。

主要包括視圖,子查詢,使用它們解決問題的思路,常用函數

一、視圖(視圖很像origin里的模板,科研狗的胡言亂語.....)

  • 視圖不存放實際數據,存放的是sql語句,能夠創(chuàng)建一個新的臨時表;
  • 創(chuàng)建視圖時,視圖列名的順序應該和查詢語句中的列的順序對應;
create view 視圖名稱(視圖列名1,視圖列名2,.....) as select 列名1,列名2,... from 表名 ......

練習

#創(chuàng)建視圖,按性別匯總人數

  • 使用視圖時,查詢語句的字段名應該使用創(chuàng)建視圖時用的視圖列名。
select 視圖列名1,視圖列名2,.... from 視圖名稱; (在from子句中,使用視圖名稱代替原表名稱。)


練習

#使用視圖,使用“按性別匯總”視圖匯總各性別的人數

注意事項:

避免多個視圖嵌套,會影響SQL的性能;視圖中不能插入數據;

子查詢

  • 在from子句中直接寫定義視圖的sql查詢語句,就形成了一個創(chuàng)建臨時表子查詢;
  • 執(zhí)行sql語句時,先運行內部sql子查詢語句,在運行外部sql查詢語句;
  • 子查詢可以放在from子句中,也可以放在where子句中,視具體情況而定;
select 列名1,列名2,... from (select 查詢語句) as X;

練習

#使用子查詢按性別匯總人數

  • 使用子查詢時常常和in,all,any結合使用,....in(子查詢);....all(子查詢);....any(子查詢);.....between(子查詢) and(子查詢);

練習1

#找出每個課程里成績最低的學號,思路:1、按課程分組找到各自最低成績;2、查詢組內最低成績的學號,組內比較;(這是個關聯子查詢)

第一次查詢報錯,提示該子查詢中應該只包含一列;粗心多寫了課程號,顯然in不能這么用,其本質是等值判斷;

修改后,查詢正常運行,但是查詢結果不正確,課程&amp;amp;amp;amp;amp;#39;0002&amp;amp;amp;amp;amp;#39;出現60和80兩個成績,該查詢結果是“查詢哪些學生的成績與各課程最低成績里任意一個相同”;

更正如下:

其中,&amp;amp;amp;amp;amp;#39;in&amp;amp;amp;amp;amp;#39;也可以替換為&amp;amp;amp;amp;amp;#39;=&amp;amp;amp;amp;amp;#39;來判斷;

練習2、3

#查詢哪些學生的成績比課程0002的全部成績里的任意一個高,思路分兩步:

子查詢中的最低成績是60

#查詢哪些學生的成績比課程0002的全部成績都高,思路分兩步:

子查詢中最高成績?yōu)?0

注意事項:

  • all,any(結果)中是集合,要避免算術運算誤用;
  • 子查詢和視圖一樣避免嵌套,影響性能又難于理解;可以使用as為子查詢命名;

包含子查詢的SQL語句的運行順序:

標量子查詢——是指只返回一個值的子查詢,可作為單獨的一個結果使用。

  • 它可能會用到分組函數,比如使用avg函數,但用了分組函數的子查詢未必就是標量子查詢,因為分組后可能有多個結果。

練習

#大于平均成績的學生的學號和成績

#成績位于差生<=60和優(yōu)等生>80成績之間的學生的學號和成績

注意事項:

  • 標量子查詢僅僅返回一個結果,所以不能錯誤的把分組函數和group by結合起來一起使用。
√select 學號,成績,(select avg(成績)from score); ×select 學號,成績,(select avg(成績)from score group by 課程號);

關聯子查詢——關聯子查詢有一點繞人,結合sql語句的執(zhí)行順序和底層指令來理解

  • 前面提到標量子查詢返回單一值;若是需要多個組里的內容自行比較,則需要分成多個組,而組內又需要單一值來實現算術比較時——這時即用到關聯子查詢。

練習

#查找每個課程中大于對應課程平均成績的學生

因為之前通讀過必知必會,此處乍一看關聯子查詢很像表的自連接,但是兩者并不相同,自連接是為了避免歧義導致SQL解析出錯;關聯條件實際上是通過外內表的關聯對內表列值進行過濾。

個人理解為,SQL進行列值比對時并不是各行同時進行比對,舉個例子:(以下圖為例)

s1.課程號的第一行'0001'逐一與s2.課程號的每一行進行匹配,并返回相匹配的行們,隨后接著向下執(zhí)行group by子句等;
s1.課程號的第二行'0002'逐一與s2.課程號的每一行進行匹配,并返回相匹配的行們,隨后接著向下執(zhí)行group by子句等;
..........由此每次子查詢每次只返回單一值,與外部表相應列值進行比較。
  • 該關聯條件每次篩選出和s1中某一行課程號同一組的課程號,因此子查詢只返回某一組相同課程號的一個平均成績。這個某一組就是由關聯條件限定出來的———這個where子句的機制,正是體現了1、SQL的語句執(zhí)行順序;2、SQL中表之間過濾數據時怎么工作的;
  • 上面例子中的關聯子查詢group by去掉也不影響查詢結果,group by使語句更規(guī)范更易于理解。它是一個內外分開執(zhí)行的過程,類似for語句的嵌套循環(huán),豁然開朗。

視圖、子查詢關系圖

常用函數——(SQL中很多函數可以在需要時搜索使用)

  • 字符串函數;數值函數;日期函數;
  • 匯總函數;
  • SQL ZOO練習

    • 因為sql語句的豐富性,同樣的要求往往可以使用不同的思路解決。不同子句,異曲同工。

    總結

    以上是生活随笔為你收集整理的sql嵌套查询返回多个字段_list4 SQL复杂查询的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。