MySQL
一、SQL语句
SQL结构化查询语句,为数据库而建立的操作命令集。
1、SQL语句规范
- 在数据库系统中,SQL语句不区分大小写(建议用大写),但字符串的常量区分大小写,建议命令大写,表名和库名小写;
- SQL语句可单行或者多行书写,最后以英文分号;结尾;
- 单行注释:--
- 多行注释:/*...*/
2、SQL语句分类
- DDL数据定义语言,负责数据库定义,数据库对象定义,由CREATE、ALTER与DROP三个语法所组成。
- DML数据操作语言,负责对数据库对象的操作,CRUD增删改查。
- DCL数据控制语言,负责数据库权限访问控制,由GRANT和REVOKE两个指令组成。
- TCL事物控制语言,负责处理ACID事物,支持commit、rollback指令。
二、MySQL数据库
1、数据库安装
首先安装mysql,安装之前需要配置yum源(我配置的是阿里的源):
yum install mysql-server
然后启动服务:
service mysqld start
第一次需要配置root密码:
mysqladmin -u root password "mysql"
进入数据库:
mysql -uroot -pmysql
2、数据库操作
(1)显示数据库
show databases;
(2)创建数据库
create database 数据库名称 default charset 字符集 collate 字符排序方式;
create database test1 default charset utf8 collate utf8_general_ci;
(3)删除数据库
drop database test1;
(4)使用数据库
进入数据库:
use test;
查看当前数据库中所有的表:
show tables;
查看当前正在使用的数据库:
select database();
(5)用户管理
查看当前已经授权的用户:
use mysql
select host,user from user;
创建一个用户:
create user '用户名'@'IP地址' identified by '密码';
create user "wj"@"%" identified by "wj";
%代表所有的ip都可以访问,这样做要考虑安全性的问题
删除已授权的用户:
drop user "wj"@"%";
修改已授权用户的用户名和Ip:
rename user "wj"@"%" to "wangjie"@"127.0.0.1";
修改用户密码:
set password for "wangjie"@"127.0.0.1" = Password("wangjie");
(6)授权管理
查看权限:
show grants for "wangjie"@"127.0.0.1";
授权用户权限:
grant select on *.* to "wangjie"@"127.0.0.1"; # 查权限,*.*表示所有数据库的所有表
grant all privileges on *.* to "wangjie"@"127.0.0.1"; # 所有权限,权限过大需要考虑安全性问题
取消权限:
revoke select on *.* from "wangjie"@"127.0.0.1";
revoke all privileges on *.* from "wangjie"@"127.0.0.1";
三、数据类型
1、数值型
类型 | 大小 | 用途 |
tinyint | 1字节 | 小整数值 |
smallint | 2字节 | 大整数值 |
mediumint | 3字节 | 大整数值 |
int或者integer | 4字节 | 大整数值 |
bigint | 8字节 | 极大整数值 |
float | 4字节 | 单精度(浮点数值) |
double | 8字节 | 双精度(浮点数值) |
2、日期和时间类型
类型 | 大小 | 用途 |
date | 3字节 | 日期值 |
time | 3字节 | 时间值或者持续时间 |
year | 1字节 | 年份值 |
datetime | 8字节 | 混合日期和时间值 |
timestamp | 4字节 | 混合日期和时间值,时间戳 |
3、字符串类型
类型 | 大小 | 用途 |
char | 0-255字节 | 定长字符串 |
varchar | 0-65535字节 | 变长字符串 |
tinyblob | 0-255字节 | 不超过255个字符的二进制字符串 |
tinytext | 0-255字节 | 短文本字符串 |
blob | 0-65535字节 | 二进制形式的长文本数据 |
text | 0-65535字节 | 长文本数据 |
mediumblob | 0-16777215字节 | 二进制形式的中等长度文本数据 |
mediumtext | 0-16777215字节 | 中等长度文本数据 |
longblob | 0-4294967295字节 | 二进制形式的极大文本数据 |
longtext | 0-4294967295字节 | 极大文本数据 |
四、存储引擎
1、MyISAM和InnoDB的适用场景
- MyISAM适合:(1)做很多的count计算 (2)插入不频繁,查询非常频繁 (3)没有事务
- InnoDB适合:(1)可靠性要求比较高,或者要求事务 (2)表更新和查询都相当频繁,并且表锁定的机会比较大的情况。
2、MyISAM和InnoDB的区别
- MyISAM不支持事务处理等高级处理,而InnoDB支持
- MyISAM不支持外键
- 在执行数据库写入操作的时候,MyISAM会锁表,InnoDB或锁行
- 在数据库有大量数据写入,更新操作,查询比较少要求数据完整性比较高的话就选择InnoDB,在数据库中主要以查询为主,写入和更新操作少,并且对于数据完整性没有那么严格的话,选择MyISAM
五、数据库表的操作
1、表的定义、删除、修改
(1)语法
- create table 表名 (字段名 字段类型)
(2)示例:创建一张表
mysql> create table student(
-> id int not null auto_increment,
-> name char(32) not null,
-> age int not null,
-> register_date date,
-> primary key(id));
(3)表的相关操作
- 查看该数据库中已经创建的表:show tables;
- 查看表的结构信息:desc 表名;
- 查看表定义时的语法信息:show create table 表名;
- 删除表:drop table 表名;
(4)修改表的相关操作
- 增加字段:alter table 表名 add 字段名 类型;
- 删除字段:alter table 表名 drop column 字段名;
- 修改字段:alter table 表名 change 原字段名 新字段名 类型;
- 修改表名:alter table 表名 rename to 新表名;
- 添加主键:alter table 表名 add primary key(字段名);
- 删除主键:alter table 表名 modify 字段名 int,drop primary key;
- 添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
- 删除外键:alter table 表名 drop foreign key 外键名称;
2、表内容的相关操作
(1)插入数据
- 语法:insert into 表名 (字段1, 字段2, ...) values (值1, 值2, ...);
(2)示例:插入内容
mysql> insert into students (name, age, register_date) values ('wj', 22, '2017-01-01');
(3)查看数据
- 语法:select 字段1, 字段2, ... from 表名 [where 查询条件] [offset 偏移量] [limit 返回记录数];
(4)示例:查询内容
mysql> select * from students limit 2 offset 1; * 显示所有字段 limit 2 返回两条记录 offset 1 从第1条开始查
mysql> select * from students where id>1; 查询id大于1的记录
mysql> select * from students where id>1 and age<22; 查询所有id大于1并且age小于22的记录
mysql> select * from students where name like 'w%'; like 模糊匹配,查询所有name字段以w开头的记录
(5)修改记录
mysql> update students set name='yzw' where id=1; 将id等于1的记录的字段name的值改为yzw
(6)删除记录
mysql> delete from students where id>3; 将所有id大于3的记录删除
(7)排序
mysql> select * from students order by id; 按照id升序排列
mysql> select * from students order by id desc; 按照id降序排列
(8)分组
mysql> select name, count(*) from students group by name; 按照姓名分组,并统计姓名出现的次数
mysql> select name, sum(age) from students group by name; 按照姓名分组,并将年龄进行相加
3、表的连接
(1)内连接或者等值连接inner join
- 获取两个表中字段匹配关系的记录
mysql> select * from A inner join B on A.a=B.b; 交集
(2)左连接left join和右连接right join
- 获取左表所有记录,即使右表没有对应匹配的记录
- 获取右表所有记录,即使左表没有对应匹配的记录
mysql> select * from A left join B on A.a=B.b; 差集
mysql> select * from A right join B on A.a=B.b; 差集
mysql> select * from A left join B on A.a=B.b union select * from A right join B on A.a=B.b; 并集
六、事务
关系型数据库支持事务,必须支持其四个属性(ACID):
- 原子性:要求事务中的所有操作不可分割,不能做了一部分操作,还剩一部分操作
- 一致性:多个事务并行执行的结果,应该和事务排队执行的结果一致,如果事务的并行执行结果和多线程读写共享资源一样不可预期,就不能够保证一致性
- 隔离性:多个事务访问共同的数据,应该互不干扰
- 持久性:事务一旦提交之后,对数据库中的数据的改变就应该是永久性的
七、索引
1、普通索引
最基本的索引,没有任何限制,有以下几种创建方式:
(1)直接创建索引
- 语法: create index 索引名 on 表名(字段(长度));
mysql> create index test_username on test(username(10));
(2)修改表结构的方式添加索引
- 语法:alter table 表名 add 索引名(字段(长度));
mysql> alter table test add index test_username(username(10));
(3)创建表的时候同时创建索引
mysql> create table test(
-> id int,
-> username varchar(16),
-> city varchar(16),
-> age int,
-> index test_username (username(10))
-> );
2、唯一索引
索引列的值必须唯一,但允许有空值,它有以下几种创建方式:
(1)直接创建索引
- 语法:create unique index 索引名 on 表名(字段(长度));
mysql> create unique index test_city on test(city(10));
(2)修改表结构的方式添加索引
- 语法:alter table 表名 add unique 索引名(字段(长度(10));
mysql> alter table test add unique test_city(city(10));
(3)创建表的时候同时创建索引
mysql> CREATE TABLE test(
-> id INT,
-> username VARCHAR(16),
-> city VARCHAR(16),
-> age INT,
-> UNIQUE test_username (username(10))
-> );
3、主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般在建表的时候就同时创建了主键索引。
4、组合索引
多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
mysql> alter table test add index test_username_city(username, city);
5、全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。有以下几种创建方式:
(1)直接创建
- 语法:create fulltext index 索引名 on 表名 (字段);
mysql> create fulltext index full_username on test (username);
(2)修改表结构添加全文索引
- 语法:alter table 表名 add fulltext index 索引名(字段));
mysql> alter table test add fulltext index full_city (city);
(3)创建表的时候直接指定
mysql> create table test(
-> id int,
-> username varchar(16),
-> city varchar(16),
-> age int,
-> fulltext indexName (username(10))
-> );
6、查看索引
- 语法:show create table 表名;
7、删除索引
- 语法:drop index 索引名 on 表名;