文章目录
前言
数据库简介
- 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
- 数据库是一个按数据结构来存储和管理数据的计算机软件系统。数据库的概念实际包括两层意思:
(1)数据库是一个实体,它是能够合理保管数据的“仓库”,用户在该“仓库”中存放要管理的事务数据,“数据”和“库”两个概念结合成为数据库。
(2)数据库是数据管理的新方法和技术,它能更合适的组织数据、更方便的维护数据、更严密的控制数据和更有效的利用数据。 - 我们常用的数据存储方式,比如内存和文件,数据保存在内存中时,存取速度快,但是数据不能永久保存 ;数据保存在文件时,数据永久,但是速度比内存操作慢,频繁的IO操作,并且查询数据不方便。而数据库的存储方式,数据持久化保存,高可靠,高可用,数据的快速提取。所以在企业中得以广泛使用。
数据库管理系统
-
1.数据库管理系统是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
-
2.数据库管理系统是数据库系统的核心组成部分,主要完成对数据库的操纵与管理功能,实现数据库对象的创建、数据库存储数据的查询、添加、修改与删除操作和数据库的用户管理、权限管理等。它的安全直接关系到整个数据库系统的安全,其防护手段主要有:
(1)使用正版数据库管理系统并及时安装相关补丁。
(2)做好用户账户管理,禁用默认超级管理员账户或者为超级管理员账户设置复杂密码;为应用程序分别分配专用账户进行访问;设置用户登录时间及登录失败次数限制, 防止暴力破解用户密码。
(3)分配用户访问权限时,坚持最小权限分配原则,并限制用户只能访问特定数据库,不能同时访问其他数据库。
(4)修改数据库默认访问端口,使用防火墙屏蔽掉对 外开放的其他端口,禁止一切外部的端口探测行为。
(5)对数据库内存储的重要数据、敏感数据进行加密存储,防止数据库备份或数据文件被盗而造成数据泄露。
(6)设置好数据库的备份策略,保证数据库被破坏后能迅速恢复。
(7)对数据库内的系统存储过程进行合理管理,禁用掉不必要的存储过程,防止利用存储过程进行数据库探测与攻击。
(8)启用数据库审核功能,对数据库进行全面的事件跟踪和日志记录。
数据库的类型
关系数据库
关系型数据库,存储的格式可以直观地反映实体间的关系。关系型数据库和常见的表格比较相似,关系型数据库中表与表之间是有很多复杂的关联关系的。 常见的关系型数据库有Mysql,SqlServer等。在轻量或者小型的应用中,使用不同的关系型数据库对系统的性能影响不大,但是在构建大型应用时,则需要根据应用的业务需求和性能需求,选择合适的关系型数据库。
非关系型数据库(NoSQL)
随着近些年技术方向的不断拓展,大量的NoSql数据库如MongoDB、Redis、Memcache出于简化数据库结构、避免冗余、影响性能的表连接、摒弃复杂分布式的目的被设计。
指的是分布式的、非关系型的、不保证遵循ACID原则的数据存储系统。NoSQL数据库技术与CAP理论、一致性哈希算法有密切关系。所谓CAP理论,简单来说就是一个分布式系统不可能满足可用性、一致性与分区容错性这三个要求,一次性满足两种要求是该系统的上限。而一致性哈希算法则指的是NoSQL数据库在应用过程中,为满足工作需求而在通常情况下产生的一种数据算法,该算法能有效解决工作方面的诸多问题但也存在弊端,即工作完成质量会随着节点的变化而产生波动,当节点过多时,相关工作结果就无法那么准确。这一问题使整个系统的工作效率受到影响,导致整个数据库系统的数据乱码与出错率大大提高,甚至会出现数据节点的内容迁移,产生错误的代码信息。但尽管如此,NoSQL数据库技术还是具有非常明显的应用优势,如数据库结构相对简单,在大数据量下的读写性能好;能满足随时存储自定义数据格式需求,非常适用于大数据处理工作。
NoSQL数据库适合追求速度和可扩展性、业务多变的应用场景。对于非结构化数据的处理更合适,如文章、评论,这些数据如全文搜索、机器学习通常只用于模糊处理,并不需要像结构化数据一样,进行精确查询,而且这类数据的数据规模往往是海量的,数据规模的增长往往也是不可能预期的,而NoSQL数据库的扩展能力几乎也是无限的,所以NoSQL数据库可以很好的满足这一类数据的存储。NoSQL数据库利用key-value可以大量的获取大量的非结构化数据,并且数据的获取效率很高,但用它查询结构化数据效果就比较差。
NoSQL数据库分类
(1)键值对存储(key-value):代表软件Redis,它的优点能够进行数据的快速查询,而缺点是需要存储数据之间的关系。
(2)列存储:代表软件Hbase,它的优点是对数据能快速查询,数据存储的扩展性强。而缺点是数据库的功能有局限性。
(3)文档数据库存储:代表软件MongoDB,它的优点是对数据结构要求不特别的严格。而缺点是查询性的性能不好,同时缺少一种统一查询语言。
(4)图形数据库存储:代表软件InfoGrid,它的优点可以方便的利用图结构相关算法进行计算。而缺点是要想得到结果必须进行整个图的计算,而且遇到不适合的数据模型时,图形数据库很难使用。
NoSQL与关系型数据库的区别
存储方式
传统的关系型数据库采取表格的存储方式,数据以行和列的方式进行存储,要读取和查询都十分方便,而非关系新数据库不适合这样的传统表格存储方式,通常以数据集的方式,大量的数据集中存储在一起,类似于键值对,图结构或者文档。
存储结构
关系型数据库按照结构化的方法存储数据, 每个数据表都必须对各个字段定义好(也就是先定义好表的结构),再根据表的结构存入数据,这样做的好处就是由于数据的形式和内容在存入数据之前就已经定义好了,所以整个数据表的可靠性和稳定性都比较高,但带来的问题就是一旦存入数据后,如果需要修改数据表的结构就会十分困难。而NoSQL数据库由于面对的是大量非结构化的数据的存储,它采用的是动态结构,对于数据类型和结构的改变非常的适应,可以根据数据存储的需要灵活的改变数据库的结构。
存储规范
关系型数据库为了避免重复、规范化数据以及充分利用好存储空间,把数据按照最小关系表的形式进行存储,这样数据管理的就可以变得很清晰、一目了然,当然这主要是一张数据表的情况。如果是多张表情况就不一样了,由于数据涉及到多张数据表,数据表之间存在着复杂的关系,随着数据表数量的增加,数据管理会越来越复杂。而NoSQL数据库的数据存储方式是用平面数据集的方式集中存放,虽然会存在数据被重复存储,从而造成存储空间被浪费的问题(从当前的计算机硬件的发展来看,这样的存储空间浪费的问题微不足道),但是由于基本上单个数据库都是采用单独存放的形式,很少采用分割存放的方式,所以这样数据往往能存成一个整体,这对于数据的读写提供了极大的方便。
扩展方式
当前社会和科学飞速发展,要支持日益增长的数据库存储需求当然要求数据库有良好的扩展性能,并且要求数据库支持更多数据并发量,扩展方式是NoSQL数据库与关系型数据库差别最大的地方,由于关系型数据库将数据存储在数据表中,数据操作的瓶颈出现在多张数据表的操作中,而且数据表越多这个问题越严重,如果要缓解这个问题,只能提高处理能力,也就是选择速度更快性能更高的计算机,这样的方法虽然可以一定的拓展空间,但这样的拓展空间一定有非常有限的,也就是关系型数据库只具备纵向扩展能力。而NoSQL数据库由于使用的是数据集的存储方式,它的存储方式一定是分布式的,它可以采用横向的方式来开展数据库,也就是可以添加更多数据库服务器到资源池,然后由这些增加的服务器来负担数据量增加的开销。
查询方式
关系型数据库采用结构化查询语言(即SQL)来对数据库进行查询,SQL早已获得了各个数据库厂商的支持,成为数据库行业的标准,它能够支持数据库的CRUD(增加,查询,更新,删除)操作,具有非常强大的功能,SQL可以采用类似索引的方法来加快查询操作。NoSQL数据库使用的是非结构化查询语言(UnQL),它以数据集(像文档)为单位来管理和操作数据,由于它没有一个统一的标准,所以每个数据库厂商提供产品标准是不一样的,NoSQL中的文档Id与关系型表中主键的概念类似,NoSQL数据库采用的数据访问模式相对SQL更简单而精确。
规范化
在数据库的设计开发过程中开发人员通常会面对同时需要对一个或者多个数据实体(包括数组、列表和嵌套数据)进行操作,这样在关系型数据库中,一个数据实体一般首先要分割成多个部分,然后再对分割的部分进行规范化,规范化以后再分别存入到多张关系型数据表中,这是一个复杂的过程。好消息是随着软件技术的发展,相当多的软件开发平台都提供一些简单的解决方法,例如,可以利用ORM层(也就是对象关系映射)来将数据库中对象模型映射到基于SQL的关系型数据库中去以及进行不同类型系统的数据之间的转换。对于NoSQL数据库则没有这方面的问题,它不需要规范化数据,它通常是在一个单独的存储单元中存入一个复杂的数据实体。
事务性
关系型数据库强调ACID规则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),可以满足对事务性要求较高或者需要进行复杂数据查询的数据操作,而且可以充分满足数据库操作的高性能和操作稳定性的要求。并且关系型数据库十分强调数据的强一致性,对于事务的操作有很好的支持。关系型数据库可以控制事务原子性细粒度,并且一旦操作有误或者有需要,可以马上回滚事务。而NoSQL数据库强调BASE原则(基本可用(Basically Available)、软状态(Soft-state)、最终一致性(Eventual Consistency)),它减少了对数据的强一致性支持,从而获得了基本一致性和柔性可靠性,并且利用以上的特性达到了高可靠性和高性能,最终达到了数据的最终一致性。NoSQL数据库虽然对于事务操作也可以使用,但由于它是一种基于节点的分布式数据库,对于事务的操作不能很好的支持,也很难满足其全部的需求,所以NoSQL数据库的性能和优点更多的体现在大数据的处理和数据库的扩展方面。
读写性能
关系型数据库十分强调数据的一致性,并为此降低读写性能付出了巨大的代价,虽然关系型数据库存储数据和处理数据的可靠性很不错,但一旦面对海量数据的处理的时候效率就会变得很差,特别是遇到高并发读写的时候性能就会下降的非常厉害。而NoSQL数据库相对关系型数据库优势最大的恰恰是应对大数据方面,也就是对于大量的每天都产生非结构化的数据能够高性能的读写,这是因为NoSQL数据库是按key-value类型进行存储的,以数据集的方式存储的,因此无论是扩展还是读写都非常容易,并且NoSQL数据库不需要关系型数据库繁琐的解析,所以NoSQL数据库大数据管理、检索、读写、分析以及可视化方面具有关系型数据库不可比拟的优势。
授权方式
关系型数据库常见的有Oracle,SQLServer,DB2,Mysql,除了Mysql大多数的关系型数据库如果要使用都需要支付一笔价格高昂的费用,即使是免费的Mysql性能也受到了诸多的限制。而对于NoSQL数据库,比较主流的有redis,HBase,MongoDb,memcache等产品,通常都采用开源的方式,不需要像关系型数据库那样,需要一笔高昂的花费。
一、查看数据库结构
1.1 查看已存在数据库信息
查看已存在的库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql默认4个数据库
information_schema: 定义访问数据库元数据的方式。数据库名和表名,列的数据类型、访问权限等。
mysql:核心数据库,负责存储数据库用户、权限、关键字等用户自己需要使用的控制和管理信息。
performance_schema:数据库的性能参数,存储引擎等。
sys:sys系统库下包含许多视图,它们以各种方式对preformance_schema表进行聚合计算展示。
1.2 查看数据库表信息
mysql> use mysql; #use后跟数据库名
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
......
Mysql数据库的数据文件都存放在/usr/local/mysql/data目录下,每个数据库对应一个子目录,用于储存数据表文件。每一个数据表对应为三个文件,后缀名分别为’’.frm “.myd” 和“.myi"。当然也有少数以opt、csm、csv、ibd结尾的。
1.3 显示数据表的结构(字段)
mysql> use mysql;#先使用数据库
mysql> desc user;#再查看表
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
或者
mysql> desc mysql.user;#用 数据库名.表名 的格式查看
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
二、SQL基本语句
SQL分类
- DDL:数据定义语言
- DML:数据操纵语
- DQL:数据查询语言(select)
- DCL:数据控制语言
2.1 DDL语句
DDL语句用于创建数据库对象,如库、表、索引等。
1、新建库、表
mysql> create database student;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;#可查看到
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| student |
| sys |
+--------------------+
5 rows in set (0.00 sec)
#建表
mysql> use student;
Database changed
mysql> create table info (id int(3) not null primary key,name char(10) not null,address varchar(50) default 'nj');
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| info |
+-------------------+
1 row in set (0.00 sec)
#查看表结构
mysql> describe info;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(3) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| address | varchar(50) | YES | | nj | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
create table 表名(字段01名称 字段01类型 字段01约束,字段02名 字段02类型 字段02约束)存储引擎 字符集
多个字段用逗号加空格隔开。
字段01名称:属性名称,自定义
字段01类型:
int (5) 整型 00000-99999
double 浮点型
decimal(5,2) 有效数字是5位,小数点后面保留2位
fioat 单精度浮点 4字节
varchar(50) 可变长度字符串
char(10) 固定长度字符串
字段01约束:
非空约束:内容不允许为空
主键约束:非空且唯一 典型的标识
默认值:假如没有填数据,默认预先设定的值
自增值:自动排序1、2、3、4…
存数引擎:myisam innodb
字符集:UTF-8
2、删除库、删除表
mysql> drop database 后面跟库名或者 库名.表名;
Query OK, 0 rows affected (0.02 sec)
2.2 DML语句
DML语句用于对表中的数据进行管理
INSERT:插入新数据
UPDATE:更新原有数据
DELETE:删除不不需要的数据
1.表中插入数据
#方法1:
insert into info (id,name,address) values (1,'lisi','上海'),(3,'wangwu','北京');#对应各个字段
#方法2:
insert into info values (4,'yiyi','北京');
查看:
mysql> select * from info;
+----+--------+---------+
| id | name | address |
+----+--------+---------+
| 1 | lisi | 上海 |
| 3 | wangwu | 北京 |
| 4 | yiyi | 北京 |
+----+--------+---------+
3 rows in set (0.00 sec)
2.表中修改、更新数据记录
UPDATE 表名 SET 字段名1=值1[,字段名2=值2] WHERE条件表达式
#将info表中lisi的地址替换为苏州
mysql> update tom set address=‘苏州’ where name='lisi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
查看
mysql> select * from info;
+----+--------+---------+
| id | name | address |
+----+--------+---------+
| 1 | lisi | 苏州 |
| 3 | wangwu | 北京 |
| 4 | yiyi | 北京 |
+----+--------+---------+
3 rows in set (0.00 sec)
3.修改用户登录数据库密码
mysql> update mysql.user set authentication_string=password('123123') where user='root';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 1
4.在数据库中删除指定的数据记录
delete from 表名 where 条件表达式(不带where代表删除表中所有记录)
mysql> select * from student.info;
+----+--------+---------+
| id | name | address |
+----+--------+---------+
| 1 | lisi | 苏州 |
| 3 | wangwu | 北京 |
| 4 | yiyi | 北京 |
+----+--------+---------+
3 rows in set (0.00 sec)
mysql> delete from student.info where name='yiyi';
Query OK, 1 row affected (0.01 sec)
mysql> select * from student.info;
+----+--------+---------+
| id | name | address |
+----+--------+---------+
| 1 | lisi | 苏州 |
| 3 | wangwu | 北京 |
+----+--------+---------+
2 rows in set (0.00 sec)
5.修改表名与表结构
alter table 旧表名 rename 新表名;
例:alter table zzz rename yyy;
扩展表结构(增加字段)
alter table 表名 add address varchar(50) default ‘地址不详’;
#default ‘地址不详’:表示此字段设置默认值为地址不详,可与not null配合使用
mysql> alter table info add address varchar(50) not null default '地址不详';
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from info;
Empty set (0.00 sec)
mysql> desc info;
+---------+-------------+------+-----+--------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+--------------+-------+
| id | int(3) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| address | varchar(50) | NO | | 地址不详 | |
+---------+-------------+------+-----+--------------+-------+
3 rows in set (0.00 sec)
6.修改字段(列)名,添加唯一键
alter table 表名 change 旧列名 新列名 数据类型 [unique key];
#change 可修改字段名、数据类型、约束等所有项。
删除字段/主键
格式:
alter table 表名 drop 字段名/主键;
##扩展
use student;
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
show create table test02\G #获取数据库的表结构、索引等信息
select * from test02;
2.3 数据库高级操作
1、清空表
delete from info;
# delete清空表后,返回的结果内有删除的记录条目;
delete工作是一行一行的删除记录数据的;如果表中有自增长字段,使用delete from 删除所有记录,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。
truncate table info;
# truncate清空表数据,表还在,没有返回被删除的条目;
truncate工作时是将表结构按原样重新建立,因此在速度上truncate会比delete清空表快;
使用truncate table清空表内数据后,id会从1开始重新记录
drop是删除数据和表;
速度
drop > truncate > delete
安全性
delete 最好
2、临时表
临时建立的表,用于保存一些临时数据,不会长期存在
创建成功后,使用shiwtables命令看不到创建的临时表的,临时表会在连接退出后被销毁。
如果在退出连接之前,也可以可执行增删改查等操作,比如使用drop table语句手动直接删除临时表。
PS:无法创建外键
mysql> create temporary table cdc (id int(3) not null auto_increment,name varchar(10) not null,hobby varchar(10) not null,primary key(id))engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> describe cdc;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| hobby | varchar(10) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> insert into cdc (name,hobby) values ('boy','dog');
Query OK, 1 row affected (0.00 sec)
mysql> select * from cdc;
+----+------+-------+
| id | name | hobby |
+----+------+-------+
| 1 | boy | dog |
+----+------+-------+
1 row in set (0.00 sec)
mysql> show tables;#并没有cdc表
+-------------------+
| Tables_in_student |
+-------------------+
| info |
| jerry |
| tom |
+-------------------+
3 rows in set (0.00 sec)
#不在硬盘上,在内存上
3、克隆表
like方法:从info表完整复制结构生成test表
mysql> use student;
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> create table test like info;
Query OK, 0 rows affected (0.02 sec)
导入数据
mysql> insert into test select * from info;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test;
+----+--------+---------+
| id | name | address |
+----+--------+---------+
| 1 | lisi | 苏州 |
| 3 | wangwu | 北京 |
+----+--------+---------+
2 rows in set (0.00 sec)
或者用as
mysql> create table zf as select * from info;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from zf;
+----+--------+---------+
| id | name | address |
+----+--------+---------+
| 1 | lisi | 苏州 |
| 3 | wangwu | 北京 |
+----+--------+---------+
2 rows in set (0.00 sec)
2.4 DCL数据库用户授权
1、DCL语句设置用户权限(用户不存在时;则会新建用户)
- ‘用户名’:指定将创建的用户名
- 来源地址:指定新创建的用户可在哪些主机上登录,可使用IP地址、网段、主机名的形式,本地用户可用localhost,允许任意主机登录
- 可用通配符:
- 密码’:若使用明文密码,直接输入密码,插入到数据库时由Mysq1自动加密;
- 若使用加密密码,需要先使用SELECT PASSWORD(‘密码’);获取密文,再在语句中添PASSWORD ‘密文’;
- 若省略"IDENTIFIED BY"部分,则用户的密码将为空(不建议使用)
mysql> create user 'lisi'@'%' identified by '123123';
Query OK, 0 rows affected (0.00 sec)
#设置登录密码为abc123的lisi用户,可以从任意终端(%)登录
#若要限制只能本地登录,%换为localhost,(主机名或终端IP地址)
mysql> grant all on *.* to 'lisi'@'%' identified by '123123';
Query OK, 0 rows affected, 1 warning (0.01 sec)
#对所有库和所有表(*.*)有全部权限
#若只允许对mysql库中user表有select权限
mysql> grant select on mysql.user to 'lisi'@'%' identified by '123123';
2.查看当前用户的权限
flush privileges;#刷新权限
mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
3.查看从本地用户登录的权限
mysql> show grants for 'lisi'@'localhost';
+------------------------------------------------------+
| Grants for lisi@localhost |
+------------------------------------------------------+
| GRANT USAGE ON *.* TO 'lisi'@'localhost' |
| GRANT SELECT ON `mysql`.`user` TO 'lisi'@'localhost' |
+------------------------------------------------------+
4.撤销用户的权限
mysql> revoke select on mysql.user from 'lisi'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'lisi'@'localhost';
+------------------------------------------+
| Grants for lisi@localhost |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'lisi'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
5.修改当前密码
#修改当前密码
set password = password('123456');
#修改其他用户密码
set password for 'user1'@'localhost' password('abc123');
忘记密码的解决方法
#忘记root密码的解决办法
修改/etc/my.cnf配置文件,免密登陆mysq1
vim / etc / my . cnf
[mysqld]
skip-grant-tables #添加,使登录mysq1不使用授权表
systemctl restart mysqld
mysq1 #直接登录
然后使用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删除,并重启mysq1服务
Mysql中的约束
- 主键约束(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,
#可以使用查询表语句结构命令查看外键关联
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;