當前位置:首頁 » 編程語言 » sql子查詢放在函數裡面
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql子查詢放在函數裡面

發布時間: 2023-02-15 23:14:59

⑴ 在sql中使用子查詢需要注意哪些事項

多練習很重要,很多子查詢能做的工作用聯接也可以做,SELECT語句有時候聯結還會好理解一點。不過如果子查詢需要用到一些函數的時候聯接就不太方便,如MAX(),AVG()這些,如果是INSERT,UPDATE,DELETE的話也不能用

⑵ 一文講懂SQL子查詢

大家好,我是寧一。


今天講解SQL教程第18課:子查詢。


SQL語句可以嵌套,最常見的就是查詢語句的嵌套。


基本語法:



我們一般稱外面嵌套的語句為主查詢,裡面被嵌套的語句為子查詢,有時也會叫外查詢、內查詢,大家知道意思就好。


子查詢要用括弧括起來。子查詢不僅可以放在WHERE的後面,還可以放在SELECT、FROM的後面,我們一個個來講解。


1、子查詢+WHERE子句


SQL執行時,會先執行括弧內的子查詢,子查詢最常與WHERE子句結合使用。子查詢的結果作為WHERE子句的篩選條件,完成更復雜的數據檢索。


實例: 在Students表中,找出所有在"寧一"後面出生的學生。



實例解析: 需要先確定"寧一"的生日,再將生日作為WHERE篩選條件,得到最終數據。


第一步:找到"寧一"的生日




第二步:將生日作為WHERE篩選條件,得到最終數據,子查詢語句要用括弧括起來。






SELECT語句的子查詢經常與聚合函數結合使用。因為我們使用聚合函數的時候,記錄會合成一條,其它數據細節就不能顯示了。


比如: 我們想要查看學生表中所有的學生姓名、學生生日、學生的最大生日。


示例結果:



錯誤寫法:



像上面這樣寫是會報錯的,因為聚合函數與其他表中的列(Sname,Sage),同時放在SELECT的後面。需要用GROUP BY語句將這些表中的列(Sname,Sage)分組。


上面的語句後面加上 GROUP BY Sname,Sage 就可以了。


但是這樣寫,會將每組的數據聚合成1條數據,比如每組有3條數據,使用聚合函數MAX()+GROUP BY,最終每組只會顯示1條最大值的數據。


我們需要展現Students表中所有的學生,這樣寫不能滿足我們的需求。


正確寫法: 結合子查詢來實現。




子查詢與FROM子句結合使用,子查詢結果被當成了一個「表」,可以用SELECT語句做進一步的篩查。


比如:我們先寫一個SELECT查詢語句




將上面的查詢語句放在FROM的後面,則上面查詢到的結果,就會被當成一個「表」。



這里有一個特別要注意的地方,放在FROM後面的子查詢,必須要加別名。



復雜的子查詢再嵌套進 FROM 里會讓整個查詢看起來過於復雜,我們一般會將子查詢結果儲存為視圖,然後再直接使用視圖作為來源表,視圖會SQL高階課程中詳細講解。


其實子查詢就是查詢語句嵌套,沒有什麼新的東西,只是多了一個層級,由內向外地一層層梳理就會很清楚了。


作業: 結合Students表,從Teachers表中找出當班主任的老師(通過子查詢實現)。



作業解析: 先從Students表中,找出所有班主任的Tid並去重,將查詢結果作為篩選條件,放在WHERE語句中。



⑶ SQL,在SELECT語句中,( )不能包含子查詢。

count()是一個聚集函數(也稱為聚合函數)是為了選定行的數目,可以包含空值。
group
by
是分組,
可以按照一個多多個欄位分組。
使用時應注意:select
後顯示的信息:要麼包含在聚集函數中,要麼包含在group
by
子句中。
where
:是一個條件語句,在where後面跟的是條件!

⑷ sql的函數,排序和分組的sql語句,最簡單的就OK,還有子查詢

排序:select * from A order by id (默認升序 如果是降序的話就是 order by id desc)

分組:select id from A group by id

(子查詢是一個 SELECT 語句,它嵌套在一個 SELECT、SELECT...INTO 語句、INSERT...INTO 語句、DELETE 語句、或 UPDATE 語句或嵌套在另一子查詢中。)
簡單的如:select id from A where id in(select id from B )

都是很簡單的例子

⑸ 子查詢可以出現在SQL語言中那些語句的什麼位置

在select語句中,子查詢可以被嵌套在select語句的列,表和查詢條件中,即select子句,from子句,where子句,group by 子句和having子句

⑹ SQL 子查詢

所謂 SQL 子查詢就是嵌套在其他查詢中的查詢。子查詢通常用於 WHERE 子句的 IN 操作符中進行過濾,以及用來填充計算列。下面我們從這兩種使用場景展開學習。

本節涉及到關系表如下:

最上方的訂單表 Orders 存儲了訂單 ID 、訂單日期以及顧客 ID ;具體的訂單信息存儲在 OrderItems 表中,通過 order_num 進行關聯;具體的顧客信息存儲在顧客表 Customers 中,通過 cust_id 欄位進行關聯。

下面,假設我們需要檢索出購買了 RGA01 產品的所有顧客信息,應該怎麼做呢?

首先,我們只列出步驟:

接下來,我們來完成第一步:

包含了產品 RGAN01 的訂單編號:

有了訂單編號,就可以從訂單表檢索出顧客 ID 了:

運行結果:

接下來,我們來合並上面的兩步:把第一個查詢變為子查詢,放在 WHERE 語句的 IN 操作符之後:

運行結果和上述第二步獲得的結果是一樣的:

SELECT 語句中子查詢從內向外處理:首先執行 SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01' 子查詢,將返回的訂單號作為 IN 操作符的參數,執行外部查詢: SELECT cust_id FROM Orders WHERE order_num IN ( 20007, 20008 ); 。

最後,我們來看第三步,根據顧客 ID 檢索出顧客相關信息。

運行結果:

同理,我們可以將上述的 WHERE 子句替換為子查詢:

至此,我們的檢索任務就完成了:查詢購買了 RGAN01 商品的所有顧客姓名及聯系方式。

子查詢的另一個使用場景為創建計算欄位。同樣,我們以一個案例來學習:檢索每個顧客的訂單的總數。

顧客表與訂單表是一對多的關系,即一個顧客對應多個訂單,但一個訂單只對應一個顧客。

如下的 SQL 檢索出顧客 1000000001 的訂單數:

要對每個顧客的訂單計數,應該將其作為子查詢:

運行結果:

上述 SQL Customers 表中每個顧客返回三列: cust_name cust_state 和 orders 。其中 orders 為子查詢創建的計算欄位,該子查詢對檢索出的每個顧客都執行一次,一共執行了 6 次子查詢。

在子查詢的條件中,我們使用了表的完全限定列名 Orders.cust_id = Customers.cust_id ,這是因為 Orders 表和 Customers 表中包含了欄位名名稱相同的列。

本節我們學習了在 SELECT 語句中使用子查詢的兩種用法:將子查詢應用於 WHERE 子句的 IN 操作符中,進行條件過濾,以及用子查詢創建計算欄位。

子查詢的檢索效率不夠理想,下一篇文章中小魚將和大家展開聯結表的學習~ 連接表 是數據檢索的精華和重點,我們拭目以待吧!

⑺ SQL必知必會(二)函數、子查詢

#文本處理函數

UPPER()     --大寫

LOWER()    --小寫

SOUNDEX()   --讀音類似

LENGTH()    --字元串長度

#日期和時間處理函數

SELECT order_code

FROM order_table

WHERE DATEPART(yy,order_date)=2012

#to_char()函數提取日期成分,MySQL可用year()函數提取年份

SELECT order_num

FROM order_table

WHERE to_number(to_char(order_date,'YYYY'))=2012;    --to_char提取日期成分to_number轉化為數值

SELECT order_num

FROM order_table

WHERE order_date BETWEEN to_date('01-01-2012') AND to_date('12-31--2012');    --字元串轉日期

#數值處理函數

ABS()    --絕對值

COS()    --餘弦

EXP()    --指數值

PI()   --圓周率

SIN()    --正弦

SQRT()    --平方根

TAN()    --正切

#平均數AVG()

SELECT AVG(a) AS avg_a

FROM tableA

WHERE a='DLL01';

#計數

SELECT COUNT(*)  AS num_cust              --對所有行計數,不管是否NULL值

FROM tableA;

SELECT COUNT(a) AS num_a          --指定了列名,會忽略NULL值

FROM tableA;

#最值

MAX()和MIN(),忽略NULL值

#總值SUM(),忽略NULL值

SELECT SUM(price*quantity) AS total_price

FROM tableA

WHERE order_code=20008

#以上聚集函數只包含不同值

SELECT AVG(DISTINCT order_price) AS avg_price

FROM tableA

WHERE id='DLL01';

兩個子句:GROUP BY 和 HAVING

#GROUP BY創建分組HAVING過濾分組

SELECT vend_id, COUNT(*) AS num_prods

FROM tableA

WHERE price>=4

GROUP BY vend_id

HAVING COUNT(*)>=2;   

ORDER BY price    --GROUP BY在WHERE之後在ORDER   BY之前

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY

#子查詢順序為從內而外

SELECT order_num 

FROM tableA

WHERE id='DLL01';

(輸出20007和20008)

SELECT id

FROM tableB

WHERE order_num IN(20007,20008);

#合並為子查詢。只能查詢單個列

SELECT id

FROM tableB

WHERE order_num IN (SELECT order_num FROM tableA WHERE id='DLL01')

SELECT  cust_name,

                cust_state

                (SELECT COUNT(*) 

                 FROM Orders

                WHERE Orders.cust_id=Customers.cust_id) AS orders

FROM Customers

ORDER BY cust_name;

#Orders.cust_id=Customers.cust_id完全限定列名,在兩張表中名字相同列拿出來比較,防止歧義