请写出一条 SQL 语句,从用户表中找出所有注册时间晚于 2024 年 6 月,并且访问记录中包含 '/contact' 路径的用户,只返回这些用户的用户名。
考察说明
考查 SQL 多表连接、日期过滤与去重能力。
回答思路
- 【回答框架 1】假设存在用户表 users(字段 username、register_date)和访问表 visits(字段 username 或 user_id、page_path、visit_time)。对两表按用户标识连接,用 WHERE 子句同时过滤 register_date 大于 2024-06-30 和 page_path 等于 '/contact'。
- 【回答框架 2】若一名用户多次访问 '/contact',SELECT 结果会出现重复用户名,因此应使用 SELECT DISTINCT 或 GROUP BY 用户名去重,保证每个用户只返回一次。
- 【回答框架 3】若访问表只存 user_id 而用户表有 id 字段,连接条件改为 users.id = visits.user_id;若直接用 username 关联,需注意两表同一字段命名一致。
- 【回答框架 4】还可以改用 EXISTS 子查询:SELECT username FROM users u WHERE register_date > '2024-06-30' AND EXISTS (SELECT 1 FROM visits v WHERE v.username = u.username AND v.page_path = '/contact'),语义更清晰且可避免重复。
- 【回答框架 5】日期过滤应使用严格大于 '2024-06-30',而不是大于等于 2024-07-01,因为两种写法等价但需明确边界;索引建议放在 register_date 和 page_path 上以提升性能。
- 【关键点 1】连接用户表和访问表并加日期与路径条件。
- 【关键点 2】使用 DISTINCT 或 EXISTS 避免重复用户名。
- 【关键点 3】注册日期条件为 register_date > '2024-06-30'。
- 【易错点 1】若用户存在多次访问,不加去重会返回重复用户名。
- 【易错点 2】日期比较时漏掉单引号导致语法错误或类型转换问题。
- 【易错点 3】若访问表用户标识为 user_id 而连接错字段会查不到数据。