MySQL轻松入门,驾驭数据库的奇妙世界!

37 阅读11分钟

数据库的好处

学习数据库和数据库管理是计算机科学和信息技术领域中至关重要的一部分,有许多好处和重要性:

  1. 数据组织和存储: 数据库提供了一种结构化和组织化的方式来存储和管理大量数据。这使得数据更容易检索、更新和维护。
  2. 数据的持久性: 数据库提供了一种持久性的数据存储机制,确保数据在计算机系统重启或关闭时不会丢失。
  3. 数据一致性和完整性: 数据库系统通过实施约束(如主键、外键、唯一性约束等)来确保数据的一致性和完整性,防止不合法或不一致的数据进入数据库。
  4. 高效的数据检索: 数据库使用索引和查询优化技术,可以高效地检索所需的数据,提高数据检索性能。
  5. 数据安全性: 数据库系统提供用户认证、授权和审计等安全机制,保护数据免受未经授权的访问和恶意攻击。
  6. 并发控制: 在多用户环境中,数据库系统能够有效地处理并发访问,确保数据的一致性和完整性。
  7. 数据备份和恢复: 数据库系统提供了备份和恢复机制,可以定期备份数据,以防止数据丢失,并在需要时恢复数据。
  8. 支持复杂查询: 数据库系统支持复杂的查询语言,如SQL,使用户能够执行灵活和高级的数据查询和分析操作。
  9. 支持事务处理: 数据库管理系统支持事务处理,确保一系列操作要么全部执行成功,要么全部失败,从而保持数据的一致性。
  10. 应用程序集成: 数据库可以与应用程序进行集成,为应用程序提供数据存储和管理的支持。

数据库相关概念

  1. DB:数据库,保存一组有组织的数据的容器
  2. DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
  3. SQL:结构化查询语言,用于和DBMS通信的语言

数据库存储数据的特点

  1. 将数据放到表中,表再放到库中
  2. 一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
  3. 表具有一些特性,这些特性定义了数据在表中如何存储,类似java中“类”的设计。
  4. 表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
  5. 表中的数据是按行存储的,每一行类似于java中的“对象”。

表的表现形态和Excel十分相近

MySQL服务的登录和退出

# 登录命令:
mysql 【-h主机名 -P端口号 】-u用户名 -p密码

# 退出:
exit或ctrl+C

MySQL的常见命令

# 1.查看当前所有的数据库
show databases;
# 2.打开指定的库
use 库名;
# 3.查看当前库的所有表
show tables;
# 4.查看其它库的所有表
show tables from 库名;
# 5.查看表结构
desc 表名;
# 6.查看服务器的版本
# 方式一:登录到mysql服务端
select version();
# 方式二:没有登录到mysql服务端
mysql --version
# 或
mysql --V

MySQL的语法规范

  1. 不区分大小写,但建议关键字大写,表名、列名小写

  2. 每条命令最好用分号结尾

  3. 每条命令根据需要,可以进行缩进或换行

  4. 注释

    • 单行注释:#注释文字

    • 单行注释:-- 注释文字

    • 多行注释:/* 注释文字 */

SQL的语言分类

DQL(Data Query Language):数据查询语言(select)

DML(Data Manipulate Language):数据操作语言(insert 、update、delete)

DDL(Data Define Languge):数据定义语言(create、drop、alter)

TCL(Transaction Control Language):事务控制语言(commit、rollback)

DQL语言的学习

基础查询

语法:

SELECT 要查询的东西 
【FROM 表名】;

要查询的东西可以是常量值、表达式、字段、函数

条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据

语法:select 要查询的字段|表达式|常量值|函数 from 表 where 条件;

其中**“条件”**有如下分类:

  1. 条件表达式

    示例:salary>10000

    条件运算符:< >= <= = != <>

  2. 逻辑表达式

    示例:salary>10000 && salary<20000

    逻辑运算符:and(&&)、or(||)、not(!)

  3. 模糊查询

    示例:last_name like 'a%'

排序查询

语法:

select 要查询的东西 
from 表 
where 条件 
order by 【排序的字段|表达式|函数|别名】 【asc|desc】

DQL是MySQL的重点,后面单独出一篇文章,这里仅做简单介绍

DML语言

插入

语法:insert into 表名(字段名1,...) values(值1,...);

特点:

  • 字段类型和值类型一致或兼容,而且一一对应
  • 可以为空的字段,可以不用插入值,或用null填充
  • 不可以为空的字段,必须插入值
  • 字段个数和值的个数必须一致
  • 字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致

修改

  1. 修改单表语法:

    update 表名 
    set 字段1=新值1,字段2=新值2 
    【where 条件】
    
  2. 修改多表语法:

    update 表1 别名1, 表2 别名2
    set 字段1=新值1,字段2=新值2
    where 连接条件
    and 筛选条件
    

删除

方式1:delete语句

  • 单表的删除:

    delete from 表名 
    【where 筛选条件】
    
  • 多表的删除:

    delete 别名1,别名2
    from 表1 别名1,表2 别名2
    where 连接条件
    and 筛选条件;
    

方式2:truncate语句

truncate table 表名

两种方式的区别【面试题】

  1. truncate不能加where条件,而delete可以加where条件

  2. truncate的效率高一丢丢

  3. truncate删除带自增长的列的表后,如果再插入数据,数据从1开始

    delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始

  4. truncate删除不能回滚,delete删除可以回滚

DDL语句

库和表的管理

库的管理

# 创建库
create database 库名
# 删除库
drop database 库名

表的管理

# 创建表
CREATE TABLE IF NOT EXISTS stu_info(
	stu_id INT,
	stu_name VARCHAR(20),
	gender CHAR,
	born_date DATETIME
);
# 修改表
ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段类型】;

# 修改字段名
ALTER TABLE stu_info CHANGE COLUMN sex gender CHAR;

# 修改表名
ALTER TABLE stu_info RENAME [TO]  student_info;

# 修改字段类型和列级约束
ALTER TABLE student_info MODIFY COLUMN born_date DATE;

# 添加字段
ALTER TABLE student_info ADD COLUMN email VARCHAR(20) first;
# 删除字段
ALTER TABLE student_info DROP COLUMN email;

# 删除表
DROP TABLE [IF EXISTS] student_info;

常见字段类型

MySQL支持多种常见的字段类型,每种类型都有其特定的用途。以下是一些常见的MySQL字段类型:

  1. 整数类型:

    • TINYINT: 一个字节,范围从-128到127(有符号),0到255(无符号)。
    • SMALLINT: 两个字节,范围从-32,768到32,767(有符号),0到65,535(无符号)。
    • MEDIUMINT: 三个字节,范围从-8,388,608到8,388,607(有符号),0到16,777,215(无符号)。
    • INT(或INTEGER): 四个字节,范围从-2,147,483,648到2,147,483,647(有符号),0到4,294,967,295(无符号)。
    • BIGINT: 八个字节,范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807(有符号),0到18,446,744,073,709,551,615(无符号)。
  2. 小数类型:

    • FLOAT: 单精度浮点数。
    • DOUBLE(或REAL): 双精度浮点数。
    • DECIMAL(或NUMERIC): 固定小数点数。
  3. 字符串类型:

    • CHAR: 固定长度字符串。
    • VARCHAR: 变长字符串。
    • TEXT: 长文本字符串。
  4. 日期与时间类型:

    • DATE: 日期,格式为'YYYY-MM-DD'。
    • TIME: 时间,格式为'HH:MM:SS'。
    • DATETIME: 日期和时间,格式为'YYYY-MM-DD HH:MM:SS'。
    • TIMESTAMP: 时间戳,与DATETIME类似但存储时区信息。
    • YEAR: 年份,存储4位的年份值。
  5. 枚举与集合类型:

    • ENUM: 存储字符串对象,可从预定义的字符串列表中选择一个值。
    • SET: 存储字符串对象,可从预定义的字符串列表中选择一个或多个值。
  6. 二进制类型:

    • TINYBLOB:最大长度为 255 字节的 BLOB
    • BLOB:最大长度为 65,535 字节的 BLOB
    • MEDIUMBLOB:最大长度为 16,777,215 字节的 BLOB
    • LONGBLOB:最大长度为 4 GB 的 BLOB

常见约束

在MySQL中,你可以使用约束来定义对表中数据的限制和规则。以下是一些常见的MySQL约束:

  1. 主键约束(Primary Key Constraint):

    • 用于唯一标识表中的每一行记录。
    • 主键列的值不能为空(NOT NULL)。
    • 一个表只能有一个主键。
    CREATE TABLE example (
        id INT PRIMARY KEY,
        name VARCHAR(255)
    );
    
  2. 唯一约束(Unique Constraint):

    • 确保某列或一组列的值是唯一的。
    • 不同于主键,唯一约束允许NULL值。
    CREATE TABLE example (
        email VARCHAR(255) UNIQUE,
        name VARCHAR(255)
    );
    
  3. 外键约束(Foreign Key Constraint):

    • 用于确保在一个表中的值在另一个表中存在。
    • 创建外键需要参考另一表的主键。
    CREATE TABLE orders (
        order_id INT PRIMARY KEY,
        product_id INT,
        FOREIGN KEY (product_id) REFERENCES products(product_id)
    );
    
  4. 检查约束(Check Constraint):

    • 用于确保列中的值满足指定条件。
    • MySQL 8.0.16版本及以上支持检查约束。
    CREATE TABLE example (
        age INT,
        CHECK (age >= 18)
    );
    
  5. 非空约束(NOT NULL Constraint):

    • 确保列中的值不为空。
    CREATE TABLE example (
        username VARCHAR(50) NOT NULL,
        password VARCHAR(255)
    );
    

这些约束可以单独使用,也可以组合使用,以便更严格地定义表中数据的规则。在设计数据库时,正确使用这些约束可以帮助确保数据的完整性和一致性。

数据库事务

含义

通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态

特点(ACID)

  • 原子性:要么都执行,要么都回滚
  • 一致性:保证数据的状态操作前和操作后保持一致
  • 隔离性:多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
  • 持久性:一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改

开启事务的步骤

set autocommit=0;
# 1、开启事务
start transaction;
# 2、编写事务的一组逻辑操作单元(多条sql语句)
......
# 3、提交事务或回滚事务
commit;【or rollback;】

事务的分类

  1. 隐式事务,没有明显的开启和结束事务的标志

    例如insert、update、delete语句本身就是一个事务

  2. 显式事务,具有明显的开启和结束事务的标志,有着上述提到的开启事务的明显步骤

事务的隔离级别

事务并发问题如何发生?

当多个事务同时操作同一个数据库的相同数据时

事务的并发问题有哪些?

  • 脏读:一个事务读取到了另外一个事务未提交的数据
  • 不可重复读:同一个事务中,多次读取到的数据不一致
  • 幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据

如何避免事务的并发问题?

通过设置事务的隔离级别

  • READ UNCOMMITTED
  • READ COMMITTED 可以避免脏读
  • REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读
  • SERIALIZABLE可以避免脏读、不可重复读和幻读

设置隔离级别:

set session | global transaction isolation level 隔离级别名;

查看隔离级别:

select @@tx_isolation;

如果您觉得该文章有用,欢迎点赞、留言并分享给更多人。感谢您的支持!