前身属于瑞典的一家公司,MySQL AB
08年被sun公司收购
09年sun被oracle收购
1、开源、免费、成本低
2、性能高、移植性也好
3、体积小,便于安装
略
从网上下载rpm包
一共需要4个
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-server-5.7.26-1.el7.x86_64.rpm
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-client-5.7.26-1.el7.x86_64.rpm
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-common-5.7.26-1.el7.x86_64.rpm
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-libs-5.7.26-1.el7.x86_64.rpm
将下载好的包上传到服务器
安装
rpm -ivh mysql-community-****.rpm --force --nodeps
安装顺序 common–>libs–>client–>server
配置
启动mysql服务:
service mysqld start
找到初始密码:
cat /var/log/mysqld.log | grep password
登录MySQL
先修改一个比较复杂的密码随后再改
alter user 'root'@'localhost' identified by 'newpasswd';
修改允许简易密码
set global validate_password_policy=LOW; # 等级low
set global validate_password_length=6; # 长度六位
此时就可以修改简易密码了
alter user 'root'@'localhost' identified by 'newpasswd';
允许远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'newpasswd' WITH
GRANT OPTION;
关闭防火墙
# 单次关闭
systemctl stop firewalld.service
# 永久关闭
systemctl disable firewalld.service
设置开机自启
vi /etc/rc.local
在文件中添加 service mysqld start即可。
SQL—Structured Query Language 结构化查询语言
select 查询列表 7
from 表1 别名 1
连接类型 join 表2 2
on 连接条件 3
where 筛选 4
group by 分组列表 5
having 筛选 6
order by排序列表 8
limit 起始条目索引,条目数; 9
查询单个字段
select 字段名 from 表名;
查询多个字段
select 字段名,字段名 from 表名;
查询所有字段
select * from 表名;
查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
查询函数
select 函数名(实参列表);
查询表达式
select 100/1234;
起别名
select 字段名 as 别名 from 表名 as 别名;
去重
select distinct 字段名 from 表名;
作用:做加法运算
select 数值+数值; # 直接运算
select 字符+数值; # 先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
select null+值; # 结果都为null
[补充]concat函数
作用: 拼接函数
select concat(字符1,字符2,字符3,...);
[补充]ifnull函数
功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;
[补充]isnull函数
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
select 查询列表 from 表名 where 筛选条件;
简单条件运算符
> < = <> != >= <= <=>安全等于
逻辑运算符
&& and || or ! not
模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符
区间判断
between and
in
is null /is not null:用于判断null值
select 查询列表 from 表 where 筛选条件
order by 排序列表 [asc|desc]
功能:类似于java中的方法
好处:提高重用性和隐藏实现细节
调用:select 函数名(实参列表);
字符函数
concat # 连接
substr # 截取子串
upper # 变大写
lower # 变小写
replace # 替换
length # 获取字节长度
trim # 去前后空格
lpad # 左填充
rpad # 右填充
instr # 获取子串第一次出现的索引
数学函数
ceil # 向上取整
round # 四舍五入
mod # 取模
floor # 向下取整
truncate # 截断
rand # 获取随机数,返回0-1之间的小数
日期函数
now # 返回当前日期+时间
year # 返回年
month # 返回月
day # 返回日
date_format # 将日期转换成字符
curdate # 返回当前日期
str_to_date # 将字符转换成日期
curtime # 返回当前时间
hour # 小时
minute # 分钟
second # 秒
datediff # 返回两个日期相差的天数
monthname # 以英文形式返回月
其他函数
version # 当前数据库服务器的版本
database # 当前打开的数据库
user # 当前用户
password('字符') # 返回该字符的密码形式
md5('字符') # 返回该字符的md5加密形式
流程控制函数
if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
case 变量或表达式或字段
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end
case
when 条件1 then 值1
when 条件2 then 值2
...
else 值n
end
max # 最大值
min # 最小值
sum # 和
avg # 平均值
count # 计算个数2.4 DML语言2.4.1 插入
# 方式一
insert into 表名(字段名,...) values(值,...);
# 方式二
insert into 表名 set 字段=值,字段=值,...;
update 表名 set 字段=值,字段=值 [where 筛选条件];
delete from 表名 [where 筛选条件] [limit 条目数];
truncate table 表名
两种方式的区别
创建库
create database [if not exists] 库名
[character set 字符集名];
修改库
alter database 库名 character set 字符集名;
删除库
drop database [if exists] 库名;
create table [if not exists] 表名(
字段名 字段类型 [约束],
字段名 字段类型 [约束],
...
字段名 字段类型 [约束]
)
# 添加列
alter table 表名 add column 列名 类型 [first|after 字段名];
# 修改列的类型或约束
alter table 表名 modify column 列名 新类型 [新约束];
# 修改列名
alter table 表名 change column 旧列名 新列名 类型;
# 删除列
alter table 表名 drop column 列名;
# 修改表名
alter table 表名 rename [to] 新表名;
drop table [if exists] 表名;
# 仅复制表结构
create table 表名 like 旧表;
# 复制表结构加数据
create table 表名
select 查询列表 from 旧表 [where 筛选];
整型
tinyint 1
smallint 2
mediumint 3
int/integer 4
bigint 8
特点
浮点型
定点数:decimal(M,D)
浮点数:
float(M,D) 4
double(M,D) 8
特点
char、varchar、binary、varbinary、enum、set、text、blob
char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略
year 年
date 日期
time 时间
datetime 日期+时间 8
timestamp 日期+时间 4 比较容易受时区、语法模式、版本的影响,更能反映当前时区的真实时间
NOT NULL:非空,该字段的值必填
UNIQUE:唯一,该字段的值不可重复
DEFAULT:默认,该字段的值不用手动插入有默认值
CHECK:检查,mysql不支持
PRIMARY KEY:主键,该字段的值不可重复并且非空 unique+not null
FOREIGN KEY:外键,该字段的值引用了另外的表的字段
create table 表名(
字段名 字段类型 not null, # 非空
字段名 字段类型 primary key, # 主键
字段名 字段类型 unique, # 唯一
字段名 字段类型 default 值, # 默认
constraint 约束名 foreign key(字段名) references 主表(被引用列)
)
# 非空约束
# 添加非空
alter table 表名 modify column 字段名 字段类型 not null;
# 删除非空
alter table 表名 modify column 字段名 字段类型 ;
# 默认约束
# 添加默认
alter table 表名 modify column 字段名 字段类型 default 值;
# 删除默认
alter table 表名 modify column 字段名 字段类型 ;
# 主键约束
# 添加主键
alter table 表名 add [constraint 约束名] primary key(字段名);
# 删除主键
alter table 表名 drop primary key;
# 唯一约束
# 添加唯一
alter table 表名 add [constraint 约束名] unique(字段名);
# 删除唯一
alter table 表名 drop index 索引名;
# 外键约束
# 添加外键
alter table 表名 add [constraint 约束名] foreign key(字段名) references 主表(被引用列);
# 删除外键
alter table 表名 drop foreign key 约束名;
特点:
# 创建表时设置自增长列
create table 表(
字段名 字段类型 约束 auto_increment
)
# 修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment
# 删除自增长列
alter table 表 modify column 字段名 字段类型 约束
事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行.
A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
C 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
D 持久性:一个事务一旦提交了,则永久的持久化到本地
并发访问的问题 | 含义 |
---|---|
脏读 | 一个事务读取到了另一个事务尚未提交的数据 |
不可重复读 | 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取的数据是一致的,这是事务中update时引发的问题 |
幻读 | 一个事务中两次读取数据的数量不一致,要求在一个事务中多次读取的数据数量是一致的,只是事务中insert或delete时引发的问题 |
名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
---|---|---|---|---|---|
读未提交 | read uncommitted | 是 | 是 | 是 | |
读已提交 | read committed | 否 | 是 | 是 | Oracle;SQL Server |
可重复读 | repeatable read | 否 | 否 | 是 | MySQL |
串行化 | serializable | 否 | 否 | 否 |
本身是一个虚拟表,它的数据来自于表,通过执行时动态生成。
好处:
create view 视图名
as
查询语句;
# 方式一:
create or replace view 视图名
as
查询语句;
# 方式二:
alter view 视图名
as
查询语句
drop view 视图1,视图2,...;
desc 视图名;
show create view 视图名;
# 查看系统变量
show [global|session] variables like '';
#如果没有显式声明global还是session,则默认是session
# 查看指定的系统变量的值
select @@[global|session].变量名; 如果没有显式声明global还是session,则默认是session
# 为系统变量赋值
# 方式一:
set [global|session] 变量名=值;
# 如果没有显式声明global还是session,则默认是session
# 方式二:
set @@global.变量名=值;
set @@变量名=值;
全局变量
服务器层面上的,必须拥有super权限才能为系统变量赋值,作用域为整个服务器,也就是针对于所有连接(会话)有效
会话变量
服务器为每一个连接的客户端都提供了系统变量,作用域为当前的连接(会话)
说明:
用户变量
作用域:针对于当前连接(会话)生效
位置:begin end里面,也可以放在外面
# 声明并赋值
set @变量名=值;
set @变量名:=值;
select @变量名:=值;
# 更新值
# 方式一:
set @变量名=值;
set @变量名:=值;
select @变量名:=值;
# 方式二:
select xx into @变量名 from 表;
# 使用
select @变量名;
局部变量
作用域:仅仅在定义它的begin end中有效
位置:只能放在begin end中,而且只能放在第一句
# 声明
declare 变量名 类型 [default 值];
# 赋值或更新
# 方式一:
set 变量名=值;
set 变量名:=值;
select @变量名:=值;
# 方式二:
select xx into 变量名 from 表;
# 使用
select 变量名;
存储过程是一种数据库对象,是为了实现某个特定任务,将一组预编译的SQL语句以一个存储单元的形式存储在服务器上,供用户调用。
存储过程在第一次执行时进行编译,然后将编译好的代码保存在高速缓存中以便以后调用,这样可以提高代码的执行效率。
DELIMITER $$
CREATE
PROCEDURE `db1`.`count_view`() # '数据库名'.'存储过程名'(可放参数)
BEGIN
# 此处填写代码块
END$$
DELIMITER ;
注意:
call 存储过程名(实参列表);
举例:
# 调用in模式的参数
call sp1('值');
# 调用out模式的参数
set @name;
call sp1(@name);
select @name;
# 调用inout模式的参数
set @name=值;
call sp1(@name);
select @name;
show create procedure 存储过程名;
drop procedure 存储过程名;
CREATE FUNCTION sp_name ([param_name type[,...]])
RETURNS type -- 定义返回值类型
BEGIN
routine_body
return sth ;
END
select 函数名(实参列表);
show create function 函数名;
drop function 函数名;
CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW
BEGIN
routine_body
END
# trigger_time: { BEFORE | AFTER } # trigger_event: { INSERT | UPDATE | DELETE }
注意事项:
SELECT * FROM A INNER JOIN B ON A.condition = B.condition;
SELECT * FROM A LEFT JOIN B ON A.condition = B.condition;
SELECT * FROM A RIGHT JOIN B ON A.condition = B.condition;
SELECT * FROM A LEFT JOIN B ON A.condition = B.condition WHERE B.condition is null;
SELECT * FROM A RIGHT JOIN B ON A.condition = B.condition WHERE A.condition is null;
# left join + union(可去除重复数据)+ right join
SELECT * FROM A LEFT JOIN B ON A.condition = B.condition
UNION
SELECT * FROM A RIGHT JOIN B ON A.condition = B.condition;
SELECT * FROM A LEFT JOIN B ON A.condition = B.condition WHERE B.condition is null
UNION
SELECT * FROM A RIGHT JOIN B ON A.condition = B.condition WHERE A.condition is null;
MySQL官方定义: 索引(Index)是帮助MySQL高效获取数据的数据结构。
简单理解: 排好序的快速查询数据结构。
一般来说索引本身也很大,不可能全部存储在内存中,往往以索引文件的形式存储在硬盘上。
我们平常说的索引,如果没有特别指明,都是指BTree组织结构索引。
类似大学图书馆建图书索引,提高数据的检索效率,降低数据库的IO成本,通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
同时,索引实际也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。虽然提高了查询速度,但会降低更新表的速度。
索引只是提高效率的一个因素,如果你的MySQL有大量的表,就需要花时间研究建立最优秀的索引。
创建
# 方式一:
CREATE [UNIQUE] INDEX indexName ON tableName (columnName(length));
# 如果是char或varchar类型,length可以小于实际长度,如果是BLOB和TEXT类型必须指定length
# 方式二:
ALTER tableName ADD [UNIQUE] INDEX indexName ON (columnName(length));
删除
DROP INDEX indexName ON tableName;
查看
SHOW INDEX FROM tableName;
[优化口诀]
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE百分写最后,覆盖索引不写星;
不等空值还有OR,索引失效要少用;
VAR引号不可丢,SQL高级也不难。
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的。
EXPLAIN 包含以下部分
select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
有三种情况
显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称。
对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)。
key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中。
如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)。
不损失精确性的情况下,长度越短越好。
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。
该列包含MySQL解决查询的详细信息,有以下几种情况: