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

GoldenDB教程FG009-GoldenDB SQL语言与开发

内容简介

本教程详细介绍GoldenDB数据库的SQL语言与开发方法,帮助读者掌握GoldenDB的SQL语法和开发技巧。风哥教程参考GoldenDB官方文档SQL语言与开发相关内容。

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

目录大纲

Part01-基础概念与理论知识

1.1 SQL语言概述

SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,包括数据定义、数据操作、数据查询和数据控制等功能。GoldenDB支持标准SQL语法,并提供了一些扩展功能。

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

1.2 GoldenDB SQL特性

GoldenDB的SQL特性包括:

  • 标准兼容:支持SQL92/99/2003标准
  • MySQL兼容:兼容MySQL 5.7/8.0语法
  • Oracle兼容:支持部分Oracle语法
  • 分布式支持:支持分布式事务和分布式查询
  • 高级特性:支持存储过程、触发器、视图等

1.3 开发环境搭建

搭建GoldenDB开发环境:

# 安装MySQL客户端

yum install -y mysql

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

Package mysql-8.0.28-1.module+el8.5.0+13076+5d81699d.x86_64 already installed and latest version

Nothing to do

# 连接GoldenDB

mysql -h 192.168.1.10 -P 3306 -u fgedu -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 8.0.0 GoldenDB Community Edition

mysql>

风哥提示:GoldenDB兼容MySQL客户端,可以使用MySQL客户端工具连接GoldenDB进行开发。

Part02-SQL语言基础

2.1 DDL语句

DDL(Data Definition Language)语句用于定义数据库结构,包括创建、修改和删除数据库对象:

# 创建数据库

CREATE DATABASE fgedudb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Query OK, 1 row affected (0.01 sec)

# 创建表

CREATE TABLE fgedudb.fgedu_test (

id INT PRIMARY KEY AUTO_INCREMENT,

name VARCHAR(100) NOT NULL,

age INT,

create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

Query OK, 0 rows affected (0.02 sec)

# 修改表

ALTER TABLE fgedudb.fgedu_test ADD COLUMN email VARCHAR(100);

Query OK, 0 rows affected (0.01 sec)

# 删除表

DROP TABLE fgedudb.fgedu_test;

Query OK, 0 rows affected (0.01 sec)

2.2 DML语句

DML(Data Manipulation Language)语句用于操作数据,包括插入、更新、删除和查询:

# 插入数据

INSERT INTO fgedudb.fgedu_test (name, age, email) VALUES (‘fgedu_user1’, 20, ‘user1@fgedu.net.cn’);

Query OK, 1 row affected (0.00 sec)

# 批量插入

INSERT INTO fgedudb.fgedu_test (name, age, email) VALUES

(‘fgedu_user2’, 21, ‘user2@fgedu.net.cn’),

(‘fgedu_user3’, 22, ‘user3@fgedu.net.cn’),

(‘fgedu_user4’, 23, ‘user4@fgedu.net.cn’),

(‘fgedu_user5’, 24, ‘user5@fgedu.net.cn’);

Query OK, 4 rows affected (0.00 sec)

Records: 4 Duplicates: 0 Warnings: 0

# 更新数据

UPDATE fgedudb.fgedu_test SET age = 25 WHERE id = 1;

Query OK, 1 row affected (0.00 sec)

# 删除数据

DELETE FROM fgedudb.fgedu_test WHERE id = 5;

Query OK, 1 row affected (0.00 sec)

2.3 查询语句

查询语句用于从数据库中检索数据:

# 基本查询

SELECT * FROM fgedudb.fgedu_test;

+—-+————+—–+———————-+———————+

| id | name | age | email | create_time |

+—-+————+—–+———————-+———————+

| 1 | fgedu_user1| 25 | user1@fgedu.net.cn | 2024-01-01 10:00:00 |

| 2 | fgedu_user2| 21 | user2@fgedu.net.cn | 2024-01-01 10:00:00 |

| 3 | fgedu_user3| 22 | user3@fgedu.net.cn | 2024-01-01 10:00:00 |

| 4 | fgedu_user4| 23 | user4@fgedu.net.cn | 2024-01-01 10:00:00 |

+—-+————+—–+———————-+———————+

# 条件查询

SELECT * FROM fgedudb.fgedu_test WHERE age > 22;

+—-+————+—–+———————-+———————+

| id | name | age | email | create_time |

+—-+————+—–+———————-+———————+

| 1 | fgedu_user1| 25 | user1@fgedu.net.cn | 2024-01-01 10:00:00 |

| 4 | fgedu_user4| 23 | user4@fgedu.net.cn | 2024-01-01 10:00:00 |

+—-+————+—–+———————-+———————+

# 排序查询

SELECT * FROM fgedudb.fgedu_test ORDER BY age DESC;

+—-+————+—–+———————-+———————+

| id | name | age | email | create_time |

+—-+————+—–+———————-+———————+

| 1 | fgedu_user1| 25 | user1@fgedu.net.cn | 2024-01-01 10:00:00 |

| 4 | fgedu_user4| 23 | user4@fgedu.net.cn | 2024-01-01 10:00:00 |

| 3 | fgedu_user3| 22 | user3@fgedu.net.cn | 2024-01-01 10:00:00 |

| 2 | fgedu_user2| 21 | user2@fgedu.net.cn | 2024-01-01 10:00:00 |

+—-+————+—–+———————-+———————+

# 分组查询

SELECT age, COUNT(*) FROM fgedudb.fgedu_test GROUP BY age;

+—–+———-+

| age | COUNT(*) |

+—–+———-+

| 21 | 1 |

| 22 | 1 |

| 23 | 1 |

| 25 | 1 |

+—–+———-+

2.4 事务管理

事务管理用于确保数据的一致性和完整性:

# 开始事务

START TRANSACTION;

Query OK, 0 rows affected (0.00 sec)

# 执行操作

INSERT INTO fgedudb.fgedu_test (name, age, email) VALUES (‘fgedu_user6’, 26, ‘user6@fgedu.net.cn’);

Query OK, 1 row affected (0.00 sec)

UPDATE fgedudb.fgedu_test SET age = 27 WHERE id = 1;

Query OK, 1 row affected (0.00 sec)

# 提交事务

COMMIT;

Query OK, 0 rows affected (0.01 sec)

# 开始事务

START TRANSACTION;

Query OK, 0 rows affected (0.00 sec)

# 执行操作

DELETE FROM fgedudb.fgedu_test WHERE id = 6;

Query OK, 1 row affected (0.00 sec)

# 回滚事务

ROLLBACK;

Query OK, 0 rows affected (0.01 sec)

学习交流加群风哥QQ113257174

Part03-高级SQL开发

3.1 存储过程

存储过程是一组预编译的SQL语句,可以重复执行:

# 创建存储过程

DELIMITER //

CREATE PROCEDURE fgedudb.sp_insert_user(IN p_name VARCHAR(100), IN p_age INT, IN p_email VARCHAR(100))

BEGIN

INSERT INTO fgedudb.fgedu_test (name, age, email) VALUES (p_name, p_age, p_email);

END //

DELIMITER ;

Query OK, 0 rows affected (0.01 sec)

# 调用存储过程

CALL fgedudb.sp_insert_user(‘fgedu_user7’, 28, ‘user7@fgedu.net.cn’);

Query OK, 1 row affected (0.00 sec)

# 查看存储过程

SHOW CREATE PROCEDURE fgedudb.sp_insert_user;

+————-+—————-+————————————————————————————————————————————————————————————————-+———————-+———————-+——————–+

| Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation |

+————-+—————-+————————————————————————————————————————————————————————————————-+———————-+———————-+——————–+

| sp_insert_user | STRICT_TRANS_TABLES | CREATE DEFINER=`root`@`%` PROCEDURE `sp_insert_user`(IN p_name VARCHAR(100), IN p_age INT, IN p_email VARCHAR(100))
BEGIN
INSERT INTO fgedudb.fgedu_test (name, age, email) VALUES (p_name, p_age, p_email);
END | utf8mb4 | utf8mb4_unicode_ci | utf8mb4_unicode_ci |

+————-+—————-+————————————————————————————————————————————————————————————————-+———————-+———————-+——————–+

3.2 触发器

触发器是在特定事件发生时自动执行的SQL语句:

# 创建触发器

DELIMITER //

CREATE TRIGGER fgedudb.trg_before_insert_user

BEFORE INSERT ON fgedudb.fgedu_test

FOR EACH ROW

BEGIN

SET NEW.create_time = NOW();

END //

DELIMITER ;

Query OK, 0 rows affected (0.01 sec)

# 测试触发器

INSERT INTO fgedudb.fgedu_test (name, age, email) VALUES (‘fgedu_user8’, 29, ‘user8@fgedu.net.cn’);

Query OK, 1 row affected (0.00 sec)

# 查看结果

SELECT * FROM fgedudb.fgedu_test WHERE id = LAST_INSERT_ID();

+—-+————+—–+———————-+———————+

| id | name | age | email | create_time |

+—-+————+—–+———————-+———————+

| 8 | fgedu_user8| 29 | user8@fgedu.net.cn | 2024-01-01 10:30:00 |

+—-+————+—–+———————-+———————+

3.3 视图

视图是虚拟表,基于查询结果:

# 创建视图

CREATE VIEW fgedudb.vw_user_info AS

SELECT id, name, age FROM fgedudb.fgedu_test;

Query OK, 0 rows affected (0.01 sec)

# 查询视图

SELECT * FROM fgedudb.vw_user_info;

+—-+————+—–+

| id | name | age |

+—-+————+—–+

| 1 | fgedu_user1| 27 |

| 2 | fgedu_user2| 21 |

| 3 | fgedu_user3| 22 |

| 4 | fgedu_user4| 23 |

| 6 | fgedu_user6| 26 |

| 7 | fgedu_user7| 28 |

| 8 | fgedu_user8| 29 |

+—-+————+—–+

3.4 索引优化

索引用于提高查询性能:

# 创建索引

CREATE INDEX idx_age ON fgedudb.fgedu_test(age);

Query OK, 0 rows affected (0.01 sec)

# 查看索引

SHOW INDEX FROM fgedudb.fgedu_test;

+———-+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+

| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+———-+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+

| fgedu_test | 0 | PRIMARY | 1 | id | A | 7 | NULL | NULL | | BTREE | | |

| fgedu_test | 1 | idx_age | 1 | age | A | 7 | NULL | NULL | YES | BTREE | | |

+———-+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+

# 分析查询性能

EXPLAIN SELECT * FROM fgedudb.fgedu_test WHERE age > 25;

+—-+————-+———-+————+——-+—————+———+———+——+——+———-+————————–+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+—-+————-+———-+————+——-+—————+———+———+——+——+———-+————————–+

| 1 | SIMPLE | fgedu_test | NULL | range | idx_age | idx_age | 5 | NULL | 3 | 100.00 | Using where; Using index |

+—-+————-+———-+————+——-+—————+———+———+——+——+———-+————————–+

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

Part04-生产案例与实战讲解

4.1 SQL开发实战

SQL开发的实战操作:

# 创建用户表

CREATE TABLE fgedudb.fgedu_users (

id INT PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(50) NOT NULL UNIQUE,

password VARCHAR(100) NOT NULL,

email VARCHAR(100) NOT NULL UNIQUE,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

);

Query OK, 0 rows affected (0.02 sec)

# 创建订单表

CREATE TABLE fgedudb.fgedu_orders (

id INT PRIMARY KEY AUTO_INCREMENT,

user_id INT NOT NULL,

order_no VARCHAR(50) NOT NULL UNIQUE,

amount DECIMAL(10,2) NOT NULL,

status ENUM(‘pending’, ‘paid’, ‘shipped’, ‘completed’) DEFAULT ‘pending’,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

FOREIGN KEY (user_id) REFERENCES fgedudb.fgedu_users(id)

);

Query OK, 0 rows affected (0.02 sec)

# 插入测试数据

INSERT INTO fgedudb.fgedu_users (username, password, email) VALUES

(‘fgedu_user1’, ‘password1’, ‘user1@fgedu.net.cn’),

(‘fgedu_user2’, ‘password2’, ‘user2@fgedu.net.cn’),

(‘fgedu_user3’, ‘password3’, ‘user3@fgedu.net.cn’);

Query OK, 3 rows affected (0.00 sec)

Records: 3 Duplicates: 0 Warnings: 0

INSERT INTO fgedudb.fgedu_orders (user_id, order_no, amount, status) VALUES

(1, ‘ORDER001’, 100.00, ‘completed’),

(1, ‘ORDER002’, 200.00, ‘paid’),

(2, ‘ORDER003’, 150.00, ‘shipped’),

(3, ‘ORDER004’, 300.00, ‘pending’);

Query OK, 4 rows affected (0.00 sec)

Records: 4 Duplicates: 0 Warnings: 0

# 复杂查询

SELECT u.username, o.order_no, o.amount, o.status, o.created_at

FROM fgedudb.fgedu_users u

JOIN fgedudb.fgedu_orders o ON u.id = o.user_id

WHERE o.amount > 150

ORDER BY o.created_at DESC;

+————+———-+——–+———–+———————+

| username | order_no | amount | status | created_at |

+————+———-+——–+———–+———————+

| fgedu_user3| ORDER004 | 300.00 | pending | 2024-01-01 11:00:00 |

| fgedu_user1| ORDER002 | 200.00 | paid | 2024-01-01 10:50:00 |

+————+———-+——–+———–+———————+

4.2 性能优化实战

性能优化的实战操作:

# 分析表

ANALYZE TABLE fgedudb.fgedu_test;

+——————-+———+———-+———-+

| Table | Op | Msg_type | Msg_text |

+——————-+———+———-+———-+

| fgedudb.fgedu_test| analyze | status | OK |

+——————-+———+———-+———-+

# 优化表

OPTIMIZE TABLE fgedudb.fgedu_test;

+——————-+———-+———-+———-+

| Table | Op | Msg_type | Msg_text |

+——————-+———-+———-+———-+

| fgedudb.fgedu_test| optimize | status | OK |

+——————-+———-+———-+———-+

# 查看慢查询日志

SHOW VARIABLES LIKE ‘slow_query_log’;

+—————-+——-+

| Variable_name | Value |

+—————-+——-+

| slow_query_log | ON |

+—————-+——-+

SHOW VARIABLES LIKE ‘long_query_time’;

+—————–+———-+

| Variable_name | Value |

+—————–+———-+

| long_query_time | 1.000000 |

+—————–+———-+

4.3 常见问题处理

SQL开发中常见的问题及解决方法:

  • 性能问题:使用索引,优化查询语句,避免全表扫描
  • 死锁问题:合理设计事务,避免长时间占用锁资源
  • 数据一致性问题:使用事务,确保数据的一致性
  • 安全问题:使用参数化查询,避免SQL注入
  • 内存问题:合理设置缓冲区大小,避免内存溢出

from GoldenDB视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 SQL开发最佳实践

SQL开发的最佳实践建议:

  • 使用参数化查询:避免SQL注入,提高安全性
  • 合理使用索引:提高查询性能
  • 优化查询语句:避免全表扫描,减少不必要的列查询
  • 使用事务:确保数据的一致性和完整性
  • 定期维护:分析和优化表,保持数据库性能

5.2 常见问题与解决方案

SQL开发中常见的问题及解决方法:

  • 查询性能慢:创建索引,优化查询语句,分析执行计划
  • 死锁:合理设计事务,减少事务持有时间,避免循环依赖
  • 内存溢出:调整缓冲区大小,优化查询结果集大小
  • 数据不一致:使用事务,确保原子性、一致性、隔离性和持久性
  • SQL注入:使用参数化查询,避免直接拼接SQL语句

5.3 学习建议与职业发展

学习GoldenDB SQL开发的建议:

  • 深入理解SQL语法和原理
  • 掌握索引优化和查询优化技巧
  • 熟悉存储过程、触发器和视图的使用
  • 了解事务管理和并发控制
  • 参与实际项目,积累开发经验

职业发展建议:

  • 初级开发人员:掌握基本的SQL语法和查询
  • 中级开发人员:熟悉高级SQL特性和性能优化
  • 高级开发人员:精通数据库设计和性能调优

风哥提示:SQL开发是数据库应用的核心技能之一,掌握SQL开发技巧可以提高应用性能和开发效率,是每个数据库开发人员必须掌握的技能。

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

联系我们

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

微信号:itpux-com

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