高级查询 #

一、LET语句 #

1.1 LET语法 #

sql
LET <variable> = <expression>
SELECT ... FROM ...

1.2 定义变量 #

sql
LET $activeUsers = SELECT FROM User WHERE status = 'active'
SELECT name, email FROM $activeUsers

1.3 多变量定义 #

sql
LET $users = SELECT FROM User WHERE status = 'active'
LET $orders = SELECT FROM Order WHERE createdAt > sysdate() - 30
SELECT u.name, COUNT(o) AS orderCount
FROM $users u
LET $userOrders = (SELECT FROM $orders WHERE userId = u.@rid)
WHERE $userOrders.size() > 0

1.4 变量复用 #

sql
LET $company = SELECT FROM Company WHERE name = 'ABC Corp'
SELECT name FROM Person WHERE employer = $company[0].@rid
SELECT name FROM Department WHERE company = $company[0].@rid

二、子查询 #

2.1 WHERE子查询 #

sql
SELECT FROM Person WHERE employer IN (
    SELECT FROM Company WHERE industry = 'Technology'
)

2.2 FROM子查询 #

sql
SELECT name, age FROM (
    SELECT FROM Person WHERE age > 30
) WHERE city = 'Beijing'

2.3 投影子查询 #

sql
SELECT 
    name, 
    (SELECT COUNT(*) FROM Order WHERE customer = @rid) AS orderCount
FROM Person

2.4 关联子查询 #

sql
SELECT 
    p.name,
    (SELECT SUM(amount) FROM Order WHERE customer = p.@rid) AS totalSpent
FROM Person p
WHERE (SELECT COUNT(*) FROM Order WHERE customer = p.@rid) > 0

2.5 EXISTS子查询 #

sql
SELECT FROM Person p
WHERE (SELECT COUNT(*) FROM Order WHERE customer = p.@rid) > 0

三、UNION查询 #

3.1 UNION合并 #

sql
SELECT name, 'Person' AS type FROM Person
UNION
SELECT name, 'Company' AS type FROM Company

3.2 UNION ALL保留重复 #

sql
SELECT name FROM Person WHERE city = 'Beijing'
UNION ALL
SELECT name FROM Person WHERE city = 'Shanghai'

3.3 多表UNION #

sql
SELECT name, email FROM Customer
UNION
SELECT name, email FROM Supplier
UNION
SELECT name, email FROM Employee

四、条件表达式 #

4.1 CASE WHEN #

sql
SELECT 
    name,
    age,
    CASE 
        WHEN age < 18 THEN 'Minor'
        WHEN age BETWEEN 18 AND 30 THEN 'Young Adult'
        WHEN age BETWEEN 31 AND 50 THEN 'Adult'
        WHEN age BETWEEN 51 AND 65 THEN 'Middle Age'
        ELSE 'Senior'
    END AS ageGroup
FROM Person

4.2 简单CASE #

sql
SELECT 
    name,
    CASE status
        WHEN 'active' THEN 'Active User'
        WHEN 'inactive' THEN 'Inactive User'
        WHEN 'pending' THEN 'Pending Approval'
        ELSE 'Unknown Status'
    END AS statusLabel
FROM User

4.3 嵌套CASE #

sql
SELECT 
    name,
    CASE 
        WHEN status = 'active' THEN 
            CASE 
                WHEN age < 30 THEN 'Young Active'
                ELSE 'Senior Active'
            END
        ELSE 'Inactive'
    END AS category
FROM Person

五、窗口函数 #

5.1 ROW_NUMBER #

sql
SELECT 
    name,
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM Employee

5.2 RANK和DENSE_RANK #

sql
SELECT 
    name,
    department,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS deptRank,
    DENSE_RANK() OVER (ORDER BY salary DESC) AS overallRank
FROM Employee

5.3 聚合窗口函数 #

sql
SELECT 
    name,
    department,
    salary,
    AVG(salary) OVER (PARTITION BY department) AS deptAvgSalary,
    SUM(salary) OVER (ORDER BY salary) AS runningTotal
FROM Employee

5.4 LAG和LEAD #

sql
SELECT 
    orderDate,
    amount,
    LAG(amount, 1) OVER (ORDER BY orderDate) AS prevAmount,
    LEAD(amount, 1) OVER (ORDER BY orderDate) AS nextAmount
FROM Sales

六、复杂条件 #

6.1 多条件组合 #

sql
SELECT FROM Person WHERE 
    (age > 18 AND age < 60) 
    AND (city = 'Beijing' OR city = 'Shanghai')
    AND status = 'active'

6.2 嵌套条件 #

sql
SELECT FROM Person WHERE 
    (status = 'active' AND (
        (age > 30 AND experience > 5) OR
        (age > 25 AND education = 'PhD')
    ))

6.3 使用NOT #

sql
SELECT FROM Person WHERE 
    NOT (status = 'deleted' OR status = 'inactive')

6.4 复杂IN条件 #

sql
SELECT FROM Person WHERE 
    @rid IN (
        SELECT @rid FROM Person WHERE 
            employer IN (SELECT FROM Company WHERE industry = 'Tech')
    )

七、JSON查询 #

7.1 JSON属性访问 #

sql
SELECT name, preferences['theme'] AS theme FROM Person
SELECT name, address.city, address.street FROM Person

7.2 JSON条件 #

sql
SELECT FROM Person WHERE preferences['theme'] = 'dark'
SELECT FROM Person WHERE address.city = 'Beijing'

7.3 JSON函数 #

sql
SELECT name, JSON_FROM_RECORD(@this) AS jsonRecord FROM Person
SELECT name, JSON_FROM_SET(tags) AS tagsJson FROM Person

八、正则表达式 #

8.1 基本匹配 #

sql
SELECT FROM Person WHERE name MATCHES '^[A-Z]'
SELECT FROM Person WHERE email MATCHES '^[a-zA-Z0-9._%+-]+@'

8.2 复杂模式 #

sql
SELECT FROM Person WHERE phone MATCHES '^\+?[0-9]{10,15}$'
SELECT FROM Product WHERE code MATCHES '^[A-Z]{2}[0-9]{4}$'

8.3 组合条件 #

sql
SELECT FROM Person WHERE 
    name MATCHES '^[A-Z][a-z]+$' AND
    email MATCHES '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

九、集合高级操作 #

9.1 集合函数 #

sql
SELECT 
    name,
    hobbies,
    SIZE(hobbies) AS hobbyCount,
    FIRST(hobbies) AS firstHobby,
    LAST(hobbies) AS lastHobby
FROM Person

9.2 集合转换 #

sql
SELECT 
    name,
    ASSET(hobbies) AS uniqueHobbies,
    ASLIST(tags) AS tagList
FROM Person

9.3 集合运算 #

sql
SELECT 
    name,
    UNIONALL(hobbies, skills) AS allInterests,
    INTERSECT(hobbies, requiredSkills) AS matchingSkills
FROM Person

9.4 展开集合 #

sql
SELECT name, hobby FROM Person 
UNWIND hobbies AS hobby

十、链接高级操作 #

10.1 深层链接 #

sql
SELECT 
    name,
    employer.name AS companyName,
    employer.address.city AS companyCity,
    employer.ceo.name AS ceoName
FROM Person

10.2 链接集合展开 #

sql
SELECT p.name AS personName, f.name AS friendName
FROM Person p
UNWIND p.friends AS friendRid
LET f = (SELECT FROM Person WHERE @rid = $friendRid)

10.3 反向链接 #

sql
SELECT 
    c.name AS companyName,
    in('WORKS_AT').name AS employees
FROM Company c

十一、查询优化技巧 #

11.1 使用索引 #

sql
CREATE INDEX Person.email UNIQUE
SELECT FROM Person WHERE email = 'tom@example.com'

11.2 限制结果 #

sql
SELECT FROM Person WHERE status = 'active' LIMIT 100

11.3 延迟加载 #

sql
SELECT @rid, name FROM Person

11.4 避免SELECT * #

sql
SELECT name, email, status FROM Person

11.5 使用LET缓存 #

sql
LET $companies = SELECT FROM Company WHERE industry = 'Tech'
SELECT p.name, c.name AS companyName
FROM Person p
LET c = (SELECT FROM $companies WHERE @rid = p.employer)
WHERE $c.size() > 0

十二、实际应用示例 #

12.1 复杂报表查询 #

sql
LET $sales = SELECT FROM Order WHERE createdAt BETWEEN DATE('2024-01-01') AND DATE('2024-12-31')
SELECT 
    customer.name AS customerName,
    COUNT(*) AS orderCount,
    SUM(totalAmount) AS totalSpent,
    AVG(totalAmount) AS avgOrderValue
FROM $sales
GROUP BY customer
ORDER BY totalSpent DESC
LIMIT 10

12.2 层级数据查询 #

sql
LET $managers = SELECT FROM Employee WHERE level = 'manager'
SELECT 
    m.name AS managerName,
    in('REPORTS_TO').name AS teamMembers
FROM $managers m

12.3 时间序列分析 #

sql
SELECT 
    DATE(createdAt) AS date,
    COUNT(*) AS orderCount,
    SUM(amount) AS dailyTotal
FROM Order
WHERE createdAt >= sysdate() - 30
GROUP BY DATE(createdAt)
ORDER BY date ASC

12.4 多维度统计 #

sql
SELECT 
    department,
    status,
    COUNT(*) AS count,
    AVG(salary) AS avgSalary,
    MIN(salary) AS minSalary,
    MAX(salary) AS maxSalary
FROM Employee
GROUP BY department, status
ORDER BY department, status

十三、总结 #

高级查询要点:

技术 说明
LET 定义变量,复用查询结果
子查询 嵌套查询,关联数据
UNION 合并多个查询结果
CASE 条件表达式
窗口函数 排名、聚合、偏移

下一步,让我们学习聚合与分组!

最后更新:2026-03-27