SQL语法基础 #
一、SQL概述 #
1.1 OrientDB SQL特点 #
OrientDB使用扩展SQL作为查询语言,具有以下特点:
text
OrientDB SQL特点:
├── 兼容标准SQL语法
├── 扩展图查询功能
├── 支持JSON格式
├── 支持嵌套查询
├── 支持模式匹配
└── 支持遍历操作
1.2 SQL语句分类 #
| 类别 | 语句 | 说明 |
|---|---|---|
| DDL | CREATE, ALTER, DROP, TRUNCATE | 数据定义 |
| DML | INSERT, UPDATE, DELETE | 数据操作 |
| DQL | SELECT, TRAVERSE | 数据查询 |
| DCL | GRANT, REVOKE | 权限控制 |
二、命名规范 #
2.1 标识符规则 #
text
命名规则:
├── 以字母或下划线开头
├── 可包含字母、数字、下划线
├── 区分大小写
├── 不能使用保留字
└── 建议使用有意义的名称
2.2 命名约定 #
| 类型 | 命名约定 | 示例 |
|---|---|---|
| Class | PascalCase | Person, OrderItem |
| Property | camelCase | firstName, orderDate |
| Index | idx_ClassName_Property | idx_Person_email |
| Edge | VERB_NOUN | WORKS_AT, KNOWS |
2.3 保留字 #
text
OrientDB保留字(部分):
├── SELECT, FROM, WHERE, INSERT
├── UPDATE, DELETE, CREATE, DROP
├── AND, OR, NOT, NULL, TRUE, FALSE
├── ORDER, BY, GROUP, HAVING, LIMIT
├── INDEX, CLASS, CLUSTER, DATABASE
└── VERTEX, EDGE, GRAPH, TRAVERSE
2.4 转义标识符 #
使用反引号转义:
sql
SELECT `from`, `to` FROM `Order`
CREATE CLASS `User-Profile`
三、数据类型 #
3.1 基本类型 #
| 类型 | 说明 | 示例 |
|---|---|---|
| STRING | 字符串 | ‘Hello’, “World” |
| INTEGER | 整数 | 42, -100 |
| LONG | 长整数 | 9223372036854775807L |
| FLOAT | 单精度浮点 | 3.14F |
| DOUBLE | 双精度浮点 | 3.14159265359 |
| BOOLEAN | 布尔值 | true, false |
| DATETIME | 日期时间 | ‘2024-01-15 10:30:00’ |
| DATE | 日期 | ‘2024-01-15’ |
| BINARY | 二进制数据 | base64编码 |
3.2 集合类型 #
| 类型 | 说明 | 示例 |
|---|---|---|
| LIST | 列表 | [1, 2, 3] |
| SET | 集合(唯一) | |
| MAP | 键值对 | |
| EMBEDDED | 嵌入文档 | |
| LINK | 链接(引用) | #12:0 |
| LINKLIST | 链接列表 | [#12:0, #12:1] |
| LINKSET | 链接集合 | |
| LINKMAP | 链接映射 |
3.3 特殊类型 #
| 类型 | 说明 | 示例 |
|---|---|---|
| RID | Record ID | #12:0 |
| NULL | 空值 | NULL |
| DECIMAL | 高精度小数 | 12345.6789 |
四、字面量 #
4.1 字符串字面量 #
sql
SELECT 'Hello World' AS message
SELECT "Double quotes" AS text
SELECT 'It''s a test' AS escaped
4.2 数字字面量 #
sql
SELECT 42 AS integer_value
SELECT 3.14 AS float_value
SELECT 100L AS long_value
SELECT 2.5F AS float_explicit
4.3 布尔字面量 #
sql
SELECT true AS is_active
SELECT false AS is_deleted
4.4 日期时间字面量 #
sql
SELECT DATE('2024-01-15') AS date_value
SELECT DATETIME('2024-01-15 10:30:00') AS datetime_value
4.5 NULL值 #
sql
SELECT NULL AS empty_value
SELECT name FROM Person WHERE email IS NULL
五、注释 #
5.1 单行注释 #
sql
SELECT * FROM Person
WHERE age > 18
5.2 多行注释 #
sql
SELECT * FROM Person
WHERE age > 18
AND status = 'active'
六、SELECT语句 #
6.1 基本语法 #
sql
SELECT [FROM] <target>
[WHERE <condition>]
[GROUP BY <field>]
[ORDER BY <field> [ASC|DESC]]
[LIMIT <maxRecords>]
[SKIP <skipRecords>]
6.2 选择所有字段 #
sql
SELECT * FROM Person
6.3 选择指定字段 #
sql
SELECT name, age FROM Person
6.4 使用别名 #
sql
SELECT name AS fullName, age AS userAge FROM Person
6.5 使用表达式 #
sql
SELECT name, age * 2 AS doubleAge FROM Person
SELECT name, UPPER(name) AS upperName FROM Person
6.6 DISTINCT去重 #
sql
SELECT DISTINCT city FROM Person
七、WHERE条件 #
7.1 比较运算符 #
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 等于 | age = 30 |
| !=, <> | 不等于 | age != 30 |
| > | 大于 | age > 18 |
| < | 小于 | age < 60 |
| >= | 大于等于 | age >= 18 |
| <= | 小于等于 | age <= 60 |
7.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'
7.3 范围查询 #
sql
SELECT * FROM Person WHERE age BETWEEN 18 AND 60
SELECT * FROM Person WHERE age IN (20, 30, 40)
SELECT * FROM Person WHERE name IN ['Tom', 'Jerry']
7.4 模糊匹配 #
sql
SELECT * FROM Person WHERE name LIKE 'T%'
SELECT * FROM Person WHERE name LIKE '%om%'
SELECT * FROM Person WHERE name LIKE '_om'
7.5 NULL判断 #
sql
SELECT * FROM Person WHERE email IS NULL
SELECT * FROM Person WHERE email IS NOT NULL
7.6 正则表达式 #
sql
SELECT * FROM Person WHERE name MATCHES '^[A-Z][a-z]+$'
八、ORDER BY排序 #
8.1 升序排序 #
sql
SELECT * FROM Person ORDER BY name ASC
SELECT * FROM Person ORDER BY name
8.2 降序排序 #
sql
SELECT * FROM Person ORDER BY age DESC
8.3 多字段排序 #
sql
SELECT * FROM Person ORDER BY city ASC, age DESC
九、LIMIT和SKIP #
9.1 LIMIT限制结果 #
sql
SELECT * FROM Person LIMIT 10
9.2 SKIP跳过记录 #
sql
SELECT * FROM Person SKIP 10 LIMIT 10
9.3 分页查询 #
sql
SELECT * FROM Person SKIP 0 LIMIT 10
SELECT * FROM Person SKIP 10 LIMIT 10
SELECT * FROM Person SKIP 20 LIMIT 10
十、运算符 #
10.1 算术运算符 #
| 运算符 | 说明 | 示例 |
|---|---|---|
| + | 加法 | age + 1 |
| - | 减法 | age - 1 |
| * | 乘法 | price * quantity |
| / | 除法 | total / count |
| % | 取模 | id % 10 |
10.2 字符串运算符 #
sql
SELECT firstName + ' ' + lastName AS fullName FROM Person
SELECT CONCAT(firstName, ' ', lastName) AS fullName FROM Person
10.3 集合运算符 #
sql
SELECT * FROM Person WHERE 'reading' IN hobbies
SELECT * FROM Person WHERE hobbies CONTAINS 'reading'
SELECT * FROM Person WHERE hobbies CONTAINSALL ['reading', 'coding']
SELECT * FROM Person WHERE hobbies CONTAINSANY ['reading', 'coding']
10.4 链接运算符 #
sql
SELECT * FROM Person WHERE @rid = #12:0
SELECT * FROM Person WHERE out('KNOWS') CONTAINS #13:0
十一、内置函数 #
11.1 字符串函数 #
| 函数 | 说明 | 示例 |
|---|---|---|
| UPPER() | 转大写 | UPPER(name) |
| LOWER() | 转小写 | LOWER(name) |
| LENGTH() | 字符串长度 | LENGTH(name) |
| TRIM() | 去除空格 | TRIM(name) |
| SUBSTRING() | 子字符串 | SUBSTRING(name, 0, 3) |
| REPLACE() | 替换 | REPLACE(name, ‘a’, ‘b’) |
| CONCAT() | 连接字符串 | CONCAT(a, b, c) |
11.2 数学函数 #
| 函数 | 说明 | 示例 |
|---|---|---|
| ABS() | 绝对值 | ABS(-5) |
| CEIL() | 向上取整 | CEIL(3.2) |
| FLOOR() | 向下取整 | FLOOR(3.8) |
| ROUND() | 四舍五入 | ROUND(3.5) |
| SQRT() | 平方根 | SQRT(16) |
| POW() | 幂运算 | POW(2, 3) |
| RANDOM() | 随机数 | RANDOM() |
11.3 日期函数 #
| 函数 | 说明 | 示例 |
|---|---|---|
| DATE() | 创建日期 | DATE(‘2024-01-15’) |
| DATETIME() | 创建日期时间 | DATETIME(‘2024-01-15 10:30:00’) |
| YEAR() | 提取年份 | YEAR(date) |
| MONTH() | 提取月份 | MONTH(date) |
| DAY() | 提取日 | DAY(date) |
| HOUR() | 提取小时 | HOUR(datetime) |
| MINUTE() | 提取分钟 | MINUTE(datetime) |
| SYSDATE() | 当前日期时间 | SYSDATE() |
11.4 聚合函数 #
| 函数 | 说明 | 示例 |
|---|---|---|
| COUNT() | 计数 | COUNT(*) |
| SUM() | 求和 | SUM(amount) |
| AVG() | 平均值 | AVG(age) |
| MIN() | 最小值 | MIN(age) |
| MAX() | 最大值 | MAX(age) |
| FIRST() | 第一个值 | FIRST(name) |
| LAST() | 最后一个值 | LAST(name) |
11.5 集合函数 #
| 函数 | 说明 | 示例 |
|---|---|---|
| SIZE() | 集合大小 | SIZE(hobbies) |
| ASSET() | 转集合 | ASSET(list) |
| ASLIST() | 转列表 | ASLIST(set) |
| ASMAP() | 转映射 | ASMAP(list) |
| UNIONALL() | 并集 | UNIONALL(a, b) |
| INTERSECT() | 交集 | INTERSECT(a, b) |
| DIFFERENCE() | 差集 | DIFFERENCE(a, b) |
十二、表达式 #
12.1 条件表达式 #
sql
SELECT name,
CASE
WHEN age < 18 THEN 'Minor'
WHEN age < 60 THEN 'Adult'
ELSE 'Senior'
END AS ageGroup
FROM Person
12.2 IF表达式 #
sql
SELECT name, IF(age >= 18, 'Adult', 'Minor') AS status FROM Person
12.3 COALESCE表达式 #
sql
SELECT COALESCE(nickname, name, 'Unknown') AS displayName FROM Person
12.4 NULLIF表达式 #
sql
SELECT NULLIF(score, 0) AS normalizedScore FROM Exam
十三、JSON支持 #
13.1 JSON字面量 #
sql
SELECT {'name': 'Tom', 'age': 30} AS person
13.2 访问JSON属性 #
sql
SELECT address.city FROM Person
SELECT address['city'] FROM Person
13.3 JSON函数 #
sql
SELECT JSON_FROM_RECORD(@this) FROM Person
SELECT JSON_FROM_SET(hobbies) FROM Person
十四、元数据查询 #
14.1 查询类信息 #
sql
SELECT FROM metadata:schema
SELECT FROM (SELECT classes FROM metadata:schema) WHERE name = 'Person'
14.2 查询索引信息 #
sql
SELECT FROM metadata:indexes
SELECT FROM metadata:indexManager
14.3 查询数据库信息 #
sql
SELECT FROM metadata:database
SELECT properties FROM metadata:database
14.4 特殊字段 #
| 字段 | 说明 |
|---|---|
| @rid | Record ID |
| @class | 类名 |
| @type | 记录类型 |
| @version | 版本号 |
| @size | 记录大小 |
| @this | 当前记录 |
十五、语句执行 #
15.1 批量执行 #
sql
BEGIN;
INSERT INTO Person SET name = 'Tom', age = 30;
INSERT INTO Person SET name = 'Jerry', age = 25;
COMMIT;
15.2 条件执行 #
sql
IF (SELECT COUNT(*) FROM Person WHERE name = 'Tom' = 0) {
INSERT INTO Person SET name = 'Tom', age = 30;
}
15.3 循环执行 #
sql
LET persons = SELECT FROM Person WHERE status = 'active';
FOREACH ($person IN $persons) {
UPDATE $person SET lastActive = sysdate();
}
十六、总结 #
SQL语法要点:
| 类别 | 要点 |
|---|---|
| 命名 | 遵循规范,使用有意义的名称 |
| 数据类型 | 了解基本类型和集合类型 |
| 查询 | 掌握SELECT、WHERE、ORDER BY |
| 函数 | 熟悉常用内置函数 |
| 表达式 | 灵活使用条件表达式 |
下一步,让我们学习数据类型详解!
最后更新:2026-03-27