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 |
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 |
+——————-+———-+———-+———-+
# 查看慢查询日志
