学习数据库的增删改查

一、创建数据库和表

在进行增删改查操作之前,我们需要创建一个数据库和表。

1. 创建数据库

使用 CREATE DATABASE 语句创建数据库:

CREATE DATABASE test_db;

2. 选择数据库

使用 USE 语句选择数据库:

USE test_db;

3. 创建表

使用 CREATE TABLE 语句创建一个名为 users 的表:

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(50) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

二、插入数据(INSERT)

使用 INSERT INTO 语句向表中插入数据:

INSERT INTO users (username, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (username, email) VALUES ('Bob', 'bob@example.com');

可以一次插入多条记录:

INSERT INTO users (username, email) VALUES 
('Charlie', 'charlie@example.com'),
('Dave', 'dave@example.com');

三、查询数据(SELECT)

使用 SELECT 语句从表中查询数据:

SELECT * FROM users;

查询特定列的数据:

SELECT username, email FROM users;

添加条件查询:

SELECT * FROM users WHERE username = 'Alice';

使用 LIKE 进行模糊查询:

SELECT * FROM users WHERE email LIKE '%example.com';

排序查询结果:

SELECT * FROM users ORDER BY created_at DESC;

四、更新数据(UPDATE)

使用 UPDATE 语句更新表中的数据:

UPDATE users SET email = 'alice_new@example.com' WHERE username = 'Alice';

更新多列的数据:

UPDATE users SET email = 'bob_new@example.com', username = 'Bobby' WHERE id = 2;

五、删除数据(DELETE)

使用 DELETE FROM 语句删除表中的数据:

DELETE FROM users WHERE username = 'Charlie';

删除所有数据:

DELETE FROM users;

注意:删除所有数据不会重置自增列(AUTO_INCREMENT),如果需要重置,可以使用:

TRUNCATE TABLE users;

六、实用操作

1. 插入或更新(INSERT … ON DUPLICATE KEY UPDATE)

当插入数据时,如果遇到主键冲突,可以选择更新数据:

INSERT INTO users (id, username, email) VALUES (1, 'Alice', 'alice@example.com')
ON DUPLICATE KEY UPDATE email = 'alice_new@example.com';

2. 计算查询(COUNT、SUM、AVG 等)

使用聚合函数进行计算:

SELECT COUNT(*) FROM users;
SELECT AVG(id) FROM users;

3. 分页查询

使用 LIMITOFFSET 实现分页:

SELECT * FROM users LIMIT 10 OFFSET 20;

4. 连接查询(JOIN)

使用 JOIN 语句连接多表查询:

CREATE TABLE orders (id INT AUTO_INCREMENT PRIMARY KEY,user_id INT,order_date DATE,amount DECIMAL(10, 2),FOREIGN KEY (user_id) REFERENCES users(id)
);SELECT users.username, orders.order_date, orders.amount
FROM users
JOIN orders ON users.id = orders.user_id;

七、索引和性能优化

1. 创建索引

为提高查询效率,可以创建索引:

CREATE INDEX idx_username ON users(username);

2. 查看执行计划

使用 EXPLAIN 查看查询的执行计划:

EXPLAIN SELECT * FROM users WHERE username = 'Alice';

八、事务处理

使用事务可以保证一组操作的原子性:

START TRANSACTION;INSERT INTO users (username, email) VALUES ('Eve', 'eve@example.com');
UPDATE users SET email = 'eve_new@example.com' WHERE username = 'Eve';COMMIT;

在需要回滚时使用 ROLLBACK

START TRANSACTION;INSERT INTO users (username, email) VALUES ('Frank', 'frank@example.com');
-- 出现错误,回滚
ROLLBACK;

九、复杂查询

1. 子查询

子查询是在一个查询中嵌套另一个查询,用于复杂的数据检索需求:

SELECT username FROM users WHERE id = (SELECT MAX(id) FROM users);

2. 联合查询(UNION)

使用 UNION 将两个或多个查询的结果合并成一个结果集:

SELECT username FROM users WHERE id < 3
UNION
SELECT username FROM users WHERE id > 3;

3. 分组查询(GROUP BY)

使用 GROUP BY 进行分组查询,并结合聚合函数使用:

SELECT username, COUNT(*) AS order_count
FROM users
JOIN orders ON users.id = orders.user_id
GROUP BY username;

4. HAVING 过滤

HAVING 子句用于过滤分组后的结果:

SELECT username, COUNT(*) AS order_count
FROM users
JOIN orders ON users.id = orders.user_id
GROUP BY username
HAVING order_count > 1;

十、视图(VIEW)

1. 创建视图

视图是一种虚拟表,用于简化复杂的查询:

CREATE VIEW user_orders AS
SELECT users.username, orders.order_date, orders.amount
FROM users
JOIN orders ON users.id = orders.user_id;

2. 查询视图

使用视图进行查询,就像查询普通表一样:

SELECT * FROM user_orders;

3. 更新视图

视图的数据通常是只读的,但在某些情况下,可以通过视图更新数据:

UPDATE user_orders SET amount = 100.00 WHERE username = 'Alice';

十一、存储过程和函数

1. 创建存储过程

存储过程是一组预编译的 SQL 语句,用于封装复杂的操作:

DELIMITER //CREATE PROCEDURE add_user(IN uname VARCHAR(50), IN uemail VARCHAR(50))
BEGININSERT INTO users (username, email) VALUES (uname, uemail);
END //DELIMITER ;

2. 调用存储过程

CALL add_user('George', 'george@example.com');

3. 创建存储函数

存储函数是可以返回值的 SQL 代码块:

DELIMITER //CREATE FUNCTION get_user_count() RETURNS INT
BEGINDECLARE count INT;SELECT COUNT(*) INTO count FROM users;RETURN count;
END //DELIMITER ;

4. 调用存储函数

SELECT get_user_count();

十二、触发器(TRIGGER)

1. 创建触发器

触发器是在特定事件发生时自动执行的 SQL 代码块:

CREATE TRIGGER before_insert_user
BEFORE INSERT ON users
FOR EACH ROW
BEGINIF NEW.username = '' THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Username cannot be empty';END IF;
END;

十三、用户权限管理

1. 创建用户

使用 CREATE USER 语句创建新用户:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

2. 授予权限

使用 GRANT 语句授予用户权限:

GRANT SELECT, INSERT, UPDATE ON test_db.* TO 'newuser'@'localhost';

3. 撤销权限

使用 REVOKE 语句撤销用户权限:

REVOKE INSERT ON test_db.* FROM 'newuser'@'localhost';

4. 删除用户

使用 DROP USER 语句删除用户:

DROP USER 'newuser'@'localhost';

十四、备份与恢复

1. 数据库备份

使用 mysqldump 工具备份数据库:

mysqldump -u root -p test_db > test_db_backup.sql

2. 数据库恢复

使用 mysql 命令恢复数据库:

mysql -u root -p test_db < test_db_backup.sql

十五、性能优化

1. 查询优化

使用 EXPLAIN 分析查询计划,识别性能瓶颈:

EXPLAIN SELECT * FROM users WHERE username = 'Alice';

2. 索引优化

合理创建和使用索引可以显著提高查询性能:

CREATE INDEX idx_email ON users(email);

3. 表分区

使用表分区将大表分割为多个小表,提高查询性能和管理效率:

CREATE TABLE orders (id INT AUTO_INCREMENT,user_id INT,order_date DATE,amount DECIMAL(10, 2),PRIMARY KEY (id, order_date)
)
PARTITION BY RANGE (YEAR(order_date)) (PARTITION p0 VALUES LESS THAN (2021),PARTITION p1 VALUES LESS THAN (2022),PARTITION p2 VALUES LESS THAN (2023)
);

4. 配置优化

调整 MySQL 配置文件(my.cnfmy.ini)中的参数以优化性能,例如:

[mysqld]
innodb_buffer_pool_size = 1G
query_cache_size = 128M

十六、实际案例

案例1:用户管理系统

在用户管理系统中,我们需要进行用户信息的增删改查操作。以下是具体的实现过程。

1. 创建用户表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(100) NOT NULL,email VARCHAR(50) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 插入用户数据
INSERT INTO users (username, password, email) VALUES ('JohnDoe', 'password123', 'john@example.com');
INSERT INTO users (username, password, email) VALUES ('JaneDoe', 'password456', 'jane@example.com');
3. 查询用户数据
SELECT * FROM users WHERE username = 'JohnDoe';
4. 更新用户数据
UPDATE users SET email = 'john.doe@example.com' WHERE username = 'JohnDoe';
5. 删除用户数据
DELETE FROM users WHERE username = 'JaneDoe';

案例2:订单管理系统

在订单管理系统中,我们需要对订单信息进行管理,包括创建订单、查询订单、更新订单状态和删除订单。

1. 创建订单表
CREATE TABLE orders (id INT AUTO_INCREMENT PRIMARY KEY,user_id INT,product_name VARCHAR(100) NOT NULL,quantity INT NOT NULL,order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status VARCHAR(20) DEFAULT 'Pending'
);
2. 插入订单数据
INSERT INTO orders (user_id, product_name, quantity) VALUES (1, 'Laptop', 1);
INSERT INTO orders (user_id, product_name, quantity) VALUES (1, 'Mouse', 2);
3. 查询订单数据
SELECT * FROM orders WHERE user_id = 1;
4. 更新订单状态
UPDATE orders SET status = 'Shipped' WHERE id = 1;
5. 删除订单数据
DELETE FROM orders WHERE id = 2;

十七、数据库安全

1. 数据库备份策略

定期备份数据库以防止数据丢失:

mysqldump -u root -p test_db > /backups/test_db_backup_$(date +%F).sql

2. 数据库恢复策略

在数据丢失或损坏时,使用备份文件进行恢复:

mysql -u root -p test_db < /backups/test_db_backup_2024-07-09.sql

3. 用户权限管理

授予用户最小权限原则,确保数据库安全:

GRANT SELECT, INSERT ON test_db.users TO 'appuser'@'localhost';
REVOKE DELETE ON test_db.users FROM 'appuser'@'localhost';

4. 数据加密

在存储敏感数据时进行加密,例如用户密码:

INSERT INTO users (username, password, email) VALUES ('JohnDoe', SHA2('password123', 256), 'john@example.com');

5. 审计日志

启用审计日志,记录用户的操作以便于审计和追踪:

SET GLOBAL audit_log_policy = 'ALL';

十八、性能调优

1. 查询优化

分析查询语句并创建适当的索引,以提高查询性能:

EXPLAIN SELECT * FROM users WHERE email = 'john.doe@example.com';
CREATE INDEX idx_email ON users(email);

2. 缓存机制

启用查询缓存,减少对数据库的直接访问:

SET GLOBAL query_cache_size = 128M;

3. 分区表

对于大数据量的表,使用分区提高查询效率:

CREATE TABLE log_data (id INT AUTO_INCREMENT,log_message TEXT,log_date DATE,PRIMARY KEY (id, log_date)
) PARTITION BY RANGE (YEAR(log_date)) (PARTITION p0 VALUES LESS THAN (2021),PARTITION p1 VALUES LESS THAN (2022),PARTITION p2 VALUES LESS THAN (2023)
);

4. 监控和调试

使用性能监控工具(如 MySQL Enterprise Monitor)监控数据库性能,并根据分析结果进行优化。

十九、数据迁移

在进行数据迁移时,保证数据的一致性和完整性:

1. 数据导出

将数据从一个数据库导出到文件:

mysqldump -u root -p --databases source_db > source_db_backup.sql

2. 数据导入

将导出的数据导入到新的数据库:

mysql -u root -p target_db < source_db_backup.sql

3. 数据验证

在数据迁移完成后,进行数据验证以确保数据完整性:

SELECT COUNT(*) FROM source_db.users;
SELECT COUNT(*) FROM target_db.users;

结语

本文详细介绍了 MySQL 5.7 中的增删改查操作,并通过实际案例和高级操作,进一步展示了如何高效管理和优化数据库。希望通过本文,读者能够全面掌握 MySQL 5.7 的使用技巧,并在实际应用中灵活运用所学知识,提高数据库系统的效率和可靠性。掌握这些技巧不仅能提升工作效率,还能为系统的稳定性和安全性提供有力保障。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解C语言结构体

文章目录 1.结构体的声明1.1 结构体的基础知识1.2 结构的声明1.3 结构成员的类型 1.4结构体变量的定义和初始化2.结构体成员的访问3.结构体传参 1.结构体的声明 1.1 结构体的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 …

【密码学】分组密码概述

一、分组密码的定义 分组密码和流密码都是对称密码体制。 流密码&#xff1a;是将明文视为连续的比特流&#xff0c;对每个比特或字节进行实时加密&#xff0c;而不将其分割成固定的块。流密码适用于加密实时数据流&#xff0c;如网络通信。分组密码&#xff1a;是将明文数据…

【React】Ant Design -- Table分页功能实现

实现步骤 为Table组件指定pagination属性来展示分页效果在分页切换事件中获取到筛选表单中选中的数据使用当前页数据修改params参数依赖引起接口重新调用获取最新数据 const pageChange (page) > {// 拿到当前页参数 修改params 引起接口更新setParams({...params,page})…

翰德恩咨询赋能材料行业上市公司,共筑IPD管理体系新篇章

赋能背景概览 坐落于江苏的某材料行业领军企业&#xff0c;作为国内无机陶瓷膜元件及成套设备领域的佼佼者&#xff0c;以其庞大的生产规模、丰富的产品系列及卓越的研发实力&#xff0c;屹立行业之巅二十余年。公司不仅在新材料研发、技术创新、工艺设计、设备制造及整体解决…

【VUE进阶】安装使用Element Plus组件

Element Plus组件 安装引入组件使用Layout 布局button按钮行内表单菜单 安装 包管理安装 # 选择一个你喜欢的包管理器# NPM $ npm install element-plus --save# Yarn $ yarn add element-plus# pnpm $ pnpm install element-plus浏览器直接引入 例如 <head><!-- I…

Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测

Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测 目录 Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现Transformer-LSTM时间序列预测&#xff0c;Transformer-LSTM&#xf…

浅谈“不要卷模型,要卷应用”

目录 1.概述 2.AI技术应用场景探索 3.避免超级应用陷阱的策略 3.1.追求DAU的弊端 3.2.平衡用户活跃度与应用实用性的策略 4.个性化智能体开发 4.1. 用户需求分析与数据收集 4.2. 技术选择与开发 4.3. 个性化算法设计 4.4. 安全性与隐私保护 4.5. 多渠道集成与响应机…

用vite创建Vue3项目的步骤和文件解释

创建项目的原则是不能出现中文和特殊字符&#xff0c;最好为小写字母&#xff0c;数字&#xff0c;下划线组成 之后在visual studio code 中打开创建的这个项目 src是源代码文件 vite和webpack是有去别的&#xff0c;对于这个vite创建的工程来说index.js是入口文件 在终端里面输…

数字探秘:用神经网络解密MNIST数据集中的数字!

用神经网络解密MNIST数据集中的数字&#xff01; 一. 介绍1.1 MNIST数据集简介1.2 MLP&#xff08;多层感知器&#xff09;模型介绍1.3 目标&#xff1a;使用MLP模型对MNIST数据集中的0-9数字进行分类 二.数据预处理2.1 数据集的获取与加载2.2 数据集的探索性分析&#xff08;E…

骗子用出国月薪3万骗了1000多万上千名求职者被骗

日前,江苏省南通市崇川区人民法院开庭审理了一起涉及诈骗的案件,该案件 审理后引发全国求职者的关注以及热议。根据了解得知,这起案件的主犯是利用出 国劳务的虚假高薪职位位诱饵,最终有上千名求职者被骗上当了。文章来源于&#xff1a;股城网www.gucheng.com 根据法院审…

微信文件太大传不了?学会这些,微信秒变大文件传输神器

在数字化时代&#xff0c;微信已成为我们日常沟通的重要桥梁。然而&#xff0c;当需要在微信上传输大文件时&#xff0c;文件大小的限制往往让人束手无策。 今天&#xff0c;我们将分享一些实用的技巧&#xff0c;帮助你在微信上轻松传输大文件&#xff0c;无论是工作文档还是…

HTTP 概况

Web的应用层协议是超文本传输协议(HyperTextTransferProtocol&#xff0c;HTTP)&#xff0c;它是 Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中&#xff0c;通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及…

彩虹小插画:成都亚恒丰创教育科技有限公司

彩虹小插画&#xff1a;色彩斑斓的梦幻世界 在繁忙的生活节奏中&#xff0c;总有一抹温柔的色彩能悄然触动心弦&#xff0c;那就是彩虹小插画带来的梦幻与宁静。彩虹&#xff0c;这一自然界的奇迹&#xff0c;被艺术家们巧妙地融入小巧精致的插画之中&#xff0c;不仅捕捉了瞬…

事务未释放问题排查

事务未释放问题现象&#xff1a;一般会导致大量锁表现象。 排查&#xff1a;查看所有锁表报错的日志是否都是同一个线程号上的&#xff0c;找到最开始的报错并进行分析。

Oracle基础以及一些‘方言’(一)

1、什么是Oracle ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORACLE 数据库是目前世界…

vue使用 “xlsx-style“: “^0.8.13“ 报错

关于jszip not a constructor报错配置config.js文件后可能还报错的问题&#xff1a; 在node_modules处找到node_modules\xlsx-style\xlsx.js 文件。 将 if(typeof jszip undefined) jszip require(./jszip).JSZip;(应该在xlsx.js文件1339行左右) 替换成 if(typeof jszip und…

高压线束屏蔽效能测试之管中管法、线注入法

一、引言 上期推文介绍了高压线束屏蔽效能测试方法三同轴法&#xff0c;本篇文章将继续介绍高压线束相关测试方法——管中管法和线注入法。 二、管中管法 1、一般要求 管中管法参照IEC62153-4-7标准对高低压连接器进行零部件级屏蔽效能测试。在测试时&#xff0c;通过金属延长管…

3、视图和模板

续上一篇&#xff0c;这一篇 着重于创建公共接口——“视图” 第三部分——3、视图和模板 1、概述2、编写更多视图原理——django依次访问了什么文件 3、写一个真正有用的视图一个快捷函数 render() render——渲染 4、抛出404错误一个快捷函数 get_object_or_404() 5、使用模…

实时数仓和离线数仓的区别是什么,企业该如何选择合适的数仓架构?

目录 一、离线数仓 1. 离线数仓是什么&#xff1f; 2. 离线数仓的特点 3. 离线数仓的适用场景 二、实时数仓 1. 实时数仓是什么&#xff1f; 2. 实时数仓的特点 3. 实时数仓的适用场景 三、由数仓需求变化带来的数据仓库架构的演变 1. 传统数仓架构 2. 离线大数据架构 3. Lambd…

高级IO_多路转接之ET模式Reactor

文章目录 Reactor是什么&#xff1f;LT模式 VS ET模式 示例代码 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 Reactor是什么&#xff1f; Reactor模式是一种事件驱动的并发模型&#xff0c;它通过将事件处理逻辑与事件分发机制解耦&#xff0c;实现…