目录
一、常用数据类型
类型 | 说明 |
int | 整型(定义整数类型数据) |
float | 单精度浮点,4字节32位,准确到小数点后六位 |
double | 双精度浮点,8字节64位 |
char | 固定长度的字符类型,定义字符类数据 存入数据的实际长度比指定长度要小,会补空格至指定长度;如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错。 |
varchar | 可变长度的字符类型 最大为设置的长度值,当不足时,即为当前长度大小。 |
text | 文本 |
image | 图片 |
decimal (5,2) | 5个有效长度数字,小数点后面有2位,指定长度数组 当输入的数值后的小数位小于两位时,会拿0补全两位;当超过两位时,小数点后第三位是自动进行的四舍五入进第二位 |
主键是唯一的,但主键可以由多个字段构成
MysQL数据库的数据文件存放在/usr/local/mysql/data目录下,每个数据库对应一个子目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为".frm"、".MYD"和".MYI"。
“MYD"文件是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MISA表都会有一个".MNYD*文件与之对应,同样存放于所属数据库的文件夹下,和".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文件。
二、数据库基本操作
1、进入数据库
mysql -uroot -p 或者mysql -uroot -p密码
-u 连接数据库的用户名
-p 后面跟的是连接数据库的密码(不能有空格)
2、查看数据库
show databases;
3、查看数据库中表的信息
use 数据库名;
show tables;
4、显示数据表的结构(字段)
describe [数据库.]表名
或
desc [数据库.]表名
当你已经在所在表的库中时,可省略前面的数据库名。
当你需要对其他库中的表进行操作时,就需要加上库名进行操作。
三、SQL语句概述
1、SQL语言
Structured Query Language 的缩写,即结构化查询语言
关系型数据库的标准语言
用于维护管理数据库
包括数据查询、数据更新、访问控制、对象管理等功能
2、SQL分类
DDL | 数据定义语言,用于创建数据库对象,如库、表、索引等 |
DML | 数据操纵语言,用于对表中的数据进行管理,用来插入、册删除和修改数据库中的数据 |
DQL | 数据查询语言,用于从数据表中查找符合条件的数据记录 |
DCL | 数据控制语言,用于设置或者更改数据库用户或角色权限(数据控制语句,用于控制不通数据段直接的许可和访问级别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,如COMMIT、ROLLBACK、GRANT、REVOKE) |
四、创建及删除库和表(DDL语言)
1、创建数据库和表
创建数据库
create database 数据库名;
刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/data 目录下会自动生成一个与新建的库名相同的空文件夹。
创建数据表
create table 表名(字段1 数据类型,字段2 数据类型,....,[primary key(主键名)]);
#主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
#NOT NULL不允许为空值
#DEFAULT''默认值为空
#PRIMARY KEY :主键一般选择没有重复并且不为空值的字段
2、删除数据表
drop table xf.zhangsan;
drop table 语句用于删除库中的表,需要指定“库名.表名”作为参数;若只指定表名参数,则需先通过执行“USE”语句切换到目标库。
drop属于DDL、不可回滚(无法恢复)、不可带where、表内容和结构删除、删除速度快
3、删除数据库
drop database xf;
五、管理表中的数据
DML语句用于对表中的数据进行管理
包括的操作:INSERT:插入新数据
UPDATE:更新原有数据
DELETE:删除不需要的数据
1、向数据表中插入新的数据记录
mysql> create table book1 (id int not null,name char(20) not null,sex char(1) not null,primary key (id));
insert into book1 (id,name,sex) values(1,'liyi','男');
2、 查询数据记录
#语法格式
SELECT 字段名1,字段名2 ······FROM 表名 WHERE 条件表达式;
#表示所有字段时,可以使用通配符“*”,若要显示所有的数据记录则可以省略WHERE条件子句DQL是数据查询语句,只有SELECT
用于从数据表中查找符合条件的数据记录查询时可不指定条件
mysql> CREATE TABLE book3 (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT '',PRIMARY KEY (id));
mysql> insert into book3(id,name,score,passwd) values(1,'zhangsan',70,PASSWORD('123456'));
mysql> insert into book3 values(2,'lisi',85,PASSWORD('123456'));
mysql> insert into book3 values(3,'wangwu',80,PASSWORD('123456'));
mysql> insert into book3 values(4,'zhaoliu',90,PASSWORD('123456'));
mysql> insert into book3 values(5,'qianqi',83,PASSWORD('123456'));
mysql> select * from book3;
+----+----------+-------+-------------------------------------------+
| id | name | score | passwd |
+----+----------+-------+-------------------------------------------+
| 1 | zhangsan | 70.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | lisi | 85.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 3 | wangwu | 80.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 4 | zhaoliu | 90.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 5 | qianqi | 83.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+----------+-------+-------------------------------------------+
5 rows in set (0.00 sec)
#当需要根据特定的条件查找记录时,WHERE条件子句时必不可少的,比如查询users表中用户名为wangba的记录,显示其中用户名,密码字段的信息,操作如下
mysql> select id,name,score from book3 where id='2';
+----+------+-------+
| id | name | score |
+----+------+-------+
| 2 | lisi | 85.00 |
+----+------+-------+
1 row in set (0.00 sec)
#查看前两行内容
mysql> select * from book3 limit 2;
+----+----------+-------+-------------------------------------------+
| id | name | score | passwd |
+----+----------+-------+-------------------------------------------+
| 1 | zhangsan | 70.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | lisi | 85.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+----------+-------+-------------------------------------------+
2 rows in set (0.00 sec)
#查看第二行后的前三行
mysql> select * from book3 limit 2,3;
+----+---------+-------+-------------------------------------------+
| id | name | score | passwd |
+----+---------+-------+-------------------------------------------+
| 3 | wangwu | 80.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 4 | zhaoliu | 90.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 5 | qianqi | 83.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+---------+-------+-------------------------------------------+
3 rows in set (0.00 sec)
密码字串以加密形式显示,若不使用 PASSWORD(),查询时以明文显示
3、修改、更新数据表中的数据记录
UPDATE 语句用于修改、更新表中得数据记录
UPDATE 表名 SET 字段名 1=字段值 1[,字段名 2= 字段值 2] WHERE 条件表达式;
mysql> update book3 set passwd=password('') where id='2';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from book3;
+----+----------+-------+-------------------------------------------+
| id | name | score | passwd |
+----+----------+-------+-------------------------------------------+
| 1 | zhangsan | 70.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | lisi | 85.00 | |
| 3 | wangwu | 80.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 4 | zhaoliu | 90.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 5 | qianqi | 83.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+----------+-------+-------------------------------------------+
5 rows in set (0.00 sec)
4、 在数据表中删除指定的数据记录
DELETE FROM 表名 WHERE 条件表达式;
1)属于DML
2)可回滚(可恢复)
3)可带where
4)表结构在,表内容要看where执行的情况
5)册删除速度慢,需要逐行删除
mysql> delete from book3 where id='2';
Query OK, 1 row affected (0.01 sec)
mysql> select * from book3;
+----+----------+-------+-------------------------------------------+
| id | name | score | passwd |
+----+----------+-------+-------------------------------------------+
| 1 | zhangsan | 70.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 3 | wangwu | 80.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 4 | zhaoliu | 90.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 5 | qianqi | 83.00 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+----------+-------+-------------------------------------------+
4 rows in set (0.00 sec)
案例扩展
例:
use SCHOOL;
create table if not exists CLASS4 (id int(4) zerofill primary key auto_increment,student_name varchar(20) not null,cardid varchar(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
六、数据表高级操作
1、修改表名和表结构
1-1、修改表面
#语法格式 ALTER TABLE 旧表名 RENAME 新表名;
mysql> show tables;
+-----------------+
| Tables_in_daxue |
+-----------------+
| book1 |
| book3 |
| gaozhong |
| web_demo |
+-----------------+
4 rows in set (0.00 sec)
mysql> alter table gaozhong rename xiaoxue;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-----------------+
| Tables_in_daxue |
+-----------------+
| book1 |
| book3 |
| web_demo |
| xiaoxue |
+-----------------+
4 rows in set (0.00 sec)
1-2、扩展表结构
#增加字段
mysql> select * from book1;
+----+------+-----+
| id | name | sex |
+----+------+-----+
| 1 | liyi | 男 |
+----+------+-----+
1 row in set (0.00 sec)
mysql> alter table book1 add number varchar(50) not null default '未知';
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from book1;
+----+------+-----+--------+
| id | name | sex | number |
+----+------+-----+--------+
| 1 | liyi | 男 | 未知 |
+----+------+-----+--------+
1 row in set (0.00 sec)
#修改字段(列)名,添加唯一键
mysql> alter table book1 change id shuzi varchar(20) unique key;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from book1;
+-------+------+-----+--------+
| shuzi | name | sex | number |
+-------+------+-----+--------+
| 1 | liyi | 男 | 未知 |
+-------+------+-----+--------+
1 row in set (0.00 sec)
#删除字段
语法格式:ALTER TABLE 表名 DROP 字段名;
mysql> alter table book1 drop number;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from book1;
+-------+------+-----+
| shuzi | name | sex |
+-------+------+-----+
| 1 | liyi | 男 |
+-------+------+-----+
1 row in set (0.00 sec)
2、克隆表
方法1:
mysql> create table book1_1 like book1;
Query OK, 0 rows affected (0.02 sec)
mysql> desc book1_1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| shuzi | varchar(20) | NO | PRI | NULL | |
| name | char(20) | NO | | NULL | |
| sex | char(1) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into book1_1 select * from book1;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from book1_1;
+-------+------+-----+
| shuzi | name | sex |
+-------+------+-----+
| 1 | liyi | 男 |
+-------+------+-----+
1 row in set (0.00 sec)
方法2:
mysql> create table book1_2 (select * from book1);
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from book1_2;
+-------+------+-----+
| shuzi | name | sex |
+-------+------+-----+
| 1 | liyi | 男 |
+-------+------+-----+
1 row in set (0.00 sec)
3、清空表
DELETE清空表后,返回的结果内有删除的记录条目,DELETE工作时是一行一行的删除记录数据的 如果表中有自增长字段,使用DELETE
FROM 删除所有记录后,再次新添加的记录会从原来最大的记录 ID 后面继续自增写入记录
方法1:
mysql> delete from book1_1;
Query OK, 1 row affected (0.00 sec)
mysql> select * from book1_1;
Empty set (0.00 sec)
方法2:
mysql> select * from book1_2;
+-------+------+-----+
| shuzi | name | sex |
+-------+------+-----+
| 1 | liyi | 男 |
+-------+------+-----+
1 row in set (0.00 sec)
mysql> truncate table book1_2;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from book1_2;
Empty set (0.01 sec)
#TRUNCATE 清空表后,没有返回被删除的条目
#TRUNCATE 工作时是将表结构按原样重新建立,因此在速度上 TRUNCATE 会比 DELETE 清空表快
#使用 TRUNCATE TABLE 清空表内数据后,ID 会从 1 开始重新记录
drop:属于 DDL、 不可回滚(无法恢复) 、不可带 where 、表内容和结构删除 、删除速度快
truncate:属于 DDL、 不可回滚、 不可带 where 、表内容删除 、删除速度快
delete :属于DML 、可回滚(可恢复)、 可带 where 表结构在,表内容要看 where 执行的情况 、删除速度慢,需要逐行删除
不再需要一张表的时候,用 drop
想删除部分数据行时候,用 delete,并且带上 where 子句
保留表而删除所有数据的时候用 truncate
删除速度 drop > truncate > delete
安全性 delete 最好
4、创建临时表
临时表创建成功之后,使用SHOW TABLES命令是看不到创建的临时表的,临时表会在连接退出后被销毁
在退出连接之前,也可以可执行增删改查等操作,比如使用 DROP TABLE 语句手动直接删除临时表临时表创建成功之后,使用 show tables; 命令是看不到创建的临时表的,临时表会在连接退出后被销毁。
在退出连接之前可执行增删改查等操作,比如使用 DROP TABLE 语句手动删除临时表
临时表只对创建会话可见
可能会跟永久表冲突,导致重连之后误操作永久表中的数据
为了避免删除相同表名的永久表,执行删除表结构的时候可以使用 drop temporary table_name;
mysql> create temporary table book_linshi (id int not null,name varchar(20) not null,cardid varchar(18) not null
unique key,primary key (id));Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-----------------+
| Tables_in_daxue |
+-----------------+
| book1 |
| book1_1 |
| book1_2 |
| book3 |
| web_demo |
| xiaoxue |
+-----------------+
6 rows in set (0.00 sec)
mysql> insert into book_linshi values (1,'gaode','123456');
Query OK, 1 row affected (0.00 sec)
mysql> select *from book_linshi;
+----+-------+--------+
| id | name | cardid |
+----+-------+--------+
| 1 | gaode | 123456 |
+----+-------+--------+
1 row in set (0.00 sec)
5、创建外键约束
创建外键约束能保证数据的完整性和一致性
外键的定义:
如果同一个属性字段 x 在表一中是主键,而在表二中不是主键,则字段 x 称为表二的外键主键表和外键表的理解:
以公共关键字作为主键的表为主键表(父表、主表)
以公共关键字作为外键的表为外键表(从表、外表)注意:与外键关联的主表的字段必须设置为主键,要求从表不能是临时表,且主从表的字段具有相同的数据类型、字符长度和约束
常见的约束对应:
主键约束 primary key
外键约束 foreign key
非空约束 not null
唯一约束 unique key
默认值约束 default
自增约束 auto_increment
5-1、主表和从表的操作原则和示范
5-1-1、首先创建两张表,并且其中一张表的字段和另一张表的主键相同
5-1-2、向表内添加数据内容
5-1-3、为主表添加主键约束,并为从表添加外键
5-1-4、查看结构情况显示外键关联
5-1-5、插入数据(先主表,再从表)
5-1-6、删除数据记录(先从表,后主表)
5-1-7、如果要删除外约束字段((先删除外键约束,再删除外键名)
七、数据库用户管理
1、新建用户
create user '用户名'@'来源地址' [identified by [passwd] '密码'];
用户名:指定将创建的用户名
来源地址:指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录
可用通配符%
可使用通配符 %
密码’:若使用明文密码,直接输入’密码’,插入到数据库时由Mysql自动加密;
若使用加密密码,需要先使用SELECT PASSWORD(‘密码’); 获取密文,再在语句中添加 PASSWORD ‘密文’;
若省略“IDENTIFIED BY”部分,则用户的密码将为空(不建议使用)
mysql> create user 'zhangsan'@'localhost' identified by '123123'
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> select password('123321');
+-------------------------------------------+
| password('123321') |
+-------------------------------------------+
| *437F1809645E0A92DAB553503D2FE21DB91270FD |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> create user 'lisi'@'localhost' identified by password '*437F1809645E0A92DAB553503D2FE21DB91270FD';
Query OK, 0 rows affected, 1 warning (0.00 sec)
2、查看用户信息
use mysql;
select User,authentication_string,Host from user;
3、重命名用户
rename user 'lisi'@'localhost' to 'wangwu'@'localhost';
select User,authentication_string,Host from user;
4、删除用户
drop user 'wangwu'@'localhost';
select User,authentication_string,Host from user;
5、修改当前登录用户密码
set password = password('123456');
quit
mysql -uroot -p123456
6、修改其他用户密码
7、mysql的root登录密码忘记了处理办法
7-1、修改配置文件,改成免密登录,并重启mysql服务
[root@localhost ~]# vim /etc/my.cnf
7-2、免密登录mysql,使用 update 修改 root 密码,并刷新数据库
7-3、退出数据库,注释掉配置文件中的免密登录项,并重启mysql服务
[root@localhost ~]# vim /etc/my.cnf
[root@localhost ~]# systemctl restart mysqld.service
八、数据库用户授权
1、授予权限
grant 提权
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' [identified by '密码'];
权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如 “select,insert,update” 。使用 “all” 表示所有权限,可授权执行任何操作。
数据库名.表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符 * 。lucien.* 表示授权操作的对象为lucien数据库中的所有表。
‘用户名@来源地址’:用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP 地址,还可以使用 “%” 通配符,表示某个区域或网段内的所有地址,如 “%.lucien.com” 、“192.168.184.%” 等。
identified by:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略 “identified by” 部分, 则用户的密码将为空。
2、查看权限
show grants for 用户名@来源地址;
3、撤销权限
revoke 权限列表 on 数据库名.表名 from 用户名@来源地址;
总结
一个关系数据库通常包含多个表,可以通过外键将这些表关联起来
MySQL是一个开源的数据库软件,默认端口号3306,配置文件是/etc/my.cnf
需要了解的5个项:
if not exists:表示检测要创建的表是否存在,如果不存在就创建表
int(4) zerofill:表示若数值不满4位数,则前面用“0”填充
auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且添加失败也会自动递增一次
unique key:表示此字段唯一键约束,此字段数据不可以重复;一张表中只能有一个主键, 但是一张表中可以有多个唯一键
not null:表示此字段不允许为NULL
关于克隆一个表的操作
有两种方法可进行克隆/复制一个表
方法一:先复制格式再复制内容
create table 新表名 like 复制的表名;
insert into 新表名 select * from 复制的表名;
方法二:直接全部复制(包括格式和内容)
create table 新表名 (select * from 复制的表名)
清空表操作
有三种方式:delete、truncate 和 drop
三种操作的对比:
删除速度:drop > truncate > delete
安全性:delete 最好
临时表
临时表创建成功之后,使用 show tables 命令是看不到创建的临时表的,临时表会在连接退出后被销毁。
如果在退出连接之前,也可以可执行增删改查等操作,比如使用 drop table 语句手动直接删除临时表。
同时,临时表也无法创建外键。
创建方式:
create temporary table 表名 (字段1 类型,字段2 类型 [,primary key (主键名)]);
mysql的6个常见约束方式
主键约束:primary key
外键约束:foreign key
非空约束:not null
唯一约束:unique [key
默认值约束:default
自增约束:auto_increment
‘用户名’@'来源地址’是一个整体,不管是创建、删除、重命名、改密码等操作
所有的 mysql 用户信息都存放在 mysql 库的 user 表中,可使用 select User,authentication_string,Host from user;查看
关于root龙湖忘记登录数据库的密码,修改完配置文件后,免密登录mysql之后,并没有提权,所以我们不能直接使用set 来修改密码,需要使用 update mysql.user set authentication_string = password(‘010230’) where user=‘root’;
在给用户授权的时候,可以使用通配符代表所有。
不建议省略 “identified by” 部分,因为这样就代表不需要密码登录,会很不安全。
才进行撤销权限操作的时候,最后剩下的USAGE代表登录权限,为不可回收权限。