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

如何編寫sql子查詢

發布時間: 2023-06-02 13:56:55

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 操作符中,進行條件過濾,以及用子查詢創建計算欄位。

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

⑵ mysql 分組子查詢sql怎麼寫

一使用SELECT子句進行多表查詢
SELECT 欄位名 FROM 表1,表2 … WHERE 表1.欄位 = 表2.欄位 AND 其它查詢條件
SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id
注:在上面的的代碼中,以兩張表的id欄位信息相同作為條件建立兩表關聯,但在實際開發中不應該這樣使用,最好用主外鍵約束來實現
二使用表的別名進行多表查詢
如:SELECT
a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065
a,tb_demo065_tel b WHERE a.id=b.id AND b.id='$_POST[textid]'
SQL語言中,可以通過兩種方式為表指定別名
MySQL是一個關系型資料庫管理系統,由瑞典MySQL
AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關系型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的
RDBMS (Relational Database Management System,關系資料庫管理系統) 應用軟體。
MySQL是一種關系資料庫管理系統,關系資料庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標准化語言。MySQL 軟體採用了雙授權政策,分為社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。
由於其社區版的性能卓越,搭配 PHP 和 Apache 可組成良好的開發環境。

⑶ sql 分組子查詢怎麼寫

你的意思是不是「找出所有status欄位不是OK的BarCode,然後顯示找到的這些BarCode對應的所有的記錄」
比如:某個BarCode有三條記錄,這三條記錄中有一條status不是OK,那麼就顯示這三條記錄;另一個BarCode有亮條記錄,他們的status狀態都是OK,那麼就不顯示。是這個意思不是。
如果是那麼不需要分組,直接子查詢就可以。
子查詢的內容是查詢status!='OK'(因為不知道是不是只有NG一種不OK的狀態所以用了「不等於」,具體的要根據業務情況來定)的BarCode。
外層就是利用子查詢查到的BarCode去查詢就可以了,可以直接用in或者exist都可以。
比如某個編號為1111的有三條數據,其中有一條的status不是ok,那麼子查詢就會找到這條不是ok的記錄,並返回編號1111,外層查詢在利用編號1111,查到全部的三條記錄。

⑷ 一文講懂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 子查詢

1、二樓提供的sql我查詢出來的結果如下。

mysql> select student.stuNo,stuName,stuAge,Score
-> from student,stuMark
-> where student.stuNo in (
-> select stuMark.stuNo
-> from stuMark);
+-------+---------+--------+-------+
| stuNo | stuName | stuAge | Score |
+-------+---------+--------+-------+
| 1 | 張三 | 19 | 99 |
| 1 | 張三 | 19 | 96 |
| 2 | 李四 | 20 | 99 |
| 2 | 李四 | 20 | 96 |
+-------+---------+--------+-------+

2、我提供兩個sql語句。供樓主參考。

mysql> select * from student,stumark where student.stuno=stumark.stuno;
+-------+---------+--------+-------+--------+-------+
| stuNo | stuName | stuAge | stuNo | course | Score |
+-------+---------+--------+-------+--------+-------+
| 1 | 張三 | 19 | 1 | java | 99 |
| 2 | 李四 | 20 | 2 | C# | 96 |
+-------+---------+--------+-------+--------+-------+

mysql> select *from student ta,stumark tb where ta.stuno in(select stuno from s
tumark) and ta.stuno=tb.stuno;
+-------+---------+--------+-------+--------+-------+
| stuNo | stuName | stuAge | stuNo | course | Score |
+-------+---------+--------+-------+--------+-------+
| 1 | 張三 | 19 | 1 | java | 99 |
| 2 | 李四 | 20 | 2 | C# | 96 |
+-------+---------+--------+-------+--------+-------+
2 rows in set (0.00 sec)

就是上面的那兩個。我不明白樓主為什麼一定要子查詢。這個完全沒有必要要。我感覺我第一種方法還行。

下面我再附上這兩個表在mysql下創建的語句。供大家參考:

student表

# MySQL-Front 3.2 (Build 6.2)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET CHARACTER SET 'latin1' */;

# Host: localhost Database: test
# ------------------------------------------------------
# Server version 5.0.18-nt

DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `test`;

#
# Table structure for table student
#

CREATE TABLE `student` (
`stuNo` int(11) NOT NULL auto_increment,
`stuName` varchar(11) default NULL,
`stuAge` int(11) default NULL,
PRIMARY KEY (`stuNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#
# Dumping data for table student
#

INSERT INTO `student` (`stuNo`,`stuName`,`stuAge`) VALUES (1,'張三',19);
INSERT INTO `student` (`stuNo`,`stuName`,`stuAge`) VALUES (2,'李四',20);
INSERT INTO `student` (`stuNo`,`stuName`,`stuAge`) VALUES (3,'王武',23);
INSERT INTO `student` (`stuNo`,`stuName`,`stuAge`) VALUES (4,'趙六',33);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

stumark表:

# MySQL-Front 3.2 (Build 6.2)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET CHARACTER SET 'latin1' */;

# Host: localhost Database: test
# ------------------------------------------------------
# Server version 5.0.18-nt

DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `test`;

#
# Table structure for table stumark
#

CREATE TABLE `stumark` (
`stuNo` int(11) NOT NULL default '0',
`course` varchar(11) default NULL,
`Score` int(11) default NULL,
PRIMARY KEY (`stuNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#
# Dumping data for table stumark
#

INSERT INTO `stumark` (`stuNo`,`course`,`Score`) VALUES (1,'java',99);
INSERT INTO `stumark` (`stuNo`,`course`,`Score`) VALUES (2,'C#',96);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

希望我的回答能對你有幫助

⑹ SQL子查詢代碼如何寫

select from 用戶信息表 where 用戶名 in(
select 用戶名 from 訂單表 group by 用戶名 having sum( 訂單額 ) <1000 )

and 性別=『男『

⑺ sql子查詢如何使用主查詢里的欄位作為篩選條件

sql子查詢使用主查詢里的欄位作為篩選條件的方法:
使用SELECT子句、GROUP BY子句、HAVING子句、ORDER BY子句中均可使用子查詢語句,較常用的是WHERE子句、HAVING子句和FROM子句。
子查詢是在一個完整的查詢語句中,嵌套不同功能的小查詢,從而完成復雜查詢的一種編寫形式。本部分主要介紹非關聯子查詢,關聯子查詢的適用場景,語句寫法,執行邏輯及相對應的注意事項。

⑻ SQL裡面的嵌套查詢語句怎麼寫

就是在SELECT-FROM-WHERE查詢塊中插入另一個查詢塊就行了

舉個例子:

SELECT S#,SNAME FROM S WHERE S# IN
SELECT S# FROM SC WHERE C# IN
SELECT C# FROM C WHERE CNAME='Y';

注意比單個SELECT語句多了「IN」

⑼ sql 子查詢如何寫

select id from 表A
full join
(select id,count(id) from 表B group by id)
on A.id=B.id