博客
关于我
MySql从入门到精通
阅读量:790 次
发布时间:2023-02-11

本文共 6304 字,大约阅读时间需要 21 分钟。

第一部分 基础篇

1.概述

MySQL 是一款流行的关系型数据库管理系统,广泛应用于Web开发、数据分析等领域。本文将从基础到进阶,详细介绍MySQL的使用方法和相关知识点。

1.1 启动与停止MySQL

MySQL 在安装完成后,默认会自动启动服务。以下是启动和停止 MySQL 的命令:

  • 启动 MySQL

    net start mysql80

  • 停止 MySQL

    net stop mysql80

注意:请确保 MySQL 服务已经安装并配置正确。

1.2 客户端连接

MySQL 提供了多种方式供用户连接数据库,以下是常用的方法:

  • 方法一:MySQL 提供的命令行客户端

    使用 MySQL 提供的命令行工具连接数据库。例如:

    mysql [-h 127.0.0.1] [-p 3306] -u root -p

    请注意:-p 选项会提示输入密码。

  • 方法二:系统自带的命令行工具

    直接使用系统自带的命令行工具执行 MySQL 命令。例如:

    mysql -u root -p

1.3 CentOS 下MySQL 的登录、启动、停止、重启命令

在 CentOS 系统中,MySQL 的相关操作可以通过以下命令实现:

  • 登录 MySQL

    mysql -u root -p
  • MySQL 配置文件

    MySQL 的配置文件通常位于 /etc/my.cnf,可以用于配置数据库的运行参数,如端口、数据目录等。

  • 启动 MySQL

    service mysql start

    或者:

    service mysqld start

    或者使用 systemctl:

    systemctl start mysqld.service
  • 停止 MySQL

    service mysql stop

    或者:

    service mysqld stop

    或者:

    systemctl stop mysqld.service
  • 重启 MySQL

    service mysql restart

    或者:

    service mysqld restart

    或者:

    systemctl restart mysqld.service
  • 查询状态

    service mysql status

    或者:

    service mysqld status

    或者:

    systemctl status mysqld.service

2.SQL 语句

MySQL 的 SQL 语句分为多种类型,主要包括 DDL、DML、DQL 等。以下是几种基本类型的说明:

  • 注释

    • 单行注释:--#
    • 多行注释:/* */
  • SQL 语句结尾

    MySQL 的 SQL 语句一般以分号 ; 结尾。

  • 不区分大小写

    MySQL 的 SQL 语句对大小写不敏感,但建议规范编写为大写字母。

  • SQL 语句分类

    根据作用可将 SQL 语句分为以下几类:

    • DDL(数据定义语言)

      用于定义数据库对象,如数据库、表和字段等。

    • DML(数据操作语言)

      用于对数据库表中的数据进行增删改。

    • DQL(数据查询语言)

      用于查询数据库中表的记录。

    • DCL(数据控制语言)

      用于管理数据库用户和权限。

2.1 DDL 用于定义数据库对象

  • 数据库操作

    CREATE DATABASE mydatabase;

    或者:

    DROP DATABASE mydatabase;
  • 表操作

    CREATE TABLE students (    id INT PRIMARY KEY AUTO_INCREMENT,    name VARCHAR(10) NOT NULL UNIQUE,    age INT CHECK (age >= 0 AND age <= 120),    status CHAR(1) DEFAULT '1',    gender CHAR(1)) COMMENT '学生信息表';
  • 字段操作

    对字段进行增删改查,例如:

    ALTER TABLE students ADD column_name DATA_TYPE(长度)【注释】【约束】;
    ALTER TABLE students MODIFY column_name NEW_DATA_TYPE(长度);
    ALTER TABLE students CHANGE old_column_name new_column_name NEW_DATA_TYPE(长度);
    ALTER TABLE students DROP column_name;
  • 表名操作

    ALTER TABLE students RENAME TO new_students;
    DROP TABLE students;
    TRUNCATE TABLE students;

2.2 DML 用于对数据库表中的数据进行增删改

  • 插入数据

    INSERT INTO students (name, age, gender) VALUES ('张三', 25, '男');

    注意:插入值应与字段顺序一致,字符串和日期数据需用引号括起来。

  • 修改数据

    UPDATE students SET name = '李四', age = 30 WHERE id = 2;

    注意:默认修改当前行的指定字段值,如果没有 WHERE 条件,默认修改整张表。

  • 删除数据

    DELETE FROM students [WHERE 条件];

    注意:没有 WHERE 条件,默认删除整张表的数据。删除单个字段值可使用 UPDATE 将其设为 NULL。

2.3 DQL 用于查询数据库中表的记录

  • 基础查询

    SELECT * FROM students;
  • 条件查询

    SELECT name, age FROM students WHERE gender = '男' AND age > 20;

    注意betweenand 等条件需小的数字放在前面。

  • 聚合函数

    SELECT COUNT(*) FROM students;

    注意:所有 NULL 值不参与聚合计算。

  • 分组查询

    SELECT COUNT(name), name FROM students GROUP BY name HAVING count > 1;

    注意:查询顺序为 WHERE > 聚合函数 > HAVING。

  • 排序查询

    SELECT name, age FROM students ORDER BY age DESC, name ASC;
  • 分页查询

    SELECT name, age FROM students LIMIT 10 OFFSET 5;

    注意:起始索引从 0 开始,可以省略 LIMIT 假设起始索引为 0。

  • 执行顺序

    查询语句的执行顺序如下:

  • 编写顺序(编写语句时遵循优先级)
  • 执行顺序(数据库执行时遵循优先级)

2.4 DCL 用于创建数据库用户和控制权限

  • 用户管理

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

    注意:主机名可用 % 表示任意地址。

  • 权限控制

    GRANT SELECT, INSERT ON mydatabase.* TO 'username'@'localhost';

    注意:多个权限用逗号分隔,数据库名和表名可用 * 表示所有。

3.函数

MySQL 提供了丰富的内置函数,主要包括字符串函数、数值函数、日期函数和流程控制函数等。以下是几种常用函数的示例:

  • 字符串函数

    CONCAT('Hello', ' World!');
  • 数值函数

    SUM(1 + 2 + 3) = 6;
  • 日期函数

    NOW() 返回当前时间和日期;DATETIME('2024-05-15 12:00:00') 解析指定日期时间;
  • 流程控制函数

    IF (条件, true_value, false_value);CASE WHEN 条件 THEN 值 END;

4.约束

约束用于限制表中数据的有效性和完整性,常见约束类型包括非空约束、唯一约束、主键约束、默认约束、检查约束和外键约束。

  • 非空约束

    name VARCHAR(10) NOT NULL;
  • 唯一约束

    name VARCHAR(10) UNIQUE;
  • 主键约束

    id INT PRIMARY KEY AUTO_INCREMENT;
  • 默认约束

    status CHAR(1) DEFAULT '1';
  • 检查约束

    age INT CHECK (age >= 0 AND age <= 120);
  • 外键约束

    CREATE TABLE orders (    order_id INT AUTO_INCREMENT PRIMARY KEY,    student_id INT,    student_name VARCHAR(10),    FOREIGN KEY (student_id) REFERENCES students(id));

4.2 增加约束

  • 创建表时增加约束

    CREATE TABLE teachers (    id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'id',    name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名',    age INT CHECK (age >= 0 AND age <= 120) COMMENT '年龄',    status CHAR(1) DEFAULT '1' COMMENT '状态',    gender CHAR(1) COMMENT '性别') COMMENT '驾驶表';
  • 对已有表增加约束

    ALTER TABLE teachers ADD PRIMARY KEY (id);
    ALTER TABLE teachers MODIFY age INT NOT NULL AUTO_INCREMENT;
    ALTER TABLE teachers ADD CHECK (age >= 0 AND age <= 120);
  • 外键约束

    ALTER TABLE orders ADD CONSTRAINT fk_student FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE ON UPDATE CASCADE;

5.多表查询

  • 多表关系分类

    多表查询主要分为连接查询和子查询。连接查询包括内连接、外连接和自连接。

  • 连接查询

    • 内连接

      SELECT * FROM students, teachers WHERE students.id = teachers.id;

      或者显式内连接:

      SELECT * FROM students INNER JOIN teachers ON students.id = teachers.id;
    • 外连接

      SELECT * FROM students LEFT JOIN teachers ON students.id = teachers.id;

      或者:

      SELECT * FROM students RIGHT JOIN teachers ON students.id = teachers.id;
    • 自连接

      SELECT * FROM students AS s WHERE s.name = '张三';
  • 联合查询

    SELECT name, age FROM students UNION SELECT name, age FROM teachers;

    注意:确保联合查询的字段类型和数量一致,且字段顺序一致。

  • 子查询

    子查询分为标量子查询、列子查询、行子查询和表子查询。

    • 标量子查询

      SELECT COUNT(*) FROM teachers WHERE name = (SELECT name FROM students);
    • 列子查询

      SELECT name FROM teachers WHERE name IN (SELECT name FROM students);
    • 行子查询

      SELECT name, age FROM teachers WHERE age = (SELECT age FROM students);
    • 表子查询

      SELECT * FROM teachers WHERE name IN (SELECT name FROM students);

6.事务

  • 事务简介

    事务是一组操作的集合,确保所有操作要么同时成功,要么同时失败。默认 MySQL 事务是自动提交的。

  • 事务特性(ACID)

    • 原子性(Atomicity):所有操作要么全部成功,要么全部失败。
    • 一致性(Consistency):事务完成时,数据必须处于一致状态。
    • 隔离性(Isolation):事务的隔离级别决定了多个事务之间的数据一致性。
    • 持久性(Durability):事务提交后,修改必须持久化到存储中。
  • 事务操作

    • 开始事务

      START TRANSACTION;
    • 提交事务

      COMMIT;
    • 回滚事务

      ROLLBACK;
  • 事务的隔离级别

    隔离级别决定了事务的安全性和性能。常见的隔离级别包括:

    • 读未提交(Read Uncommitted)

      最低隔离级别,可能导致脏读。

    • 读已提交(Read Committed)

      保证事务的读操作看到其他事务的提交结果。

    • 可重复读(Repeatable Read)

      提高一致性,防止不可重复读。

    • 串行化(Serializable)

      最高隔离级别,保证事务的严格一致性,但性能较差。

6.2 并发事务问题

并发事务可能导致的问题包括脏读、不可重复读和幻读等。需要合理设置隔离级别以确保数据一致性。

第二部分 进阶篇

1.存储引擎

  • MySQL 体系结构

    MySQL 的存储引擎决定了数据存储和索引的方式。默认存储引擎为 InnoDB。

  • 存储引擎类型

    • InnoDB:支持事务、外键、自增长列,适合高并发和复杂查询。
    • MyISAM:适合只读或低并发的场景。
    • Memory:基于内存的存储引擎,性能最佳但数据持久化无法保留。
  • 存储引擎选择

    根据应用需求选择合适的存储引擎,InnoDB 是推荐的默认选择。

2.索引

  • 索引概述

    索引是优化查询性能的重要工具,但也需要合理设计。

  • 索引结构

    • B+树索引:适合范围查询和排序,支持索引的范围。
    • 哈希索引:适合全文检索和等值查询,但不支持范围查询。
  • 索引分类

    • 普通索引:对应单个字段。
    • 联合索引:对应多个字段的联合查询。
    • 唯一索引:确保记录的唯一性。
    • 全文索引:用于全文检索。
  • 索引语法

    CREATE INDEX idx_name ON table_name (column_name);
  • 索引性能分析

    • SQL 执行频率

      通过观察常用 SQL 查询的执行频率来决定是否需要索引。

    • 慢查询日志

      启用慢查询日志,分析长时间运行的查询并优化索引。

    • explain 执行计划

      使用 explain 命令分析查询执行计划,优化索引结构。

    • profiling

      通过 profiling 工具分析查询性能,找出性能瓶颈。

总结

通过以上内容,可以全面了解 MySQL 的基础和进阶知识,包括启动停止 MySQL、SQL 语句操作、存储引擎选择、索引优化等。MySQL 的学习是一个持续的过程,随着项目需求的变化,可以不断深入探索和优化数据库配置和查询性能。

转载地址:http://tabfk.baihongyu.com/

你可能感兴趣的文章
MySQL为什么不建议使用delete删除数据?
查看>>
MySQL主从、环境搭建、主从配制
查看>>
Mysql主从不同步
查看>>
mysql主从同步及清除信息
查看>>
MySQL主从同步相关-主从多久的延迟?
查看>>
mysql主从同步配置方法和原理
查看>>
mysql主从复制 master和slave配置的参数大全
查看>>
MySQL主从复制几个重要的启动选项
查看>>
MySQL主从复制及排错
查看>>
mysql主从复制及故障修复
查看>>
MySQL主从复制的原理和实践操作
查看>>
webpack loader配置全流程详解
查看>>
mysql主从复制,读写分离,半同步复制实现
查看>>
MySQL主从失败 错误Got fatal error 1236解决方法
查看>>
MySQL主从架构与读写分离实战
查看>>
MySQL主从篇:死磕主从复制中数据同步原理与优化
查看>>
mysql主从配置
查看>>
MySQL之2003-Can‘t connect to MySQL server on ‘localhost‘(10038)的解决办法
查看>>
MySQL之CRUD
查看>>
MySQL之DML
查看>>