一、数据库介绍
1.数据库管理系统的产生背景
(1)数据时代的到来要求对数据进行有效和安全的管理
涉及的数据量大
数据不随程序的结束而消失
数据被多个应用程序共享
大数据时代的到来
(2)传统文件系统管理上的缺陷要求改变数据管理方式
编写应用程序不方便
数据冗余不可避免
应用程序依赖性
不支持对文件的并发访问
数据间联系弱
难以按用户视图表示数据
无安全控制功
2.数据库管理系统的相关概念
(1)数据库(DB):
数据库是数据的汇集,它以一定的组织形式存于存储介质上
(2)数据库管理系统(DBMS):
是管理数据库的系统软件,它实现数据库系统的各种功 能。是数据库系统的核心
(3)数据库管理员(DBA):
负责数据库的规划、设计、协调、维护和管理等工作
(4)应用程序(APP):
指以数据库为基础的应用程序
3.数据库管理系统
(1)优点:
相互关联的数据的集合
较少的数据冗余
程序与数据相互独立
保证数据的安全、可靠
最大限度地保证数据的正确性
数据可以并发使用并能同时保证一致性
(2)基本功能:
数据定义 数据处理 数据安全 数据备份
(3)架构:
单机架构 大型主机/终端架构 主从式架构(C/S) 分布式架构
(4)分类:
数据库通常分为层次式数据库、网络式数据库和关系式数据库三种。
不同的数据库是按不同的数据结构来联系和组织的。
在当今的互联网中,最常见的数据库模型主要是两种,即关系型数据库和非关系型数据库。
4.关系型数据库相关概念介绍
(1)概念:
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。
(2)关系:
关系就是指存储数据的二维表,表种的行和列的存贮不注重次序,因为展示可以通过相关操作来实现次序的需求。
(3)行row:
表中的每一行,又称为一条记录record
(4)列column:
表中的每一列,称为属性,字段 ,域(field);这个域和domain这个域的含义不同。前者指列的一种称呼,后者指列的取值范围。
(5)事务(transaction):
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit),通常就是指数据库事务。
事务的特性:ACID
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。
(6)联系:
联系是数据之间的关联集合,是客观存在的应用语义链。
实体内部的联系:指组成实体的各属性之间的联系。如职工 实体中,职工号和部门经理号之间有一种关联关系。
实体之间的联系:指不同实体之间联系。例学生选课实体和 学生基本信息实体之间。
联系的类型:一对一联系(1:1) 一对多联系(1:n) 多对多联系(m:n)
5.数据三要素
(1)数据结构:
包括两类,一类是与数据类型、内容、性质有关的对象,比如关系模型中的域、属性和关系等;另一类是与数据之间联 系有关的对象,它从数据组织层表达数据记录与字段的结构。
(2)数据的操作:
数据提取(SELECT)在数据集合中提取感兴趣的内容。
数据更新(INSERT、DELETE、 UPDATE )变更数据库中的数据。
(3)数据的约束条件 :
是一组完整性规则的集合。
实体(行)完整性 Entity integrity
值行的唯一性,列和列总是不同的,利用主键实现
域(列)完整性 Domain Integrity
指有一个合理的取值范围
参考完整性 Referential Integrity
6.数据库范式概念
设计关系数据库时,遵从不同的规范要求,设计出合理的 关系型数据库,这些不同的规范要求被称为不同的范式,各种范 式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式: 第一范式(1NF)、第二范式 (2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第 四范式(4NF)和第五范式(5NF,又称完美范式)。满足最 低要求的范式是第一范式(1NF)。在第一范式的基础上进 一步满足更多规范要求的称为第二范式(2NF),其余范式 以次类推。一般说来,数据库只需满足第三范式(3NF)即可。
(1)第一范式
无重复的列,每一列都是不可分割的基本数据项,同 一列中不能有多个值,即实体中的某个属性不能有多个值或 者不能有重复的属性。除去同类型的字段,就是无重复的列 说明:第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
(2)第二范式
属性完全依赖于主键,第二范式必须先满足第一范式 ,要求表中的每个行必须可以被唯一地区分。通常为表加上 一个列,以存储各个实例的唯一标识PK,非PK的字段需要与 整个PK有直接相关性。
(3)第三范式
属性不依赖于其它非主属性,满足第三范式必须先满 足第二范式。第三范式要求一个数据库表中不包含已在其它 表中已包含的非主关键字信息,非PK的字段间不能有从属关系。
范式的目的是为了减少数据冗余,但是相对牺牲了性能。有时候为了性能,需要违反范式。
7.数据库约束
(1)主键
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。
要求:必须提供数据,即字段不为空(null);字段不重复,即唯一标识本行;一张表只能有一个主键。
目的:确定一条唯一的记录。
(2)复合主键
表中一个属性无法唯一标识一条记录,用两条属性组才可以唯一标识一条记录,那么两条属性主就组成了符合主键。单独的每列的字段可重复,但是两个列组成主键后总字段是不重复的。
(3)唯一键
一个或多个字段的组合,填入的数据必须能在本表唯一标识本行。和主键不同之处:在表中可以有多个;允许为空值
(4)外键
一个表中的某字段可填入的数据取决于另一个表的主 键或唯一键已有的数据 ,键表示了两个表之间的相关联系。一个表的主键是另外一张表的外键(唯一键也可以做外键)
二、安装MariaDB
MySQL是世界上最流行的开源关系数据库,它的名字取自于创始人Michael “Monty” Widenius的长女“My”。2008年,Sun收购MySQL;2009年,甲骨文收购了Sun,MySQL落入了与开源社区关系紧张的甲骨文手中。Widenius与他的旧团队在2009初创建了MySQL的分支MariaDB,它的名字取自于Widenius的幼女“Maria”,他希望通过保留核心开发者和日益增长的社区帮助MariaDB挑战甲骨文的MySQL。换言之,MariaDB其实就是Mysql的另一个版本,其中的很多操作命令,并没有发生什么本质变化。
MariaDB的安装方式大致分为三种,第一种是利用程序包管理器的程序包进行安装,简单说可以通过配置yum源来进行安装;第二种是通过对远吗进行编译安装进行一些功能选择,以满足生产活动中对一些特殊功能的要求;第三种是利用官网提供的已经编译好的二进制格式程序包进行安装。下面我们主要介绍如何在CentOS6上利用第三种方式进行安装。
1.安装前准备
(1)准备用户。
因为MariaDB是通过用户身份进行运行的,因此要提前为其准备好运行账户和组。
groupadd -r -g 306 mysql
新建组并指定为系统组,编号为306,组名为mysql。
useradd -r -g 306 -u 306 -s /sbin/nologin –m –d /app/data mysql
新建用户mysql并指定为系统用户,编号为306,属组编号为306,shell类型为/sbin/nologin,创建家目录并指定为/app/data。
chown mysql:mysql /app/data
改变目录/app/data目录的所有者和属组,我们可以用其当做数据库的存放目录,这也是我们之所以指定为其创建家目录的原因所在。
(2)准备二进制程序包。
tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
注意必须要将程序包解压到这个目录,因为在初始编译的时候就已经指定了路径。
cd /usr/local;ln -sv mariadb-VERSION mysql
为解压好的目录创建软链接,或者直接为这个目录直接改名为mysql都可以,目的纯粹是为了方便我们管理。
chown -R root:mysql /usr/local/mysql/
将安装目录的所有者从root改为mysql,从而使得mysql账户获得权限。之前我们已经说过,数据库的运行是需要通过某个账户身份进行的,利用我们自建的用户mysql更加方便我们进行管理,也使得数据库更加安全。注意要加上R选项,这样是为整个目录和其子目录以及文件递归授权。
(3)为数据库准备配置文件。
在准备配置文件之前,需要注意的是,数据库会在启动时自动读取配置文件,读取的次序是/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extrafile=/PATH/TO/CONF_FILE --> ~/.my.cnf mkdir /etc/mysql/
注:后面的配置文件会覆盖前面的配置文件。
cd cd /usr/local/mysql/support-files/;ls
数据库已经为我们准备了配置文件模板,我们可以通过这条命令查询并进行选择。而且有”my-small.cnf my-medium.cnf my-large.cnf my-huge.cnf”适合多种类型数据库的配置文件模板供我们选择。这里我们选择huge模板。
cp /usr/local/mysql/support-files/my-large.cnf /etc/mysql/my.cnf
直接copy配置文件模板到目录/etc/mysql并改名为myconf。
修改配置文件,只需要改变以下几项即可。
datadir = /app/data 指定数据库位置。必须要指定到我们之前选定的数据库存放目录。
innodb_file_per_table = on 允许每个表格单独存放。方便管理,可省略。
skip_name_resolve = on 禁止主机名反向解析,加快登录速度,可省略。
2.创建数据库文件
cd/usr/local/mysql/;./scripts/mysql_install_db --datadir=/app/data --user=mysql
创建数据库文件并不需要我们直接手动进行,数据库为我们准备了脚本,我们只需要执行脚本即可。注意必须在目录/usr/local/mysql中,我们才可以执行这个脚本。
3.创建日志文件
touch /var/log/mysqld.log;chown mysql /var/log/mysqld.log
为了方便对数据进行管理和排错,我们要自己手动创建数据库文件,并且要给予数据库的运行账户mysql以权限,让其可以写数据进去。
4.配置服务脚本
install /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
为了使服务脚本可以利用service命令进行管理,我们需要将服务脚本copy进固定目录中,用install命令是因为这个命令既可以复制又可以加权限。
chkconfig --add mysqld
将服务增加到chkconfig可以管理的列表,以方便我们用这个命令进行管理。
chkconfig mysqld on
将服务列为开机启动
service mysqld start;ss-ntl
启动服务,并查看端口是否已经打开。
5.为客户端工具指明PATH路径。
我们在安装编译好的二进制程序包的时候,不仅安装了服务端程序,也安装了客户端程序。所以我们要为客户端程序指明PATH路径。
vim /etc/profile.d/mysql.sh
#export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile.d/mysql.sh
6.执行安全初始化脚本
刚安装好的数据库是无论什么身份都可以登录的,所以需要进行安全初始化,为数据库的root用户创建密码,以及禁止非数据库目录登录数据库。
mysql_secure_installation
执行后按照提示一步步进行设置即可。
三、一些基本的管理
1.管理数据库
(1)创建数据库
CREATE DATABASE 'DB_NAME';
CREATE SCHEMA [IF NOT EXISTS] 'DB_NAME';
CHARACTER SET 'character set name'
定义字符集
COLLATE 'collate name'
定义排序方式
(2)删除数据库
DROP DATABASE 'DB_NAME';
DROP SCHEMA [IF EXISTS] 'DB_NAME';
(3)查看支持所有字符集
SHOW CHARACTER SET;
(4)查看支持所有排序规则
SHOW COLLATION;
(5)获取命令使用帮助
HELP ;
(6)查看数据库列表
SHOW DATABASES;
2.管理表
(1)针对表的结构
DDL语句:Data Defination Language 针对表结构
CREATE,创建
DROP, 删除
ALTER 修改
1)创建表
CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修饰符, col2 type2 修饰符, ...)
其他选项:
ENGINE [=] engine_name 指定该表存储用什么引擎 不指定就默认
SHOW ENGINES;查看支持的engine类型
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT |COMPACT}定义行格式
解释:
tbl_name:想要创建的表名
col1:指定字段名
type1:指定字段的数据类型
修饰符:下面会详细介绍
[IF NOT EXISTS]:判断语句,如果不存在
举例:
USE hhydb;
使用hhydb这个数据库
CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED);
创建student表
DESC students;
查看
CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));
创建student2表
2)查看表
SHOW TABLES [FROM db_name];
查看有哪些表
DESC tb_name;
查看某个表结构
SHOW INDEXES FROM students;
查看表索引
SHOW TABLE STATUS LIKE 'tbl_name'\G;
查看表状态,表名要加引号
3)删除表
DROP TABLE [IF EXISTS] 'tbl_name';
删除整个表
4)修改表
ALTER TABLE 'tbl_name' RENAME 'newtbl_name';
为表改名
ALTER TABLE 'tbl_name' ADD 'col_name' data_type [FIRST|AFTER col_name];
添加字段
ALTER TABLE 'tbl_name' CHANGE 'col_name' 'newcol_name' data_type;
修改字段名及属性
ALTER TABLE 'tbl_name' CHANGE 'col_name' 'col_name' ;
修改字段属性
ALTER TABLE 'tbl_name' MODIFY ‘col_name’ data_type;
修改字段属性
ALTER TABLE 'tbl_name' DROP ‘col_name’ data_type ;
删除某个字段
解释:
[FIRST|AFTER col_name] :在某个字段之前或者之后
data_type:数据类型
CHANGE全称:CHANGE VOLUMN
举例
ALTER TABLE students RENAME s1;
为表students改名为s1
ALTER TABLE s1 ADD phone varchar(11) AFTER name;
为表s1在name字段后增加字段phone,数据类型varchar
ALTER TABLE s1 MODIFY phone int;
改表s1中的字段phone的数据类型为int
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);
修改表s1中字段phone数据类型为char,并改名为mobile
ALTER TABLE s1 DROP COLUMN mobile;
删除字段mobile
ALTER TABLE students ADD gender ENUM('m','f');
ENUM:枚举值,这里规定只有两个选择要么M,要么f
ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY;
修改字段id的属性并改名为sid
(3)针对表结构
1)创建索引
CREATE INDEX ’idx_name‘ ON ’tbl_name‘(col_name) ;
创建索引
ALTER TABLE ADD INDEX ’idx_name’(col_name);
增加索引
注:
不指定索引名,会默认以字段名作为索引名。
如果创建表时指定了字段属性为主键或者唯一键,那么系统会默认以主键和唯一键为索引。
2)查看索引
SHOW INDEX FROM ‘tbl_name [FROM db_name]’\G;
SHOW INDEX FROM ‘[db_name.]tbl_name‘\G;
注:\G,让数据显示以行显示
3)删除索引
ALTER TABLE ‘tbl_name’ DROP INDEX ‘idx_name’;
4)修改索引
数据库中没有直接修改索引的方法,需要先删除在创建来实现索引的修改。
注:
索引是特殊数据结构
创建索引必须要有索引名称
定义在查找时作为查找条件的字段
优点:提高查询速度
缺点:占用额外空间,影响插入速度
(3)针对表中数据
DML语句:Data Manipulation Language 针对表内数据
INSERT 增
DELETE 删
UPDATE 改
DQL语句:Data Query Language 针对表内数据
SELECT 查
1)插入数据
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (val1,...),(...),...
解释:
INTO:可以省略
tbl_name:想要操作的表名
col_name:想要操作的字段名,多个用逗号隔开。如果不写字段,会默认针对所有字段按照次数进行赋值操作。
VALUES:插入的语法要求,必须写
val1:表示插入的值,多个用逗号隔开,字符串要加引号
举例
INSERT INTO students VALUES(1,'tom','m'),(2,'alice','f');
INSERT INTO students(id,name) VALUES(3,'jack'),(4,'allen');
2)修改数据
UPDATE tbl_name SET col1=val1, col2=val2, ... [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
解释:
SET:修改的固定关键字
WHERE clause:定位
ORDER BY:排序,用的少,一般查询多
LIMIT m,n:条件,跳过m选择n个
注意:
①UPDATE s2 SET gender=null where id=4;
②UPDATE s2 SET gender=NULL where id=4;
③UPDATE s2 SET gender=’‘ where id=4;
④UPDATE s2 SET gender=’NULL‘ where id=4;
⑤UPDATE s2 SET gender=’NULL‘ where id=4;
上面四个写法含义:
①②含义相同,表示将gender这个字段的值赋值为空值,并定位为id=4的那行。
③表示将gender这个字段的值赋值为零值(零值也是有值),并定位为id=4的那行。
④表示将gender这个字段的值赋值为字符串NULL,并定位为id=4的那行。
⑤表示将gender这个字段的值赋值为字符串null,并定位为id=4的那行。
举例
UPDATE s2 SET age=21,gender='m' WHERE id=3;
3)删除数据
DELETE FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
按条件删除
DELETE FROM tbl_name;
全部清除
TRUNCATE TABLE tbl_name;
全部清除
注:两个全部清除的区别在于,前者要记录日志,速度会慢一点。
举例
DELETE FROM s2 WHERE id=3;
4)查看数据
SELECT col1[[AS] name],col2[[AS] name],... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
解释:
col1,col2:选择显示哪些字段。*代表显示所有字段。
AS name:选择按照name显示字段名,而不是显示直接显示字段名。相当于起了别名。AS可以省略。
FROM tbl_name :选择从哪张表显示。
WHERE clause:定位显示。
ORDER BY 'col_name' [DESC]:排序显示。
LIMIT [m,]n:条件显示,跳过m选择n个。
举例
SELECT id AS 编号,name 姓名,gender 性别 FROM s2;
SELECT * FROM s2 WHERE id < 3;
SELECT * FROM s2 WHERE gender='m';
SELECT * FROM s2 WHERE gender IS NULL;
SELECT * FROM s2 WHERE gender IS NOT NULL;
SELECT * FROM s2 ORDER BY id DESC LIMIT 3;
根据id字段的值倒序显示,限制只显示三行
SELECT * FROM s2 ORDER BY id DESC LIMIT 1,3;
根据id字段的值正序显示,限制跳过一行显示后面3行
SELECT * FROM s2 WHERE id >=2 and id <=4;
根据id字段的行数为条件,查看2和4之间的行
SELECT * FROM s2 WHERE name LIKE ‘t%’ ;
按照通配符模糊查询,定位name字段中t开头后面跟任意字符的行
SELECT * FROM s2 WHERE name LIKE '%c%';
按照通配符模糊查询,定位name字段中中间包含t的任意字符的行
SELECT * FROM s2 WHERE name RLIKE 'a';
按照正则表达式精确查找,定位name字段中只要包含a字母的行
SELECT * FROM s2 WHERE name RLIKE 'a';
按照正则表达式精确查找,定位name字段中只要a字母为首的行
SELECT * FROM s2 WHERE name RLIKE '^a.*e$';
按照正则表达式精确查找,定位name字段中以a字母为首n字母结尾的行
SELECT * FROM s2 WHERE name RLIKE '.*[lo].*';
按照正则表达式精确查询,定位name字段中任意包含l或者o字母的行
SELECT * FROM s2 WHERE name IN ('alice','allen');
定位name字段中值是alice和allen的行进行显示
(4)特殊用法
CREATE TABLE newtbl_name SELECT * FROM tbl_name;
复制粘贴
INSERT INTO newtbl_name SELECT * FROM tbl_name;
按照格式插入, 要求前表存在且结构和后表结构完全相同
(5)字段表示法
*: 所有字段
as:字段别名,col1 AS alias1
(6)定位
WHERE clause语句
操作符:
>, <, >=, <=, ==, !=:赋值
BETWEEN ... AND ... :定位范围
LIKE: 通配符模糊匹配
%:任意长度的任意字符
_:任意单个字符;
RLIKE: 正则表达式精确匹配
.*:任意长度的任意字符
^:锚定行首
$:锚定行尾
. :单个字符
+ :重复一次以上
IS NULL ,IS NOT NULL : 根据是否为空匹配
IN (val1,val2,…): 根据挑选的值显示
条件逻辑操作:
and,or,not 与,或,非
(7)排序
ORDER BY 'col_name' [DESC]语句
DESC: 表示倒序排
ASC: 表示正序排,不写默认就是这个排序方法
(8)限制条件
[LIMIT [m,]n]语句
LIMIT m,n: 表示跳过m个,选择之后的n个
LIMIT n: 表示选择n个
3.数据和修饰符
表示用来规定数据存放格式的,数据库中的数据类型有多种
(1)MySql支持多种列类型:
数值类型
日期/时间类型
字符串(字符)类型
(2)选择正确的数据类型对于获得高性能至关重要,三大原则:
更小的通常更好,尽量使用可正确存储数据的最小数据类型
简单就好,简单数据类型的操作通常需要更少的CPU周期
尽量避免NULL,包含为NULL的列,对MySQL更难优化
(3)数据类型
整形:
tinyint(m) 1个字节 范围(-128~127)
smallint(m) 2个字节 范围(-32768~32767)
mediumint(m) 3个字节 范围(-8388608~8388607)
int(m) 4个字节 范围(-2147483648~2147483647)
bigint(m) 8个字节 范围(+-9.22*10的18次方)
注:
一个字节8位,最高位表示是正数还是负数
0表示负数 最高位是0 所以其取值范围是-128~127
1表示整数 最高位是1 所以取值范围是0~255翻倍
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned 的取值范围为(0~255)。
int(m)里的m定义显示的格式,是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围。
MySQL可以为整型类型指定宽度,例如Int(11),对绝大多数应用这是没有意义的:
它不会限制值的合法范围,只是规定了MySQL 的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。
对于存储和计算来说,Int(1)和Int(20)是相同的。
浮点型:
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位
double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d小 数位
注:
设一个字段定义为float(6,3),如果插入一个数123.45678,实 际数据库里存的是123.457,但总个数还以实际为准,即6位
定点数:
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位
注:
MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。
例如,decimal(18,9)小数点两 边将各存储9个数字,一共使用9个字节:小数点前的数字用4 个字节,小数点后的数字用4个字节,小数点本身占1个字节
浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储。double占用8个字节.
因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal——例如存储财务数据。
但在数据量比较大的时候,可以考虑使用bigint代替decimal
字符串:
char(n) 固定长度,最多255个字符,必须指定
varchar(n) 可变长度,最多65535个字符,必须指定
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符
BINARY(M) 固定长度,可存二进制或字符,允许长度为0M字节,
VARBINARY(M) 可变长度,可存二进制或字符,允许长度 为0-M字节
内建类型 ENUM枚举, SET集合
char和varchar:
1)char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉,所以char类型存储的字符串末尾不能有空格;varchar 不限于此。
2)char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个 字节,varchar是存入的实际字符数+1个字节(n< n>255),所以 varchar(4),存入3个字符将占用4个字节。
3)char类型的字符串检索速度要比varchar类型的快。
varchar和text:
1)varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n< n>255),text是实际字符数+2个字节。
2)text类型不能有默认值。
3)varchar可直接创建索引,text创建索引要指定前多少个字符。 varchar查询速度快于text。
二进制数据:
BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写
BLOB存储的数据只能整体读出
TEXT可以指定字符集,BLOB不用指定字符集
日期时间:
date 日期 '2008-12-2'
time 时间 '12:25:36'
datetime 日期时间 '2008-12-2 22:06:44'
timestamp 时间戳,自动存储记录修改时间
YEAR(2) 年份
注:
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新;
这个数据类型的字段可以存放这条记录最后被修改的时间。即timestamp指时间戳;
修改时间会记录,就算前后数据一样,也可以通过时间戳发现是否进行过修改;
数据库本身只能看到当前状态,无法确定是否被修改过。
(4)修饰符
所有类型:
NULL 数据列可包含NULL值
NOT NULL 数据列不允许包含NULL值
DEFAULT 设定默认值
PRIMARY KEY 主键
UNIQUE KEY 唯一键
数值型可以加的修饰符:
AUTO_INCREMENT 自动递增,适用于整数类型,如果中间某个数删除会出现问题
UNSIGNED 无符号
4.管理用户
(1)用户账号组成
用户账号:'user'@'host'
user: 用户名
host: 允许用户通过哪些主机远程连接mysqld服务
注:
mysql的账号是由用户名和主机两部分组成的。
host的格式:
IP:直接可以写IPv4或者IPv6格式
网络地址:可以直接写网络,或者CIDR表示法的网络
主机名:写成域名,需要配合数据库服务器的DNS进行解析成IP后才可以使用。
通配符(%和_) :可以在写host的时候搭配通配符使用,下划线表示单一一个字符
(2)创建用户
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
只是创建用户,可以链接服务器,不代表能够对数据库进行操作,因为没有给予权限
(3)查看用户
SELECT user();
查看当前用户
SELECT User,Host,Password FROM mysql.user;
查看所有用户
(4)删除用户
DROP USER 'username'@'host';
(5)更改口令
1)SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
注意:这是正常通过命令修改的做法。PASSWORD()这是一个函数,加密口令的作用
推荐做法。
2) UPDATE user SET password=PASSWORD('magedu') WHERE User='root' ;
注意:这是通过修改表内数据的做法。修改表的命令不会马上生效,需执行FLUSH PRIVILEGES生效
不推荐 如果有两个用户同名(不同主机),就会导致所有同名的用户密码都会被修改,而且这个命令不会立即生效
3) /usr/local/mysql/bin/mysqladmin -u root –poldpassword password 'newpassword‘
注意:这是在myaql外利用脚本实现。
(6)破解口令
找到mysql的user这个数据库将其删除,重新运行mysql初始化脚本mysqlsecureinstallation
5.管理权限
(1)对用户进行授权
GRANT priv_type,... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
解释:
priv_type 给予的权限类型
select: 查
insert: 插入
upset: 改
delete: 删
ALL: 代表完全控制 增删改查
注:授权多个用逗号隔开
ON 表示对什么进行授权
db_name.tb_name 指明数据库名和表
*.*: 所有库的所有表
db_name.*: 指定库的所有表
db_name.tb_name: 指定库的指定表
db_name.routine_name: 指定库的存储过程和函数
TO 表示授权给那个用户
'user'@'host 用户名和主机地址
IDENTIFIED BY 'password' 相当于如果没有这个账号的话就会生成这个用户而且设置密码且给予权限 如果有用户 这个操作可以省略
WITH GRANT OPTION 级联授权,自己被授予的权限还可以传给其他用户
举例
GRANT SELECT,DELETE ON hhydb.s2 TO 'hhy'@'172.18.65.%' IDENTIFIED BY '123456';
(2)查看用户的权限
SHOW GRANTS FOR 'user'@'host';
查看某个用户的权限
SHOW GRANTS FOR CURRENT_USER[()];
查看当前正在使用的用户的权限
举例
SHOW GRANTS FOR hhy@'172.18.65.%';
SHOW GRANTS FOR CURRENT_USER();
(3)回收用户的权限
REVOKE priv_type, ... ON db_name.tb_name FROM 'user_name' @'%';
举例
REVOKE DELETE ON hhydb.* FROM 'hhy'@'172.18.65.%';
(4)注意:
MariaDB服务进程启动时会读取mysql库中所有授权表至内存
1) GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效
2) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES;
————–终—————–
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87657
评论列表(1条)
实在不怪小的排版不行,怪只怪这不支持html也不支持markdown,心碎,还是自搭网站吧。