Administrator
发布于 2025-10-23 / 7 阅读
0
0

mysql教程

部署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;



评论