目录
1、数据库的基本概念
1.1 数据
1.2 表
1.3 数据库
1.4 数据库管理系统
1.5 DBMS的工作模式
2、数据库类型
2.1 分类
2.2 关系数据库
2.3 非关系型数据库(NoSQL)
2.4 小结
2.5 Mysql 数据库
3、mysql 数据库管理
3.1 常用的数据类型
3.2 数据库位置
4、SQL 语句
4.1 SQL语言分类
4.2 DDL(create drop)创建数据库、表以及删除
4.2 DML管理表中的数据记录(insert update delete )
4.3 DQL查询数据记录(select)
4.4 修改、更新数据表中的数据记录
4.5 在数据表中删除指定的数据记录
4.6 修改表名和表结构
4.7 扩展表结构(增加字段)
4.8 修改字段(列)名,添加唯一键
4.9 删除字段
4.10 扩展
4.11 数据表高级操作(克隆,清空,临时表)
5、数据库用户管理
5.1 创建用户
5.2 数据库用户授权
· 描述事物的符号记录
· 包括数字、文字、图形、图像、声音、档案记录等
· 以“记录”形式按统一的格式进行存储
· 将不同的记录组织在一起的
· 用来存储具体数据
· 表的集合,是存储数据的仓库
· 以一定的组织方式存储的相互有关的数据集合
· 是实现对数据库资源有效组织、管理和存取的系统软件
数据库的建立和维护功能、数据定义功能、数据操纵功能、数据库的运行管理功能、通信功能
· 是一个人机系统,由硬件、OS、数据库、DBMS、应用软件和数据库用户组成
· 用户可以通过DBMS或应用程序操作数据库
· 接受应用程序的数据请求和处理请求
· 将用户的数据请求(高级指令)转换为复杂机器代码(底层指令)
· 实现对数据库的操作
· 从数据库的操作中接受查询结果
· 对查询结果进行处理(格式转换)
· 将处理结果返回给用户
关系型数据库、非关系型数据库
① 关系型数据库: 存储的往往是字符、字符串、数值、布尔值等
② 非关系型数据库:存储的往往是图片、视频、语音等
Mysql(Oracle公司) 、 SQL server(微软) 、access(微软公司office产品)
Oracle 、DB2(IBM公司),sybase(sybase) 等等
mysql 开源数据库
MongoDB 、 Redis(内存数据库/缓存数据库)K-V键值对、与之类似的Memcache,K-V键值对
redis-memecache对比:
相同点:存储高热数据(在内存中高速运行)
不同点:redis可以做持久化保存,可以存储对象
关系型数据库: 适用于对关系很明确的数据建立模型、定义、存储数据
非关系型数据库: 存储海量数据,给与”大数据“进行分析,筛选出有价值的部分
引申:redis 持久化方式
以键值存储数据,数据保存在内存中,但会定期将数据写入磁盘(持久化方式
⭐⭐日志
数据库日志文件用于备份,恢复,是最 核心的部分
mysql 与 oracle 日志有所区别
mysql 写一条数据,同步到日志中一条
oracle :重做日志组
一个组中至少3个日志成员,轮流存储日志
还会有另一个组与之同步/备份
阿里云OSS对象存储,一式三份备份(使用重做日志组思想)
Mysql 存储引擎
myisam 和innodb
myisam:快速读取,不支持事务
innodb:更注重写,支持事务
describe user; 显示表的框架
Field:字段名称
Type:数据类型
Null :是否允许为空
Key :主键
Type:数据类型
Null :是否允许为空key :主键
Default :默认值
Extra :扩展属性,例如:标志符列(标识了种子,增量/步长)1 2
id:1 3 5 7
int:整型 用于定义整数类型的数据
float:单精度浮点4字节32位 准确表示到小数点后六位
double:双精度浮点8字节64位
char:固定长度的字符类型 用于定义字符类型数据。
varchar:可变长度的字符类型
text:文本
image:图片
decimal(5,2):5个有效长度数字,小数点后面有2位 指定长度数组
#Char如果存入数据的实际长度比指定长度要小,会补空格至指定长度,如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错
主键是唯一的,但主键可以由多个字段构成
MySQL数据库的数据文件存放在/usr/local/mysql/data目录下,每个数据库对应一个子目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为“.frm”、“.MYD”和“.MYI”。
MYD”文件是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MyISAM表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。
“.MYI”文件也是专属于 MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息。对于 MyISAM 存储来说,可以被 cache 的内容主要就是来源于“.MYI”文件中。每一个MyISAM 表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。
MyISAM 存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件
(frm,myd,myi)。 每个表都有且仅有这样三个文件做为 MyISAM 存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI 文件中。
另外还有“.ibd”和 ibdata 文件,这两种文件都是用来存放 Innodb 数据的,之所以有两种文件来存放 Innodb 的数据(包括索引),是因为Innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储 方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和 MyISAM 数据相同的位置。如果选用共享存储表空间来存放数据,则会使用 ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件。
mysql -u root -p密码 登录数据库(数据库的安装见之前博客LNMP)
show databases;查看数据库
show tables; 查看库中的表,要先use 数据库选择好了数据库
flush privileges; 刷新权限
DDL:数据定义语言,用于创建数据库对象,如库、表、索引等
DML:数据操纵语言,用于对表中的数据进行管理
DQL:数据查询语言,用于从数据表中查找符合条件的数据记录
DCL:数据控制语言,用于设置或者更改数据库用户或角色权限
创建新的数据库:
CREATE DATABASE 数据库名;(CREATE DATABASE大小写都行)
创建新的表:
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
#主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
例:CREATE DATABASE school;
注:要先use 数据库
USE school;
CREATE TABLE zzz (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT'', PRIMARY KEY (id));
DESC zzz; 查看表的架构
#NOT NULL 不允许为空值
#DEFAULT'' 默认值为空
#PRIMARY KEY :主键一般选择没有重复并且不为空值的字段
删除指定的数据表:
use 数据库名
DROP TABLE 表名
DROP TABLE [数据库名.] 表名;
#如不用USE进入库中,则需加上数据库名
删除指定的数据库:DROP DATABASE 数据库名;
insert:插入数据
update:修改、更新数据表中的数据记录
delete:在数据表中删除指定的数据记录
格式:
· INSERT INTO 表名(字段1,字段2[,...]) VALUES (字段1的值,字段2的值,...);
示例:
INSERT INTO zzz (id,name,score,passwd) values(1,'zhangsan',70.5,PASSWORD('123456'));
创建一个名为 "zzz" 的表,该表包含了 id、name、score 和 passwd 四个列。其中 id 是主键,而其他列的约束和默认值根据需求来确定
向名为 "zzz" 的表中插入一行数据,其中包含了 id、name、score 和 passwd 四个列的数值。其中 passwd 列的数值经过密码函数处理后被插入。
#PASSWORD('123456'):查询数据记录时,密码字串以加密形式显示:若不使用PASSWORD(),查询时以明文显示。
INSERT INTO zzz VALUES(2,'lisi',90.5,654321) ;
SELECT * FROM zzz ; #查询表的数据记录
#修改、更新数据表中的数据记录
格式:
· UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
示例:
UPDATE zzz SET passwd=PASSWORD('') WHERE name='zhangsan';
将表 "zzz" 中 name 列值为 'zhangsan' 的行的 passwd 列修改为空字符串
UPDATE zzz SET name='wangxiaoer',passwd='' WHERE id=3;
将表 "zzz" 中 id 列值为 3 的行的 name 列修改为 'wangxiaoer',同时将 passwd 列修改为空字符串。
在数据表中删除指定的数据记录
· 格式:
DELETE FROM 表名 [WHERE 条件表达式];
示例:
DELETE FROM zzz WHERE id=4;
格式:
SELECT 字段名1,字段名2[,...] FROM 表名[WHERE 条件表达式];
示例:
SELECT * FROM zzz;
SELECT id,name,score FROM zzz WHERE id=2;
select name from zzz\G #以列表方式竖向显示
select * from info limit 2; #只显示头2行
select * from info limit 2,3; #显示第2行后的前3行
格式:
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
示例:
UPDATE zzz SET passwd=PASSWORD('123') WHERE name='zhangsan';
UPDATE zzz SET name='wangxiaoer',passwd='' WHERE id=3;
格式:
DELETE FROM 表名 [WHERE 条件表达式];
示例:
DELETE FROM zzz WHERE id=4;
ALTER TABLE 旧表名 RENAME 新表名;
例:
ALTER TABLE zzz RENAME yyy;
ALTER TABLE yyy RENAME zzz;
ALTER TABLE 表名 ADD address varchar(50) default '地址不详';
#default '地址不详':表示此字段设置默认值为地址不详,可与NOT NULL配合使用
ALTER TABLE yyy ADD address varchar(50) NOT NULL default '地址不详';
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [unique key];
ALTER TABLE yyy CHANGE name user_name varchar(10) unique key;
#CHANGE可修改字段名、数据类型、约束等所有项。desc
格式:
ALTER TABLE 表名 DROP 字段名;
示例:
ALTER TABLE yyy DROP passwd;
##扩展
use school;
create table if not exists info (
id int(4) zerofill primary key auto_increment, #指定主键的第二种方式
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));
#if not exists:表示检测要创建的表是否已存在,如果不存在就继续创建
#int(4) zerofill:表示若数值不满4位数,则前面用"0"填充,例0001
#auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;
自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且
添加失败也会自动递增一次
#unique key:表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
#not null:表示此字段不允许为NULL
高级操作
use school;
create table if not exists info (
id int(4) zerofill primary key auto_increment, #指定主键的第二种方式
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));
#if not exists:表示检测要创建的表是否已存在,如果不存在就继续创建
#int(4) zerofill:表示若数值不满4位数,则前面用"0"填充,例0001
#auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且添加失败也会自动递增一次
#unique key:表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
#not null:表示此字段不允许为NULL
克隆复制:
create table yyy2 like yyy; #复制格式,通过LIKE方法,复制yyy表结构生成yyy2表
insert into yyy2 select * from yyy; #备份内容
克隆表,将数据表的数据记录生成到新的表中
清空表:
方法一:
delete from yyy3;
#DELETE清空表后,返回的结果内有删除的记录条目;
DELETE 工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM 删除
所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。
方法二:
truncate table test01;
#TRUNCATE清空表后,没有返回被删除的条目: TRUNCATE 工作时是将表结构按原样重新建立,
因此在速度上TRUNCATE会比DELETE清空表快;使用TRUNCATE TABLE 清空表内数据后,
ID会从1开始重新记录
#删除
速度
drop> truncate > delete
安全性
delete 最好
创建临时表:
临时表创建成功之后,使用SHOWTABLES命令是看不到创建的临时表的,临时表会在连接退出
后被销毁。
如果在退出连接之前,也可以可执行增删改查等操作,比如使用DROP TABLE语句手动直接删除
临时表。
PS:无法创建外键
CREATE TEMPORARY TABLE 表名 (字段1 数据类型,字段2 数据类型[, ...]
[, PRIMARY KEY (主键名)]);
示例:
create temporary table xxx (
id int(4) zerofill primary key auto_ increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));
insert into xxx values (1,'zhangsan',123456,'running') ;
select * from test03;
show tables;
quit
select * from test03;
场景
1.可做测试环境使用 比如删除大量数据的时候,可以创建临时表 做一个复杂删除
2、需求要今天所有的注册王者荣耀的新号码
4.12 MySQL中6种常见的约束
主键约束(primary key)
外键约束(foreign key)
非空约束(not null)
唯一性约束(unique [key|index])
默认值约束(default)
自增约束(auto_increment)
外键的定义:如果同一个属性字段x在表一中是主键,而在表二中不是主键,
则字段x称为表二的外键。
创建外键约束作用(误删,修改),保证数据的完整性和一致性。
主键表和外键表的理解
(1)以公共关键字作主键的表为主键表(父表、主表)
(2)以公共关键字作外键的表为外键表(从表、外表)
注意:与外键关联的主表的字段必须设置为主键。要求从表不能是临时表,
主表外键字段和从表的字段具备相同的数据类型、字符长度和约束。
#创建主表test04
create table test04 (hobid int(4),hobname varchar(50));
#创建从表test05
create table test05 (id int(4) primary key auto_increment,
name varchar(10),age int(3),hobid int(4)) ;
#为主表test04添加一个主键约束。主键名建议以"PK_”开头。
alter table test04 add constraint PK_hobid primary key (hobid);
#为从表test05表添加外键,并将test05表的hobid字段和test04表的hobid字段建立外键关联。
外键名建议以"FK_”开头。
alter table test05 add constraint FK_hob foreign key (hobid) references
test04 (hobid);
#可以使用查询表语句结构命令查看外键关联
show create table test05;
desc test04;
desc test05;
#插入新的数据记录时,要先主表再从表
insert into test04 values(1,'runing');
insert into test05 values(1,'zhangsan',18,1);
#删数数据记录时,要先从表再主表,也就是说删除主键表时必须先删除其他与之关联的表。
drop tables test05;
drop tables test04;
#查看和删除外键约束
#如果要删除外键约束字段先删除外键约束,再删除外键名
show create table test05;
alter table test05 drop foreign key FK_hob;
alter table test05 drop key FK_hob;
desc test05;
CREATE USER '用户名'@'来源地址' [IDENTIFIED BY [PASSWORD] '密码'];
'用户名':指定将创建的用户名.
'来源地址':指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录
可用通配符%
'密码':若使用明文密码,直接输入'密码',插入到数据库时由Mysql自动加密;
若使用加密密码,需要先使用SELECT PASSWORD('密码');获取密文,再在语句中添PASSWORD '密文';
若省略“IDENTIFIED BY"部分,则用户的密码将为空(不建议使用)
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123456';
SELECT PASSWORD('abc123');
CREATE USER 'user2'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
查看用户信息
创建后的用户保存在mysql 数据库的user表里
USE mysql;
SELECT User,authentication_string,Host from user;
重命名指定
RENAME USER 'zhangsan'@'localhost' TO 'lisi'@'localhost';
删除用户
DROP USER 'lisi'@'localhost' ;
修改当前密码
SET PASSWORD = PASSWORD('abc123');
修改其他用户密码
SET PASSWORD FOR 'user1'@'localhost' = PASSWORD('abc123T);
忘记root密码的解决办法
修改/etc/my.cnf 配置文件,免密登陆mysql
vim /etc/my.cnf
[mysqld]
skip-grant-tables #添加,使登录mysql不使用授权表
systemctl restart mysqld
mysql #直接登录
然后使用SQL语句修改密码
UPDATE mysql.user SET AUTHENTICATION_STRING = PASSWORD('abc123') where user='root';
FLUSH PRIVILEGES;
quit
mysql -u root -pabc123
PS:最后再把/etc/my.cnf 配置文件里的skip-grant-tables 删除,并重启mysql服务
授予权限:@表示本地连接,%表示远程连接
grant 提权
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'来源地址' [IDENTIFIED BY '密码'];
grant all privileges on *.* to 'taotao'@'%' identified by '123456';
#权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select, insert,
update”。使用"all"表示所有权限,可授权执行任何操作。
#数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符"*"。
例如,使用“kgc.*"表示授权操作的对象为school数据库中的所有表。
#'用户名@来源地址':用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.xyw.com"、“192. 168.80.%”等。
#IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。
在新建用户时,若省略“IDENTIFIED BY"部分,则用户的密码将为空。
#允许用户zhangsan在本地查询school数据库中所有表的数据记录,
但禁止查询其他数据库中的表的记录。
GRANT select ON school.* TO 'zhangsan'@'localhost' IDENTIFIED BY 'abc123';
#允许用户lisi在所有终端远程连接mysql,并拥有所有权限。
GRANT ALL [PRIVILEGES] ON *.* TO 'lisi'@'%' IDENTIFIED BY '123456';
flush privileges; #刷新权限
quit
mysql -u zhangsan -pabc123
use xyw;
show tables; .
select * from yyy;
查看权限
mysql -u root -pabc123
SHOW GRANTS FOR 用户名@来源地址;
SHOW GRANTS FOR 'lisi'@'%';
撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址;
REVOKE ALL ON *.* FROM 'lisi'@'%';
SHOW GRANTS FOR 'lisi'@'%';
#USAGE权限只能用于数据库登陆,不能执行任何操作; USAGE权限不能被回收,即REVOKE不能删除用户。
flush privileges;
授权用户权限 all privileges 代表了哪些权限呢?
insert(插入数据)
select(查询数据)
update(更新表的数据)
delete (删除表中的数据)
drop (删除库 和表)
cerate (创建库,表)
index (创建索引)
alter (更改表的属性)
create view (创建视图)
create routine (创建存储过程)
alter routine (修改存存储过程)
event (事件)
trigger on (创建触发器)
等