數據如何查詢

分組查詢

分組查詢(Group By)是在關系型數據庫中用來對數據進行分組并對每個組應用聚合函數的一種操作。這種查詢通常結合聚合函數(如 COUNT、SUM、AVG、MAX、MIN 等)使用,用于在查詢結果中生成匯總信息

特點(聚合):輸入多行,最終輸出一行,且分組函數(COUNT、SUM、AVG、MAX、MIN)需要分組了才能使用,如果不進行分組則將會聚合整張表的數據

語法

SELECT 字段1, 分組/聚合函數(字段2)
FROM 表名
WHERE 條件
GROUP BY 字段1;

分組查詢的工作原理如下:

  • 數據庫首先按照 GROUP BY 子句中指定的列對數據進行分組。
  • 然后,對每個分組應用 SELECT 中指定的聚合函數,計算每個分組的匯總值。
  • 最后,返回每個分組的匯總結果作為查詢結果集。
注意事項
  • 必須包含在 SELECT 子句中的列:在使用 GROUP BY 子句時,SELECT 子句中的列要么是分組列,要么是聚合函數。非聚合函數列必須包含在 GROUP BY 子句中,否則將導致語法錯誤。
  • NULL 值處理:分組查詢中,數據庫會將 NULL 值視為一個分組。
  • 性能考慮:當數據量較大時,分組查詢可能會影響性能,尤其是在沒有正確索引支持的情況下。

聚合/分組函數

COUNT

計算某一列中的行數,或者符合特定條件的行數。

假設有一個 students 表,包含學生的信息,可以使用 COUNT() 函數來統計學生的總數或者符合某些條件的學生數。

-- 統計學生總數
SELECT COUNT(*) AS total_students
FROM students;-- 統計年齡大于等于 18 歲的學生數
SELECT COUNT(*) AS adults
FROM students
WHERE age >= 18;
SUM

計算數值列的總和。

示例: 假設有一個 orders 表,包含訂單信息,可以使用 SUM() 函數來計算訂單總金額。

-- 計算所有訂單的總金額
SELECT SUM(order_amount) AS total_amount
FROM orders;-- 計算特定客戶的訂單總金額
SELECT customer_id, SUM(order_amount) AS total_spent
FROM orders
WHERE customer_id = 123
GROUP BY customer_id;
AVG

計算數值列的平均值。

示例: 繼續使用 orders 表的例子,可以使用 AVG() 函數來計算平均訂單金額。

sql-- 計算所有訂單的平均金額
SELECT AVG(order_amount) AS average_amount
FROM orders;-- 計算特定客戶的平均訂單金額
SELECT customer_id, AVG(order_amount) AS average_spent
FROM orders
WHERE customer_id = 123
GROUP BY customer_id;
MAX

找出數值列的最大值。

示例: 使用 MAX() 函數來查找訂單表order中的最高訂單金額。

sql-- 找出訂單表中的最高訂單金額
SELECT MAX(order_amount) AS max_amount
FROM orders;-- 找出每個客戶的最高訂單金額
SELECT customer_id, MAX(order_amount) AS max_spent
FROM orders
GROUP BY customer_id;
MIN

找出數值列的最小值。

示例: 使用 MIN() 函數來查找訂單表order中的最低訂單金額。

-- 找出訂單表中的最低訂單金額
SELECT MIN(order_amount) AS min_amount
FROM orders;-- 找出每個客戶的最低訂單金額
SELECT customer_id, MIN(order_amount) AS min_spent
FROM orders
GROUP BY customer_id;

連接查詢

從一張表中單獨查詢,稱為單表查詢。假設有a表和b表聯合起來查詢數據,從表a中取a1字段,從b表中取b1字段。這種跨表查詢,多張表聯合起來查詢數據,被稱為連接查詢。

連接查詢的應用場景
  • 關聯查詢:用于在多個表中檢索相關聯的數據,比如客戶和訂單、產品和訂單等。
  • 數據整合:將多個表中的數據整合為一個結果集,便于分析和報告。
  • 復雜條件過濾:通過連接不同表,并結合條件過濾,可以實現復雜的數據查詢和分析需求。
  • 數據分析和報表:連接查詢可以幫助生成更具體和詳細的報表,涵蓋多個業務方面的數據。
表連接的方式分類

內連接:

  • 等值連接
  • 非等值連接
  • 自連接

外連接:

  • 左外連接(左連接)
  • 右外連接(右連接)
  • 全連接(FULL JOIN)
??注意避免笛卡爾積

當兩張表進行連接查詢的時候,沒有任何條件限制會發生笛卡爾積現象

例如A表有1000條數據,B表有200條數據,同時在鏈接查詢時并沒有去做表的連接限制,例如ON關鍵字(下面會講),或者Where關鍵字,那么查詢出的數據行數約:1000 * 200 = 200000條數據,且很大可能性沒有任何質量

語法

內連接查詢(AB兩個表沒有主次關系)
  • 等值連接
SELECT 字段
FROM1 INNER JOIN2 ON1.字段 =2.字段
WHERE 條件-- orders 表和 customers 表通過 customer_id 列進行內連接,返回訂單信息和對應客戶的名稱。
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
  • 非等值連接
SELECT 字段
FROM1 INNER JOIN2 ON1.字段 between2.字段1 and2.字段2
WHERE 條件-- 找出員工的薪資等級
SELECT	e.name,e.sal,s.grade
FROM emp e INNER JOIN salgrade s 
ON e.sal BETWEEN s.losal AND s.hisal
  • 自連接
    • 自連接就是同一張表進行連接查詢
SELECT 字段
FROM1 INNER JOIN1 ON1.字段1 =1.字段2
WHERE 條件
-- 查詢員工的上級領導
SELECT a.ename AS '員工名',b.ename AS '領導名'
FROM 
emp a INNER JOIN emp b
a.mgr = b.empno
外連接(AB兩個表有主次關系)
  • 左連接(Left Join)
    • 左連接返回左邊表(即左表)中的所有行,以及右表中滿足連接條件的行。如果右表中沒有匹配的行,則返回 NULL 值。
-- 語法
SELECT 列名 FROM1 LEFT JOIN2 ON1.=2.-- 返回所有客戶的名稱,以及他們的訂單信息(如果有的話),如果客戶沒有訂單,則訂單信息列顯示為 NULL
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
  • 右連接(Right Join)
    • 右連接與左連接類似,不同之處在于它返回右表中的所有行,以及左表中滿足連接條件的行。如果左表中沒有匹配的行,則返回 NULL 值。
-- 語法
SELECT 列名 FROM1 RIGHT JOIN2 ON1.=2.-- 返回所有訂單的信息,以及對應的客戶名稱,如果訂單沒有對應的客戶信息,則客戶名稱列顯示為 NULL。
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
  • 全連接(Full Join):
    • 全連接返回左表和右表中所有的行,無論是否滿足連接條件。
-- 語法
SELECT 列名 FROM1 FULL JOIN2 ON1.=2.-- 返回所有客戶和訂單的組合,無論是否有匹配的條件。
-- 如果某個客戶沒有訂單或某個訂單沒有客戶,則對應的列會顯示 NULL。
SELECT customers.customer_name, orders.order_id
FROM customers
FULL JOIN orders ON customers.customer_id = orders.customer_id;
??注意事項

性能影響:連接操作可能會影響查詢性能,特別是在大型數據集上或者未優化的情況下。
索引優化:在進行連接查詢之前,確保相關的連接字段上存在適當的索引,可以提高查詢效率。
結果集理解:理解不同類型連接查詢的行為和生成的結果集,以避免數據丟失或者意外的數據組合。

子查詢

查詢語句中嵌套的select語句被稱為子查詢

子查詢出現在如下部分:查詢的字段列表中、FROM的臨時表、WHERE的子條件,如下

SELECT 字段..,(子查詢)
FROM ..,(子查詢)
WHERE ..,(子查詢)

現在有一張表為員工薪資表emp

where中的子查詢
  • 利用where子查詢找出工資最低的員工信息
SELECT ename,sal 
FROM emp 
WHERE sal > (SELECT MIN(sal) FROM emp)
from中的子查詢

from后的子查詢,可以將子查詢的結果當做一張臨時表

  • 利用from子查詢找出每個崗位的平均工資的薪資等級
SELECT
t.*,s.grade
FROM 
(SELECT job,avg(sal) as avgsal FROM emp group by job) t
INNER JOIN 
salgrade s
ON t.avgsal BETWEEN s.losal AND s.hisal
select中的子查詢
  • 利用select的子查詢實現根據員工編號獲取員工的部門名稱
SELECT 
e.ename,e.deptno,(SELECT d.dname FROM dept d WHERE e.deptno = d.deptno) as dname
FROM emp e

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42113.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始做題:My_lllp

題目 給出一張png圖片 解題 ┌──(holyeyes?kali2023)-[~/Misc/題目/zulu/My_lllp] └─$ python2 lsb.py extract my_lllp.png out.txt my_lllp [] Image size: 1080x1079 pixels. [] Written extracted data to out.txt. ┌──(holyeyes?kali2023)-[~/Misc/題目/zul…

python的線程池和進程池

Python 3.2 就已經引入了 concurrent.futures 模塊,提供了線程池(ThreadPoolExecutor)和進程池(ProcessPoolExecutor),用于簡化并發編程的管理和調度。 ThreadPoolExecutor 在ThreadPoolExecutor 是 conc…

簡易Qt串口助手

界面顯示如下 關于串口類 初始化 設置串口號 設置波特率 打開串口 發送按鈕功能實現 接收數據顯示在控件中 關閉串口

使用 MFA 保護對企業應用程序的訪問

多因素身份驗證(MFA)是在授予用戶訪問特定資源的權限之前,使用多重身份驗證來驗證用戶身份的過程,僅使用單一因素(傳統上是用戶名和密碼)來保護資源,使它們容易受到破壞,添加其他身份…

springboot非物質文化遺產管理系統-計算機畢業設計源碼16087

目錄 摘要 1 緒論 1.1 選題背景與意義 1.2國內外研究現狀 1.3論文結構與章節安排 2系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1系統開發流程 2.2.2 用戶登錄流程 2.2.3 系統操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 刪除信息流程 2.3 系統功能…

前端開發過程中經常遇到的問題以及對應解決方法 (持續更新)

我的朋友已經工作了 3 年,他過去一直擔任前端工程師。 不幸的是,他被老板批評了,因為他在工作中犯了一個錯誤,這是一個非常簡單但容易忽視的問題,我想也是很多朋友容易忽視的一個問題。 今天我把它分享出來&#xff…

Linux三劍客(grep、awk和sed)操作及與管道結合使用

1. 總覽 grep、sed和awk被稱為Linux三劍客,是因為它們在文本處理和數據操作方面極其強大且常用。 Linux三劍客在文件處理中的作用: grep(數據查找定位):文本搜索工具,在文件中搜索符合正則表達式的文本內容…

Redis原理-數據結構

Redis原理篇 1、原理篇-Redis數據結構 1.1 Redis數據結構-動態字符串 我們都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可見字符串是Redis中最常用的一種數據結構。 不過Redis沒有直接使用C語言中的字符串,因為C語言字符串存…

【大模型LLM面試合集】大語言模型架構_attention

1.attention 1.Attention 1.1 講講對Attention的理解? Attention機制是一種在處理時序相關問題的時候常用的技術,主要用于處理序列數據。 核心思想是在處理序列數據時,網絡應該更關注輸入中的重要部分,而忽略不重要的部分&…

BJT的結構(晶體管電壓/電流+β+晶體管特性曲線/截止與飽和+直流負載線(Q點))+單片機數碼管基礎

2024-7-8,星期一,20:23,天氣:晴,心情:晴。今天沒有什么特殊的事情發生,周末休息了兩天,周一回來繼續學習啦,加油加油!!! 今日完成模電…

視頻號矩陣管理系統:短視頻內容營銷的智能助手

隨著短視頻行業的蓬勃發展,視頻號矩陣管理系統應運而生,為內容創作者和品牌提供了一站式的短視頻管理和營銷解決方案。本文將深入探討視頻號矩陣管理系統的核心功能,以及它如何助力用戶在短視頻營銷領域取得成功。 視頻號矩陣管理系統概述 …

在PyTorch中使用TensorBoard

文章目錄 在PyTorch中使用TensorBoard1.安裝2.TensorBoard使用2.1創建SummaryWriter實例2.2利用add_scalar()記錄metrics2.3關閉Writer2.4啟動TensorBoard 3.本地連接服務器使用TensorBoard3.1方法一:使用SSH命令進行本地端口轉發3.2方法二:啟動TensorBo…

Python 全棧體系【三階】(二)

第一章 Django 五、模板 1. 概述 Django中的模板是指可以動態生成任何基于文本格式文件的技術(如HTML、CSS等)。 Django中內置了自己的模板系統,稱為DTL(Django Template Language), Django模板語言。 2. 配置 settings.py中關于模板的…

如何將資源前端通過 Docker 部署到遠程服務器

作為一個程序員,在開發過程中,經常會遇到項目部署的問題,在現在本就不穩定的大環境下,前端開發也需要掌握部署技能,來提高自己的生存力,今天就詳細說一下如何把一個前端資源放到遠程服務器上面通過docker部…

紫外線芯片殺菌燈問題

1.265nm深紫外光子能量是多少 504kj/mol 2.紫外光分解有害物質的原理是什么? 通過紫外光分子鍵打斷有害物質的分子鍵,使其分解成co2和H2o等無害物質 3.紫外光殺菌的原理是什么? 通過特定波長的紫外光照射,破壞和改變微生物的…

【網絡協議】PIM

PIM 1 基本概念 PIM(Protocol Independent Multicast)協議,即協議無關組播協議,是一種組播路由協議,其特點是不依賴于某一特定的單播路由協議,而是可以利用任意單播路由協議建立的單播路由表完成RPF&…

【Python】不小心卸載pip后(手動安裝pip的兩種方式)

文章目錄 方法一:使用get-pip.py腳本方法二:使用easy_install注意事項 不小心卸載pip后:手動安裝pip的兩種方式 在使用Python進行開發時,pip作為Python的包管理工具,是我們安裝和管理Python庫的重要工具。然而&#x…

產品經理技能揭秘:如何巧妙啟發需求,引領市場新潮流

文章目錄 引言一、需求啟發的定義二、需求啟發的藝術三、需求啟發的重要性四、需求啟發的流程五、需求啟發的問題與挑戰內部自身的問題與挑戰:挑戰一:知識的詛咒挑戰二:做與定義的不同挑戰三:溝通障礙挑戰四:需求變更頻…

solidity:構造函數和修飾器、事件

構造函數? 構造函數(constructor)是一種特殊的函數,每個合約可以定義一個,并在部署合約的時候自動運行一次。它可以用來初始化合約的一些參數,例如初始化合約的owner地址: address owner; // 定義owner變…

電腦找回徹底刪除文件?四個實測效果的方法【一鍵找回】

電腦數據刪除了還能恢復嗎?可以的,只要我們及時撤銷上一步刪除操作,還是有幾率找回徹底刪除文件。 當我們的電腦文件被徹底刪除后,盡管恢復的成功率可能受到多種因素的影響,但仍有幾種方法可以嘗試找回這些文件。本文整…