面試常備與開發必知:一文掌握MySQL字符串拼接的所有核心技巧

?? ? ? ?在 MySQL 中拼接字符串是一個非常常見的操作,主要用于查詢時動態組合多個字段或值。以下是幾種最核心和常用的方法。

一、核心拼接函數

1. `CONCAT(str1, str2, ...)`

這是最通用、最常用的字符串拼接函數。它接受兩個或多個字符串參數,并將它們按順序連接成一個字符串。

如果參數中有 `NULL`,則 `CONCAT` 的結果為 `NULL`。這是最重要的一點。

示例:

```sql

SELECT CONCAT('Hello', ' ', 'World') AS greeting;

-- 結果: 'Hello World'

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;

-- 結果: 將 first_name 和 last_name 用空格連接起來

SELECT CONCAT('User ID: ', id, ', Name: ', name) AS user_info FROM users;

-- 結果: 'User ID: 1, Name: John Doe'

SELECT CONCAT('Hello', NULL, 'World');?

-- 結果: NULL (因為有一個參數是NULL)

```

2. `CONCAT_WS(separator, str1, str2, ...)`

`WS` 是 With Separator 的縮寫。這個函數用一個指定的分隔符將多個字符串連接起來。它最大的優點是會自動忽略 `NULL` 值,而不會導致整個結果變為 `NULL`。

`separator`:第一個參數是分隔符。

? 如果分隔符是 `NULL`,則結果為 `NULL`。

示例:

```sql

SELECT CONCAT_WS(' ', 'Hello', 'World') AS greeting;

-- 結果: 'Hello World' (效果和CONCAT一樣)

SELECT CONCAT_WS(', ', last_name, first_name) AS full_name FROM users;

-- 結果: 'Doe, John'

SELECT CONCAT_WS('-', '2023', NULL, '10') AS date_str;

-- 結果: '2023-10' (NULL值被忽略,分隔符仍然存在)

-- 如果用 CONCAT('2023', NULL, '10') 結果會是 NULL

SELECT CONCAT_WS(NULL, 'Hello', 'World');?

-- 結果: NULL (因為分隔符是NULL)

```

二、特殊情況處理

處理 NULL 值:使用 `IFNULL()` 或 `COALESCE()`

為了避免 `CONCAT` 因為 `NULL` 值而返回 `NULL`,可以先用函數將 `NULL` 轉換成一個空字符串 `''` 或其他默認值。

? `IFNULL(expr1, replacement_value)`:如果 `expr1` 不是 `NULL`,則返回 `expr1`;否則返回 `replacement_value`。

? `COALESCE(value1, value2, ...)`:返回參數列表中第一個非 `NULL` 的值。

示例:

假設 `middle_name` 字段可能為 `NULL`。

```sql

-- 如果middle_name為NULL,就用空字符串代替

SELECT CONCAT(

? ? ? ? ?first_name,?

? ? ? ? ?' ',?

? ? ? ? ?IFNULL(middle_name, ''),?

? ? ? ? ?' ',?

? ? ? ? ?last_name

? ? ? ?) AS full_name?

FROM users;

-- 使用 COALESCE 實現同樣效果

SELECT CONCAT(

? ? ? ? ?first_name,?

? ? ? ? ?' ',?

? ? ? ? ?COALESCE(middle_name, ''),?

? ? ? ? ?' ',?

? ? ? ? ?last_name

? ? ? ?) AS full_name?

FROM users;

```

?三、進階用法:`GROUP_CONCAT()`

這個函數用于將分組后多行記錄的某個字段值,拼接成一個字符串。通常與 `GROUP BY` 子句一起使用。

基本語法:

```sql

GROUP_CONCAT([DISTINCT] column_name [ORDER BY ...] [SEPARATOR 'sep'])

```

? `DISTINCT`: 去重。

? `ORDER BY`: 對要拼接的值進行排序。

? `SEPARATOR`: 指定分隔符,默認為逗號 `,`。

示例:

假設有一個 `orders` 表,一個用戶 (`user_id`) 可能有多個訂單 (`order_id`)。

```sql

-- 查詢每個用戶的所有訂單號,合并成一個用逗號分隔的字符串

SELECT?

? ? user_id,

? ? GROUP_CONCAT(order_id) AS all_orders?

FROM orders?

GROUP BY user_id;

-- 結果可能如下:

-- user_id | all_orders

-- 1? ? ? ?| 1001,1005,1009

-- 2? ? ? ?| 1002,1004

-- 去重并使用不同的分隔符

SELECT?

? ? user_id,

? ? GROUP_CONCAT(DISTINCT product_name ORDER BY product_name SEPARATOR ' | ') AS products?

FROM order_details?

GROUP BY user_id;

-- 結果: product_a | product_b | product_c

```

?總結與對比

| 函數 | 用途 | 對 NULL 的處理 |?適用場景?|

| : | : | : | : |

| `CONCAT()` | 連接多個字符串 | 遇到 `NULL` 則返回 `NULL` | 通用的字符串拼接,需注意處理NULL |

| `CONCAT_WS()` | 用分隔符連接字符串 | 自動忽略 `NULL` | 用統一分隔符拼接字段(如地址、全名),首選 |

| `GROUP_CONCAT()` | 將分組的多行值連接成一行 | 忽略該行(如果該字段為NULL) | 與 `GROUP BY` 一起使用,進行行轉列聚合查詢 |

最佳實踐建議:

? 日常拼接,特別是字段之間需要加分隔符(如空格、逗號)時,優先使用 `CONCAT_WS()`,因為它更安全、簡潔。

? 如果確定所有參數都不為 `NULL`,或者需要 `NULL` 導致整個結果為 `NULL` 的邏輯,可以使用 `CONCAT()`。

? 需要進行多行合并時,毫不猶豫地使用 `GROUP_CONCAT()`。

另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導出導入。可本地連接LINUX里的MYSQL,簡單便捷。可以大大地提高工作效率喔。

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

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

相關文章

數據可視化大屏精選開源項目

為您精心挑選和整理了一系列在 GitHub 上廣受好評的數據可視化大屏開源項目。這些項目覆蓋了不同的技術棧(Vue、React、ECharts、D3.js等),適合從初學者到資深開發者不同層次的需求。 我將它們分為以下幾類,方便您選擇&#xff1…

LeetCode 3516.找到最近的人:計算絕對值大小

【LetMeFly】3516.找到最近的人:計算絕對值大小 力扣題目鏈接:https://leetcode.cn/problems/find-closest-person/ 給你三個整數 x、y 和 z,表示數軸上三個人的位置: x 是第 1 個人的位置。y 是第 2 個人的位置。z 是第 3 個人…

【面試】MySQL 面試常見優化問題

1. 為什么要建索引?索引一定能提高性能嗎?場景:一個表有上千萬數據,查詢 SELECT * FROM user WHERE age25;。問題:沒有索引時會全表掃描,性能差。解決方案:給 age 建立普通索引,加快…

Access開發導出PDF的N種姿勢,你get了嗎?

目錄 基礎篇:一行代碼搞定 實戰篇:讓導出更智能 進階篇:用戶體驗升級 總結 hi,大家好呀! 今天我們來聊聊一個非常實用的功能——如何用VBA將Access中的數據導出為PDF。 相信很多朋友在日常工作中都遇到過這樣的需…

JavaAI炫技賽:電商系統商品管理模塊的創新設計與實踐探索

一、引言電商行業的競爭日益激烈,電商系統商品管理模塊的高效性、智能化程度成為企業提升競爭力的關鍵因素。Java 作為企業級開發的主流語言,憑借其穩定性和強大的生態系統,在電商系統開發中占據重要地位。而 AI 技術的融入,為商品…

關于如何在PostgreSQL中調整數據庫參數和配置的綜合指南

關于如何在PostgreSQL中調整數據庫參數和配置的綜合指南 PostgreSQL是一個非常通用的數據庫系統,能夠在低資源環境和與各種其他應用程序共享的環境中高效運行。為了確保它將在許多不同的環境中正常運行,默認配置非常保守,不太適合高性能生產數據庫。加上地理空間數據庫具有…

wps的excel如何轉為谷歌在線表格

1.?打開 Google Sheets(sheets.google.com)。 2.?新建一個空白表格。3.?點擊菜單 文件 → 導入 (File → Import)。4.?選擇在 WPS 保存好的 .xlsx 文件上傳。5.?選擇 “新建表格” 或 “替換當前表格”,就能直接在 Google Sheets 使用注…

貓頭虎AI 薦研|騰訊開源長篇敘事音頻生成模型 AudioStory:統一模型,讓 AI 會講故事

🐯貓頭虎薦研|騰訊開源長篇敘事音頻生成模型 AudioStory:統一模型,讓 AI 會講故事 大家好,我是貓頭虎 🐯🦉,又來給大家推薦新鮮出爐的 AI 開源項目! 這次要聊的是騰訊 A…

收藏!VSCode 開發者工具快捷鍵大全

一、文件操作快捷鍵1. 打開與關閉文件Ctrl O(Windows/Linux)或 Command O(Mac):打開文件,可以通過輸入文件名快速查找并打開相應文件。Ctrl W(Windows/Linux)或 Command W&#…

Simulations RL 平臺學習筆記

1. 選擇標準 1.1 開源項目,🌟star數量越多越好 2. 常見平臺 2.1 🌟18.6k ML-Agents:基于Unity實現 2.2 🌟1.2k Godot RL Agents

【國內電子數據取證廠商龍信科技】IOS 逆向脫殼

我們都知道,大多數的 APP 在開發的時候一般都會加上一層殼,例如 愛加密、梆梆、360、網易易盾等等。那 APK 的脫殼我們見得多了,那 IOS 逆向脫殼又是怎樣子的呢?首先咱們先了解一下為什么要砸殼,因為 IOS 開發者開發軟…

基于STM32單片機溫濕度PM2.5粉塵甲醛環境質量wifi手機APP監測系統

1 基于STM32單片機溫濕度PM2.5粉塵甲醛環境質量WiFi手機APP監測系統 本系統旨在實現對環境中溫度、濕度、PM2.5粉塵濃度以及甲醛濃度的實時監測,并通過WiFi技術將數據傳輸至手機APP端,實現移動化與可視化的環境質量檢測。系統在硬件上主要依賴STM32單片…

用C++實現日期類

在上學的時候,總是在計算還有多少天放假;在上班的時候,總是在計算還有多久發工資?我們一般通過日歷得到結果,那自己能不能實現一些基本的功能呢?答案是可以的!需要實現內容:1. 日期加…

百度網盤基于Flink的實時計算實踐

01 概覽 隨著數字化轉型的來臨,企業對于數據服務的實時化需求日益增長,在大規模數據和復雜場景的情況下,Flink在實時計算數據鏈路中扮演著極為重要的角色,本文介紹了網盤如何通過 Flink 構建實時計算引擎,從而提供高性…

【CMake】策略

目錄 一.CMake策略簡要理解 1.1.第一階段:童年時期(舊行為,The "Old Way") 1.2.第二階段:成長與改進(引入新行為,The "New Way") 1.3.第三階段:…

LLM中的function call

1. 概念 **Function Call(函數調用)**是指在編程中,程序可以通過調用預定義的函數來執行特定的操作。在LLM中,函數調用的概念擴展了模型的能力,使其不僅能夠生成文本,還能與外部系統進行交互。通過函數調用…

【系統架構設計(13)】項目管理上:盈虧平衡分析與進度管理

文章目錄零、核心思想:經濟性與時效性的動態平衡一、盈虧平衡分析:項目的經濟生命線1、核心公式與決策邏輯二、進度管理:項目的時效生命線1. **工作分解結構(WBS)**2. 進度管理流程3、關鍵路徑法關鍵路徑法&#xff08…

【SuperSocket 】利用 TaskCompletionSource 在 SuperSocket 中實現跨模塊異步處理客戶端消息

利用 TaskCompletionSource 在 SuperSocket 中實現跨模塊異步處理客戶端消息 在使用 SuperSocket 構建 TCP 服務時,我們經常會遇到這樣的需求: 服務端接收到客戶端數據后,需要將數據交給其他模塊處理處理完成后再將結果返回給調用模塊或客戶端…

《IC驗證必看|semaphore與mailbox的核心區別》

月薪30K驗證工程師必答:SystemVerilog中semaphore與mailbox的核心區別,及必須用semaphore的場景深度解析 在驗證工程師的技能體系里,線程同步與資源管控是區分“基礎會用”(20K水平)和“精通工程化”(30K水…

Spring線程池ThreadPoolTaskExecutor?詳解

ThreadPoolTaskExecutor?寫法Bean(name "taskExecutor") public ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(8); // 8核CPU服務器建議值executor.setMaxPoolSize(…