本文中的案例如下,可以自己测试一下,有问题可以留言哦。
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函数说完了,欢迎大家批评指正。