前言
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,MySQL的语法和其他数据库都类似,和Oracle不同的就是字段、注释。在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
账号管理
为什么要有账号管理
对于公司而言,每一条数据都很重要,为了保护数据防止泄露
也可以理解为权限限制
案例
1,创建权限的账号
#将所有的权限付给zhangsan
GRANT ALL PRIVILEGES ON *.* TO 'zhangsan'@'%' IDENTIFIED BY 'zhangsan123' WITH GRANT OPTION;
2,创建一个只能查看sys数据库的用户
grant select on sys.* to 'zara'@'localhost' identified by 'zara123';
测试用户连接成功
连接后可以发现,该连接里只有sys数据库及一个mysql默认的数据
尝试访问其他数据库会提示权限不足,因为上面语句我只设置了select,尝试删除也会提示报错
与权限相关的表,存在创建连接后自带的mysql数据库中
db | 控制用户账户+操作数据库权限 |
---|---|
user | 管理所有账号 |
tables_priv | 表层权限 |
columns_priv | 字段层权限 |
四大引擎
- InnoDB存储引擎 2. MyISAM存储引擎
- MEMORY存储引擎 4. Archive存储引擎
四大引擎作用
InnoDB存储引擎
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎。InnoDB主要特性有:
1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合
2、InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的
3、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上
4、InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
5、InnoDB被用在众多需要高性能的大型数据库站点上
InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件
MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。MyISAM主要特性有:
1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持
2、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成
3、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
4、最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
5、BLOB和TEXT列可以被索引
6、NULL被允许在索引的列中,这个值占每个键的0~1个字节
7、所有数字键值以高字节优先被存储以允许一个更高的索引压缩
8、每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快
9、可以把数据文件和索引文件放在不同目录
10、每个字符列可以有不同的字符集
11、有VARCHAR的表可以固定或动态记录长度
12、VARCHAR和CHAR列可以多达64KB
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
MEMORY存储引擎
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。MEMORY主要特性有:
1、MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
2、MEMORY存储引擎执行HASH和BTREE缩影
3、可以在一个MEMORY表中有非唯一键值
4、MEMORY表使用一个固定的记录长度格式
5、MEMORY不支持BLOB或TEXT列
6、MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
7、MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)
8、MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享
9、当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)
DDL数据定义
库和表
每一个库和表都有增加、删除、修改的功能
- 创建:create
- 删除:drop
- 修改:alter
库
创建语法
books:库名
create database if not exists books;
删除语句
drop database if exists books;
修改语句
rename database books to 新库名
表
创建表
语法:
create table 表名(
列名 列的类型 (长度)约束,
列名 列的类型(长度)约束,
列名 列的类型(长度)约束
)
CREATE TABLE book(
id INT,#编号
bName VARCHAR(20),#图书名
price DOUBLE,#价格
authorId INT,#作者编号
publishDate DATETIME#出版日期
);
#查看表结构
desc book;
删除表
drop table if exists book_author ;
show tables;
修改表+表的复制
#修改表名
ALTER TABLE author RENAME TO book_author;
#查询所有的表
SHOW TABLES;
#表的复制
INSERT INTO author VALUES
(1,'村上春树','日本'),
(2,'莫言','中国'),
(3,'冯唐','中国'),
#1,仅仅复制表结构
CREATE TABLE copy LIKE author;
#2,复制表结构+数据
CREATE TABLE copy2
SELECT * FROM author;
#只复制部分数据
CREATE TABLE copy3
SELECT id,au_name
FROM author
WHERE nation='中国';
六大约束
约束 | 约束名 | 概念 |
---|---|---|
not null | 非空约束 | 该字段不能为空 |
default | 默认约束 | 如果插入数据时,该字段没有赋值,则为默认值。 |
primary | 主键约束 | 该字段不能重复,且不能为空。比如学号。一个表中只能有一个主键约束。通过表级约束对两个字段设置联合主键: |
unique | 唯一约束 | 该字段值不能重复,可以为空,但只能有一个null值。比如座位号。一个表中可以有多个唯一约束。 |
check | 检查约束 | 用于检查字段值是否正确。比如检查年龄是否规范,性别是否不男不女。 |
foreign key | 外键约束 | 该字段的值必须要来自约束关联的外表字段值。比如学生成绩表的学号必须来自学生信息表的学号字段。 |
注意 : 外键foreign( 从 ) 必须关联references 其他表的某个字段( 主 )。
被关联的主表字段必须时一个key ( 主键或者唯一 )。
插入数据时,必须先插主表,再插从表。
删除数据时,先删除从表,再删除主表
约束案例
#创建表的时候添加约束
CREATE TABLE stuinfo(
id INT PRIMARY KEY,#主键
stuname VARCHAR(20) NOT NULL UNIQUE,#非空
gender CHAR(1) CHECK(gender='男' OR gender='女'),#检查
seat INT UNIQUE,#唯一
age INT DEFAULT 18,#默认
majorid INT REFERENCES major(id)#外键
)
desc stuinfo
CREATE TBALE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
)
#查看stuinfo中的所有索引,包括主键,外键,唯一
SHOW INDEX FROM stuinfo
DROP TABLE IF EXISTS stuinfo
#通用的写法
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20),
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
)
CREATE TABLE stuinfo(
id INT ,
stuName VARCHAR(20) ,
gender CHAR(1) ,
seat INT ,
age INT ,
majorid INT
)
desc stuinfo
#添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
#添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#添加主键
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#②表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#添加唯一约束
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#②表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN(majorid) REFERENCES major(id);
#1,删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#2,删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;
#3,删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4,删除唯一约束
ALTER TABLE stuinfo DROP INDEX seat;
#5,删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
标识列
又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值
特点:
1、标识列必须和主键搭配吗?不一定,但要求是一个key,key可以是主键、唯一键、甚至外键(没什么意义)
2、一个表可以有几个标识列?至多一个!
3、标识列的类型只能是数值型
4、标识列可以通过 SET auto_increment_increment=3;设置步长
5、可以通过 手动插入值,设置起始值
案例
CREATE TABLE tab_identity(
id INT,
NAME FLOAT UNIQUE AUTO_INCREMENT,
seat INT
)
desc tab_identity
INSERT INTO tab_identity(id,NAME)VALUES(NULL,1);
INSERT INTO tab_identity(NAME)VALUES(2);
INSERT INTO tab_identity(id)VALUES(4);
INSERT INTO tab_identity(id)VALUES(5);
SELECT * FROM tab_identity
#步长默认是1
SHOW VARIABLES LIKE '%auto_increment%';
#步长为3
SET auto_increment_increment=3;
总结
今天就到这里了如果有什么不对的地方欢迎大家在评论区留言交流改进!!