Window Frame Specifications: Functions
Module: Window Functions
**Basic Frame Syntax:**
```sql
{ROWS | RANGE} BETWEEN frame_start AND frame_end
```
**Frame Boundaries:**
```sql
UNBOUNDED PRECEDING -- First row in partition
N PRECEDING -- N rows before current
CURRENT ROW -- Current row
N FOLLOWING -- N rows after current
UNBOUNDED FOLLOWING -- Last row in partition
```
**Common Patterns:**
```sql
-- Running total
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
-- Moving average (5 periods)
ROWS BETWEEN 4 PRECEDING AND CURRENT ROW
-- Centered window (3 periods)
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
-- Full partition
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
```
**Shorthand Syntax:**
```sql
-- These are equivalent:
ROWS UNBOUNDED PRECEDING
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
-- These are equivalent:
ROWS 3 PRECEDING
ROWS BETWEEN 3 PRECEDING AND CURRENT ROW
```
Frame syntax: {ROWS | RANGE} BETWEEN frame_start AND frame_end
ROWS counts physical rows, RANGE groups by ORDER BY values (handles ties)
Boundaries: UNBOUNDED PRECEDING/FOLLOWING, N PRECEDING/FOLLOWING, CURRENT ROW
Default frame with ORDER BY: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Default frame without ORDER BY: entire partition (UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Shorthand syntax: ROWS N PRECEDING equals ROWS BETWEEN N PRECEDING AND CURRENT ROW
Full frame support including RANGE with INTERVAL for time-based frames. Excellent optimization.
Complete frame support starting MySQL 8.0. Good performance optimization for ROWS frames.