05.查詢表

查詢表

  • 字段顯示可以使用別名:

    • col1 AS alias1, col2 AS alias2, …
  • WHERE子句:指明過濾條件以實現“選擇"的功能:

    • 過濾條件:
      • 布爾型表達式
      • 算術操作符:+,-,*,/,%
      • 比較操作符:=,<=>(相等或都為空),<>,!=(非標準SQL),>,>=,<,<=
      • 范圍查詢: BETWEEN min_num AND max_num
      • 不連續的査詢:IN(element1,element2,…)
      • 空查詢: IS NULL, IS NOT NULL
      • IN 判斷某字段是否在一組值中, NOT IN 判斷某字段不在一組值中,IN() 可以接受常量列表或子查詢
      • DISTINCT 去除重復行
      • 模糊査詢: LIKE 使用 % 表示任意長度的任意字符,_ 表示任意單個字符
      • RLIKE:正則表達式,索引失效,不建議使用
      • REGEXP:匹配字符串可用正則表達式書寫模式,同上
    • 邏輯操作符:NOT,AND,OR,XOR
  • GROUP BY:根據指定的條件把查詢結果進行"分組"以用于做"聚合"運算

    • 常見聚合函數: count(), sum(), max(),min(), avg(),注意:聚合函數不對null統計
    • HAVING: 對分組聚合運算后的結果指定過濾條件
    • 一旦分組 group by,select語句后只跟分組的字段,聚合函數
  • ORDER BY: 根據指定的字段對查詢結果進行排序

    • 升序:ASC
    • 降序:DESC
  • LIMIT [[offset,]row_count]:對查詢的結果進行輸出行數數量限制,跳過offset,顯示row_count行,offset默為值為0

  • 對查詢結果中的數據請求施加“鎖”

    • FOR UPDATE:寫鎖,獨占或排它鎖,只有一個讀和寫操作
    • LOCK IN SHARE MODE:讀鎖,共享鎖,同時多個讀操作

1. 單表查詢

1.1 簡單查詢

mysql> select * from students where id < 5;
mysql> select * from students where gender = 'm';注意:第一條記錄的索引是 0
mysql> select * from students order by name desc limit 5;
mysql> select * from students order by name desc limit 0,5;# 判斷是否為NULL
mysql> select * from students where classid is null;
mysql> select * from students where classid <=> null;
mysql> select * from students where classid is not null;mysql> select * from students where stuid >= 2 and stuid <= 8;
mysql> select * from students where stuid between 2 and 8;mysql> select * from students where name like 's%';
mysql> select * from students where name rlike '.*[s].*';mysql> select * from students where classid in (1,2,3);
mysql> select * from students where classid not in (1,2,3);# 字段別名
mysql> select stuid 學員ID,name 姓名,gender 性別 from students;# ifnu11函數判斷指定的字段是否為空值,如果空值則使用指定默認值
mysql> select stuid 學號, name 姓名, ifnull(classid,'無班級') 班級 from students where classid is null;
+--------+-------------+-----------+
| 學號   | 姓名        | 班級      |
+--------+-------------+-----------+
|     24 | Xu Xian     | 無班級    |
|     25 | Sun Dasheng | 無班級    |
+--------+-------------+-----------+# 記錄去重
mysql> select distinct classid from students;
mysql> select distinct age,gender,classid from students;# 分頁查詢
mysql> select * from students limit 0,3;
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |
+-------+-------------+-----+--------+---------+-----------+
3 rows in set (0.01 sec)mysql> select * from students limit 3,3;
+-------+-----------+-----+--------+---------+-----------+
| StuID | Name      | Age | Gender | ClassID | TeacherID |
+-------+-----------+-----+--------+---------+-----------+
|     4 | Ding Dian |  32 | M      |       4 |         4 |
|     5 | Yu Yutong |  26 | M      |       3 |         1 |
|     6 | Shi Qing  |  46 | M      |       5 |      NULL |
+-------+-----------+-----+--------+---------+-----------+
3 rows in set (0.00 sec)# 查詢第n頁的數據,每頁顯示m條記錄
mysql>select * from students limit (n-1)*m,m;# 聚合函數
mysql> select count(*) from students where gender = 'm';
+----------+
| count(*) |
+----------+
|       15 |
+----------+
1 row in set (0.01 sec)mysql> select sum(age) from students where gender = 'm';
+----------+
| sum(age) |
+----------+
|      495 |
+----------+
1 row in set (0.00 sec)mysql> select sum(age)/count(*) from students where gender = 'm';
+-------------------+
| sum(age)/count(*) |
+-------------------+
|           33.0000 |
+-------------------+
1 row in set (0.00 sec)# 分組統計
注意:一旦使用分組group by,在select 后面的只能采用分組的列和聚合函數,其它的列不能放在select后面,否則根據系統變量SQL-MODE的值不同而不同的結果mysql> select classid,count(*) from students group by classid;
mysql> select gender,classid,count(*) from students group by gender,classid;mysql> select gender,classid,count(*) from students group by gender,classid having count(*) > 2;
mysql> select gender,classid,count(*) from students group by gender,classid having classid > 2;# group_concat函數實現分組信息的集合
mysql> select classid,group_concat(name) from students group by classid;# with rollup 分組后聚合函數統計后再做匯總
mysql> select ifnull(gender,'總計')性別,count(*) from students group by gender with rollup;# 排序
mysql> select * from students order by stuid desc limit 3;
mysql> select * from students order by stuid desc limit 3,3;
mysql> select * from students where classid is not null order by gender desc,age asc;# 正序排序時將NULL記錄排在最后
mysql> select classid from students order by -classid desc;# 分組后排序
mysql> select classid, count(*) from students group by classid order by classid desc;
mysql> select gender,classid,avg(age) from students where classid is not null group by gender,classid order by gender desc,classid desc;注意:分組和排序的次序 順序:group by,having,order by
mysql> select classid,count(*) from students group by classid having classid is not null order by classid asc;

2. 多表查詢

多表查詢,即查詢結果來自于多張表

  • 子查詢:在SQL語句嵌套著查詢語句,性能較差,基于某語句的查詢結果再次進行的查詢
  • 聯合查詢:UNION
  • 交叉連接:笛卡爾乘積 CROSS JOIN
  • 內連接:
    • 等值連接:讓表之間的字段以"等值”建立連接關系
    • 不等值連接
    • 自然連接:去掉重復列的等值連接,語法: FROM table1 NATURAL JOIN table2;
  • 外連接:
    • 左外連接:FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
    • 右外連接:FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
    • 完全外連接: FROM tb1 FULL OUTER JOIN tb2 ON tb1.col=tb2.col 注意:MySQL不支持此SQL語法
  • 自連接:本表和本表進行連接查詢
  • 注意:ON 定義兩個表之間的連接條件, JOIN 把兩個表按照某種方式合并

2.1 子查詢

子查詢 subquery 即SQL語句調用另一個SELECT子句,可以是對同一張表,也可以是對不同表,

主要有以下四種常見的用法:

  1. 用于比較表達式中的子查詢;子查詢僅能返回單個值
mysql> select avg(age) from students;
mysql> select name,age from students where age > (select avg(age) from students);
  1. 用于IN中的子查詢:子查詢應該單獨查詢并返回一個或多個值重新構成列表
mysql> select name,age from students where age in (select age from teachers);
  1. 用于EXISTS 和 Not EXISTS

EXISTS(包括 NOT EXISTS)子句返回一個布爾值(TRUEFALSE)。它內部包含一個子查詢(稱為內查詢),用于判斷該子查詢是否返回了任何行。

對于外查詢中的每一行數據,系統都會將該行的值帶入到內查詢中進行驗證。如果內查詢返回了至少一行結果,則 EXISTS 返回 TRUE,該行數據就會被包含在外查詢的結果集中;否則返回 FALSE,該行不會出現在最終結果中。

NOT EXISTS 的工作方式類似,只不過是在內查詢結果為空時才返回 TRUE

mysql> select * from students s where exists (select * from teachers t where s.teacherid=t.tid);# 說明:
1、EXISTS(或 NOT EXISTS))用在 where之后,且后面緊跟子查詢語句(帶括號)
2、EXISTS(或 NOTEXISTS)只關心子查詢有沒有結果,并不關心子查詢的結果具體是什么
3、上述語句把students的記錄逐條代入到Exists后面的子查詢中,如果子查詢結果集不為空,即說明存在,那么這條students的記錄出現在最終結果集,否則被排除。
  1. 用于FROM子句中的子查詢
mysql> select classid,avg(age) age from students where classid is not null group by classid;# 主查詢 + 子查詢
mysql> select s.classid,s.age from (select classid,avg(age) age from students where classid is not null group by classid) s where s.age > 30;

子查詢優化

子查詢可以一次性完成很多邏輯上需要多個步驟才能完成的SQL操作。子查詢雖然可以使査詢語句很靈活,但執行效率不高。執行子查詢時,需要為內層查詢語句的查詢結果建立一個臨時表。然后外層查詢語句從臨時表中查詢記錄。查詢完畢后,再撤銷這些臨時表。因此,子查詢的速度會受到一定的影響。如果查詢的數據量比較大,這種影響就會隨之增大。

可以使用連接(J0IN)查詢來替代子査詢。連接査詢不需要建立臨時表,其速度比子查詢要快,如果查詢中使用到索引的話,性能會更好。

2.2 聯合查詢

聯合査詢 Union 實現的條件,多個表的字段數量相同,字段名和數據類型可以不同,但一般數據類型是相同的

mysql> select tid id,name,age,gender from teachers union select stuid id,name,age,gender from students;# 合并數據并去重 UNION, 合并數據且無需去重 UNION ALL
mysql> select * from teachers union select * from teachers;
mysql> select * from teachers union all select * from teachers;

2.3 交叉連接

cross join 即多表的記錄之間做笛卡爾乘積組合,并且多個表的列橫向合并相加,"雨露均沾

比如: 第一個表3行4列,第二個表5行6列,cross join后的結果為3*5=15行,4+6=10列

交叉連接生成的記錄可能會非常多,建議慎用

# 完全等價,都表示笛卡爾積
mysql> select * from teachers cross join students;
mysql> select * from teachers,students;

2.4 內連接

inner join 內連接取多個表的交集

mysql> select * from students s inner join teachers t on s.teacherid=t.tid;# 內連接后再過濾
mysql> select * from students s inner join teachers t on s.teacherid=t.tid where s.age > 30;# 自然連接
1. 當源表和目標表共享相同名稱的列時,就可以在它們之間執行自然連接,而無需指定連接列。
2. 在使用純自然連接時,如沒有相同的列時,會產生交叉連接(笛卡爾乘積)語法:SELECT table1.column, table2.column FROM table1 NATURAL JOIN table2;

2.5 左和右外連接

左連接: 以左表為主根據條件查詢右表數據,如果根據條件查詢右表數據不存在使用nul值填充

右連接:以右表為主根據條件查詢左表數據,如果根據條件查詢左表數據不存在使用null值填充

mysql> select s.stuid,s.name,s.age,s.teacherid,t.tid,t.name,t.age from students s left join teachers t on s.teacherid=t.tid;mysql> select s.stuid,s.name,s.age,s.teacherid,t.tid,t.name,t.age from students s left outer join teachers t on s.teacherid=t.tid;# 先左外連接再過濾
mysql> select * from students s left join teachers t on s.teacherid=t.tid where s.teacherid is null;# 右外連接
mysql> select * from students s right join teachers t on s.teacherid=t.tid;
mysql> select * from students s right outer join teachers t on s.teacherid=t.tid;# 右外連接再過濾
mysql> select * from students s right outer join teachers t on s.teacherid=t.tid where t.tid is null;注意:右外連接其實就是把左外連接的表位置對換一下,結果是一樣的。

2.6 完全外連接

MySQL不支持完全外連接 full outer join語法

# 用這個方法替代 full outer join
mysql> select * from students left join teachers on students.teacherid=teachers.tid-> union-> select * from students right join teachers on students.teacherid=teachers.tid;

2.7 自連接

自連接, 即表自身連接自身

3. 補充說明

  • SQL語句查詢順序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
  • 查詢執行路徑中的組件:查詢緩存、解析器、預處理器、優化器、查詢執行引擎、存儲引擎

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

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

相關文章

Python學習——數組的行列互換

數組的行列互換 data [ [col for col in range (4)] for row in range (4)] for row in data: print (row) print(“--------------”) for r_index,row in enumerate(data): for c_index in range (r_index,len(row)): tmp data [c_index] [r_index] data[c_index] [r_index…

bugku 應急加固1

Linux的應急加固 一、JS劫持 獲取JS劫持域名 JS劫持&#xff0c;JavaScript Hijacking介紹&#xff1a; 攻擊者通過某種方式篡改網頁中的JavaScript代碼&#xff0c;從而使網頁跳轉到惡意域名。 常見攻擊方式有&#xff1a; 中間人攻擊&#xff0c;在網絡傳輸過程中攔截并修…

ant-design4.xx實現數字輸入框; 某些輸入法數字需要連續輸入兩次才顯示

目錄 一、問題 二、解決方法 三、總結 一、問題 1.代碼里有一個基于ant封裝的公共組件數字輸入框&#xff0c;測試突然說 無效了&#xff0c;輸入其他字符也會顯示&#xff1b;改了只有又發現某些 輸入法 需要連續輸入兩次 才能顯示出來。 二、解決方法 1.就離譜&#xff0…

鄭州工程技術學院赴埃文科技開展訪企拓崗促就業活動

6 月 3 日&#xff0c;鄭州工程技術學院信息工程學院&軟件學院黨總支書記尚德基、校企合作處處長吳博、軟件學院院長葉愷、信息工程學院院長馬耀鋒、副院長黃繼海、河南省人工智能產業創新發展聯盟執行秘書長孟松濤等領導一行到訪鄭州埃文科技有限公司。埃文科技總經理助理…

pandas 字符串存儲技術演進:從 object 到 PyArrow 的十年歷程

文章目錄 1. 引言2. 階段1&#xff1a;原始時代&#xff08;pandas 1.0前&#xff09;3. 階段2&#xff1a;Python-backed StringDtype&#xff08;pandas 1.0 - 1.3&#xff09;4. 階段3&#xff1a;PyArrow初次嘗試&#xff08;pandas 1.3 - 2.1&#xff09;5. 階段4&#xf…

[特殊字符] 在 React Native 項目中封裝 App Icon 一鍵設置命令(支持參數與默認路徑)

?? 前置依賴 使用的是社區維護的 CLI 工具: @bam.tech/react-native-make它擴展了 react-native 命令,支持 set-icon 功能。 安裝: yarn add -D "@bam.tech/react-native-make"?? 封裝目標 我們希望能夠通過以下方式調用: # 默認使用 ./icon.png yarn …

[論文閱讀] 人工智能 | 搜索增強LLMs的用戶偏好與性能分析

【論文解讀】Search Arena&#xff1a;搜索增強LLMs的用戶偏好與性能分析 論文信息 作者: Mihran Miroyan, Tsung-Han Wu, Logan King等 標題: Search Arena: Analyzing Search-Augmented LLMs 來源: arXiv preprint arXiv:2506.05334v1, 2025 一、研究背景&#xff1a;…

[2025CVPR]確定性圖像轉換新突破:雙逼近器布朗橋模型(Dual-approx Bridge)技術詳解

本文深入解析CVPR 2024頂會論文《Deterministic Image-to-Image Translation via Denoising Brownian Bridge Models with Dual Approximators》,揭示確定性圖像轉換的核心突破 一、問題背景:確定性圖像轉換的挑戰 在圖像轉換任務中(如超分辨率、醫學影像處理),?確定性…

Python Pytest

1.Pytest用例發現規則 1.1 模塊名(python文件)名必須以 test_ 開頭或 _test 結尾&#xff0c;如 test_case&#xff0c;case_test&#xff0c;下劃線都不能少 1.2 模塊不能放在 . 開頭的隱藏目錄或者叫 venv的目錄下&#xff0c;virtual environment&#xff0c;叫venv1都可以…

CSRF(跨站請求偽造)詳解

目錄 一、&#x1f4d6;什么是CSRF 二、&#x1f517;漏洞利用過程 三、&#x1f4d1;漏洞的前提條件 四、&#x1f50d;常見漏洞發生位置 五、?CSRF挖掘技巧 (一) 抓正常請求包進行初步判斷 (二) Referer 繞過驗證測試 (三) Token 缺失與二次驗證缺失識別 六、??漏…

深入解析 Qwen3-Embedding 的模型融合技術:球面線性插值(Slerp)的應用

在深度學習領域&#xff0c;模型融合技術是一種強大的工具&#xff0c;用于提升模型的魯棒性和泛化能力。通過結合多個模型的優勢&#xff0c;可以減少單一模型的過擬合風險&#xff0c;并在多種任務中實現更優的性能表現。在 Qwen3-Embedding 的訓練過程中&#xff0c;模型融合…

【在線五子棋對戰】二、websocket 服務器搭建

文章目錄 Ⅰ. WebSocket1、簡介2、特點3、原理解析4、報文格式 Ⅱ. WebSocketpp1、認識2、常用接口3、websocketpp庫搭建服務器搭建流程主體框架填充回調函數細節 4、編寫 makefile 文件5、websocket客戶端 Ⅰ. WebSocket 1、簡介 WebSocket 是從 HTML5 開始支持的一種網頁端…

針對異構數據的聯邦學習

在聯邦學習中&#xff0c;數據異構性是指不同客戶端之間的數據分布差異&#xff0c;包括數據的特征空間、標簽空間以及數據量等方面的差異。處理異構數據是聯邦學習中的一個重要挑戰&#xff0c;因為異構數據可能導致模型訓練過程中的性能不穩定、收斂速度較慢&#xff0c;甚至…

【判斷自整除數】2022-4-6

緣由是判斷自整除數的&#xff0c;這個我的結果是正確的&#xff0c;但是提交就有運行錯誤是怎么回事啊-編程語言-CSDN問答 void 自整除數字() {//所謂的自整除數字就是該數字可以整除其每一個位上的數字。 //對一個整數n,如果其各個位數的數字相加得到的數m能整除n,則稱n為自…

@Import原理與實戰

文章目錄 前言一、導入普通類二、導入ImportSelector實現類三、導入ImportBeanDefinitionRegistrar實現類四、Import注解的解析4.1、解析實現ImportSelector的候選bean4.2、解析實現ImportBeanDefinitionRegistrar的候選bean4.3、DeferredImportSelector的特殊處理 總結 前言 I…

day 18進行聚類,進而推斷出每個簇的實際含義

浙大疏錦行 對聚類的結果根據具體的特征進行解釋&#xff0c;進而推斷出每個簇的實際含義 兩種思路&#xff1a; 你最開始聚類的時候&#xff0c;就選擇了你想最后用來確定簇含義的特征&#xff0c; 最開始用全部特征來聚類&#xff0c;把其余特征作為 x&#xff0c;聚類得到…

Java并發編程實戰 Day 11:并發設計模式

【Java并發編程實戰 Day 11】并發設計模式 開篇 這是"Java并發編程實戰"系列的第11天&#xff0c;今天我們聚焦于并發設計模式。并發設計模式是解決多線程環境下常見問題的經典解決方案&#xff0c;它們不僅提供了優雅的設計思路&#xff0c;還能顯著提升系統的性能…

iview組件庫:當后臺返回到的數據與使用官網組件指定的字段不匹配時,進行修改某個屬性名再將response數據渲染到頁面上的處理

1、需求導入 當存在前端需要的數據的字段渲染到表格或者是一些公共的表格組件展示數據時的某個字段名與后臺返回的字段不一致時&#xff0c;那么需要前端進行稍加處理&#xff0c;而不能直接this.list res.data;這樣數據是渲染不出來的。 2、后臺返回的數據類型 Datalist(pn) …

Ubuntu下有關UDP網絡通信的指令

1、查看防火墻狀態&#xff1a; sudo ufw status # Ubuntu 2、 檢查系統全局廣播設置 # 查看是否忽略廣播包&#xff08;0表示接收&#xff0c;1表示忽略&#xff09; sysctl net.ipv4.icmp_echo_ignore_broadcasts# 查看是否允許廣播轉發&#xff08;1表示允許&#xff09…

vue3:十六、個人中心-修改密碼

一、頁面效果 頁面展示當前用戶名(只讀),展示需要輸入的當前密碼,輸入新的密碼以及確認密碼的提交表單 二、初始建立 1、建立密碼修改頁面 在個人中心文件夾中寫入新頁面UpdatepwdView.vue 2、新建路由 在路由頁面中寫入修改密碼頁面 3、新建菜單 在菜單布局菜單頁面中寫…