部署mysql8.0
# 更新yum
yum update -y
# 卸载可能影响mysqld部署的包
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
rpm -qa | grep postfix
yum remove -y postfix
# 部署mysql
wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
rpm -ivh mysql80-community-release-el7-7.noarch.rpm
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql
yum install -y mysql-community-server
# mysqld服务管理
# 启动 MySQL 服务
systemctl start mysqld
# 设置开机自启
systemctl enable mysqld
# 查看服务状态(确认 active (running))
systemctl status mysqld
# 查看初始密码
cat /var/log/mysqld.log
# 进入mysql数据库
mysql -u root -p创建账号与授权
-- 首次登录更改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxxxx';
-- 创建允许远程访问的 root 用户(% 表示所有 IP),并设置密码
CREATE USER 'root'@'%' IDENTIFIED BY 'xxxxxx'; -- 密码需符合策略(如:Root@123456)
-- 授予该用户所有权限(生产环境建议按需授权,避免过度开放)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-- 刷新权限使配置生效
FLUSH PRIVILEGES;
-- 验证用户
SELECT user, host FROM mysql.user;基础sql示例
创建数据库(CREATE DATABASE)
-- 创建数据库,指定字符集为 utf8mb4,排序规则为 utf8mb4_general_ci
CREATE DATABASE IF NOT EXISTS test
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
-- 切换数据库
use test;创建表(CREATE TABLE)
-- 创建用户表(users)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
username VARCHAR(50) NOT NULL UNIQUE, -- 用户名(唯一)
age INT CHECK (age > 0 AND age < 150), -- 年龄(约束:0-150岁)
email VARCHAR(100) NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP, -- 默认当前时间
status TINYINT DEFAULT 1 -- 状态(1:正常,0:禁用)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 创建订单表(orders)
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10,2) NOT NULL, -- 金额(保留2位小数)
order_time DATETIME DEFAULT CURRENT_TIMESTAMP,
-- 外键关联用户表(级联删除:用户删除时订单也删除)
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;创建索引(CREATE INDEX)
-- 为用户表的 email 列创建普通索引(加速查询)
CREATE INDEX idx_users_email ON users(email);
-- 为订单表的 user_id + order_time 创建联合索引(优化多条件查询)
CREATE INDEX idx_orders_user_time ON orders(user_id, order_time);
-- 为订单表的 amount 创建唯一索引(假设金额不允许重复,实际场景按需使用)
CREATE UNIQUE INDEX idx_orders_amount ON orders(amount);增删改查(CRUD)
插入数据(INSERT)
-- 插入用户
INSERT INTO users (username, age, email)
VALUES
('张三', 25, 'zhangsan@example.com'),
('李四', 30, 'lisi@example.com');
-- 插入订单(关联用户ID=1和2)
INSERT INTO orders (user_id, amount)
VALUES
(1, 99.99),
(1, 199.50),
(2, 49.99);查询数据(SELECT)
-- 基础查询:查询所有用户
SELECT * FROM users;
-- 条件查询:查询年龄>28的用户
SELECT username, age FROM users WHERE age > 28;
-- 联表查询:查询用户及其订单(内连接)
SELECT u.username, o.order_id, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 聚合查询:统计每个用户的订单总数和总金额
SELECT
u.id,
u.username,
COUNT(o.order_id) AS order_count,
SUM(o.amount) AS total_amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.username;更新数据(UPDATE)
-- 修改用户年龄
UPDATE users
SET age = 26
WHERE username = '张三';
-- 批量更新:将所有订单金额增加10元
UPDATE orders
SET amount = amount + 10;删除数据(DELETE)
-- 删除指定订单
DELETE FROM orders
WHERE order_id = 3;
-- 删除年龄>100的用户(实际场景谨慎使用)
DELETE FROM users
WHERE age > 100;创建视图(CREATE VIEW)
视图是虚拟表,用于简化复杂查询:
-- 创建「用户订单汇总视图」
CREATE VIEW user_order_summary AS
SELECT
u.id AS user_id,
u.username,
COUNT(o.order_id) AS total_orders,
SUM(o.amount) AS total_spent,
MAX(o.order_time) AS last_order_time
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.username;
-- 使用视图查询
SELECT * FROM user_order_summary WHERE total_orders > 1;创建函数(CREATE FUNCTION)
自定义函数用于封装重复逻辑(需先确保数据库允许创建函数):
-- 开启函数创建权限(若提示权限不足)
SET GLOBAL log_bin_trust_function_creators = 1;
-- 创建函数:计算用户的平均订单金额
DELIMITER // -- 临时修改分隔符(避免函数内分号冲突)
CREATE FUNCTION get_avg_order_amount(user_id INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
DECLARE avg_amount DECIMAL(10,2);
SELECT AVG(amount) INTO avg_amount
FROM orders
WHERE orders.user_id = user_id;
RETURN IFNULL(avg_amount, 0); -- 若无订单返回0
END //
DELIMITER ; -- 恢复分隔符
-- 使用函数
SELECT username, get_avg_order_amount(id) AS avg_order
FROM users;其他常用操作
-- 查看表结构
DESCRIBE users;
-- 修改表结构(添加列)
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 删除索引
DROP INDEX idx_users_email ON users;
-- 删除视图
DROP VIEW user_order_summary;
-- 删除函数
DROP FUNCTION get_avg_order_amount;
-- 删除表(谨慎操作!)
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS users;