MySQL高階查詢語句與視圖實戰指南

MySQL高階查詢語句與視圖實戰指南

文章目錄

  • MySQL高階查詢語句與視圖實戰指南
    • 一、常用高階查詢技巧
      • 1. 按關鍵字排序(ORDER BY)
        • 基礎用法
        • 進階用法:多字段排序+條件過濾
      • 2. 區間判斷與去重(AND/OR + DISTINCT)
        • 區間判斷:AND/OR
        • 去重查詢:DISTINCT
      • 3. 結果分組(GROUP BY + 聚合函數)
        • 基礎分組
        • 進階分組:條件篩選+排序
      • 4. 限制結果條數(LIMIT)
        • 常用場景
      • 5. 簡化查詢:設置別名(AS)
        • 字段別名
        • 表別名
        • 特殊用法:用別名創建表
      • 6. 模糊查詢(通配符 + LIKE)
        • 常用案例
      • 7. 嵌套查詢(子查詢)
        • 基礎用法:IN關鍵字
        • 進階用法:子查詢在INSERT/UPDATE/DELETE中
        • 特殊用法:EXISTS關鍵字
      • 8. NULL值處理
        • 常用操作
    • 二、視圖:簡化查詢+數據安全
      • 1. 什么是視圖?
      • 2. 視圖的作用
      • 3. 視圖與表的區別和聯系
      • 4. 視圖實戰案例
        • 案例1:單表創建視圖
        • 案例2:多表創建視圖
        • 案例3:通過視圖修改原表
      • 5. 視圖的注意事項
    • 三、總結

在日常的數據庫操作中,基礎的增刪改查(CRUD)往往無法滿足復雜的業務需求。比如需要對查詢結果排序、篩選特定區間數據、簡化多表查詢,或者控制數據訪問權限等。今天這篇文章,就帶大家深入學習MySQL的高階查詢語句和視圖的應用,結合實際案例,讓你輕松應對復雜場景。

一、常用高階查詢技巧

首先,我們先搭建一個測試環境,創建一張info表并插入學生數據,后續案例都會基于這張表展開:

-- 創建info表
create table info (id int,name varchar(10) primary key not null,score decimal(5,2),address varchar(20),hobbid int(5)
);-- 插入測試數據
insert into info values
(1,'liuyi',80,'beijing',2),
(2,'wangwu',90,'shengzheng',2),
(3,'lisi',60,'shanghai',4),
(4,'tianqi',99,'hangzhou',5),
(5,'jiaoshou',98,'laowo',3),
(6,'hanmeimei',10,'nanjing',3),
(7,'lilei',11,'nanjing',5);

1. 按關鍵字排序(ORDER BY)

類比Windows任務管理器的排序功能,ORDER BY可以對查詢結果按單個或多個字段排序,默認升序(ASC),降序需顯式指定(DESC)。

基礎用法
  • 按分數升序排列(默認ASC,可省略):
select id,name,score from info order by score;
  • 按分數降序排列:
select id,name,score from info order by score desc;
進階用法:多字段排序+條件過濾

當第一個排序字段值相同時,會按第二個字段排序;還可結合WHERE篩選數據。比如篩選地址為“杭州”的學生,按分數降序排列:

select name,score from info where address='hangzhou' order by score desc;

再比如,先按興趣ID(hobbid)降序,相同興趣的學生按ID升序排列:

select id,name,hobbid from info order by hobbid desc, id;

2. 區間判斷與去重(AND/OR + DISTINCT)

區間判斷:AND/OR
  • 篩選分數大于70且小于等于90的學生:
select * from info where score >70 and score <=90;
  • 篩選分數大于70或小于等于90的學生(注意:邏輯或會包含大部分數據,需謹慎使用):
select * from info where score >70 or score <=90;
  • 多條件嵌套:篩選分數大于70,或分數在75-90之間的學生:
select * from info where score >70 or (score >75 and score <90);
去重查詢:DISTINCT

當某個字段存在重復值時,用DISTINCT只保留唯一值。比如查詢所有不重復的興趣ID:

select distinct hobbid from info;

3. 結果分組(GROUP BY + 聚合函數)

GROUP BY通常與聚合函數搭配使用,常用聚合函數有:

  • COUNT():計數
  • SUM():求和
  • AVG():求平均
  • MAX()/MIN():求最大/最小值
基礎分組

hobbid分組,統計每個興趣的學生人數:

select count(name) as student_count, hobbid from info group by hobbid;
進階分組:條件篩選+排序

篩選分數大于等于80的學生,按hobbid分組,再按學生人數升序排列:

select count(name) as student_count, hobbid from info where score>=80 group by hobbid order by student_count asc;

4. 限制結果條數(LIMIT)

LIMIT是高頻使用的語句,用于只返回部分結果,語法為:

SELECT 字段 FROM 表名 LIMIT [偏移量,] 條數;
  • 偏移量可選,默認從第0行開始(即第一條數據);
  • 條數:要返回的記錄數。
常用場景
  • 顯示前3條數據:
select * from info limit 3;
  • 從第4行開始(偏移量為3),顯示3條數據:
select * from info limit 3,3;
  • 按ID降序,顯示最后3條數據(常用于獲取最新數據):
select id,name from info order by id desc limit 3;

5. 簡化查詢:設置別名(AS)

當表名或字段名較長時,用AS設置別名(AS可省略),增強SQL可讀性。

字段別名

name改為“姓名”,score改為“成績”:

select name as 姓名, score as 成績 from info;
表別名

查詢時給表設置別名,簡化多表查詢(后續視圖會用到):

select i.name as 姓名, i.score as 成績 from info as i;
特殊用法:用別名創建表

info表的查詢結果作為新表t1的結構和數據(注意:原表的主鍵約束可能無法完全復制):

create table t1 as select * from info;

6. 模糊查詢(通配符 + LIKE)

通配符用于匹配部分字符,常與LIKE搭配,常用通配符:

  • %:匹配0個、1個或多個字符;
  • _:匹配單個字符。
常用案例
  • 查詢名字以“c”開頭的學生:
select id,name from info where name like 'c%';
  • 查詢名字中包含“g”的學生:
select id,name from info where name like '%g%';
  • 查詢名字格式為“c_ic_i”的學生(比如“caicai”):
select id,name from info where name like 'c_ic_i';

7. 嵌套查詢(子查詢)

子查詢(內查詢)是嵌套在主查詢中的SQL語句,先執行子查詢,結果作為主查詢的條件。

基礎用法:IN關鍵字

查詢分數大于80的學生姓名和成績(子查詢先獲取符合條件的ID,主查詢根據ID篩選數據):

select name,score from info where id in (select id from info where score>80);
進階用法:子查詢在INSERT/UPDATE/DELETE中
  • 插入數據:將info表中ID在ky11表中的記錄插入t1
insert into t1 select * from info where id in (select * from ky11);
  • 更新數據:將ky11表中ID=2對應的學生分數改為50:
update info set score=50 where id in (select * from ky11 where id=2);
  • 刪除數據:刪除分數大于80的學生:
delete from info where id in (select id from info where score>80);
特殊用法:EXISTS關鍵字

EXISTS判斷子查詢結果是否為空,不為空則返回TRUE,否則FALSE。比如判斷是否存在分數等于80的學生,若存在則統計info表總記錄數:

select count(*) from info where exists(select id from info where score=80);

8. NULL值處理

NULL表示“缺失值”,與0、空字符串('')不同:

  • 空字符串長度為0,不占空間;
  • NULL長度未知,占用空間;
  • COUNT()會忽略NULL,但包含空字符串。
常用操作
  • 查詢addr字段為NULL的記錄:
select * from info where addr is NULL;
  • 查詢addr字段不為NULL的記錄:
select * from info where addr is not null;

二、視圖:簡化查詢+數據安全

1. 什么是視圖?

視圖是數據庫中的虛擬表,不存儲真實數據,只保存對真實表的查詢邏輯(類似“鏡子”,動態映射真實數據)。

2. 視圖的作用

  • 簡化查詢:將復雜的多表查詢封裝為視圖,后續直接查詢視圖即可;
  • 數據安全:給不同用戶提供不同視圖,隱藏敏感字段(比如不給普通用戶看學生的身份證號);
  • 靈活適配:同一批真實數據,可根據需求生成多個視圖。

3. 視圖與表的區別和聯系

維度視圖(View)表(Table)
數據存儲不存儲真實數據,只存查詢邏輯存儲真實物理數據
編譯狀態已編譯的SQL語句未編譯,動態執行
空間占用不占物理空間占用物理空間
安全性可隱藏表結構,權限更精細直接暴露表結構
修改影響修改視圖可能影響原表修改表直接影響數據

聯系:視圖基于表存在,一個視圖可對應一個或多個表;視圖的結構和數據來自表。

4. 視圖實戰案例

案例1:單表創建視圖

創建一個視圖,只顯示分數大于等于80的學生(后續原表數據更新,視圖會同步變化):

-- 創建視圖
create view v_score as select * from info where score>=80;-- 查詢視圖
select * from v_score;
案例2:多表創建視圖

先創建test01表存儲學生年齡:

create table test01 (id int,name varchar(10),age char(10));
insert into test01 values(1,'zhangsan',20),(2,'lisi',30),(3,'wangwu',29);

創建視圖,關聯infotest01,顯示學生ID、姓名、分數和年齡:

create view v_info(id,name,score,age) as 
select info.id,info.name,info.score,test01.age 
from info,test01 
where info.name=test01.name;-- 查詢視圖
select * from v_info;
案例3:通過視圖修改原表

視圖不僅能查,還能修改原表數據(前提是視圖字段對應原表字段,無函數計算)。比如修改v_score視圖中“tianqi”的分數為120:

update v_score set score='120' where name='tianqi';-- 驗證原表數據
select * from info where name='tianqi';

5. 視圖的注意事項

  • 不建議用視圖做增刪改:復雜視圖(如多表關聯、含聚合函數)無法增刪改,容易報錯;
  • 視圖不保存數據:查詢視圖時,本質是執行底層SQL,性能取決于原表索引;
  • 刪除視圖不影響原表:drop view v_score;只會刪除視圖,不會刪除原表數據。

三、總結

本文介紹的MySQL高階功能,覆蓋了日常開發中90%以上的復雜查詢場景:

  1. 排序與篩選ORDER BY + WHERE實現精準排序;
  2. 分組統計GROUP BY + 聚合函數搞定數據匯總;
  3. 簡化操作LIMIT限制結果、AS設置別名、DISTINCT去重;
  4. 復雜查詢:子查詢解決嵌套邏輯,視圖封裝多表關聯;
  5. 細節處理NULL值判斷、通配符模糊查詢。

這些技巧需要結合實際業務多練,比如用視圖封裝報表查詢、用子查詢篩選復雜條件,慢慢就能熟練掌握。如果有疑問,歡迎在評論區交流!

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

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

相關文章

解決Pytest參數化測試中文顯示亂碼問題:兩種高效方法

在使用Pytest進行參數化測試時&#xff0c;許多開發者都會遇到一個常見但令人頭疼的問題&#xff1a;當測試用例的ids參數包含中文字符時&#xff0c;控制臺輸出會出現亂碼。這不僅影響了測試報告的可讀性&#xff0c;也給測試結果的分析帶來了困難。本文將深入探討這個問題&am…

基于SpringBoot的校園流浪動物救助平臺【spring boot實戰項目、Java畢設、Java項目、Java實戰】

&#x1f496;&#x1f496;作者&#xff1a;計算機畢業設計小途 &#x1f499;&#x1f499;個人簡介&#xff1a;曾長期從事計算機專業培訓教學&#xff0c;本人也熱愛上課教學&#xff0c;語言擅長Java、微信小程序、Python、Golang、安卓Android等&#xff0c;開發項目包括…

利用kimi k2編寫postgresql協議服務端的嘗試

美團龍貓還是很有自知之明的 提問請用C編寫postgresql協議服務端&#xff0c;能接收psql客戶端或其他采用postgresql協議的工具的請求&#xff0c;實現將用戶請求打印在控制臺&#xff0c;并把回應發給客戶端回答 抱歉&#xff0c;我無法為您編寫完整的 PostgreSQL 協議服務端。…

醫療 AI 再突破:輔助診斷準確率超 90%,但落地醫院仍面臨數據安全與臨床信任難題

一、引言&#xff08;一&#xff09;醫療 AI 發展背景在數字化與智能化浪潮的席卷下&#xff0c;醫療領域正經歷著深刻變革&#xff0c;人工智能&#xff08;AI&#xff09;技術的融入成為這場變革的關鍵驅動力。近年來&#xff0c;醫療 AI 輔助診斷技術取得重大突破&#xff0…

Rocky Linux10.0安裝zabbix7.4詳細步驟

安裝Rocky Linux10.0系統 請參考Rocky Linux10.0安裝教程-CSDN博客 查看當前系統版本 cat /etc/*release 安裝數據庫 安裝zabbix之前&#xff0c;需要先安裝一個數據庫來承載zabbix的數據。這里我選擇在本機直接安裝一個MariaDB數據庫。 Rocky Linux10.0系統默認不包含MySQ…

JDBC插入數據

文章目錄視頻&#xff1a;JDBC插入數據環境準備寫插入數據屬性配置屬性配置視頻&#xff1a;JDBC插入數據 環境準備 MySQL環境 小皮面板 提供MySQL環境 寫插入數據 屬性配置 聲明變量 屬性配置 # . properties 是一個特俗的map 集合 # key : 字符串 value : 字符串…

GPU 服務器壓力測試核心工具全解析:gpu-burn、cpu-burn 與 CUDA Samples

在 GPU 服務器的性能驗證、穩定性排查與運維管理中,壓力測試是關鍵環節,可有效檢測硬件極限性能、散熱效率及潛在故障。以下從工具原理、核心功能、使用場景等維度,詳細介紹三款核心測試工具,幫助用戶系統掌握 GPU 服務器壓力測試方法。 一、GPU 專屬壓力測試工具:gpu-bu…

Python進程和線程——多線程

前面提到過進程是由很多線程組成的&#xff0c;那么今天廖老師就詳細解釋了線程是如何運行的。首先&#xff0c;&#xff0c;Python的標準庫提供了兩個模塊&#xff1a;_thread和threading&#xff0c;_thread是低級模塊&#xff0c;threading是高級模塊&#xff0c;對_thread進…

【MySQL|第九篇】視圖、函數與優化

目錄 十、視圖 1、簡單視圖&#xff1a; 2、復雜視圖&#xff1a; 3、視圖更新&#xff1a; 十一、函數 1、函數創建&#xff1a; 十二、數據庫優化 1、索引優化&#xff1a; 2、查詢優化&#xff1a; 3、設計優化&#xff1a; 十、視圖 在 MySQL 中&#xff0c;視圖…

使用Docker和虛擬IP在一臺服務器上靈活部署多個Neo4j實例

使用Docker和虛擬IP在一臺服務器上靈活部署多個Neo4j實例 前言 在現代應用開發中&#xff0c;圖數據庫Neo4j因其強大的關系處理能力而備受青睞。但有時候我們需要在同一臺服務器上運行多個Neo4j實例&#xff0c;比如用于開發測試、多租戶環境或者A/B測試。傳統的端口映射方式…

K8s學習筆記(一):Kubernetes架構-原理-組件

Kubernetes&#xff08;簡稱 K8s&#xff09;是一款開源的容器編排平臺&#xff0c;核心目標是實現容器化應用的自動化部署、擴展、故障恢復和運維管理。其設計遵循 “主從架構”&#xff08;Control Plane Node&#xff09;&#xff0c;組件分工明確&#xff0c;通過 “聲明式…

ensp配置學習筆記 比賽版 vlan 靜態路由 ospf bgp dhcp

學習配置VLAN 虛擬局域網&#xff0c;目的讓兩臺在同一網段的設備&#xff0c;在交換機中訪問。基礎指令&#xff1a;sys 進入系統 sysname R1 修改交換機名字為R1 display cur 查看數據、端口等交換機信息 &#xff08;在端口中&#xff0c;可以直接display this 可以直接看…

倉頡編程語言青少年基礎教程:enum(枚舉)類型和Option類型

倉頡編程語言青少年基礎教程&#xff1a;enum&#xff08;枚舉&#xff09;類型和Option類型enum 和 Option 各自解決一類“語義級”問題&#xff1a;enum 讓“取值只在有限集合內”的約束從注釋變成編譯器強制&#xff1b;Option 讓“值可能不存在”的語義顯式化。enum類型enu…

javaEE-Spring IOCDI

目錄 1、什么是Spring&#xff1a; 2.什么是IoC: 3. 什么是控制反轉呢? 4.IoC容器具備以下優點: 5.DI是什么&#xff1a; 依賴注?方法&#xff1a; 三種注入方法的優缺點&#xff1a; Autowired注解注入存在的問題&#xff1a; Autowired和Resource的區別&#xff…

TensorFlow Lite 全面解析:端側部署方案與PyTorch Mobile深度對比

1 TensorFlow Lite 基礎介紹 TensorFlow Lite (TFLite) 是 Google 為移動設備&#xff08;Android, iOS&#xff09;、微控制器&#xff08;Microcontrollers&#xff09;和其他嵌入式設備&#xff08;如 Raspberry Pi&#xff09;開發的輕量級深度學習推理框架。它的核心目標是…

mapbox進階,使用jsts實現平角緩沖區

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言 1.1 ??mapboxgl.Map 地圖對象 1.2 ??mapboxgl.Map style屬性 1.3 ??jsts myBufferOp 緩沖區生成對對象 …

linux裝好顯卡后如何檢查

背景&#xff1a;客戶通知裝好了顯卡&#xff0c;我們去機器上查看一下一. 使用到的命令 watch -n 1 nvidia-smi 可實時查看gpu的使用率nvidia-smi 之查看一次 二、查看內存和顯存 內存使用命令 free -h,顯存使用 nvidia-smi 這只是查看的navidia, 其他品牌的會不一樣

人工智能深度學習——卷積神經網絡(CNN)

一、圖像卷積運算 對圖像矩陣與濾波器矩陣進行對應相乘再求和運算&#xff0c;轉化得到新的矩陣。 作用&#xff1a;快速定位圖像中某些邊緣特征 英文&#xff1a;convolution&#xff08;CNN&#xff09;池化層實現維度縮減 池化&#xff1a;按照一個固定規則對圖像矩陣進行處…

SaaS 建站從 0 到 1 教程:Vue 動態域名 + 后端子域名管理 + Nginx 配置

SaaS 建站從 0 到 1 教程&#xff1a;Vue 動態域名 后端子域名管理 Nginx 配置 一、什么是 SaaS 建站&#xff1f; SaaS&#xff08;Software as a Service&#xff09;建站&#xff0c;就是通過一套統一的系統&#xff0c;支持用戶在線注冊、綁定域名、快速生成專屬網站。…

關于神經網絡中回歸的概念

神經網絡中的回歸詳解 引言 神經網絡&#xff08;NeuralNetworks&#xff09;是一種強大的機器學習模型&#xff0c;可用于分類和回歸任務。本文聚焦于神經網絡中的回歸&#xff08;Regression&#xff09;&#xff0c;即預測連續輸出值&#xff08;如房價、溫度&#xff09;。…