本文中的案例如下,可以自己測試一下,有問題可以留言哦。
CREATE TABLE staff (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
job_id INT,
joindate DATE,
salary DECIMAL(7,2)
);
INSERT INTO staff(name,job_id,joindate,salary) VALUES
('孫悟空',4,'2000-12-17',8000.00),
('盧俊義',3,'2001-02-20',16000.00),
('林沖',3,'2001-02-22',12500.00),
('唐僧',2,'2001-04-02',29750.00),
('李逵',4,'2001-09-28',12500.00)
('孫悟空',4,'2000-12-17',8000.00),
('林沖',3,'2001-02-22',12500.00);
CONCAT
CONCAT函數用於將兩個字符串連接起來,形成一個單一的字符串。
語法:CONCAT(str1,str2,)
輸出:拼接的字符串,如果有任何一個參數爲null,則返回值爲null。
SELECT CONCAT(id,name,job_id) id_name_job_id FROM staff;
這樣簡單粗暴的將三個字符串連接起來,看起來是有一點不美觀,如果用符號連接起來會美觀一些。來試一下。
SELECT CONCAT(id,' - ',name,' - ',job_id) id_name_job_id FROM staff;
可以看出來,將分割符以字符的形式添加到他們之間,這樣就美觀很多了。那麼問題來了,現在是三個字符可以很輕鬆地直接在他們之間添加分隔符 ,如果有一百個字符串呢,有一千個字符串呢,這就是一個比較大的工程了,聰明的前輩們肯定想到了這一點,CONCAT_WS函數就出現了。
CONCAT_WS
CONCAT_WS和CONCAT函數用法基本是相同的,相當於是CONCAT的一個升級,它省去了CONCAT函數逐一添加分隔符的繁瑣操作,可以一勞永逸的添加分隔符。
語法:CONCAT_WS(separator,str1,str2,)
輸出:以separator爲分隔符的拼接字符串。分隔符不能爲NULL,否則返回NULL
SELECT CONCAT_WS(' - ',id,name,job_id) id_name_jod_id FROM staff;
這樣就很方便的將他們風格,可以說是簡單又美觀。細心的你肯定發現了他們之間有好多重複的信息,比如說“孫悟空”和“李逵”的工號重複了,“盧俊義”和“林沖”的工號頁重複了,這樣說起來還可以變的更美觀一些,於是GROUP_CONCAT就出現了。
GROUP_CONCAT
GROUP_CONCAT和前面的兩個函數的功能基本上是一樣的,也是將字符進行拼接,不同之處在於它“返回由屬於一組的列值連接組合而成的結果”,也就是說他是將鏈接的字符進行分組後輸出的。
語法:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
返回:將GROUP BY產生的同一個組的字符進行連接。
SELECT job_id,GROUP_CONCAT(name) name FROM staff GROUP BY job_id;
這樣就可以將相同工號的員工分到一組進行輸出,但是這樣還不是很完美,因爲有一些人被重複統計了,看來同名同姓的人還不少,可以使用去重函數DISTINCT,然後再進行分組,這樣雖然可以,但是SQL語句不夠簡潔,可以直接再GROUP_CONCAT函數中直接進行去重。
SELECT job_id, GROUP_CONCAT(DISTINCT name) name FROM staff GROUP BY job_id;
可以看到,去重的效果還是可以的。既然可以去重了,排序可不可以呢?
可以發現對他們的名字進行了字典序排序,GROUP_CONCAT還有一個功能就是更改分隔符,它默認的分隔符是“,”。
SELECT job_id, GROUP_CONCAT(DISTINCT name ORDER BY name DESC SEPARATOR "-") name
FROM staff GROUP BY job_id;
到這裏就全部將GROUP_CONCAT函數說完了,歡迎大家批評指正。