目录
前言
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 应用软件之一。在本篇中,会让大家快速掌握 MySQL 的基本操作,并轻松使用 MySQL 数据库
一、概述
MySQL数据库的数据文件存放在/usr/local/mysq1/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 文件。
二、数据的常用类型
- int :整型
- float :单精度浮点 4字节32位
- double :双精度浮点 8字节64位
- char :固定长度的字符类型
- varchar :可变长度的字符类型
- text :文本
- image :图片
- decimal(5,2) :5个有效长度数字,小数点后面有2位
注:如果char存入数据的实际长度比指定长度要小,会空格至指定长度,如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错
三、数据库SQL语言
1、SQL语言的分类
类型 | 说明 |
DDL(数据定义语言) | 用于创建数据库对象,如库、表、索引等 |
DML(数据操作语言) | 用于对表中的数据进行管理,用来插入、删除和修改数据库中的数据 |
DQL(数据查询语言) | 用于从数据表中查找符合条件的数据记录 |
DCL(数据控制语言) | 用于设置或者更改数据库用户或者角色权限(用于控制不同数据段直接的许可和访问加别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,如COMMIT、ROLLBACK、GRANT、REVOKE) |
2、 数据库管理
进入MySQL命令的方式
方式一
方式二
查看数据库信息
mysql> show databases; #查看当前又写什么数据库
mysql> use mysql; #选择需要使用的数据库mysql
mysql> show tables; #查看当前库里有什么表
mysql> desc user; #查看user表结构
查看版本
[root@mysql ~]# mysql -V
mysql> select version(); #在mysql内部查看版本
3、DDL数据定义语言
3.1创建/删除数据库
#创建数据库
mysql> CREATE DATABASE 库名;
#删除数据库
mysql> DROP DATABASE 库名;
3.2创建/删除表
#进入school中
use school;
#主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
#删除表
DROP TABLE 表名;
CREATE TABLE first_group (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),pa aawd char(48) DEFAULT'',PRIMARY KEY (id));
3.3查看表结构
#查看表结构
desc 表名
#查看库中的表内容
show tables in 库名;
属性 | 说明 |
Field | 字段名称 |
type | 数据类型 |
Null | 是否允许为空 |
key | 主键 |
Default | 默认值 |
Extra | 扩展属性,例如:标志符列(标识了种子,增量/步长)1 2 |
id | 1 3 5 7 |
4、DML管理表中的数据
4.1向数据表中插入新的数据记录
#向数据表中插入新的数据记录
insert into 表名(字段1,字段2,字段3) values(字段1的值,字段2的值,字段3的值);
#示例1
insert into info(id,name,age,score) values(2,'yxp',18,88)
select * from info;
#示例2:直接使用表明加入字段
insert into info values(1,'dhc',20,'77)
#示例3:可以指定字段添加
insert into info(id,name,score) values(3,'dhc',20)
4.2查询数据记录
SELECT 字段名1,字段名2[,...] FROM 表名 [WHERE 条件表达式];
例:select * from first_group;
select name,score from first_group where id=1;
4.3修改并更新数据表中的数据记录
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
例:insert into first_group (id,name,score,passwd) values(3,'lisi',77,123456);
insert into CLASS (id,name,score,passwd) values(4,'lzz',66,123456);
select * from first_group;
update CLASS set id=5 where name='zhangsan';
select * from first_group;
update CLASS set name='lichen',score=100 where id=2;
select * from first_group;
4.4在数据表中给删除指定的数据记录
DELETE FROM 表名 [WHERE 条件表达式];
例:delete from first_group where id=3;
select * from first_group;
5、DQL查询数据记录
select name from first_group\G #以列表方式竖向显示
select * from CLASS limit 2; #只显示头2行
select * from CLASS limit 2,3; #显示第2行后的前3行
6、DCL修改表名和表结构
6.1修改表名
ALTER TABLE 旧表名 RENAME 新表名;
例:alter table first_group rename first;
show tables;
select * from first;
6.2扩展结构表(添加字段)
ALTER TABLE 表名 ADD status varchar(50) default '彼方尚有荣光在';
#default ‘地址不详’:表示此字段设置默认值 地址不详;可与 NOT NULL 配合使用
例:alter table first add status varchar(50) default '彼方尚有荣光在';
6.3修改字段列,添加唯一键
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [unique key];
例:alter table first change name student_name varchar(20) unique key;
select * from first ;
例:insert into first (id,name,score,passwd) values(1,'ABC',250,123456);
select * from first ;
insert into first (id,name,score,passwd) values(6,'MNQ',250,123456);
6.4删除字段
ALTER TABLE 表名 DROP 字段名;
例:alter table first drop score;
扩展
例:use SCHOOL;
create table if not exists test (id int(4) zerofill primary key auto_increment,student_name varchar(20) not null,cardid varchar(18) not null unique key,hobby varchar(50));
#显示表的内容字段
desc test;
字段 | 说明 |
if not exists | 表示检测要创建的表是否已存在,如果不存在就继续创建 |
int(4) zerofill | 表示若数值不满4位数,则前面用“0”填充,例0001 |
auto_increment | 表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且添加失败也会自动递增一次 |
unique key | 表示此字段唯一键约束,此字段数据不可以重复;一张表中只能有一个主键, 但是一张表中可以有多个唯一键 |
not null | 表示此字段不允许为NULL |
创建如果没有test表则需要创建,id:int整型(4)字段,若字段不满足指定长度,则在前面填充0,主键会从1自动增长;student_name :varchar(20)可变长度字段,指定最多20个字符,其中not null为非空值;cardid :varchar(20)唯一键不能为空值;hobby:carchar(50)
每次插入新的内容时,主键id都会递增,若失败不递增。再次插入新的内容时不需要指定主键值。若不添加主键值时,即使添加失败也会递增
四、克隆/复制一个表
查看原始数据表
方法一
create table 新表名 like 复制的表名;
复制格式,能够复制表的格式到新表,但是没有内容
insert into 新表名 select * from 复制的表名;
复制原表内容到新表
方法二
create table 新表名 (select * from 复制的表名)
数据结构和数据一起复制过来了,克隆
五、清空表/删除表内数据
方法一
delete from CLASS;
#DELETE清空表后,返回的结果内有删除的记录条目;
工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM
删除所有记录后,在此添加的记录会从原来最大的记录id后面继续自增写入数据
方法二
truncate table CLASS1;
#TRUNCATE清空表后,没有返回被删除的条目:TRUNCATE
工作时是将表结构按原样重新建立
因此在速度上TRUNCATE会比DELETE清空表快
使用TRUNCATE TABLE 清空表内数据后,id会从1开始重新记录
3、drop、truncate、delete对比
3.1 drop table table_name
- 属于DDL
- 不可回滚(无法恢复)
- 不可带where
- 表内容和结构删除
- 删除速度快
3.2 truncate table table_name
- 属于DDL
- 不可回滚
- 不可带where
- 表内容删除
- 删除速度快
3.3 delete from table_name
- 属于DML
- 可回滚(可回复)
- 可带where
- 表结构在,表内容要看where执行的情况
- 删除速度慢,需要逐行删除
3.4 小结
- 不再需要一张表的时候用drop
- 想删除部分数据行的时候用delete,并且带上where子句
- 保留表而删除所有数据的时候用truncate
- 删除速度:drop>truncate> delete
- 安全性 delete 最好
六、临时创建表
##添加临时表CLASS2
create temporary table CLASS2 (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));
## 查看当前库中所有表
show tables;
##在临时表中添加数据
insert into test03 values(1,'zhangsan',123456789,'watch a film');
##查看当前表中所有数据
select * from CLASS2;
##退出数据库
quit
##重新登录后进行查看
mysql -u root -p
##查看之前创建的临时表中所有数据,发现已经被自动销毁
select * from CLASS2;
七、用户管理
1、新建用户
CREATE USER '用户名'@'来源地址' [IDENTIFIED BY [PASSWORD] '密码'];
‘用户名’:指定将创建的用户名
‘来源地址’:指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录可用通配符%
‘密码’:
若使用明文密码,直接输入’密码’,插入到数据库时由Mysql自动加密;
若使用加密密码,需要先使用SELECT PASSWORD(‘密码’); 获取密文,再在语句中添加 PASSWORD ‘密文’;
若省略“IDENTIFIED BY”部分,则用户的密码将为空(不建议使用)
1.1明文创建用户
CREATE USER 'lic'@'localhost' IDENTIFIED BY '123456';
1.2密文创建用户
select password('123456');
create user 'lic'@'localhost' identified by password '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
查看用户信息
创建后的用户保存在mysql 数据库的user表里
use mysql
select user,authentication_string,host from user;
2、查看用户信息
创建后的用户保存在 mysql 数据库的 user 表里
use mysql;
select User,authentication_string,Host from user;
3、重命名用户
rename user 'lichen'@'localhost' to 'zhangbin'@'localhost';
select user,authentication_string,host from user;
4、删除用户
drop user 'zhangbin'@'localhost';
select user,authentication_string,host from user;
5、修改当前用户登录密码
set password = password('654321');
6、修改其他用户密码
set password for 'zhangb'@'localhost' = password('123123');
7、忘记root密码
7.1修改配置文件,添加配置,使登录mysql不使用授权表
vim /etc/my.cnf
#添加此行
skip-grant-tables
systemctl restart mysqld.service
mysql
7.2使用update丢该root密码(并刷新数据库)
update mysql.user set authentication_string = password('001122') where user='root';
flush privileges;
八、用户授权
GRANT语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时,GRANT语句将会创建新的用户;当指定的用户名存在时,GRANT 语句用于修改用户信息。
1、用户授权
- 权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select,insert,update”。使用“all”表示所有权限,可授权执行任何操作。
- 数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符。
- 用户名@来源地址:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP 地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如“%.accp.com”、“192.168.48.%”等。
- IDENTIFIED BY:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略“IDENTIFIED BY”部分, 则用户的密码将为空。
2、权限列表
权限 | 说明 |
select | 查询数据 |
insert | 插入数据 |
update | 更新数据 |
delete | 删除数据 |
create | 创建库、表 |
drop | 删除库、表 |
index | 建立索引 |
alter | 更改表属性 |
event | 事件 |
trigger on | 创建触发器 |
3、数据库授权
show grants for zhangb@localhost; #查看用户权限
grant select on SCHOOL.* to zhangb@localhost; #用户lic只有SCHOOL库下所有表的查询权限
4、远程登陆授权
使用Navicat连接Mysql登录查看
登录成功后可以查看表中的内容
5、撤销权限
revoke select on school.* from zhangb@localhost; #删除zhangb的权限