A以users为主表左连接,返回users表中所有的user_id。
B以orders为主表右连接,返回orders表中所有的user_id。
D以orders为主表右连接并筛选users表中user_id为空的记录,返回的是orders表中存在而users表中不存在的user_id。
而C以users为主表左连接并筛选orders表中user_id为空的记录,返回即是users表中存在而orders表中不存在的user_id。
正确答案是C: `select users.user_id from users left join orders on users.user_id=orders.user_id where orders.user_id is null;`
### 专业分析:
1. **LEFT JOIN** 和 **RIGHT JOIN** 的区别:
- **LEFT JOIN**: 返回左表中的所有记录,以及右表中连接字段相等的记录。如果右表中没有匹配的记录,则结果中包含左表中的记录和右表中的NULL值。
- **RIGHT JOIN**: 返回右表中的所有记录,以及左表中连接字段相等的记录。如果左表中没有匹配的记录,则结果中包含右表中的记录和左表中的NULL值。
2. **题目要求**:查询`users`表中存在而`orders`表中不存在的`user_id`。这意味着我们要找出`users`表中有但在`orders`表中没有匹配记录的`user_id`。
3. **分析选项**:
- A: `select users.user_id from users left join orders on users.user_id=orders.user_id;`
- 这个查询会返回左表`users`的所有记录以及右表`orders`中匹配的记录,但不会过滤出`orders`中没有匹配记录的那些`user_id`。
- B: `select users.user_id from users right join orders on users.user_id=orders.user_id;`
- 这个查询会返回右表`orders`的所有记录以及左表`users`中匹配的记录,这与题目要求不符。
- C: `select users.user_id from users left join orders on users.user_id=orders.user_id where orders.user_id is null;`
- 这个查询使用了`LEFT JOIN`,并且通过`where orders.user_id is null`过滤出了`orders`表中没有匹配记录的`user_id`。这正是题目要求的结果。
- D: `select users.user_id from users right join orders on users.user_id=orders.user_id where users.user_id is null;`
- 这个查询会返回`orders`表中存在但`users`表中不存在的`user_id`,与题目要求相反。
综上所述,选项C是正确的。