1、centos7中二进制安装mariadb
1、创建用户和数据库存放的目录
useradd -r -m -d /app/data -s /sbin/nologin mysql
2、解压文件到相关目录下
tar xvf mariadb-10.2.8-linux-x86_64.tar.gz -C /usr/local
ln -s mariadb-10.2.8-linux-x86_64/ mysql ---也可以不创建软链接文件,但要把mariadb-10.2.8-linux-x86_64/这个目录的名字改为mysql,这是二进制安装的时候必须要求的,目录名字必须为mysql
3、创建配置文件
cp /usr/local/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf
vim /etc/mysql/my.cnf 在这个配置文件中增加三行
datadir = /app/data ---指定存放数据库的目录
innodb_file_per_table = on ---表示每个数据库中的每个表都有一个单独的文件保存,便于管理
skip_name_resolve = on ---禁止解析主机名
注意等号前后要有空格
4、创建数据库文件
yum install libaio-0.3.109-13.el7.x86_64
安装这个包会生成/usr/lib64/libaio.so.1这个库文件,没有这个库文件无法执行下面的脚本
cd /usr/local/mysql ---注意一定要进入到这个目录下去执行下面的脚本
./scripts/mysql_install_db --datadir=/app/data --user=mysql
5、创建日志文件
mkdir /var/log/mariadb
touch /var/log/mariadb/mariadb.log
chown mysql /var/log/mariadb/mariadb.log
如果不创建这个日志文件服务起不来,会报错
6、准备服务脚本并启动
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --list mysqld
service mysqld start
7、修改PATH变量路径开启客户端工具进行修改密码等
vim /etc/profile.d/env.sh
export PATH=/usr/local/mysql/bin:$PATH
mysql ---不把变量写到PATH里启动的时候要进入到这个目录下或者写全路径才能启动客户端工具
2、mysql客户端工具
命令行交互式客户端程序:mysql
mysql选项:
-uUSERNAME: 用户名;默认为root
-hHOST: 服务器主机; 默认为localhost
-pPASSWORD:用户的密码;建议使用-p,默认为空密码
mysql用户账号由两部分组成:
'USERNAME'@'HOST'
HOST用于限制此用户可通过哪些远程主机连接mysql服务
支持使用通配符:
% 匹配任意长度的任意字符
172.16.0.0/16 或172.16.%.%
_ 匹配任意单个字符
修改口令后登录系统:mysql –uroot –p,这样登录的时候就会让输入密码,也可以mysql –uroot –pmagedu直接在p后面写上口令,但这样不安全,查历史都能看到密码。
3、SQL语句分类
SQL语句:
DDL: Data Defination Language ---数据定义语言
CREATE, DROP, ALTER ---用于创建数据库,创建表
DML: Data Manipulation Language ---数据操作语言
INSERT, DELETE, UPDATE ---可以在表中添加、删除、更新数据
DCL:Data Control Language ---数据控制语言
GRANT, REVOKE ---用于授权和取消授权
DQL:Data Query Language ---数据查询语言
SELECT ---用于查询表中的数据
4、SQL语言规范
在数据库系统中,SQL语句不区分大小写(建议用大写)
但字符串常量区分大小写
SQL语句可单行或多行书写,以“;”结尾
关键词不能跨多行或简写
用空格和缩进来提高语句的可读性
子句通常位于独立行,便于编辑,提高可读性
注释:
SQL标准:
/*注释内容
注释内容
注释内容*/ ---多行注释
-- 注释内容 ---单行注释,注意有空格
MySQL注释:
#
5、数据类型
1、整型
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次方)
取值范围如果加了unsigned,则最大值翻倍,如tinyintunsigned的取值范围为(0~255)
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围
2、浮点型(float和double),近似值
float(m,d)单精度浮点型8位精度(4字节) m总个数,d小数位double(m,d)双精度浮点型16位精度(8字节) m总个数,d小数位
精度越高值越近似
设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位
3、定点数
在数据库中存放的是精确值,存为十进制
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
4、字符串(char,varchar,_text)
char(n)固定长度,最多255个字符
varchar(n)可变长度,最多65535个字符
tinytext可变长度,最多255个字符
text可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext可变长度,最多2的32次方-1个字符
BINARY(M) 固定长度,可存二进制或字符,允许长度为0-M字节,
VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节
内建类型:ENUM枚举, SET集合
char和varchar的区别
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节,所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快,但varchar节省空间
varchar和text的区别
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n< 255),text是实际字符数+2个字节。
2.text类型不能有默认值
3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text
4.日期时间类型
date 日期 '2008-12-2'
time 时间 '12:25:36'
datetime 日期时间 '2008-12-2 22:06:44'
timestamp 自动存储记录修改时间
YEAR(2), YEAR(4):年份
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,这个数据类型的字段可以存放这条记录最后被修改的时间
6、修饰符
所有类型:
NULL数据列可包含NULL值
NOT NULL数据列不允许包含NULL值
DEFAULT默认值
PRIMARY KEY主键
UNIQUE KEY 唯一键
CHARACTER SET name指定一个字符集
数值型
AUTO_INCREMENT自动递增,适用于整数类型
UNSIGNED无符号
7、数据库和表操作
create database zhangdb; ---创建数据库
drop database zhangdb; ---删除数据库
show databases; ---查看所有数据库
create table student (id tinyint unsigned primary key,name varchar(20) not null,age tinyint unsigned,sex char(1) default "m"); ---创建表
create table student2 (id tinyint unsigned not null,name varchar(20) not null,age tinyint unsigned,sex char(1) default "m",primary key(id,name)); ---创建表并指定主键,这个主键有两列组成,称为复合主键
show tables; --查看这个数据库里有什么表
desc student; ---查看表里都有哪些列
drop table student; ---删除表
alter table student add phone char(11) after name; ---在表中增加一个字段 ,用first在某一列前插入
alter table student drop beizhu; ---删除表中某一列
show table status like 'student'\G; --查看表的状态
create index ageindex on student(age); ---创建索引
show indexes from student; ---查看索引
show indexes from student \G; ---也可以这样查看,会把列分成很多行显示,而不是一行,如果列比较多,屏幕显示不下,可以用这种方法
mysql> show indexes from student\G;
*************************** 1. row ***************************
Table: student
Non_unique: 0
Key_name: PRIMARY ---索引名,某一列设置为主键后会自动添加一个索引,并且索引名和主键名相同。唯一键也是一样
Seq_in_index: 1
Column_name: id ---列名
Collation: A
Cardinality: 4
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
1 row in set (0.00 sec)
ERROR:
No query specified
drop index ageindex on student; ----删除索引
修改表的一些示例
ALTER TABLE students RENAME s1; ---修改表名
ALTER TABLE s1 MODIFY phone int; ---修改表的数据类型
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11); 修改字段名phone为 mobile
ALTER TABLE s1 DROP COLUMN mobile; ---删除某一列,column可以不写
ALTER TABLE student ADD UNIQUE KEY(name); ---添加唯一键
ALTER TABLE student ADD INDEX(age); ---添加索引
Help ALTER TABLE 查看帮助
总结:数据库和表的操作,用的是数据的定义语言create、drop、alter,添加或者创建主键和唯一键时会自动添加索引。
8、对表里的数据的操作
insert into student (id,name,age,sex,phone)values(1,'zhang',31,'m',136); ---给表中添加数据,注意列的值如果为字母要用单引号引起来,否则识别不了,数字可以不引
insert into student (id,name,age)values(2,'li',23); ---可以挑选着进行添加数据,不添加数据的列在可以为空值的前提下
select * from student; ---查看表中的所有列
insert into student values(3,'wang',012,30,'m'),(4,'zhao',010,32,'m'); ---可以赋值多行,中间用逗号隔开
create table emp select * from student; ---相当于复制整个表,复制后两张表的结构和数据都相同
delete from emp; ---清空表中的数据,记录日志
truncate table emp; ---清空表中的数据,但不记录日志,速度快
insert into emp select * from student; ---复制表中的数据,要求两张表的结构要相同
update emp set age=50 where id=3; ---修改表中的数据
update emp set age=19,sex='s' where id=4;
delete from emp where id=4; ---删除中的数据
总结:用的是数据的操作语言,insert、delete、update。
9、查看表
DQL:SELECT数据的查询语言
SELECT col1,col2,... FROM tbl_name[WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
Limit m,n跳过m个,要n个
字段表示法:
*: 所有字段
as:字段别名,col1 AS alias1
WHERE clause:
操作符:
>, <, >=, <=, ==, !=
BETWEEN ... AND ...
LIKE:
%:任意长度的任意字符
_:任意单个字符;
RLIKE:正则表达式模式匹配
IS NULL ,IS NOT NULL
IN (val1,val2,…)
条件逻辑操作:
and,or,not
示例
select id as 员工编号,name as 姓名 from student; ---以别名的形式显示这两列
select * from student where age between 18 and 20;
select * from student where age>=18 and age<=20;
显示年龄在18-20岁之间的
select * from student where age between 18 and 30 order by age; ---显示18-30岁之间并且按年龄排序
select * from student where age between 18 and 30 order by age desc; ---按年龄倒序排序
select * from student where age between 18 and 30 order by age desc limit 1,2; ---年龄倒序排序跳过1个显示2个
select * from student where name like "l%"; ---表示以l打头的,通配符写法
select * from student where name rlike "^l.*"; ---正则表达式写法
setect * from student where name like "l_" =select * from student where name rlike "^l.$"; --表示以l打头后面跟一个字符
select * from student where phone is null; ---显示电话号码为空的行
select * from student where name in ("zhang","wang"); ---显示名字那一列为zhang和wang的行
select s.id,e.name from student as s,emp as e where s.id=e.id and s.name rlike '.*[no].*'; ---显示两张表的内容
10、用户账号管理
用户账号:'user'@'host'
user: 用户名
host: 允许用户通过哪些主机远程连接mysqld服务
IP、网络地址、主机名、通配符(%和_)
创建用户:
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
create user 'test'@'localhost' identified by '123456';
create user 'test'@'192.168.%.%' identified by '123456';
查看当前用户:
SELECT user();
查看用户:
SELECT User,Host,Password FROM user
删除用户:DROP USER 'username'@'host';
示例:删除默认的空用户
DROP USER ''@'localhost';
更改口令:
SET PASSWORD FOR 'user'@'host' = PASSWORD('password');
注意:上面修改表的命令不会马上生效,需执行FLUSH PRIVILEGES生效
示例
create user 'tom'@'172.18.%.%' identified by 'magedu';
创建一个用户账号并设置密码,允许远程的172.18网段的主机,以用户名tom连接到我的mysql服务器,注意mysql里的用户名和系统里的用户名没有关系,也就是说tom这个用户名在系统里可以没有这个名字,这个是数据库用的用户名。
mysql -utom -pmagedu -h172.18.21.107
drop user 'nihao'@'172.18.21.106'; ---删除用户名
set password for 'tom'@'172.18.%.%'=password('centos'); ---修改密码
注意:远程登录mysql前,先要看下存放数据库的服务器防火墙是否放行默认3306端口,mysql的配置文件my.cnf里的bind-address = 127.0.0.1
要注释掉,skip-networking
的值要改为0。
11、授权
grant select,insert on zhangdb.* to 'tom'@'172.18.%.%';
授权tom用户只能查看和修改表
grant all on zhangdb.* to 'tom'@172.18.%.%;
授权tom用户所有的权限
*.*: 所有库的所表
db_name.*: 指定库的所有表
db_name.tb_name: 指定库的指定表
db_name.routine_name:指定库的存储过程和函数
revoke insert on zhangdb.* from 'tom'@'172.18.%.%'; --收回授权
grant all on zhangdb.* to 'wang'@'172.18.21.106' identified by "magedu"; ----授权的同时创建账号
show grants for wang@'172.18.21.106'; ---查看用户获得的授权
grant update(name) on zhangdb.students to test@'172.18.%.%' identified by 'centos'; ---只授权修改某个字段
Help SHOW GRANTS ---查看帮助。怎么查用户的获得的授权
对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES