目录
1、数据库管理
1.1、数据库表的文件
1.1.1、MYD”文件:
1.1.2、“.MYI”文件
1.2、日志:
1.3、mysql 数据库管理
1.3.1、数据库管理命令
1.3.2、数据库列的类型
2、SQL语句
2.1、DDL:数据定义语言,用于创建数据库对象,如库、表、索引等
2.1.1、创建新的数据库
2.1.2、 创建新的表
2.1.3、 查看创建之后表的结构
2.1.4、使用DDL语句删除库、表
2.2、DML:据操纵语言,用于对表中的数据进行管理
2.2.1、添加新数据
2.2.2、 查看表的数据:
2.2.3、 修改、更新数据表中的数据记录
2.3、DQL:
2.3.1、查询数据库信息
2.3.2、 查看数据库中的数据表信息
2.3.3、显示数据表的结构(字段)
2.4、数据库表高级操作
2.4.1、表的清空、临时创建、克隆
2.4.1.1、清空列表
2.4.1. 2、临时表
2.4.1.3、克隆表
2.4.2数据库用户管理
2.4.2.1、新建用户
2.4.2.2、.查询创建的用户信息并且做增删改
2.4.2.3、 忘记用户的密码:
2.4.2.4、数据库用户授权
2.4.2.5权限撤销与刷新
2.5、DCL:数据控制语言,用于设置或者更改数据库用户或角色权限
2.5.1、设置用户权限
2.5.2、查看用户的权限
2.5.3、撤销用户的权限
3、问题:遇到root密码忘了怎么办?
3.1、 在 my.ini 或 my.cnf 的 [mysqld] 下添加 skip-grant-tables
3. 2、重启mysql数据库
3.3、登录数据库
3.4、 修改root密码
3.5、 修改mysql免密码登录配置 然后重启服务
3.6、重启mysql数据库
3. 7、mysql数据库验证
数据库文件所在:/usr/local/mysql/data/mysql
每个数据库对应一个子目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为“.frm”、“.MYD”和“.MYI”。
是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MyISAM表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。
也是专属于 MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息。对于 MyISAM 存储来说,可以被 cache 的内容主要就是来源于“.MYI”文件中。每一个MyISAM 表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。
MyISAM 存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件 (frm,myd,myi)。 每个表都有且仅有这样三个文件做为 MyISAM 存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI 文件中。
1mysql 与 oracle 日志有所区别
mysql
数据库日志文件用于备份,恢复,是最 核心的部分,写一条数据,同步到日志中一条
oracle :
重做日志组,一个组中至少3个日志成员,轮流存储日志 还会有另一个组与之同步/备份
describe user;查看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:固定长度的字符类型 用于定义字符类型数据。
Char如果存入数据的实际长度比指定长度要小,会补空格至指定长度,如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错
varchar:可变长度的字符类型
text:文本
image:图片
decimal(5,2):5个有效长度数字,小数点后面有2位 指定长度数组
主键是唯一的,但主键可以由多个字段构成
是Structured Query Language的缩写,即结构化查询语言 是关系型数据库的标准语言 用于维护管理数据库,如数据查询、数据更新、访问控制、对象管理等功能
分类
●DDL:数据定义语言 Data Definition Language
●DML:数据操纵语言 Data Manipulation Language
●DQL:数据查询语言 Data Query Language
●DCL:数据控制语言 Data Control Language
格式:
创建数据库:CREATE DATABASE 数据库名
创建数据表:CREATE TABLE 表名 (字段定义……)
CREATE DATABASE 数据库名;
mysql> create database bdqn;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
格式:
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型,...);
主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
例如:
CREATE TABLE zzz (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT'', PRIMARY KEY (id));
释义:
#NOT NULL 不允许为空值
#DEFAULT'' 默认值为空
PRIMARY KEY :主键一般选择没有重复并且不为空值的字段
注意:创建表需要在数据库的其中一个目录中创建,不指定数据库创建的话,否则会报错
创建表
mysql> use bdqn;
Database changed
mysql> create table q1 (id int NOT NULL,name char(20) NOT NULL,score decimal(5,2),passwd char(50) default'',PRIMARY KEY(id));
Query OK, 0 rows affected (0.02 sec)
mysql> desc q1;
删除表
mysql> drop tables q1
删除指定的数据库
DROP DATABASE 数据库名
mysql> drop database auth;
Query OK, 0 rows affected (0.00 sec)
数据操纵语言,用于对表中的数据进行管理,用来插入、删除和修改数据库中的数
insert :插入数据
update :更新数据
delete : 删除数据
格式:
INSERT INTO 表名(字段1,字段2[,...]) VALUES (字段1的值,字段2的值,...);
insert into users(user_name,user_passwd) values('zhangsan', password('123456')); ###标准使用方法
insert into users values('lisi', password('123456')); ###如果这条记录包含表中所有字段的值,则插入语句中的制定字段可以省略
示例:
INSERT INTO zzz (id,name,score,passwd) values(1,'zhangsan',70.5,PASSWORD('123456')); #PASSWORD('123456'):查询数据记录时,密码字串以加密形式显示:若不使用PASSWORD(),查询时以明文显示。
mysql> insert into q1(id,name,score,passwd)values(2,'po',82.5,password('123456'));
mysql> SELECT * FROM q1;
格式:
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
mysql> update q1 set passwd=password('123456') where name='xo';
修改表名
mysql> show tables;
+--------------+
| Tables_in_da |
+--------------+
| users |
+--------------+
1 row in set (0.00 sec)
mysql> alter table users rename ky30;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+--------------+
| Tables_in_da |
+--------------+
| ky30 |
+--------------+
表中 添加字段
alter table ky30 add address varchar(40) default"地址不详'
#default地址不详': 表示此字段设置默认值为地址不详,可与NOT NULL配合使用
ALTER TABLE yyy ADD address varchar(50) NOT NULL default,地址不详';
修改字段(列)名,添加唯一键
例如:ALTER TABLE 表名 CHANGE 目列名 新列名 数据类型 [unique kevl;
unique key:唯一键(特性:唯一,但可以为空,空值只允许出现一次)
Primary key:唯一且非空(主键一般选择能代表唯一性的字段不允许取空值 (NULL),一个表只能有一个主键。)
修改root密码
update mysql.user set authentication_string=PASSWORD('abc123') where User='root'; ####mysql5.7版本修改root的命令
明文往表中添加数据
mysql> insert into q1 values(3,'x1',97.5,'123456');
delete 删除数据
条件删除
delete from 表名 where 条件表达根据需求要删除的哪条记录
数据查询语言,用于从数据表中查找符合条件的数据记录
DQL是数据查询语句,只有SELECT,用于从数据表中查找符合条件的数据记录,
数据库中查询时可不指定条件,
mysql> show databases; #####查看数据库列表信息
+--------------------+
格式:
USE 数据库名
SHOW TABLES
mysql> use mysql; ####切到mysql 这个库, 解释:拿这本书
mysql> show tables; ####查看着个库中有哪些表 解释:看下这本书目录结构
+---------------------------+
格式:
DESCRIBE [数据库名.]表名
mysql> use mysql ####切到mysql 这个库, 解释:拿这本书
Database changed
mysql> describe user; ####查看着个user表的结构
select user_name,user_passwd from auth.users where user_name='lisi';
2.3.4、查询显示数据行数:
select * from limit 2 显示 头两行
select * from limit 2,3 显示 头两行后面的三行
查询信息,生产中不能用下面的命令进行查询:
select * from users;
关于数据库表的一些基础操作,比如:创建表、删除表、表的 查询等等。数据表在数据库的使用过程中, 有着很高的使用频率,所以本节会讲解些关于 表的升级用法,包括清空表、使用临时表和克隆表。
请列表的方法:
方法一:
delete from yyy3;
#DELETE清空表后,返回的结果内有删除的记录条目;DELETE 工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE EROM 删除所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。
方法二:
truncate table test01:
#TRUNCATE清空表后,没有返回被删除的条目: TRUNCATE 工作时是将表结构按原样重新建立,因此在速度上TRUNCATE会比DELETE清空表快;使用TRUNCATE TABLE 清空表内数据后,ID会从1开始重新记录
创建库(表),添加数据】删除数据
例如:
create table ky (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', level CHAR(16) NOT NULL, PRIMARY KEY (user_name));
insert into ky values('lisi', password('123456'),'10');
insert into ky values('lisi1', password('123456'),'45');
insert into ky values('lisi2', password('123456'),'46');
insert into ky values('lisi3', password('123456'),'47');
insert into ky values('lisi4', password('123456'),'48');
insert into ky values('lisi5', password('123456'),'49');
insert into ky values('lisi6', password('123456'),'50');
insert into ky values('lisi7', password('123456'),'1');
mysql> show tables;
+----------------+
| Tables_in_auth |
+----------------+
| ky |
| ky05 |
| tmp |
| tmp1 |
| tmp3 |
| users |
+----------------+
6 rows in set (0.00 sec)
mysql> select * from ky;
+-----------+-------------------------------------------+-------+
| user_name | user_passwd | level |
+-----------+-------------------------------------------+-------+
| lisi | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 10 |
| lisi1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 45 |
| lisi2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 46 |
| lisi3 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 47 |
| lisi4 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 48 |
| lisi5 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 49 |
| lisi6 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 50 |
| lisi7 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | 1 |
+-----------+-------------------------------------------+-------+
8 rows in set (0.00 sec)
mysql> delete from ky where level >=45;
Query OK, 6 rows affected (0.00 sec)
mysql> select * from ky;
+-----------+-------------------------------------------+-------+
| user_name | user_passwd | level |
+-----------+-------------------------------------------+-------+
| lisi | *6BB4837EB743
创建库(表)
create table ky (user_name CHAR(16) NOT NULL, user_passwd CHAR(48) DEFAULT '', level CHAR(16) NOT NULL, PRIMARY KEY (user_name));
添加数据
insert into ky values('lisi', password('123456'),'10');
insert into ky values('lisi1', password('123456'),'45');
insert into ky values('lisi2', password('123456'),'46');
insert into ky values('lisi3', password('123456'),'47');
insert into ky values('lisi4', password('123456'),'48');
insert into ky values('lisi5', password('123456'),'49');
insert into ky values('lisi6', password('123456'),'50');
insert into ky values('lisi7', password('123456'),'1');.
查看创建的表
show tables;
查看表中的数据
mysql> select * from ky;
根据条件来清除数据
delete from ky where level >=45;
临时建立的表,用于保存一些临时数据,不会长期存在,
MySQL 的临时表,顾名思义,就是临时建立的表,并不会长期存在,主要用于保存一 些临时数据。临时表有个特性,
就是只在当前连接可见,当前连接下可执行增删改查等操作, 当连接被关闭后,临时表就会被 MySQL 删除,相关的资源也会被释放。
下面创建临时表 mytmp,然后插入数据,之后断开当前连接,最后重新连到 MySQL 查看临时是否还存在,具体操作如下
mysql>CREATE TEMPORARY TABLE `mytmp` (`id` int(10) NOT NULL AUTO_INCREMENT,`NAME` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,`level` int(10) NOT NULL,PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into mytmp(name,level) values('aa',10);
select * from mytmp;
退出数据库
mysql -uroot -p
mysql> use auth;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from mytmp;
ERROR 1146 (42S02): Table 'auth.mytmp' doesn't exist
在 MySQL 的开发和维护过程中,会有原样拷贝某个数据表的需求。怎么样才能够快速、 完整的拷贝数据表呢? 先来看一下 CREATE TABLE new_tablename AS SELECT 这个语 句,
克隆ky的结构
第一种 先复制 表结构 再备份内容
create table 新表名 like 旧表名 复制格式 #通过like 方法 复制旧表名的表结构生成新的表名的结构
insert into 新表名 select * from 旧表名 备份内容
第二种 直接复制
create table 新表名 (select * from 日表名) 复制旧表 数据到新表中
create table test like ky;
mysql> create table test like ky;
mysql> select * from test;
mysql> insert into test select * from ky;
create user '用户名'@'来源地址' 设置用户密码 identified by '密码'(PASSWORD'密码');
来源地址:主机名、IP地址、网段、所有
% 通配符
密码: 可以使用select PASSWORD('密码') 来设置我们用户的密文密码
mysql 创建的用户 mysql数据库下面的userb
查询select user
删除用户 drop
修改用户密码 set password = password ('密码') 当前
修改其他用户密码 set password for '用户名'@'localhost' = password ('密码')
修改my.cnf 配置 跳过密码认证
[mysald]
skip-grant-tables
grant提权
grant 权限列表ON 数据库.表名 TO用户名 @来源地址 identified by '密码'
* (所有表)
例如:
grant select on nizb,* to 'ginf'@'192.168.10.2' identified by'abc123'
grant all prvileges on njzh,* to 'ginf'@'192.168.10.2' identified by'abc1231'
all prvileges :代表所有
flush prvileges 刷新权限
撤销权限
revoke 权限列表 on 数据库.表名 from '用户名' @'来源地址'
show grant for '用户名' @'来源地址'
设置用户权限(用户不存在时,则新建用户
格式:.
GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址[IDENTIFIED BY密码]
mysql> GRANT select ON auth.t TO xiaogi'@localhost' IDENTIFIEDBY123456Query OK, 0 rows affected (0.00 sec)
grant select on auth.* to 'xiaoqi'@'localhost' identified by '123456';
######列子####
mysql> grant select on auth.* to 'xiaoqi'@'localhost' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
######退出mysql用xiaoqi账户登录####
[root@localhost ~]# mysql -u xiaoqi -p ##登录
Enter password: ##输入密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.20 Source distribution
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> ###已经登录
#######验证xiaoqi#####
mysql> select * from auth.users; ###验证授权的访问操作
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| zhangsan | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-------------------------------------------+
1 row in set (0.00 sec)
mysql> drop table auth.users; ####验证非授权的访问操作
ERROR 1142 (42000): DROP command denied to user 'xiaoqi'@'localhost' for table 'users'
########创建bdqn数据库,授权192.168.100.1的主机连接,用户名为dbuser 密码为pwd@123允许bdqn库中操作###
create database bdqn;
grant all on auth.* to 'dbuser'@'192.168.100.%' identified by 'pwd@123';
grant create on bdqn.* to 'dbuser'@'192.168.100.1' identified by 'pwd@123';
#######列子####3
mysql> create database bdqn;
SHOW GRANTS FOR 用户名@来源地址
mysql> show grants for 'dbuser'@'192.168.100.1'; ####查看用户的权限
+--------------------------------------------------------------+
| Grants for [email protected] |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dbuser'@'192.168.100.1' |
| GRANT ALL PRIVILEGES ON "bdqn".* TO 'dbuser'@'192.168.100.1' |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)
revoke all on bdqn.* from 'xiaoqi'@'localhost';
格式:
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址
revoke all on bdqn.* from 'dbuser'@'192.168.100.1';
mysql> revoke all on bdqn.* from 'dbuser'@'192.168.32.2';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'dbuser'@'192.168.100.1';
+------------------------------------------------+
| Grants for [email protected] |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'dbuser'@'192.168.100.1' |
+------------------------------------------------+
1 row in set (0.00 sec)
[root@localhost mysql]# vi /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
skip-grant-tables ####此处添加###
[root@localhost mysql]# systemctl restart mysqld
[root@localhost mysql]# mysql -uroot -p
Enter password: ###回车直接登录
mysql>
mysql> update mysql.user set authentication_string=PASSWORD('abc123') where User='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
[root@localhost mysql]# vi /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
#skip-grant-tables
[root@localhost mysql]# systemctl restart mysqld
[root@localhost mysql]# mysql -uroot -p
Enter password: ####输入abc123
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.20 Source distribution
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>