MariaDB基础语法 #

一、SQL语句基础 #

1.1 语句结构 #

sql
-- SQL语句基本结构
SELECT column_name
FROM table_name
WHERE condition;

-- 语句以分号结尾
-- 不区分大小写(关键字)
-- 空格和换行不影响执行

1.2 语句分类 #

text
SQL语句分类
├── DDL(数据定义语言)
│   ├── CREATE - 创建
│   ├── ALTER - 修改
│   ├── DROP - 删除
│   └── TRUNCATE - 清空
├── DML(数据操作语言)
│   ├── SELECT - 查询
│   ├── INSERT - 插入
│   ├── UPDATE - 更新
│   └── DELETE - 删除
├── DCL(数据控制语言)
│   ├── GRANT - 授权
│   └── REVOKE - 撤销
└── TCL(事务控制语言)
    ├── START TRANSACTION - 开始事务
    ├── COMMIT - 提交
    ├── ROLLBACK - 回滚
    └── SAVEPOINT - 保存点

二、注释 #

2.1 单行注释 #

sql
-- 这是单行注释(推荐)
SELECT * FROM users;

# 这也是单行注释(MySQL兼容)
SELECT * FROM users;

2.2 多行注释 #

sql
/*
 * 这是多行注释
 * 可以跨越多行
 * 用于详细说明
 */
SELECT * FROM users;

/* 单行块注释 */
SELECT * FROM users;

2.3 注释最佳实践 #

sql
-- 文件头注释
/*
 * 文件名: user_queries.sql
 * 描述: 用户相关查询
 * 作者: developer
 * 日期: 2024-01-15
 * 版本: 1.0
 */

-- 函数注释
-- 获取用户总数
-- 参数: status - 用户状态(可选)
-- 返回: 用户数量
SELECT COUNT(*) FROM users WHERE status = 1;

-- 复杂查询注释
SELECT 
    u.id,
    u.name,
    -- 计算用户订单总数
    (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) AS order_count
FROM users u
WHERE 
    -- 只查询活跃用户
    u.status = 1
    -- 注册时间在一年内
    AND u.created_at >= DATE_SUB(NOW(), INTERVAL 1 YEAR);

三、标识符 #

3.1 命名规则 #

sql
-- 合法的标识符
CREATE TABLE users (
    id INT,
    user_name VARCHAR(50),
    user_email VARCHAR(100)
);

-- 以字母或下划线开头
CREATE TABLE _temp_table (id INT);
CREATE TABLE user_info (id INT);

-- 可以包含数字(不能以数字开头)
CREATE TABLE user2 (id INT);
CREATE TABLE table_2024 (id INT);

-- 区分大小写取决于操作系统
-- Linux: 区分大小写
-- Windows: 不区分大小写
-- macOS: 取决于文件系统

3.2 特殊字符处理 #

sql
-- 使用反引号包含特殊字符
CREATE TABLE `user-info` (
    `user-id` INT,
    `user name` VARCHAR(50)
);

-- 包含关键字的标识符
CREATE TABLE `order` (
    `select` INT,
    `from` VARCHAR(50),
    `where` TEXT
);

-- 推荐做法:避免使用关键字和特殊字符
CREATE TABLE orders (
    select_id INT,
    from_address VARCHAR(50),
    where_clause TEXT
);

3.3 命名规范 #

sql
-- 推荐命名规范

-- 表名:小写,下划线分隔,复数形式
CREATE TABLE users (id INT);
CREATE TABLE order_items (id INT);
CREATE TABLE product_categories (id INT);

-- 列名:小写,下划线分隔
CREATE TABLE users (
    user_id INT,
    first_name VARCHAR(50),
    created_at DATETIME
);

-- 主键:id 或 表名_id
CREATE TABLE users (
    id INT PRIMARY KEY,
    -- 或
    user_id INT PRIMARY KEY
);

-- 外键:关联表名_id
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 布尔字段:is_xxx, has_xxx
CREATE TABLE users (
    is_active BOOLEAN,
    has_verified BOOLEAN
);

-- 日期时间:xxx_at, xxx_date
CREATE TABLE users (
    created_at DATETIME,
    updated_at DATETIME,
    birth_date DATE
);

四、关键字 #

4.1 保留关键字 #

sql
-- MariaDB保留关键字(部分)
-- ADD, ALL, ALTER, AND, AS, ASC, BETWEEN, BY
-- CASE, CREATE, DATABASE, DEFAULT, DELETE, DESC
-- DISTINCT, DROP, ELSE, EXISTS, FROM, GROUP, HAVING
-- IN, INDEX, INSERT, INTO, IS, JOIN, KEY, LIKE
-- LIMIT, NOT, NULL, ON, OR, ORDER, SELECT, SET
-- TABLE, THEN, UNION, UPDATE, VALUES, WHERE

-- 使用保留关键字作为标识符需要反引号
CREATE TABLE `table` (
    `select` INT,
    `from` VARCHAR(50),
    `where` TEXT
);

4.2 非保留关键字 #

sql
-- 非保留关键字可以直接使用
CREATE TABLE status (
    name VARCHAR(50),
    value INT
);

-- 但建议避免使用
CREATE TABLE user_status (
    status_name VARCHAR(50),
    status_value INT
);

4.3 大小写规则 #

sql
-- 关键字不区分大小写
SELECT * FROM users;
select * from users;
Select * From Users;

-- 标识符大小写取决于系统设置
-- 查看设置
SHOW VARIABLES LIKE 'lower_case_table_names';

-- lower_case_table_names = 0: 区分大小写(Linux默认)
-- lower_case_table_names = 1: 不区分,存储为小写(Windows默认)
-- lower_case_table_names = 2: 不区分,保留原样(macOS默认)

-- 推荐做法:统一使用小写
CREATE TABLE users (id INT);
SELECT * FROM users;

五、数据类型 #

5.1 数值类型 #

sql
-- 整数类型
CREATE TABLE numbers (
    tiny_col TINYINT,        -- 1字节,-128到127
    small_col SMALLINT,      -- 2字节,-32768到32767
    medium_col MEDIUMINT,    -- 3字节
    int_col INT,             -- 4字节
    bigint_col BIGINT        -- 8字节
);

-- 无符号整数
CREATE TABLE unsigned_numbers (
    positive_int INT UNSIGNED
);

-- 浮点类型
CREATE TABLE floats (
    float_col FLOAT,         -- 单精度
    double_col DOUBLE        -- 双精度
);

-- 定点类型
CREATE TABLE decimals (
    price DECIMAL(10, 2)     -- 10位,2位小数
);

5.2 字符串类型 #

sql
-- 定长字符串
CREATE TABLE fixed_strings (
    code CHAR(10),           -- 固定10字符
    status CHAR(1)           -- 固定1字符
);

-- 变长字符串
CREATE TABLE variable_strings (
    name VARCHAR(100),       -- 最多100字符
    description TEXT         -- 长文本
);

-- 二进制数据
CREATE TABLE binary_data (
    data BLOB
);

5.3 日期时间类型 #

sql
-- 日期时间类型
CREATE TABLE dates (
    birth_date DATE,                    -- 日期
    meeting_time TIME,                  -- 时间
    created_at DATETIME,                -- 日期时间
    updated_at TIMESTAMP,               -- 时间戳
    publish_year YEAR                   -- 年份
);

-- 自动更新
CREATE TABLE auto_dates (
    id INT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

5.4 其他类型 #

sql
-- 布尔类型
CREATE TABLE flags (
    is_active BOOLEAN,      -- TINYINT(1)别名
    is_deleted BOOL         -- 同上
);

-- 枚举类型
CREATE TABLE status_table (
    status ENUM('active', 'inactive', 'pending')
);

-- 集合类型
CREATE TABLE tags_table (
    tags SET('tag1', 'tag2', 'tag3', 'tag4')
);

-- JSON类型
CREATE TABLE json_data (
    data JSON
);

六、运算符 #

6.1 算术运算符 #

sql
SELECT 10 + 5;    -- 加法:15
SELECT 10 - 5;    -- 减法:5
SELECT 10 * 5;    -- 乘法:50
SELECT 10 / 5;    -- 除法:2.0000
SELECT 10 DIV 5;  -- 整除:2
SELECT 10 % 3;    -- 取模:1
SELECT 10 MOD 3;  -- 取模:1
SELECT -5;        -- 负号:-5

6.2 比较运算符 #

sql
-- 等于
SELECT 1 = 1;     -- 1 (true)
SELECT 1 <=> 1;   -- 1 (安全等于,支持NULL比较)

-- 不等于
SELECT 1 != 2;    -- 1
SELECT 1 <> 2;    -- 1

-- 大于、小于
SELECT 2 > 1;     -- 1
SELECT 1 < 2;     -- 1
SELECT 2 >= 2;    -- 1
SELECT 1 <= 1;    -- 1

-- NULL判断
SELECT NULL IS NULL;        -- 1
SELECT 1 IS NOT NULL;       -- 1
SELECT NULL <=> NULL;       -- 1

-- BETWEEN
SELECT 5 BETWEEN 1 AND 10;  -- 1

-- IN
SELECT 1 IN (1, 2, 3);      -- 1

-- LIKE
SELECT 'hello' LIKE 'h%';   -- 1

-- REGEXP
SELECT 'hello' REGEXP '^h'; -- 1

6.3 逻辑运算符 #

sql
-- AND
SELECT 1 AND 1;   -- 1
SELECT 1 AND 0;   -- 0

-- OR
SELECT 1 OR 0;    -- 1
SELECT 0 OR 0;    -- 0

-- NOT
SELECT NOT 0;     -- 1
SELECT NOT 1;     -- 0

-- XOR
SELECT 1 XOR 0;   -- 1
SELECT 1 XOR 1;   -- 0

6.4 位运算符 #

sql
-- 按位与
SELECT 5 & 3;     -- 1 (0101 & 0011 = 0001)

-- 按位或
SELECT 5 | 3;     -- 7 (0101 | 0011 = 0111)

-- 按位异或
SELECT 5 ^ 3;     -- 6 (0101 ^ 0011 = 0110)

-- 按位取反
SELECT ~5;        -- -6

-- 左移
SELECT 1 << 2;    -- 4

-- 右移
SELECT 4 >> 1;    -- 2

七、表达式 #

7.1 算术表达式 #

sql
SELECT 
    price,
    quantity,
    price * quantity AS total,
    price * quantity * 0.9 AS discounted_total
FROM products;

7.2 字符串表达式 #

sql
-- 字符串连接
SELECT CONCAT('Hello', ' ', 'World');  -- Hello World

-- 使用CONCAT_WS
SELECT CONCAT_WS('-', '2024', '01', '15');  -- 2024-01-15

-- 字符串函数
SELECT 
    UPPER('hello'),      -- HELLO
    LOWER('HELLO'),      -- hello
    LENGTH('hello'),     -- 5
    SUBSTRING('hello', 1, 3);  -- hel

7.3 条件表达式 #

sql
-- CASE WHEN
SELECT 
    name,
    score,
    CASE 
        WHEN score >= 90 THEN 'A'
        WHEN score >= 80 THEN 'B'
        WHEN score >= 70 THEN 'C'
        WHEN score >= 60 THEN 'D'
        ELSE 'F'
    END AS grade
FROM students;

-- IF函数
SELECT 
    name,
    IF(score >= 60, 'Pass', 'Fail') AS result
FROM students;

-- IFNULL
SELECT IFNULL(NULL, 'default');  -- default

-- NULLIF
SELECT NULLIF(1, 1);  -- NULL
SELECT NULLIF(1, 2);  -- 1

7.4 日期表达式 #

sql
-- 日期计算
SELECT 
    NOW(),
    DATE_ADD(NOW(), INTERVAL 7 DAY),
    DATE_SUB(NOW(), INTERVAL 1 MONTH),
    DATEDIFF('2024-12-31', '2024-01-01');

-- 日期格式化
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');

-- 提取日期部分
SELECT 
    YEAR(NOW()),
    MONTH(NOW()),
    DAY(NOW()),
    HOUR(NOW()),
    MINUTE(NOW());

八、字面量 #

8.1 字符串字面量 #

sql
-- 单引号
SELECT 'Hello World';

-- 双引号(需要SQL模式支持)
SELECT "Hello World";

-- 转义字符
SELECT 'It\'s a test';
SELECT "He said \"Hello\"";

-- 转义序列
SELECT 'Line1\nLine2';     -- 换行
SELECT 'Tab\there';        -- 制表符

-- 十六进制
SELECT 0x48656C6C6F;       -- Hello
SELECT X'48656C6C6F';      -- Hello

8.2 数值字面量 #

sql
-- 整数
SELECT 123;
SELECT -123;

-- 浮点数
SELECT 3.14;
SELECT -3.14;

-- 科学计数法
SELECT 1.5E2;    -- 150
SELECT 1.5E-2;   -- 0.015

-- 十六进制
SELECT 0xFF;     -- 255

8.3 日期时间字面量 #

sql
-- 日期
SELECT DATE '2024-01-15';
SELECT '2024-01-15';

-- 时间
SELECT TIME '10:30:00';
SELECT '10:30:00';

-- 日期时间
SELECT TIMESTAMP '2024-01-15 10:30:00';
SELECT '2024-01-15 10:30:00';

8.4 布尔字面量 #

sql
SELECT TRUE, FALSE;     -- 1, 0
SELECT true, false;     -- 1, 0
SELECT TRUE IS TRUE;    -- 1
SELECT FALSE IS FALSE;  -- 1

8.5 NULL值 #

sql
-- NULL表示未知或缺失
SELECT NULL;

-- NULL运算结果都是NULL
SELECT NULL + 1;        -- NULL
SELECT NULL = NULL;     -- NULL
SELECT NULL <=> NULL;   -- 1

-- 判断NULL
SELECT NULL IS NULL;    -- 1
SELECT 1 IS NOT NULL;   -- 1

九、变量 #

9.1 用户变量 #

sql
-- 定义用户变量(会话级别)
SET @name = 'John';
SET @age = 30;
SET @total = (SELECT COUNT(*) FROM users);

-- 使用变量
SELECT @name, @age;
SELECT * FROM users WHERE name = @name;

-- 计算并赋值
SELECT @total := COUNT(*) FROM users;
SELECT @rank := @rank + 1 AS rank, name FROM users, (SELECT @rank := 0) r;

9.2 局部变量 #

sql
-- 在存储过程中使用
DELIMITER //
CREATE PROCEDURE test_variables()
BEGIN
    DECLARE local_name VARCHAR(50) DEFAULT 'Default';
    DECLARE local_count INT;
    
    SET local_count = (SELECT COUNT(*) FROM users);
    
    SELECT local_name, local_count;
END //
DELIMITER ;

9.3 系统变量 #

sql
-- 查看系统变量
SHOW VARIABLES;
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'character%';

-- 会话级修改
SET SESSION sql_mode = 'STRICT_ALL_TABLES';

-- 全局级修改
SET GLOBAL max_connections = 500;

-- 查看状态
SHOW STATUS;
SHOW STATUS LIKE 'Threads%';

十、SQL模式 #

10.1 查看SQL模式 #

sql
-- 查看当前SQL模式
SELECT @@sql_mode;

-- 查看全局SQL模式
SELECT @@GLOBAL.sql_mode;

-- 查看会话SQL模式
SELECT @@SESSION.sql_mode;

10.2 常用SQL模式 #

sql
-- 设置SQL模式
SET sql_mode = 'STRICT_TRANS_TABLES';

-- 多个模式
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE';

-- 常用模式说明
-- STRICT_TRANS_TABLES: 严格模式,非法值报错
-- NO_ZERO_IN_DATE: 不允许日期中有0
-- NO_ZERO_DATE: 不允许0000-00-00日期
-- ONLY_FULL_GROUP_BY: GROUP BY必须包含所有非聚合列
-- NO_ENGINE_SUBSTITUTION: 禁用引擎替换

10.3 宽松与严格模式 #

sql
-- 宽松模式
SET sql_mode = '';

-- 严格模式
SET sql_mode = 'STRICT_TRANS_TABLES';

-- 示例对比
CREATE TABLE test_strict (
    id INT PRIMARY KEY,
    name VARCHAR(5)
);

-- 宽松模式:截断数据,警告
INSERT INTO test_strict VALUES (1, 'Hello World');
-- Query OK, 1 row affected, 1 warning

-- 严格模式:报错
SET sql_mode = 'STRICT_TRANS_TABLES';
INSERT INTO test_strict VALUES (2, 'Hello World');
-- ERROR: Data too long for column 'name'

十一、语句分隔符 #

11.1 默认分隔符 #

sql
-- 默认使用分号作为语句分隔符
SELECT * FROM users;
SELECT * FROM orders;

11.2 修改分隔符 #

sql
-- 修改分隔符(用于存储过程、触发器等)
DELIMITER //

CREATE PROCEDURE get_users()
BEGIN
    SELECT * FROM users;
    SELECT * FROM orders;
END //

DELIMITER ;

-- 调用存储过程
CALL get_users();

十二、总结 #

语法要点:

类别 要点
注释 单行(–, #),多行(/* */)
标识符 字母或下划线开头,避免关键字
关键字 不区分大小写,建议大写
数据类型 数值、字符串、日期、JSON等
运算符 算术、比较、逻辑、位运算
表达式 算术、字符串、条件、日期
变量 用户变量(@),局部变量(DECLARE)
SQL模式 控制服务器行为

下一步,让我们学习MariaDB数据类型!

最后更新:2026-03-27