SELECT * 会放大别名混淆风险,因多表JOIN时同名列(如id)无前缀导致歧义,PostgreSQL报“column reference is ambiguous”,MySQL行为不可靠;子查询、视图、GROUP BY中引用更易出错。
为什么 SELECT * 会放大别名混淆风险 不写表前缀时,SELECT *ERROR: column reference "id" is ambiguousGROUP BYORDER BYSELECT *DESCRIBE table_namePRAGMA table_info(table_name)FROM users u JOIN orders o ON ...sqlfluff.sqlfluff[rules]
L027 = True # Enforce table alias usagesqlfluff lint query.sql*.sqlgrep -n "SELECT.*," query.sql | grep -v "\."LEFT JOINNULLWHERE o.status = 'paid'o.statusNULLWHERE o.status IS NOT NULL AND o.status = 'paid'WHERE status = 'paid'statusSELECTGROUP BY idusers.idHAVING COUNT(o.id) > 1ONLY_FULL_GROUP_BYGROUP BYExpression #1 of SELECT list is not in GROUP BY clauseSELECT u.name, o.amount FROM ...nameASCREATE VIEW user_order_summary AS
SELECT u.id AS user_id, u.name AS user_name, o.id AS order_id, o.total AS order_total
FROM users u LEFT JOIN orders o ON u.id = o.user_id;SELECT *WITH ranked_orders AS (SELECT o.id AS order_id, ROW_NUMBER() OVER (...) AS rn FROM orders o)EXPLAIN VERBOSEEXPLAIN FORMAT=TREE