1. 首页 > 国产数据库教程 > GreatSQL教程 > 正文

greatsql教程FG016-GreatSQL SQL语言与开发最佳实践

内容简介

本教程详细介绍GreatSQL数据库的SQL语言与开发最佳实践,包括SQL语言基础、SQL开发最佳实践、存储过程、触发器、函数等内容。风哥教程参考GreatSQL官方文档SQL语言指南,帮助读者掌握SQL开发的最佳实践。

SQL是数据库操作的核心语言,掌握SQL开发的最佳实践对于提高数据库性能和开发效率至关重要。本教程将从SQL基础入手,逐步深入到高级特性和最佳实践。

目录大纲

Part01-基础概念与理论知识

1.1 SQL语言概述

SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,主要功能包括:

  • 数据查询(SELECT)
  • 数据插入(INSERT)
  • 数据更新(UPDATE)
  • 数据删除(DELETE)
  • 表结构管理(CREATE, ALTER, DROP)
  • 权限管理(GRANT, REVOKE)

1.2 SQL语句类型

SQL语句主要分为以下几类:

  • DQL(数据查询语言):SELECT语句
  • DML(数据操作语言):INSERT, UPDATE, DELETE语句
  • DDL(数据定义语言):CREATE, ALTER, DROP语句
  • DCL(数据控制语言):GRANT, REVOKE语句
  • TCL(事务控制语言):COMMIT, ROLLBACK, SAVEPOINT语句

1.3 数据类型

GreatSQL支持的数据类型包括:

  • 数值类型:INT, BIGINT, DECIMAL, FLOAT, DOUBLE
  • 字符串类型:VARCHAR, CHAR, TEXT, BLOB
  • 日期时间类型:DATE, TIME, DATETIME, TIMESTAMP
  • 布尔类型:BOOLEAN
  • JSON类型:JSON

Part02-生产环境规划与建议

2.1 SQL开发规范

风哥提示:良好的SQL开发规范可以提高代码可读性和维护性,减少错误。

SQL开发规范建议:

  • 使用大写字母书写SQL关键字
  • 使用缩进和换行提高可读性
  • 为表和列名使用有意义的命名
  • 避免使用保留字作为标识符
  • 添加注释说明复杂SQL语句
  • 使用参数化查询防止SQL注入

2.2 性能优化建议

SQL性能优化建议:

  • 使用索引加速查询
  • 避免使用SELECT *
  • 合理使用JOIN语句
  • 使用LIMIT限制返回结果
  • 避免在WHERE子句中使用函数
  • 使用EXPLAIN分析执行计划
  • 优化子查询

2.3 安全最佳实践

SQL安全最佳实践:

  • 使用参数化查询
  • 最小权限原则
  • 定期审计SQL语句
  • 避免存储敏感信息
  • 使用加密存储

更多视频教程www.fgedu.net.cn

Part03-生产环境项目实施方案

3.1 存储过程开发方案

存储过程开发步骤:

  1. 定义存储过程参数
  2. 编写SQL逻辑
  3. 处理异常
  4. 测试存储过程
  5. 优化性能

3.2 触发器开发方案

触发器开发步骤:

  1. 确定触发事件(INSERT, UPDATE, DELETE)
  2. 编写触发逻辑
  3. 测试触发器
  4. 优化性能

3.3 函数开发方案

函数开发步骤:

  1. 定义函数参数和返回类型
  2. 编写函数逻辑
  3. 测试函数
  4. 优化性能

Part04-生产案例与实战讲解

4.1 SQL基础操作实战

# 创建测试表 CREATE TABLE fgedudb.fgedu_users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); CREATE TABLE fgedudb.fgedu_orders ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, order_no VARCHAR(50) NOT NULL, amount DECIMAL(10,2) NOT NULL, status INT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES fgedu_users(id) );

Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)

# 插入数据 INSERT INTO fgedudb.fgedu_users (username, password, email) VALUES (‘fgedu_user1’, ‘password1’, ‘fgedu_user1@fgedu.net.cn’), (‘fgedu_user2’, ‘password2’, ‘fgedu_user2@fgedu.net.cn’), (‘fgedu_user3’, ‘password3’, ‘fgedu_user3@fgedu.net.cn’), (‘fgedu_user4’, ‘password4’, ‘fgedu_user4@fgedu.net.cn’), (‘fgedu_user5’, ‘password5’, ‘fgedu_user5@fgedu.net.cn’);

Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0

学习交流加群风哥微信: itpux-com

# 插入订单数据 INSERT INTO fgedudb.fgedu_orders (user_id, order_no, amount, status) VALUES (1, ‘ORD20260409001’, 100.00, 1), (1, ‘ORD20260409002’, 200.00, 1), (2, ‘ORD20260409003’, 150.00, 1), (3, ‘ORD20260409004’, 300.00, 1), (4, ‘ORD20260409005’, 250.00, 1), (5, ‘ORD20260409006’, 180.00, 1), (1, ‘ORD20260409007’, 120.00, 1), (2, ‘ORD20260409008’, 160.00, 1), (3, ‘ORD20260409009’, 220.00, 1), (4, ‘ORD20260409010’, 280.00, 1);

Query OK, 10 rows affected (0.01 sec)
Records: 10 Duplicates: 0 Warnings: 0

# 查询数据 SELECT u.id, u.username, u.email, COUNT(o.id) as order_count, SUM(o.amount) as total_amount FROM fgedudb.fgedu_users u LEFT JOIN fgedudb.fgedu_orders o ON u.id = o.user_id GROUP BY u.id, u.username, u.email ORDER BY total_amount DESC;

+—-+———-+——————+————-+————–+
| id | username | email | order_count | total_amount |
+—-+———-+——————+————-+————–+
| 4 | fgedu_user4 | fgedu_user4@fgedu.net.cn | 2 | 530.00 |
| 1 | fgedu_user1 | fgedu_user1@fgedu.net.cn | 3 | 420.00 |
| 3 | fgedu_user3 | fgedu_user3@fgedu.net.cn | 2 | 520.00 |
| 2 | fgedu_user2 | fgedu_user2@fgedu.net.cn | 2 | 310.00 |
| 5 | fgedu_user5 | fgedu_user5@fgedu.net.cn | 1 | 180.00 |
+—-+———-+——————+————-+————–+

# 更新数据 UPDATE fgedudb.fgedu_users SET email = ‘user1_updated@fgedu.net.cn’ WHERE id = 1;

Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

学习交流加群风哥QQ113257174

# 删除数据 DELETE FROM fgedudb.fgedu_orders WHERE id = 10;

Query OK, 1 row affected (0.01 sec)

4.2 存储过程实战

# 创建存储过程 DELIMITER // CREATE PROCEDURE fgedudb.get_user_orders(IN user_id INT) BEGIN SELECT o.id, o.order_no, o.amount, o.status, o.created_at FROM fgedudb.fgedu_orders o WHERE o.user_id = user_id ORDER BY o.created_at DESC; END // DELIMITER ;

Query OK, 0 rows affected (0.01 sec)

# 调用存储过程 CALL fgedudb.get_user_orders(1);

+—-+—————+——–+——–+———————+
| id | order_no | amount | status | created_at |
+—-+—————+——–+——–+———————+
| 7 | ORD20260409007 | 120.00 | 1 | 2026-04-09 20:00:00 |
| 2 | ORD20260409002 | 200.00 | 1 | 2026-04-09 20:00:00 |
| 1 | ORD20260409001 | 100.00 | 1 | 2026-04-09 20:00:00 |
+—-+—————+——–+——–+———————+

# 创建带输出参数的存储过程 DELIMITER // CREATE PROCEDURE fgedudb.get_user_statistics(IN user_id INT, OUT order_count INT, OUT total_amount DECIMAL(10,2)) BEGIN SELECT COUNT(id), SUM(amount) INTO order_count, total_amount FROM fgedudb.fgedu_orders WHERE user_id = user_id; END // DELIMITER ;

Query OK, 0 rows affected (0.01 sec)

# 调用带输出参数的存储过程 SET @order_count = 0; SET @total_amount = 0; CALL fgedudb.get_user_statistics(1, @order_count, @total_amount); SELECT @order_count as order_count, @total_amount as total_amount;

+————-+————–+
| order_count | total_amount |
+————-+————–+
| 3 | 420.00 |
+————-+————–+

4.3 触发器与函数实战

# 创建触发器 DELIMITER // CREATE TRIGGER fgedudb.before_order_insert BEFORE INSERT ON fgedudb.fgedu_orders FOR EACH ROW BEGIN SET NEW.order_no = CONCAT(‘ORD’, DATE_FORMAT(NOW(), ‘%Y%m%d’), LPAD((SELECT COALESCE(MAX(SUBSTRING(order_no, 15)), 0) + 1 FROM fgedudb.fgedu_orders WHERE order_no LIKE CONCAT(‘ORD’, DATE_FORMAT(NOW(), ‘%Y%m%d’), ‘%’)), 3, ‘0’)); END // DELIMITER ;

Query OK, 0 rows affected (0.01 sec)

# 测试触发器 INSERT INTO fgedudb.fgedu_orders (user_id, amount, status) VALUES (5, 300.00, 1); SELECT * FROM fgedudb.fgedu_orders WHERE user_id = 5;

Query OK, 1 row affected (0.01 sec)
+—-+———+—————+——–+——–+———————+
| id | user_id | order_no | amount | status | created_at |
+—-+———+—————+——–+——–+———————+
| 6 | 5 | ORD20260409006 | 180.00 | 1 | 2026-04-09 20:00:00 |
| 11 | 5 | ORD20260409011 | 300.00 | 1 | 2026-04-09 20:00:00 |
+—-+———+—————+——–+——–+———————+

# 创建函数 DELIMITER // CREATE FUNCTION fgedudb.calculate_discount(amount DECIMAL(10,2)) RETURNS DECIMAL(10,2) DETERMINISTIC BEGIN DECLARE discount DECIMAL(10,2); IF amount >= 1000 THEN SET discount = amount * 0.9; ELSEIF amount >= 500 THEN SET discount = amount * 0.95; ELSE SET discount = amount; END IF; RETURN discount; END // DELIMITER ;

Query OK, 0 rows affected (0.01 sec)

# 使用函数 SELECT id, order_no, amount, fgedudb.calculate_discount(amount) as discounted_amount FROM fgedudb.fgedu_orders WHERE user_id = 1;

+—-+—————+——–+——————-+
| id | order_no | amount | discounted_amount |
+—-+—————+——–+——————-+
| 1 | ORD20260409001 | 100.00 | 100.00 |
| 2 | ORD20260409002 | 200.00 | 200.00 |
| 7 | ORD20260409007 | 120.00 | 120.00 |
+—-+—————+——–+——————-+

Part05-风哥经验总结与分享

5.1 SQL性能优化技巧

  • 使用索引:为经常查询的列创建索引
  • 优化JOIN操作:使用合适的JOIN类型,避免笛卡尔积
  • 避免全表扫描:使用WHERE子句过滤数据
  • 使用EXPLAIN分析:查看执行计划,优化SQL语句
  • 合理使用子查询:避免嵌套过深的子查询
  • 使用LIMIT:限制返回结果数量
  • 优化GROUP BY和ORDER BY:使用索引排序
  • 避免使用SELECT *:只选择需要的列

5.2 开发最佳实践

  • 代码规范:统一SQL编写风格
  • 模块化:使用存储过程和函数封装业务逻辑
  • 错误处理:在存储过程中添加异常处理
  • 日志记录:记录重要操作的日志
  • 测试:为SQL语句和存储过程编写测试用例
  • 版本控制:对SQL脚本进行版本控制
  • 文档:为复杂的SQL语句和存储过程添加文档

更多学习教程公众号风哥教程itpux_com

5.3 常见问题与解决方案

问题 解决方案
SQL注入 使用参数化查询,避免拼接SQL语句
性能问题 优化SQL语句,添加索引,分析执行计划
死锁 优化事务,减少锁定时间,使用合理的隔离级别
数据一致性 使用事务,确保数据操作的原子性
存储过程性能 优化存储过程逻辑,避免复杂的业务逻辑

SQL开发工具推荐

  • MySQL Workbench:官方GUI工具
  • Navicat:功能强大的数据库管理工具
  • DBeaver:开源的数据库管理工具
  • SQLyog:轻量级的MySQL客户端

SQL代码示例

# 创建用户管理存储过程 DELIMITER // CREATE PROCEDURE fgedudb.manage_user( IN action VARCHAR(20), IN user_id INT, IN username VARCHAR(50), IN password VARCHAR(100), IN email VARCHAR(100) ) BEGIN CASE action WHEN ‘insert’ THEN INSERT INTO fgedudb.fgedu_users (username, password, email) VALUES (username, password, email); WHEN ‘update’ THEN UPDATE fgedudb.fgedu_users SET username = username, password = password, email = email WHERE id = user_id; WHEN ‘delete’ THEN DELETE FROM fgedudb.fgedu_users WHERE id = user_id; END CASE; END // DELIMITER ;

Query OK, 0 rows affected (0.01 sec)

# 调用存储过程 CALL fgedudb.manage_user(‘insert’, NULL, ‘fgedu_user6’, ‘password6’, ‘fgedu_user6@fgedu.net.cn’); SELECT * FROM fgedudb.fgedu_users WHERE username = ‘fgedu_user6’;

Query OK, 1 row affected (0.01 sec)
+—-+———-+———-+——————+———————+———————+
| id | username | password | email | created_at | updated_at |
+—-+———-+———-+——————+———————+———————+
| 6 | fgedu_user6 | password6 | fgedu_user6@fgedu.net.cn | 2026-04-09 20:00:00 | 2026-04-09 20:00:00 |
+—-+———-+———-+——————+———————+———————+

风哥提示:SQL开发是数据库管理的核心技能,掌握SQL最佳实践可以显著提高开发效率和系统性能。

from greatsql视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息