SQL技术问询:char字段去空格及双表JOIN统计查询实现
嘿,我来帮你搞定这两个SQL问题!
CHAR类型是固定长度的字符串,只要你存的内容长度比定义的短,数据库就会自动在末尾补空格,确实挺烦人的。这里有几个实用的解决思路:
查询时直接修剪空格:用数据库自带的修剪函数就行,多数数据库都支持
TRIM()(能去掉首尾空格),如果只需要去掉末尾的,有些数据库比如SQL Server有RTRIM()。举个查询客户姓名的例子:SELECT TRIM(CUSTNAME) AS clean_custname FROM CUSTOMERS_JS;小提示:不同数据库的函数细节略有不同,比如Oracle的
TRIM()还能指定要修剪的字符,MySQL的用法更通用,根据你用的数据库调整就行。换用VARCHAR类型:如果你的客户姓名长度本来就不固定,直接把
CHAR(50)改成VARCHAR(50)(Oracle里是VARCHAR2)就从根源上解决了——VARCHAR是可变长度,不会自动补空格。改表结构的语句大概是这样(以MySQL为例):ALTER TABLE CUSTOMERS_JS MODIFY COLUMN CUSTNAME VARCHAR(50) NOT NULL;写入数据前提前处理:在应用层把要存入的字符串先去掉多余空格,确保存进数据库的内容没有不必要的空格,这样后续查询就不用额外折腾了。
针对你的两张表,我写了两个不同风格的查询,都能输出你要的格式:客户姓名 - 客户ID bought 购买设备数量 gadgets。这里用的是标准SQL的字符串拼接方式,如果你用的是特定数据库(比如MySQL、SQL Server),可以把CONCAT()换成对应语法(MySQL用CONCAT(),SQL Server用+,Oracle用||)。
方式一:显式INNER JOIN(推荐写法)
这种写法逻辑更清晰,把表关联条件和过滤条件分开,可读性更好:
SELECT CONCAT(c.CUSTNAME, ' - ', c.CUSTID, ' bought ', COUNT(s.GADGETID), ' gadgets') AS purchase_summary FROM CUSTOMERS_JS c INNER JOIN STORE_SALES_JS s ON c.CUSTID = s.CUSTID GROUP BY c.CUSTID, c.CUSTNAME;
方式二:隐式JOIN(传统写法)
这是比较老的写法,把表关联条件放在WHERE子句里:
SELECT CONCAT(c.CUSTNAME, ' - ', c.CUSTID, ' bought ', COUNT(s.GADGETID), ' gadgets') AS purchase_summary FROM CUSTOMERS_JS c, STORE_SALES_JS s WHERE c.CUSTID = s.CUSTID GROUP BY c.CUSTID, c.CUSTNAME;
额外说明:
如果要包含那些没有任何购买记录的客户(显示购买数量为0),可以把INNER JOIN改成LEFT JOIN,同时把COUNT(s.GADGETID)换成COALESCE(COUNT(s.GADGETID), 0),这样空值会显示成0,结果更完整。
内容的提问来源于stack exchange,提问作者Anton Makov

