我创建了两个表分别是员工表和部门表来做例子:
员工表:
部门表:
一、concat_ws()函数
1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat 和 separator)
2、语法:concat_ws(separator, str1, str2, …)
现在我要查询员工的id和名称并连接成一字符串
SELECT CONCAT_WS('-',id ,NAME ) AS '员工id-员工' FROM employee
二、group_concat()函数
现在我要查询部门相同下的所有员工可以这样写查询:
SELECT dept_name AS '部门',NAME AS '员工'
FROM dept d LEFT JOIN employee e ON e.dept_id=d.dept_id
GROUP BY NAME
但是这样同一个部门名称出现多次,看上去非常不直观。有没有更直观的方法,既让每个部门名字都只出现一次,又能够显示所有的部门相同下的员工名字呢?——使用group_concat()
1.作用:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2.语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
例子1:使用group_concat()和group by显示相同部门下的员工:
SELECT d.dept_name AS '部门',GROUP_CONCAT(NAME) AS '员工' FROM employee e LEFT JOIN dept d
ON e.dept_id=d.dept_id GROUP BY d.dept_name
例2:也可以自定义分隔符,用’-'作为分隔符:
SELECT d.dept_name AS '部门',GROUP_CONCAT(NAME SEPARATOR'-') AS '员工' FROM employee e LEFT JOIN dept d
ON e.dept_id=d.dept_id GROUP BY d.dept_name
例子3:将员工的id号从大到小排序
使用order by 默认升序(ASC)
SELECT d.dept_name AS '部门',GROUP_CONCAT(NAME,id SEPARATOR'-') AS '员工' FROM employee e LEFT JOIN dept d
ON e.dept_id=d.dept_id GROUP BY d.dept_name
使用order by 降序(DESC)
SELECT d.dept_name AS '部门',GROUP_CONCAT(NAME,id ORDER BY id DESC SEPARATOR'-') AS '员工' FROM employee e LEFT JOIN dept d
ON e.dept_id=d.dept_id GROUP BY d.dept_name
例子4:group_concat()函数,concat_ws()函数的组合使用,接下来我们要查询以部门名称分组的所有组的员工名称和员工id:
SELECT d.dept_name AS '部门',GROUP_CONCAT(CONCAT_WS('-',id,NAME))AS '员工id-员工' FROM employee e LEFT JOIN dept d
ON e.dept_id=d.dept_id GROUP BY d.dept_name