MySQL笔记1——MySQL简介

MySQL简介

数据库(Database)的概念

长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据“仓库”。

数据库特点

结构化、共享性、独立性、安全性

  1. 开源免费,小巧但功能完全
  2. 可在Windows和Linux系统上允许
  3. 操作方便,适用于中小型甚至大型网站应用

SQL语句分类

SQL语句,即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,可用于存取数据以及查询,更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。

  1. DDL(数据定义语言):定义和管理数据对象,如数据库,数据表等(如CREATE、DROP、ALTER)
  2. DML(数据操作语言):用于操作数据库对象中所包含的数据(INSERT、UPDATE、DELETE)
  3. DQL(数据查询语言):用于查询数据库数据(SELECT)
  4. DCL(数据控制语言):用来管理数据库的语言,包含管理权限及数据更改(GRANT、COMMIT、ROLLBACK)

使用注意:

  1. 注释:#、-- xxx 单行注释、/*……*/多行注释
  2. sql不区分大小写
  3. _(下划线)进行名字的分割,驼峰命名法不适用
  4. ";":sql语句结尾写代表结束
  5. 一般关键字建议用大写
  6. 所有名称不要用中文

DDL(数据定义语言)

语句操作数据库

create database dbname    -- 创建数据库
drop database dbname    -- 删除数据库
show databases     -- 查看数据库
use dbname    -- 选择数据库

DDL创建数据库表

create table 表名(
    字段名1 字段类型[属性][索引][注释],
    字段名2 字段类型[属性][索引][注释],
    字段名3 字段类型[属性][索引][注释],
    ……
)[表类型][表字符集]

其中:[ ]:包含的内容可以省略

           ` `:反引号,用于区别MySQL保留字与普通字符而引入的(取消关键性)

数据库的字段类型

类型说明取值范围存储需要
char[(M)]固定长字符串,检索快但费空间0≤M≤255M字符char[(M)]
varchar[(M)]可变字符 0≤M≤255变长度

varchar[(M)]

text文本串(4个G左右大小)4294967295长度+4字节text
tinyint非常小的数据

有符值:-2^7~2^7-1

无符值0~2^8-1

1字节
int标准整数

有符值:-2^31~2^7-31

无符值0~2^32-1

4字节
bigint较大的整数

有符值:-2^63~2^63-1

无符值0~2^64-1

8字节
decimal(钱)字符串形式的浮点数decumal(m,d)m个字节
DATETIMEYY-MM-DD hh:mm:ss

1000-01-01 00:00:00~

9999-12-31 23:59:59

DATETIME

NULL是一个类型,表示什么都没有

数据库表的字段注释

create table 表名(
    字段名 字段类型[属性][索引][注释]
);

例:
create table student(
    student_id int(4) comment 'id'
);

查询创建的数据库结构

方式一:describe 表名 或 desc 表名

方式二:show create table 表名 (常用)

数据库存储引擎

InnoDB:

  1. MySQL是从3.23.34a开始就包含了InnoDB存储引擎。大于等于5.5后,InnoDB为默认引擎
  2. InnoDB是默认事务型引擎,它被设计用来处理大量的短期事务,可以确保事务的完整提交(Commit)和回滚(Rollback)。
  3. 除了增加和查询外,还需要更新删除操作,那么应优先选择InnoDB存储引擎
  4. InnoDB是为除了巨大数据量的最大性能设计
  5. 对比MyISAM的存储引擎,InnoDB写的效率差一些,并且会占用更多的磁盘空间以保存数据和索引
  6. MyISAM只缓存索引,不缓存真实数据,InnoDB不仅缓存索引还要缓存真实数据,对内存要求较高,对内存要求较高,而且内存大小对性能有决定性影响

MyISAM:

  1. 提供了大量的特性包含全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复
  2. 优势是访问速度快,对事物完整性没有要求或者以SELECT、INSERT为主的应用
  3. 应用场景:只读应用或者以读为主的业务

数据库存储引擎——MyISAM和InnoDB的区别

对比项MyISAMInnoDB
外键不支持支持
事务不支持支持
行表锁

表锁,即使操作一条记录也会锁住整个表,

不适合高并发操作

行锁操作时只锁某一行,不对其他行产生影响,适合高并发操作
缓存只缓存索引,不缓存真实数据

不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能也有决定性的影响

默认安装
默认使用
关注点性能:节省资源、消耗少、简单业务

事务:并发写,更大资源

两者存储引擎各有特点,当然你也可以在MySQL中,针对不同的数据表,可以选择不同的存储引擎

修改和删除数据库表

-- 修改表名
alter table 旧表名 rename as 新表名
-- 删除字段
alter table 表名 drop 字段名
-- 添加字段
alter table 表名 add 字段名 列类型[属性] 
--修改字段
alter table 表名 modify 字段名 列类型[属性]
alter table 表名 change 旧字段名 新字段名 列类型[属性]
-- 删除表
drop table 表名

三范式

第一范式(1NF):确保每列的原子性

  1. 每一列属性都是不可再分的属性值,确保每一列的原子性
  2. 两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据

第二范式(2NF):是在第一范式(1NF)的基础上建立起来的。即满足第二范式必须先满足第一范式。

第二范式(2NF):要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表 加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键。

第三范式(3NF):数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。

总结:三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。 如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结 构。所以不能一味的去追求范式建立数据库。

约束

约束:实际上就是表中数据的限制条件

作用:表在设计的时候加入约束的目的是为了保证表中的记录完整和有效

约束种类:

非空约束(not null)

唯一性约束(unique)

主键约束(primary key) PK

外键约束(foreign key) FK

检查约束(目前MySQL不支持、Oracle支持)

非空约束

用not null约束的字段不能为null值,必须给定具体的数据

CREATE TABLE tb2(
	username VARCHAR(10) not NULL,-- 会导致报错要求提供一个默认值
	userage INT
);

唯一约束

unique约束的字段,具有唯一性,不可重复,但可以为null

表级约束(1)

在建表的时候,单独的用unique(字段) 来设置字段的约束

-- 行级约束
-- 是可以为null,并且可以有多个null,因为null是一个类型
create TABLE tb4(
	username VARCHAR(10) UNIQUE, -- 唯一约束,行级约束
	userage int UNIQUE -- 每个字段都是各自的唯一约束
);

 表级约束(2)

使用表级约束,给多个字段联合约束

-- 表级约束
CREATE TABLE tb5(
	username VARCHAR(10),
	userage int,
	UNIQUE(username,userage) -- 表级约束,联合唯一约束
							 -- 字段是有关联的,必须每个字的值都相同才会触发表级约束
);

表级约束(3)

表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)

CREATE TABLE tb6(
	username VARCHAR(10),
	userage int,
	CONSTRAINT name_age_unique UNIQUE(username,userage)
);

主键约束(primary key) PK

主键(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录

表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值

主键约束与“not null unique”区别

  1. 作为Primary Key的域/域组不能为null,而Unique Key可以。
  2. 在一个表中只能有一个Primary Key,而多个Unique Key可以同时存在。unique not null 可以 将表的一列或多列定义为唯一性属性,而primary key设为多列时,仅能保证多列之和是唯一的, 具体到某一列可能会重复。
  3. 更大的区别在逻辑设计上。Primary Key一般在逻辑设计中用作记录标识,这也是设置 Primary Key的本来用意,而Unique Key只是为了保证域/域组的唯一性。
-- 主键约束
-- 每张表有且只有一个主键
-- 主键的值是唯一的
-- 主键是不能为NULL的
CREATE TABLE tb7(
	username VARCHAR(10) PRIMARY KEY,
	userage INT
);
show CREATE TABLE tb7;
tb7	CREATE TABLE `tb7` (
  `username` varchar(10) NOT NULL,
  `userage` int DEFAULT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE tb8(
	username VARCHAR(10),
	userage int,
	PRIMARY KEY(username,userage)-- 联合主键,联合约束
);								 -- 多个字段的值,只有在完全相同时才会触发联合约束

-- 一般主键的建立方式
-- int bitint 自增
-- 主键的值是不回补的,用过的是不能再使用的,即使被删除了
-- 在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment
CREATE TABLE tb9(
	tid int PRIMARY KEY auto_increment,
	username VARCHAR(10),
	userage INT
);

外键约束(foreign key) FK

外键:外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。 若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键。其中,A为基本表或父标,主表,B为信息表,子表,副表

-- 外键约束
-- 外键是可以重复的
-- 外键是可以为null的
-- 外键必须要写父表中有的数据
-- 父表中的关联字段必须是一个具有唯一性的数据
-- 父表中的字段名和从表的字段名不一定要相同,但是数据类型必须一致
-- 一个表中可以有多个外键,也可以有多个外键约束,但是只能拥有一个主键
-- 要删除父表中的数据,必须先删除子表中的数据
-- 使用外键关系,不去建立外键约束
CREATE TABLE a(
	aid INT PRIMARY KEY auto_increment,
	username VARCHAR(10)
);

CREATE TABLE b(
	bid INT PRIMARY KEY auto_increment,
	username VARCHAR(10),
	aid	INT,
	FOREIGN KEY(aid) REFERENCES a(aid)
);

约束的增加和删除

约束的增加

-- 添加非空约束
alter table 表名 modify test_student char(10) not null; 
-- 添加唯一约束
alter table 表名 add unique(表字段名,字段,字段,字段);
-- 添加主键约束
alter table 表名 add primary key(表的字段名,字段,字段);
-- 添加外键约束
alter table 表名 add constraint N1 foreign key (表字段名) references 父表(父表字段名);

约束的删除

-- 删除not null约束
alter table 表名 modify 列名 类型;
-- 删除unique约束
alter table 表名 drop index 唯一约束名;
-- 删除primary key约束
alter table 表名 drop primary key;
-- 删除foreign key约束
alter table 表名 drop foreign key 外键名;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晨CH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值