# SELECT 语句生成示例
本文档展示了 yang-db 库中 SELECT 语句生成功能的使用示例。
## 基本 SELECT 查询
```rust
use yang_db::Database;
// 连接数据库
let db = Database::connect("mysql://root:111111@localhost:3306/test").await?;
// 简单查询:SELECT * FROM users
let sql = db.table("users").to_sql();
// 输出: SELECT * FROM users
// 选择特定字段:SELECT id, name FROM users
let sql = db.table("users")
.field("id")
.field("name")
.to_sql();
// 输出: SELECT id, name FROM users
```
## DISTINCT 查询
```rust
// SELECT DISTINCT name FROM users
let sql = db.table("users")
.field("name")
.distinct()
.to_sql();
// 输出: SELECT DISTINCT name FROM users
```
## WHERE 条件查询
```rust
// SELECT * FROM users WHERE status = ? AND age > ?
let sql = db.table("users")
.where_and("status", "=", 1)
.where_and("age", ">", 18)
.to_sql();
// 输出: SELECT * FROM users WHERE (status = ? AND age > ?)
// IN 条件:SELECT * FROM users WHERE id IN (?, ?, ?)
let sql = db.table("users")
.where_in("id", vec![1, 2, 3])
.to_sql();
// 输出: SELECT * FROM users WHERE id IN (?, ?, ?)
// BETWEEN 条件:SELECT * FROM users WHERE age BETWEEN ? AND ?
let sql = db.table("users")
.where_between("age", 18, 65)
.to_sql();
// 输出: SELECT * FROM users WHERE age BETWEEN ? AND ?
```
## JOIN 查询
```rust
// INNER JOIN
let sql = db.table("users")
.field("users.id")
.field("users.name")
.field("orders.total")
.join("orders", "users.id = orders.user_id")
.to_sql();
// 输出: SELECT users.id, users.name, orders.total FROM users
// INNER JOIN orders ON users.id = orders.user_id
// LEFT JOIN
let sql = db.table("users")
.field("users.name")
.field("profiles.bio")
.left_join("profiles", "users.id = profiles.user_id")
.to_sql();
// 输出: SELECT users.name, profiles.bio FROM users
// LEFT JOIN profiles ON users.id = profiles.user_id
// 多表连接
let sql = db.table("users")
.field("users.name")
.field("orders.total")
.field("products.name")
.join("orders", "users.id = orders.user_id")
.left_join("products", "orders.product_id = products.id")
.to_sql();
// 输出: SELECT users.name, orders.total, products.name FROM users
// INNER JOIN orders ON users.id = orders.user_id
// LEFT JOIN products ON orders.product_id = products.id
```
## ORDER BY 排序
```rust
// 单字段排序:SELECT * FROM users ORDER BY name ASC
let sql = db.table("users")
.order("name", true)
.to_sql();
// 输出: SELECT * FROM users ORDER BY name ASC
// 多字段排序:SELECT * FROM users ORDER BY status ASC, created_at DESC
let sql = db.table("users")
.order("status", true)
.order("created_at", false)
.to_sql();
// 输出: SELECT * FROM users ORDER BY status ASC, created_at DESC
```
## GROUP BY 分组
```rust
// 单字段分组:SELECT status FROM users GROUP BY status
let sql = db.table("users")
.field("status")
.group("status")
.to_sql();
// 输出: SELECT status FROM users GROUP BY status
// 多字段分组:SELECT status, role FROM users GROUP BY status, role
let sql = db.table("users")
.field("status")
.field("role")
.group("status")
.group("role")
.to_sql();
// 输出: SELECT status, role FROM users GROUP BY status, role
```
## LIMIT 和 OFFSET
```rust
// 分页查询:SELECT * FROM users LIMIT 10 OFFSET 20
let sql = db.table("users")
.limit(10)
.offset(20)
.to_sql();
// 输出: SELECT * FROM users LIMIT 10 OFFSET 20
```
## 复杂查询示例
```rust
// 完整的复杂查询
let sql = db.table("users")
.field("users.id")
.field("users.name")
.field("COUNT(orders.id) as order_count")
.field("SUM(orders.total) as total_amount")
.distinct()
.join("orders", "users.id = orders.user_id")
.where_and("users.status", "=", 1)
.where_and("orders.total", ">", 100)
.group("users.id")
.group("users.name")
.order("total_amount", false)
.limit(20)
.offset(10)
.to_sql();
// 输出:
// SELECT DISTINCT users.id, users.name, COUNT(orders.id) as order_count, SUM(orders.total) as total_amount
// FROM users
// INNER JOIN orders ON users.id = orders.user_id
// WHERE (users.status = ? AND orders.total > ?)
// GROUP BY users.id, users.name
// ORDER BY total_amount DESC
// LIMIT 20
// OFFSET 10
```
## 验证需求
本实现验证了以下需求:
- **需求 4.1**: find() 方法会自动添加 LIMIT 1
- **需求 4.2**: select() 方法返回所有匹配记录
- **需求 4.4**: count() 方法生成 COUNT(*) 语句
- **需求 4.5**: sum() 方法生成 SUM(field) 语句
## 注意事项
1. **参数化查询**: 所有值都使用 `?` 占位符,防止 SQL 注入
2. **括号处理**: WHERE 条件自动添加括号确保操作符优先级正确
3. **链式调用**: 所有方法都返回 `Self`,支持流畅的链式调用
4. **调试友好**: `to_sql()` 方法可以在任何时候调用以查看生成的 SQL
## 测试覆盖
- ✅ 37 个单元测试
- ✅ 16 个基于属性的测试
- ✅ 所有测试通过
- ✅ Clippy 检查通过
- ✅ 代码格式化检查通过