一.MySQL数据库基本操作知识:
1.SQL语句:
关系型数据库,都是使用SQL语句来管理数据库中的数据。
SQL,即结构化查询语言(Structured Query Language) 。
SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控制、对象管理等功能。
2.SQL分类:
数据库:database
表:table,行:row 列:column
索引:index
视图:view
存储过程:procedure
存储函数:function
触发器:trigger
事件调度器:event scheduler,任务计划
用户:user
权限:privilege
2.SQL语言规范:
-
在数据库系统中,SQL 语句不区分大小写,建议用大写
-
SQL语句可单行或多行书写,默认以 " ; " 结尾
-
关键词不能跨多行或简写
-
用空格和TAB 缩进来提高语句的可读性
-
子句通常位于独立行,便于编辑,提高可读性
3.数据库对象和命名:
数据库的组件(对象):
数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等
命名规则:
必须以字母开头,后续可以包括字母,数字和三个特殊字符(# _ $)
不要使用MySQL的保留字,如tabble select show databases
4.SQL语句分类:
SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控制、对象管理等功能。
SQL语句分类:
语句 | 代表的意思 |
---|---|
DDL | 数据定义语言,用于创建数据库对象,如库、表、索引等 |
DML | 数据操纵语言,用于对表中的数据进行管理 |
DQL | 数据查询语言,用于从数据表中查找符合条件的数据记录 |
DCL | 数据控制语言,用于设置或者更改数据库用户或角色权限 |
5.数据类型:
5.1 常用数据类型:
类型 | 说明 |
int | 整型,用于定义整数类型的数据 |
fload | 单精度浮点4字节32位,准确表示到小数点后六位 |
double | 双精度浮点8字节64位 |
char | 固定长度的字符类型,用于定义字符类型数据。 |
varchar | 可变长度的字符类型 |
text | 文本 |
image | 图片 |
decimal(5,2) | 5个有效长度数字,小数点后面有2位。指定长度数组 |
char
char的长度是不可变。char如果存入数据的实际长度比指定长度要小 会补空格至指定长度 如果存入的数据的实际长度大于指定长度,低版本会被截取高版本会报错。
varchar
varchar长度是可变的,默认会加一个隐藏的结束符,因此结束符会多算一个字节。
5.2数据类型参考:
选择正确的数据类型对于获得高性能至关重要,三大原则:
-
更小的通常更好,尽量使用可正确存储数据的最小数据类型
-
简单就好,简单数据类型的操作通常需要更少的CPU周期
-
尽量避免NULL,包含为NULL的列,对MySQL更难优化
二.管理MySQL数据库:
1.查看数据库结构:
1.1 查看当前服务器中的数据库:
show databases; #大小写不区分,分号“;”表示结束
1.2 查看数据库中包含的表:
方法一:在库中查看表
use mysql; #use 数据库名
show tables; #查看表
法二 :在库外查看表
show tables from mysql; #show tables from 数据库名
1.3 查看表的结构(字段):
use 数据库名;
describe [数据库名.]表名;
可缩写成:desc 表名;
2.创建、删除数据库和表:
2.1创建新的数据库(create database):
#建立数据库
create database 数据库名;
#建立数据库并指定字符集utf8mb4
create database 数据库名 charset=utf8mb4;
后文有详细操作及其演示
2.2删除指定的数据库(drop database):
drop database 数据库名;
查看:
2.3创建新的表 (create table):
use 数据库名;
create table 表名 (字段1 数据类型,字段2 数据类型[,...][,primary key (主键名)]);
#主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
例如:
use zhuzi;
create table students (id smallint unsigned primary key auto_increment, name varchar(10), age tinyint unsigned,gender enum('M','F') default 'M' );
#unsigned:取消负数
primary key:主键
auto_increment: 自增长
enum('M','F'):多选
default 'M':默认值为 M
decimal(3,2)小数点后两位
2.4 删除指定的数据表(drop table):
方法一:库内删除
use 数据库名;
drop table 数据表名;
方法二:库外删除
#如不用USE进入库中,则需加上数据库名
drop table 数据库名.数据表名;
3.管理表中的数据记录:
3.1向数据表中插入新的数据记录(insert into):
insert into 表名(字段1,字段2[,...]) values(字段1的值,字段2的值,...);
例如:
insert into students(id,name,age,passwd) values(2,'lisi',20,'112233' );
insert into students(id,name,age,passwd) values(2,'jiami',22,PASSWORD('123456'));
#PASSWORD('112233'):查询数据记录时,密码字串以加密形式显示;若不使用PASSWORD(),查询时以明文显示
select * from students;
提前新建数据表(注意长度设置)
use mysql;
create table students (id smallint unsigned primary key auto_increment, name varchar(10),age tinyint unsigned, passwd varchar(48));
3.2 查询数据表内数据记录(select):
select 字段名1,字段名2[,...] from 表名 [where 条件表达式];
基本操作:
1. #查询全部数据
select * from 数据表名;
例如:
select * from students;
2. #查询指定数据
例如:
select id,name from students where id=2;
3.3 修改、更新数据表中的数据记录(update):
update 表名 set 字段名1=字段值1[,字段名2=字段值2] [where 条件表达式];
例如:
update students set age=19 where id=4;
update students set age=20,passwd='111111' where id=2; #同时修改age和passwd
3.4 在数据表中删除指定的数据记录(delete from):
delete from 表名 [where 条件表达式];
例如:
delete from students where id=2;
!!!!注意id并不会顶上去!!!!
4.修改表名和表结构(alter table):
4.1修改表名(rename):
alter table 旧表名 rename 新表名;
例如:
alter table students rename xuesheng;
4.2 扩展表结构,增加字段(add):
alter table 表名 add 字段;
例如:
alter table xuesheng add address varchar(50) default 'wait get';
#default 'wait get':表示此字段设置默认值 wait get;可与 NOT NULL 配合使用
4.3 修改字段(列)名,添加唯一键(change):
alter table 表名 change 旧列名 新列名 数据类型 [unique key];
例如:
alter table xuesheng change name user_name char(30) unique key;
#CHANGE可修改字段名、数据类型、约束等所有项。
验证:
insert into xuesheng values(6,lili,23,234567,NANKING);
失败,因为设置了唯一键,lili不能重复,改成lulu即可
insert into xuesheng values(6,lulu,23,234567,NANKING);
4.4删除字段(drop):
alter table 表名 drop 字段名;
例如:
#删除表中passwd字段
alter table xuesheng drop passwd;
4.5复制表结构:
create table 新表名 like 旧表名;
#通过LIKE方法,复制旧表的结构生成新表
insert into 新表名 (select * from 旧表名);
#再将旧表数据导入新表
方式二:复制表:
create table 新表名 (select * from 旧表名);
区别:
第一种 like 的 迁移表 表的结构、属性、约束、数据都有
第二种 备份数据 表的复制内容(数据)
4.6临时表的创建:
CREATE TEMPORARY TABLE 表名(字段1 数据类型,字段2 数据类型[, ...] [, PRIMARY KEY (主键名)]);
创建方式与创建表完全一致,最大的区别是,临时表只在当前的数据库连接生效,当数据库连接断开或重新连接终端时,该临时表均失效,无法查看,但可以查询到。
4.7 清除表的两种方式比较:
方式一:delete清空 :
delete from 表名;
方式二:truncate清空 :
truncate table 表名;
两者区别:
(1)delete 清空属于按照行清空,一行一行进行,效率低,速度慢(对于表数据较多的情况) truncate 相当于删除表数据,保留表结构,重新创建一个与原表结构相同的表
(2)当数据表中有自增型约束字段时,delete 清除表数据后,在插入数据时,自增字段的数值会接着被删除表数据的最后一个自增数,计数。(eg:被删除表数据最后一行id(自增),为10,再创建时,该id从11开始)。truncate 清空后,自增型字段会从1开始计数。
三种删除方式的区别:
drop :
- 属于DDL
- 不可回滚(无法恢复)
- 不可带where
- 表内容和结构删除
- 删除速度快
truncate :
- 属于DDL
- 不可回滚
- 不可带where
- 表内容删除
- 删除速度快
delete :
- 属于DML
- 可回滚(可恢复)
- 可带where
- 表结构在,表内容要看where执行的情况
- 删除速度慢,需要逐行删除
总结:
不再需要一张表的时候,用drop
想删除部分数据行时候,用delete,并且带上where子句
保留表而删除所有数据的时候用 truncate
速度:drop> truncate > delete
安全性:delete 最好
5. mysql 中常见的约束:
- 主键约束(primary key) PK
主键具有唯一性,不可重复性,不可为空的特点。一般用于删除,查询时条件语句的条件。主键在一张表中只能有一个
- 自增长约束(auto_increment)
该约束针对于整数类型的字段,当插入该字段数据为空时,系统会根据上一个数,自动加1
- 非空约束(not null)
该约束到字段后,该字段中的数据插入不能为空
- 唯一性约束(unique)
该约束添加后,该字段的数据每行均为唯一的,不可重复。唯一性约束可以在一张表中有多个
- 默认值约束(default)
默认值约束,为该字段设置初始值,如果没有为该字段插入数据,就为初始值
- 零填充约束(zerofill)
零填充针对整数型的字段,例如int默认为11位,除了填写的数字以外其他用零填充
- 外键约束(foreign key)FK
外键约束,至少将两张表进行关联。我们将这两张表分为主表和从表,主表的主键作为从表的外键。增加数据时,先进行主表操作,如果增加的数据外键值在主表中没有,就要先在主表中添加。
若进行删除操作,就要先进行从表操作,只要将从表有关主表(主键值)全部清除后,才能清除该主表的主键值
二. 数据库用户管理:
1. 登录用户的管理:
1.1 登录用户的创建:
明文密码创建用户格式:
CREATE USER '用户名'@'来源地址' [IDENTIFIED BY [PASSWORD] '密码'];
#解释
'用户名':指定将创建的用户名.
'来源地址':指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录
可用通配符%
'密码':若使用明文密码,直接输入'密码',插入到数据库时由Mysql自动加密;
若使用加密密码,需要先使用SELECT PASSWORD('密码');获取密文,再在语句中添PASSWORD '密文';
若省略“IDENTIFIED BY"部分,则用户的密码将为空(不建议使用)
加密密码创建用户:
SELECT PASSWORD('密码'); #先获取加密的密码
CREATE USER 'lxc2'@'localhost' IDENTIFIED BY PASSWORD '加密的密码';
1.2 查看用户密码的信息:
用户信息存放在
mysql
数据库下的user
表(MySQL 服务下存在一个系统自带的 mysql 数据库)。
1.3 查看用户信息,创建后的用户保存在mysql数据库的user表里:
use mysql;
select user,authentication_string,Host from user;
1.3 登录用户用户名的更改:
重命名指定:
rename user 'lxc'@'locahost' to 'lxc1'@'localhost'
1.4 修改用户密码:
set password = password('123456');
1.5 删除登录用户:
1.6 修改其他用户密码:
set password for 'gg'@'localhost' = password('123456');
普通用户只有修改自身密码的权限
root用户是超级管理员,它不仅可以修改自身密码,还能修改其他用户的密码。 ‘
1.7 忘记root密码的解决方法:
该操作必须是在数据库本机且为root用户,才可进行
修改 /etc/my.cnf 配置文件,免密登录mysql:
重启数据库服务,无密码登录之后,修改数据库用户中的 root 密码:
update mysql.user SET AUTHENTICATION_STRING = PASSWORD('123') where user='root'
#用于更新MySQL数据库系统表mysql.user中的用户root的密码。AUTHENTICATION_STRING是MySQL 5.7.0以后版本中用于存储密码的字段名
用新密码登录:
重新加载:
2. 管理登录用户的权限:
2.2 查看用户已有权限的操作:
show grants;
#查看当前用户(自己)的权限
show grants for 'gg'@'localhost';
#查看其他用户的权限
2.3 授权操作:
[NO_AUTO_CREATE_USER
], 即在grant语句中禁止创建空密码的账户,使用grant语法创建用户必须带上 “identified by”关键字设置账户密码,否则就被认为是非法的创建语句。
2.3.1 对存在的用户进行授权:
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'来源地址' [IDENTIFIED BY '密码'];
权限列表: 用于列出授权使用的各种数据库操作,以逗号进行分隔如"select, insert,update"。 使用"all"表示所有权限(实际上部分权限仍无法使用,只包括大部分权限),可授权执行任何操作。
数据库名.表名: 用于指定授权操作的数据库和表的名称,其中可以使用通配符*。 例如,使用"mysql.*" 表示授权操作的对象为mysql数据库中的所有表。 '用户名'@'来源地址': 用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。 来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址。
IDENTIFIED BY: 用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略"IDENTIFIED BY"部分,则用户的密码将为空。
grant select,insert on study.class to 'lxc'@'localhost';
show grants for 'lxc'@'localhost';
2.3.2 对不存在的用户进行创建并授权 :
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'来源地址' IDENTIFIED BY '密码';
2.4 撤销用户权限:
revoke 权限列表/ALL on 库名.表名 from '用户名'@'来源地址';
2.5 用户的远程登录:
用户授权
grant all privileges on *.* to 'cnm'@'192.168.91.%' identified by '123';
三.总结:
创建及删除数据库和表:
create database 库名;
create table 表名(字段1 数据类型 [属性], 字段2 .....);
DROP TABLE [数据库名.]表名;
DROP DATABASE 数据库名;
insert into 表名 values (所有字段的值);
表数据的增删改查:
insert into 表名 (指定字段名称) values(字段的值);
delete from 表名 [where ...];
update 表名 set 字段=值[, 字段2=....] [where ...];
select 字段1[,字段2....] from 表名 [where ...];
select * from 表名;