基础查询 #

一、SELECT语句概述 #

1.1 基本语法 #

sql
SELECT [DISTINCT] [<projection>] 
FROM <target>
[WHERE <condition>]
[GROUP BY <field>]
[ORDER BY <field> [ASC|DESC]]
[LIMIT <maxRecords>]
[SKIP <skipRecords>]

1.2 SELECT特点 #

text
SELECT特点:
├── 支持多种投影方式
├── 支持复杂条件过滤
├── 支持聚合和分组
├── 支持排序和分页
└── 支持子查询

二、基本查询 #

2.1 查询所有字段 #

sql
SELECT * FROM Person
SELECT FROM Person

2.2 查询指定字段 #

sql
SELECT name, age, city FROM Person

2.3 使用别名 #

sql
SELECT name AS fullName, age AS userAge FROM Person
SELECT name firstName, age userAge FROM Person

2.4 查询计算字段 #

sql
SELECT name, age, age * 2 AS doubleAge FROM Person
SELECT name, firstName + ' ' + lastName AS fullName FROM Person

2.5 使用DISTINCT去重 #

sql
SELECT DISTINCT city FROM Person
SELECT DISTINCT age, city FROM Person

2.6 查询记录数 #

sql
SELECT COUNT(*) AS total FROM Person
SELECT COUNT(*) FROM Person WHERE age > 30

三、WHERE条件 #

3.1 比较运算符 #

sql
SELECT FROM Person WHERE age = 30
SELECT FROM Person WHERE age != 30
SELECT FROM Person WHERE age > 30
SELECT FROM Person WHERE age >= 30
SELECT FROM Person WHERE age < 30
SELECT FROM Person WHERE age <= 30

3.2 逻辑运算符 #

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

3.3 BETWEEN范围 #

sql
SELECT FROM Person WHERE age BETWEEN 20 AND 40
SELECT FROM Person WHERE createdAt BETWEEN DATE('2024-01-01') AND DATE('2024-12-31')

3.4 IN列表 #

sql
SELECT FROM Person WHERE city IN ('Beijing', 'Shanghai', 'Guangzhou')
SELECT FROM Person WHERE age IN (20, 25, 30, 35)
SELECT FROM Person WHERE @rid IN [#12:0, #12:1, #12:2]

3.5 LIKE模糊匹配 #

sql
SELECT FROM Person WHERE name LIKE 'Tom%'
SELECT FROM Person WHERE name LIKE '%om%'
SELECT FROM Person WHERE name LIKE '_om'
SELECT FROM Person WHERE email LIKE '%@gmail.com'

通配符说明:

通配符 说明
% 匹配任意多个字符
_ 匹配单个字符

3.6 NULL判断 #

sql
SELECT FROM Person WHERE email IS NULL
SELECT FROM Person WHERE email IS NOT NULL
SELECT FROM Person WHERE phone IS NULL AND email IS NOT NULL

3.7 正则表达式 #

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

四、ORDER BY排序 #

4.1 升序排序 #

sql
SELECT FROM Person ORDER BY name ASC
SELECT FROM Person ORDER BY name

4.2 降序排序 #

sql
SELECT FROM Person ORDER BY age DESC

4.3 多字段排序 #

sql
SELECT FROM Person ORDER BY city ASC, age DESC
SELECT FROM Person ORDER BY status ASC, name ASC, age DESC

4.4 按表达式排序 #

sql
SELECT name, age, age * 2 AS doubleAge FROM Person ORDER BY doubleAge DESC
SELECT name, firstName + ' ' + lastName AS fullName FROM Person ORDER BY fullName

4.5 NULL值排序 #

sql
SELECT FROM Person ORDER BY email ASC NULLS FIRST
SELECT FROM Person ORDER BY email DESC NULLS LAST

五、LIMIT和SKIP分页 #

5.1 LIMIT限制结果 #

sql
SELECT FROM Person LIMIT 10
SELECT FROM Person WHERE age > 30 LIMIT 5

5.2 SKIP跳过记录 #

sql
SELECT FROM Person SKIP 10
SELECT FROM Person SKIP 10 LIMIT 10

5.3 分页查询 #

sql
SELECT FROM Person SKIP 0 LIMIT 10
SELECT FROM Person SKIP 10 LIMIT 10
SELECT FROM Person SKIP 20 LIMIT 10

5.4 分页公式 #

text
第N页: SKIP (N-1) * pageSize LIMIT pageSize

示例 (每页10条):
├── 第1页: SKIP 0 LIMIT 10
├── 第2页: SKIP 10 LIMIT 10
├── 第3页: SKIP 20 LIMIT 10
└── 第N页: SKIP (N-1)*10 LIMIT 10

六、聚合函数 #

6.1 COUNT计数 #

sql
SELECT COUNT(*) AS total FROM Person
SELECT COUNT(email) AS withEmail FROM Person
SELECT COUNT(DISTINCT city) AS cityCount FROM Person

6.2 SUM求和 #

sql
SELECT SUM(age) AS totalAge FROM Person
SELECT SUM(salary) AS totalSalary FROM Employee

6.3 AVG平均值 #

sql
SELECT AVG(age) AS avgAge FROM Person
SELECT AVG(salary) AS avgSalary FROM Employee WHERE department = 'IT'

6.4 MIN和MAX #

sql
SELECT MIN(age) AS minAge, MAX(age) AS maxAge FROM Person
SELECT MIN(salary) AS minSalary, MAX(salary) AS maxSalary FROM Employee

6.5 组合使用 #

sql
SELECT 
    COUNT(*) AS total,
    AVG(age) AS avgAge,
    MIN(age) AS minAge,
    MAX(age) AS maxAge
FROM Person

七、GROUP BY分组 #

7.1 基本分组 #

sql
SELECT city, COUNT(*) AS count FROM Person GROUP BY city
SELECT status, COUNT(*) AS count FROM Person GROUP BY status

7.2 多字段分组 #

sql
SELECT city, status, COUNT(*) AS count FROM Person GROUP BY city, status

7.3 分组聚合 #

sql
SELECT city, AVG(age) AS avgAge, COUNT(*) AS count 
FROM Person 
GROUP BY city

7.4 HAVING过滤 #

sql
SELECT city, COUNT(*) AS count 
FROM Person 
GROUP BY city 
HAVING COUNT(*) > 10

7.5 分组排序 #

sql
SELECT city, COUNT(*) AS count 
FROM Person 
GROUP BY city 
ORDER BY count DESC

八、使用函数 #

8.1 字符串函数 #

sql
SELECT 
    name,
    UPPER(name) AS upperName,
    LOWER(name) AS lowerName,
    LENGTH(name) AS nameLength,
    TRIM(name) AS trimmedName,
    SUBSTRING(name, 0, 3) AS shortName
FROM Person

8.2 数学函数 #

sql
SELECT 
    price,
    ROUND(price, 2) AS roundedPrice,
    CEIL(price) AS ceilPrice,
    FLOOR(price) AS floorPrice,
    ABS(price - 100) AS diff
FROM Product

8.3 日期函数 #

sql
SELECT 
    createdAt,
    YEAR(createdAt) AS year,
    MONTH(createdAt) AS month,
    DAY(createdAt) AS day,
    HOUR(createdAt) AS hour
FROM Log

8.4 条件函数 #

sql
SELECT name, age,
    CASE 
        WHEN age < 18 THEN 'Minor'
        WHEN age < 60 THEN 'Adult'
        ELSE 'Senior'
    END AS ageGroup
FROM Person
sql
SELECT name, 
    IF(age >= 18, 'Adult', 'Minor') AS status,
    COALESCE(nickname, name, 'Unknown') AS displayName
FROM Person

九、链接查询 #

9.1 访问链接属性 #

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

9.2 链接条件 #

sql
SELECT FROM Person WHERE employer.name = 'ABC Corp'
SELECT FROM Person WHERE employer.address.city = 'Beijing'

9.3 集合链接 #

sql
SELECT name, friends.name AS friendNames FROM Person
SELECT name, SIZE(friends) AS friendCount FROM Person

十、集合查询 #

10.1 访问集合元素 #

sql
SELECT name, hobbies[0] AS firstHobby FROM Person
SELECT name, hobbies FROM Person WHERE 'coding' IN hobbies

10.2 集合条件 #

sql
SELECT FROM Person WHERE hobbies CONTAINS 'coding'
SELECT FROM Person WHERE hobbies CONTAINSALL ['coding', 'reading']
SELECT FROM Person WHERE hobbies CONTAINSANY ['coding', 'reading']

10.3 集合大小 #

sql
SELECT name, SIZE(hobbies) AS hobbyCount FROM Person
SELECT FROM Person WHERE SIZE(hobbies) > 3

10.4 MAP操作 #

sql
SELECT name, preferences['theme'] AS theme FROM Person
SELECT FROM Person WHERE preferences['theme'] = 'dark'

十一、子查询 #

11.1 WHERE子查询 #

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

11.2 FROM子查询 #

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

11.3 投影子查询 #

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

十二、元数据查询 #

12.1 查询RID #

sql
SELECT @rid, name FROM Person
SELECT FROM Person WHERE @rid = #12:0

12.2 查询类名 #

sql
SELECT @rid, @class, name FROM Person
SELECT FROM Person WHERE @class = 'Employee'

12.3 查询版本 #

sql
SELECT @rid, @version, name FROM Person

12.4 查询所有属性 #

sql
SELECT @this FROM Person WHERE name = 'Tom'
SELECT properties(@this) FROM Person WHERE @rid = #12:0

十三、查询优化 #

13.1 使用索引 #

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

13.2 限制结果集 #

sql
SELECT FROM Person WHERE city = 'Beijing' LIMIT 100

13.3 选择必要字段 #

sql
SELECT name, email FROM Person WHERE status = 'active'

13.4 避免全表扫描 #

sql
SELECT FROM Person WHERE @rid = #12:0
SELECT FROM Person WHERE email = 'tom@example.com'

十四、实际应用示例 #

14.1 用户列表查询 #

sql
SELECT 
    id,
    username,
    email,
    status,
    createdAt
FROM User
WHERE status = 'active'
ORDER BY createdAt DESC
LIMIT 20

14.2 统计查询 #

sql
SELECT 
    status,
    COUNT(*) AS count,
    AVG(age) AS avgAge
FROM User
GROUP BY status
ORDER BY count DESC

14.3 搜索查询 #

sql
SELECT FROM Person 
WHERE name LIKE '%Tom%' 
   OR email LIKE '%tom%'
ORDER BY name ASC
LIMIT 50

14.4 分页查询 #

sql
LET pageSize = 10;
LET pageNum = 1;
SELECT FROM Person 
WHERE status = 'active'
ORDER BY name ASC
SKIP ($pageNum - 1) * $pageSize 
LIMIT $pageSize

14.5 关联查询 #

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

十五、总结 #

基础查询要点:

操作 语法 说明
选择字段 SELECT field 指定返回字段
条件过滤 WHERE 过滤记录
排序 ORDER BY 结果排序
分页 SKIP/LIMIT 分页查询
聚合 COUNT/SUM/AVG 聚合计算
分组 GROUP BY 分组统计

下一步,让我们学习高级查询!

最后更新:2026-03-27