数据库基础

本文详细解读MySQL中的数据类型(包括数值、日期、字符串)选择,如tinyint、VARCHAR、DATE等,并介绍事务的原子性、一致性等特性及其在数据库操作中的应用。此外,还涉及索引策略和权限管理,为IT开发者提供数据库设计与维护的实用指南。
摘要由CSDN通过智能技术生成

一、注释

-- 注释内容

二、数据类型

数值类型:常用int

日期和时间类型:常用DATE,TIME,YEAR,DATETIME

字符串类型:常用varchar(40),

MySQL 支持多种类型,可以分为三类:

  • 数值

    tinyint : 小整数型,占一个字节
    int : 大整数类型,占四个字节
        eg : age int
    double : 浮点类型
        使用格式: 字段名 double(总长度,小数点后保留的位数)
        eg : score double(5,2)   
  • 日期

    date : 日期值。只包含年月日
        eg :birthday date : 
    datetime : 混合日期和时间值。包含年月日时分秒
  • 字符串

    char : 定长字符串。
        优点:存储性能高
        缺点:浪费空间
        eg : name char(10)  如果存储的数据字符个数不足10个,也会占10个的空间
    varchar : 变长字符串。
        优点:节约空间
        缺点:存储性能底
        eg : name varchar(10) 如果存储的数据字符个数不足10个,那就数据字符个数是几就占几个的空间    

案例:

需求:设计一张学生表,请注重数据类型、长度的合理性
    1. 编号
    2. 姓名,姓名最长不超过10个汉字
    3. 性别,因为取值只有两种可能,因此最多一个汉字
    4. 生日,取值为年月日
    5. 入学成绩,小数点后保留两位
    6. 邮件地址,最大长度不超过 64
    7. 家庭联系电话,不一定是手机号码,可能会出现 - 等字符
    8. 学生状态(用数字表示,正常、休学、毕业...)

语句设计如下:

create table student (
    id int,
    name varchar(10),
    gender char(1),
    birthday date,
    score double(5,2),
    email varchar(15),
    tel varchar(15),
    status tinyint
);

分类数据类型大小描述备注
数值类型tinyint1 byte小整数值
smallint2 bytes大整数值
mediumint3 bytes大整数值
int或integer4 bytes大整数值age int
bigint8 bytes极大整数值
float4 bytes单精度浮点数值
double8 bytes双精度浮点数值score double(总长度,小数点后保留的位数) 0~100 2
decimal字符串形式的浮点数金融计算的时候一般是用decimal
日期和时间类型DATE3日期值birthday date
TIME3时间值或持续时间
YEAR1年份值
DATETIME8混合日期和时间值
TIMESTAMP4混合日期和时间值,时间戳“张三”
字符串类型char0-255 bytes定长字符串name char(10) 10个字符空间 存储的性能高 浪费空间
varchar0-65535 bytes变长字符串name varchar(10) 2个字符空间 存储性能低 节约空间
tinyblob0-255 bytes不超过 255 个字符的二进制字符串
tinytext0-255 bytes短文本字符串
blob0-65 535 bytes二进制形式的长文本数据
text0-65 535 bytes长文本数据
mediumblob0-16 777 215 bytes二进制形式的中等长度文本数据
mediumtext0-16 777 215 bytes中等长度文本数据
longblob0-4 294 967 295 bytes二进制形式的极大文本数据
longtext0-4 294 967 295 bytes极大文本数据

三、数据库的字段属性

3.1 Unsigned:无符号的整数

声明了该列不能被声明为负数

3.2 Zerofill:零填充

不足的位数使用0来填充

3.3 AUTO_INCREMENT:自动递增

自动在上一条记录上+1(默认),常用来设计唯一的主键

3.4 NOT NULL:非空

3.5 default:默认

如果不指定该列的值会有一个默认值

四、数据表的类型(数据引擎)

4.1INNODB:默认使用

4.2MyISAM:早些年使用的

五、数据表的约束

5.1主键约束:primary key constraint

5.2外键约束:foreign key constraint

5.3非空约束:not null constraint

5.4唯一约束:unique constraint

5.5默认约束:default constraint

六、数据库函数

6.1常用函数:

数学函数:

ABS(); -- 绝对值

version();//版本

6.2聚合函数(查询中经常用到)

七、特殊的关键字(SQL中可能用到的)

7.1distinct:去重

-- 从用户表中查找不同的名字
select distinct name from user

7.2explain:分析SQL执行的状况

八、存储过程

九、事务

4.1 概述

数据库的事务(Transaction)是一种机制、一个操作序列,包含了==一组数据库操作命令==。

事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令==要么同时成功,要么同时失败==。

事务是一个不可分割的工作逻辑单元。

这些概念不好理解,接下来举例说明

张三和李四账户中各有100块钱,现李四需要转换500块钱给张三,具体的转账操作为

  • 第一步:查询李四账户余额

  • 第二步:从李四账户金额 -500

  • 第三步:给张三账户金额 +500

现在假设在转账过程中第二步完成后出现了异常第三步没有执行,就会造成李四账户金额少了500,而张三金额并没有多500;这样的系统是有问题的。如果解决呢?使用事务可以解决上述问题

4.2 语法

  • 开启事务

    START TRANSACTION;
    或者  
    BEGIN;
  • 提交事务

    commit;
  • 回滚事务

    rollback;

4.3 代码验证

  • 环境准备

    DROP TABLE IF EXISTS account;
    
    -- 创建账户表
    CREATE TABLE account(
    	id int PRIMARY KEY auto_increment,
    	name varchar(10),
    	money double(10,2)
    );
    -- 添加数据
    
INSERT INTO account(name,money) values('张三',1000),('李四',1000);
  • 不加事务演示问题

    -- 转账操作
    -- 1. 查询李四账户金额是否大于500
    
    -- 2. 李四账户 -500
    UPDATE account set money = money - 500 where name = '李四';
    
    出现异常了...  -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
    -- 3. 张三账户 +500
    UPDATE account set money = money + 500 where name = '张三';

    整体执行结果肯定会出问题,我们查询账户表中数据,发现李四账户少了500。

  • 添加事务sql如下:

    -- 开启事务
    BEGIN;
    -- 转账操作
    -- 1. 查询李四账户金额是否大于500
    
    -- 2. 李四账户 -500
    UPDATE account set money = money - 500 where name = '李四';
    
    出现异常了...  -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
    -- 3. 张三账户 +500
    UPDATE account set money = money + 500 where name = '张三';
    
    -- 提交事务
    COMMIT;
    
    -- 回滚事务
    ROLLBACK;

    上面sql中的执行成功进选择执行提交事务,而出现问题则执行回滚事务的语句。以后我们肯定不可能这样操作,而是在java中进行操作,在java中可以抓取异常,没出现异常提交事务,出现异常回滚事务。

4.4 事务的四大特征

  • 原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败

  • 一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态

  • 隔离性(Isolation) :多个事务之间,操作的可见性

  • 持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

==说明:==

mysql中事务是自动提交的。

也就是说我们不添加事务执行sql语句,语句执行完毕会自动的提交事务。

可以通过下面语句查询默认提交方式:

SELECT @@autocommit;

查询到的结果是1 则表示自动提交,结果是0表示手动提交。当然也可以通过下面语句修改提交方式

set @@autocommit = 0;

十、索引

  • 主键索引 (Primary Key)

  • 唯一索引 (Unique)

  • 常规索引 (Index)

  • 全文索引 (FullText)

8.1创建索引:

1.在创建表的时候给字段增加索引

2.创建完毕后,增加索引

-- 给studentName字段 增加一个全文索引
-- 方法一

alter table student add fulltext index studentName

-- 方法二 (create index 索引名 on 表名(字段名))

create index id_app_user_name on app_user(name)

8.2关于索引的SQL语句:

显示所有的索引信息

-- 展示student表中的 所有的索引信息
show index from student

使用索引来查询

select * from student where match(studentName) against("刘")

8.3索引原则

1.索引不是越多越好

2.不要对经常变动的数据加索引

3.小数量的不需要加索引

4.索引一般加在常用来查询的字段上

十一、权限管理和备份(运维)

9.1用户管理

SQL语句命令

创建用户:

create user wangrui identified by '123456'

修改当前用户密码:

set password = PASSWORD('123456')

修改指定用户密码

set password for wangrui = PASSWORD('123456')

给用户重命名

rename user wangrui to wangrui2

8.2mysql备份

1.直接拷贝data文件

2.使用可视化工具 Navicate

3.使用命令行导出

 

十二、规范数据库设计

三大范式:

第一范式(1NF)

原子性:保证每一列不可再分

第二范式(2NF)

前提:保证第一范式

每张表只描述一件事情

第三范式(3NF)

前提:保证第一第二范式

确保数据表中的每一列数据都和主键直接相关,而不能间接相关

规范与性能不可兼得。要做一个平衡。

实际开发中:性能优先,比如有时候会故意增加一些冗余字段,防止多表查询,提高效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值