MySQL基础

MySQL基础

数据类型

数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型

整数型

类型 大小(字节) 范围(有符号) 范围(无符号) 用途
TINYINT 1 (-128,127) (0,255) 小整数值
SMALLINT 2 (-32768,32767) (0,65535) 大整数值
MEDIUMINT 3 (-8388608,8388607) (0,16777215) 大整数值
INT 4 (-2147483648,2147483647) (0,4294967295) 大整数值
BIGINT 8 (0,2的64次方减1) 极大整数值

浮点型

类型 大小(字节) 解释
FLOAT(m,d) 4 单精度浮点型;m代表总个数,d代表小数位个数(可能损失精度)
DOUBLE(m,d) 8 双精度浮点型;m代表总个数,d代表小数位个数(可能损失精度)

定点型

类型 大小 解释
DECIMAL(m,d) 依赖于M和D的值 m代表总个数,d代表小数位个数(定长)

字符串类型

char的优缺点:存取速度比varchar更快,但是比varchar更占用空间
varchar的优缺点:比char省空间。但是存取速度没有char快

类型 大小(字节) 用途
CHAR 0-255 定长字符串
VARCHAR 0-65535 变长字符串
TINYTEXT 0-255 短文本字符串
TEXT 0-65535 长文本数据
MEDIUMTEXT 0-16777215 中等长度文本数据
LONGTEXT 0-4294967295 极大文本数据

时间型

数据类型 字节数 格式 解释
date 3 yyyy-MM-dd 存储日期值
time 3 HH:mm:ss 存储时分秒
year 1 yyyy 存储年
datetime 8 yyyy-MM-dd HH:mm:ss 存储日期+时间
timestamp 4 yyyy-MM-dd HH:mm:ss 存储日期+时间,可作时间戳

命令行模式常用操作

Command Desc
mysql -u用户 -p密码 登录命令-明文密码
mysql -u用户 -p 登录命令-密文密码
mysql -u用户 -hIp地址 -p 指定Ip登录-密文密码
exit; 或 quit; 命令行模式退出
delimiter 符号 设定sql结束符号

MySQL操作语句

DDL 数据定义语言 (Data Definition Language)

如:建库、建表

库相关

Command Desc
show databases; 查看有多少数据库
select database(); 查看当前在哪个库里面
use 库名; 进入库操作
create database db1; 直接创建数据库db1
create database if not exists db1; 判断是否存在,如果不存在则创建数据库 db1
create database db1 default character set gbk; 创建数据库db1并指定字符集为 gbk
show create database db1; 查看db1库字符集
show variables like 'character%'; 查看当前mysql使用的字符集
drop database db1; 删除db1库
alert database db1 default character set utf8; 设置db1库的字符集为utf8

表相关

约束条件
Type Desc
comment 说明解释
not null 不为空
default 默认值
unsigned 无符号(即正数,不加此约束,默认创建有符号)
auto_increment 自增
zerofill 自动填充
unique key 唯一值
primary key 主键
表相关
command Desc
show tables; 查看当前库的所有表
desc 表名; 查看表结构
show create table 表名; 查看该表的建表语句 \G :有结束sql语句的作用,还有把显示的数据纵向旋转90度 \g :有结束sql语句的作用 eg:show create table stu\G
alter table 表名 character set 字符集; 修改表的字符集
建表语句
/*第一种*/
create table 表名 (
    字段名1 字段数据类型 约束条件 说明,
    字段名2 字段数据类型 约束条件 说明
);
/*第二种 -- 表名1不存在,表名2存在,将表名2的表结构及数据复制到表名1中 -- 复制可能不完全*/
create table 表名1 as select * from 表名2
/*第三种 -- 表名1不存在,表名2存在,将表名2的column1, column2结构复制到表名1中 --  复制可能不完全*/
create table 表名1 as select column1, column2 from 表名2 
/*第四种 -- 表名1不存在,表名2存在,将表名2的表结构复制到表名1中 --  复制可能不完全*/
create table 表名1 as select * from 表名2 where 1=2
/*第五种 -- -- 表名1不存在,表名2存在,将表名2的表结构复制到表名1中*/
create table 表名1 like 表名2
表结构维护
  • 重命名

    rename table 旧表名 to 新表名;
    
  • 表删除

    drop table 表名;
    drop table if exists 表名;/*判断表是否存在,存在就删除*/
    
  • 添加列

    /*添加一列*/
    alter table 表名 add 字段名 字段类型 约束条件 说明;
    /*表最前面添加一列*/
    alter table 表名 add 字段名 字段类型 约束条件 说明 first;
    /*给表某个字段后添加一列*/
    alter table 表名 add 字段名 字段类型 约束条件 说明 after 已存在字段名;
    
  • 修改列类型

    alter table 表名 modify 字段名 字段新类型;
    
  • 修改列名

    alter table 表名 change 旧字段名 新字段名 新字段类型;
    
  • 删除列

    alter table 表名 drop 字段名;
    

DML 数据操纵语言(Data Manipulation Language)

如:对表中的数据进行增删改操作

insert

  • 普通插入

    /* 第一种 */
    insert into 表名 (column1, column2) values (column1值, column2值);
    /* 第二种 */
    insert into 表名 values (全部字段值);
    
  • 蠕虫复制

    /* 将t2中的数据复制到t1中 -- t1表和t2表的字段完全对应*/
    insert into t1 select * from t2;
    /* 将t2中的column1,column2字段数据复制到t1中*/
    insert into t1 (column1, column2) select column1, column2 from t2;
    
  • 批量插入

    insert into t1 
    (c1, c2, c3)
    values 
    (c1_v1, c2_v1, c3_v1),
    (c1_v2, c2_v2, c3_v2),
    (c1_v3, c2_v3, c3_v3)
    

update

update t1 set c1=值, c2=值 where c3 = 约束条件;

delete

delete from t1 where c = 约束条件;
truncate table t1;

DQL 数据查询语言(Data Query Language)

简单查询

/* 查询所有 */
select * from stu;
/* 查询指定字段 */
select name from stu;
/* 查询指定字段别名 */
select name as '姓名' from stu;

条件查询-比较条件

condition desc example
= 等于 select * from stu where name = 'li';
> 大于 select * from stu where age > 18;
>= 大于等于 select * from stu where age >= 18;
< 小于 select * from stu where age < 18;
<= 小于等于 select * from stu where age <= 18;
<>或!= 不等于 select * from stu where age <> 18;

条件查询-逻辑条件

condition desc example
and 逻辑条件(与) select * from stu where name = 'li' and age = 18;
or 逻辑条件(或) select * from stu where name = 'li' or age = 18;

条件查询-判空查询

condition desc example
is null 没有数据 select * from stu where name is null;
is not null 有数据 select * from stu where name is not null;
='' 没有数据 select * from stu where name = '';
<>'' 有数据 select * from stu where name <> '';

模糊查询

% 替代任意个字符

_ 替代一个字符

select * from stu where name like 'li%';
select * from stu where name like '%li%';
select * from stu where name like 'li_%';

去重查询

select distinct class from stu;
select distinct(class) from stu;

范围查询

between ... and ...

/*查询age在15-18范围的学生*/
select * from stu where age between 15 and 18;

离散查询

in

/*查询age是15和18的学生*/
select * from stu where age in (15, 18);

聚合查询

type desc example
count(code)或者count(*) 总条数 select count(*) from stu;select count(name) from stu;
sum() 计算求和 select sum(age) from stu;
max() 计算最大值 select max(age) from stu;
min() 计算最低值 select min(age) from stu;
avg() 计算平均值 select avg(age) from stu;

分组查询(group by)

把行按字段分组,常用于统计场合,一般和聚合函数连用

select class_name, count(class_name) from stu group by class_name;

having条件查询

对查询的结果进行筛选操作,一般跟在group by之后

/* having 的条件必须是查询结果中的 */
select class_name, count(class_name) from stu group by class_name having count(class_name) > 2;

排序(order by)

对查询的结果进行排序操作

asc 升序;desc 降序;默认asc

select * from stu order by age;
select class_name, COUNT(*) as 'sumTotal' from stu group by class_name having COUNT(*) > 2 order by COUNT(*) desc;

分页查询(limit)

对查询结果起到限制条数的作用

limit n,m n:代表起始条数值,不写默认为0;m代表:取出的条数

select * from stu limit 2, 5;

子查询(exists)

exists型子查询后面是一个受限的select查询语句;如果exists后的内层查询能查出数据,则返回 TRUE 表示存在;为空则返回 FLASE则不存在

分为俩种:exists跟 not exists
/* select 1 from employee where 1=1; */
select * from 表名 a where exists (select 1 from 表名2 where 条件);
select * from 表名 a where not exists (select 1 from 表名2 where 条件);
eg: 
/* 查询已经分班的学生 */
select * from stu a where exists (select 1 from class_table b where a.class_id = b.class_id);
/* 查询未分班的学生 */
select * from stu a where exists (select 1 from class_table b where a.class_id = b.class_id);

外连接

外连接分为左外连接(左连接)、右外连接(右连接)两种

左连接

left join 是left outer join的简写,左(外)连接,左表(a_table)的记录将会全部表示出来, 而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL

语法:left join 表名 on 条件 / left outer 表名 join on 条件

/*查询已经分班的学生信息*/
select b.class_name, a.* from stu a left join class_table b on a.class_id = b.class_id;
右连接

right join是right outer join的简写,与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL

语法:right join 表名 on 条件/ right outer 表名 join on 条件

/*查询已经分班的学生信息*/
select a.class_name, b.* from class_table a left join stu b on b.class_id = a.class_id;

内连接

获取两个表中字段匹配关系的记录(交集)

语法:INNER JOIN 表名 ON 条件;

/*查询已经分班的学生信息*/
select b.class_name, a.* from stu a left join class_table b on a.class_id = b.class_id;

联合查询

多个查询语句的查询结果结合在一起

语法:

  • ... UNION ... (去除重复)
  • ... UNION ALL ...(不去重复)

注意事项:

  • 两个select语句的查询结果的“字段数”必须一致;
  • 通常,也应该让两个查询语句的字段类型具有一致性;
  • 也可以联合更多的查询结果;
  • 用到order by排序时,需要加上limit(加上最大条数就行),需要对子句用括号括起来
(select * from stu where class_id = 2 order by scope limit 999)
union
(select * from stu where class_id = 2 order by scope desc limit 999)

DCL 数据控制语言(Data Control Language)

修改用户密码

以root用户为例

已知密码修改
  1. SET PASSWORD FOR 用户@ip = '密码';
    -- 使用root用户先登录
    -- SET PASSWORD FOR root@localhost = '123456';
    
  2. update mysql.user set authentication_string=password('密码') where user='用户';
    -- 使用root用户先登录 8版本以上失效
    -- update mysql.user set authentication_string=password('123456') where user='root';
    
  3. mysqladmin -uroot -p旧密码 password 新密码;
    -- 无需root用户登录
    -- mysqladmin -uroot -p123456 password;
    -- 确认密码
    
忘记密码修改
  1. 修改配置文件在[mysqld]下面加上 skip-grant-tables(跳过权限验证)
  2. 重启mysql服务
  3. 无密码登录
  4. 修改密码

限制root用户登录方式

指定Ip登录
  • 查看允许root登录的IP地址

    select user, host from mysql.user where user = 'root';
    -- 结果 %代表不限登录的ip地址
    +------+------+
    | user | host |
    +------+------+
    | root | %    |
    +------+------+
    1 row in set (0.17 sec)
    
  • 指定ip地址

    update mysql.user set host = 'localhost' where user = 'root';
    
  • 刷新权限

    flush privileges;
    

用户管理

创建用户

语法:

create user '用户名'@'IP地址' identified by '密码';
-- create user 'testUser'@'%' identified by '123456';
-- identified by '密码' 省略之后密码默认为空

-- 创建用户时指定网段
create user '用户名'@'192.%.%.%' identified by '密码';
查看用户权限

语法:

show grants for '用户名'@'IP地址';

示例:

mysql> show grants for 'testUser';
+--------------------------------------+
| Grants for testUser@%                |
+--------------------------------------+
| GRANT USAGE ON *.* TO `testUser`@`%` |
+--------------------------------------+
-- 解释
-- USAGE:无权限
-- *.*  : 所有库.所有表
mysql> show grants for 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION
*************************** 2. row ***************************
Grants for root@localhost: GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `root`@`localhost` WITH GRANT OPTION
*************************** 3. row ***************************
Grants for root@localhost: GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
3 rows in set (0.00 sec)
-- 解释
-- WITH GRANT OPTION:表示这个用户拥有grant权限,即可以对其他用户授权
删除用户
  1. drop user '用户名'@'IP地址';
    -- drop user 'testUser'@'%';
    flush privileges;
    
  2. delete from mysql.user where user='用户名';
    flush privileges;
    
权限控制
授权
  1. 对已有用户收取

    语法1:grant 权限1,权限2..... on 数据库名.表名 to '用户'@'Ip地址';

    示例:

    -- 为testUser赋予db1库中的stu表的查询权限
    grant select on db1.stu for 'testUser'@'localhost';
    flush privileges;
    -- 为testUser@localhost用户赋予超级用户权限:
    grant all privileges on *.* for 'testUser'@'localhost' with grant option;
    flush privileges;
    

    说明:

    grant:授权
    all privileges:所有的权限
    on *.*:在哪个数据库的那个表
    to username@localhost:对哪个用户的哪个主机
    with grant option: 是不是 将username用户自己本身的权限赋给其他账户
    
回收

语法1:revoke 权限1,权限2..... on 数据库名.表名 from '用户'@'Ip地址';

示例:

revoke select on db1.stu from 'testUser'@'localhost';
flush privileges;

语法2:delete from mysql.user where user='用户名'; (直接回收登录权限)

事务

作为单个逻辑工作单元执行的一系列操作(对数据库的相关增删改查的操作),要么完全地执行,要么完全地不执行

mysql中使用事务时,必须使用innodb引擎(engine=innodb)

事务的特性

  • 原子性(Atomicity):事务必须是原子工作单元,一个事务中的所有语句,应该做到:要么全做,要么一个都不做;
  • 一致性(Consistency):让数据保持逻辑上的“合理性”,比如:小明给小红打10000块钱,既要让小明的账户减少10000,又要让小红的账户上增加10000块钱;
  • 隔离性(Isolation):如果多个事务同时并发执行,但每个事务就像各自独立执行一样。
  • 持久性(Durability):一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)。

事务开启提交回滚

  • 事务的开启:begin; start transaction;
  • 事务的提交:commit;
  • 事务的回滚:rollback;

autocommit设置

临时设置

mysql> set autocommit=0;
mysql> show variables like 'autocommit';
  +---------------+-------+
  | Variable_name | Value |
  +---------------+-------+
  | autocommit    | OFF   |
  +---------------+-------+
-- 解释 OFF(0):表示关闭 
--      ON (1):表示开启

永久设置

修改配置文件:vi /etc/my.cnf 在[mysqld]下面加上:autocommit=1 记得重启服务才会生效

视图

视图(view)是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的;可以展现基表(用来创建视图的表叫做基表base table)的部分或全部数据。

使用视图的大部分情况是为了保障数据安全性,提高查询效率。

创建

语法:

create view <视图名称> [(字段)] as select 语句;
create or replace view <视图名称> [(字段)] as select 语句;
-- [(字段)] 可选

修改

alter view <视图名称> [(字段)] as select 语句;
-- [(字段)] 可选

删除

drop view <视图名称> ;

优缺点

  • 优点
    • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
    • 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
    • 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
    • 不占用空间:视图是逻辑上的表,不占用内存空间
  • 缺点
    • 性能差:sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。
    • 修改限制:当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

触发器

触发器就是监视某种情况,并触发某种操作

新建语法:

create trigger 触发器名称 before/after insert/update/delete on 表名
for each row
begin
sql语句;
end;
-- 解释
-- after/before:可以设置为事件发生前或后
-- insert/update/delete:它们可以在执行insert、update或delete的过程中触发
-- for each row:每隔一行执行一次动作
-- sql语句中可以使用 `new` 来获取被监控表的触发监控的数据

删除语法:

drop trigger 触发器名称;

存储过程

存储过程就是把复杂的一系列操作,封装成一个过程

创建语法

create procedure 名称 (参数...)
begin
过程体;
过程体;
...
end

说明:

  • 参数

    格式:in|out|inout 参数名称 类型(长度)
    in:   表示调用者向过程传入值(传入值可以是字面量或变量)
    out:  表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)        
    inout:    既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
    
  • 声明变量

    declare 变量名 类型(长度) default 默认值;
    
  • 外部变量赋值

    set @变量名=值;
    
  • 调用

    call 名称(@变量名);
    

样例:

-- 定义mysql命令行结束符
delimiter //
-- 外部申明变量
create procedure queryTotal(in n int)
begin
select * from stu limit n;
end
//
-- 变量复制
set @n = 5//
-- 调用
call queryTotal(@n)//

----------------------------------------------------

-- 内部申明变量
create procedure queryTotal()
begin
declare n int default 5;
select * from stu limit n;
end
//
-- 调用
call queryTotal()//

删除语法

drop procedure 名称;

查看语法

show create procedure 名称\G

引擎

数据库引擎是数据库底层软件组件,不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用不同的数据库引擎,可以获得特定的功能

查看引擎

  • 查看所有引擎列表

    show engines;
    
  • 查看当前库所有表引擎

    show table status\G
    
  • 查看表引擎

    show create table 表名;
    
    

设置引擎

  • 默认设置

    修改mysql配置文件,[mysqld]下添加default-storage-engine=MyIsAM ,重启mysql服务。

  • 创建表指定引擎

    create table 表名 (...) engine='InnoDB';
    

修改引擎

  • 修改表引擎

    alter table 表名 engine = 'MyISAM';
    

引擎对比

引擎 是否支持外键 是否支持全文索引 是否支持事务 表的行记录 崩溃恢复
MyISAM 表级锁 保存 不好
InnoDB 不完全的行级锁 不保存

索引

索引是一个单独的,存储在磁盘中上的数据库结构,它们包含着对数据表里的所有记录的引用指针;使用索引可以快速的找出在某列或多列中有特定值的行

  • 优点
    • 可以加快数据的检索速度
    • 可以保证表数据的完整性与准确性
  • 缺点
    • 索引需要占用物理空间
    • 对表中的数据进行改动时,索引也需要跟着动态维护,降低了数据的维护速度

普通索引

允许出现相同的索引内容,允许空(null)值

  • 创建

    1. 建表创建

      create table teacher ( id int(7) zerofill auto_increment not null, name varchar(64) not null, age int(2) default null, create_time datetime, index (id)) default charset=utf8;
      
    2. 添加索引

      语法1:alter table 表名 add index [索引名称] (字段名称);

      -- 注意:语法1创建索引时如果未指定索引名称,则默认的索引名称就是字段名称
      alter table teacher add index index_create_time (create_time);
      

      语法2:create index 索引名称 on 表名 (字段名);

      create index index_create_time on teacher (create_time);
      
  • 删除

    语法1:alter table 表名 drop index 索引名称;

    alter table teacher drop index index_create_time;
    

    语法2:drop index 索引名称 on teacher;

    drop index i_c_t on teacher;
    
  • 查看

    语法1:show index from 表名\G

    语法2:show create table 表名\G

唯一索引

不允许出现相同的索引内容,允许空(null)值

  • 创建

    1. 建表创建

      create table stu ( id int(7) zerofill auto_increment not null, name varchar(64) not null, age int(2) default null, create_time datetime, unique (id)) default charset=utf8;
      
    2. 添加索引

      语法1:alter table 表名 add unique[索引名称] (字段名称);

      -- 注意:语法1创建索引时如果未指定索引名称,则默认的索引名称就是字段名称
      alter table stu add unique unique_create_time (create_time);
      
  • 删除

    语法1:alter table 表名 drop index 索引名称

    alter table 表名 drop index unique_create_time;
    

    语法2:drop index 索引名称 on stu;

    drop index unique_create_time on stu;
    
  • 查看

    语法1:show index from 表名\G

    语法2:show create table 表名\G

主键索引

一种特殊的唯一索引,不允许有空值;主键是表的某一列,这一列的值是用来标志表中的每一行数据;

注意:每一张表只能拥有一个主键

  • 创建

    1. 建表创建

      create table stu (id int(7) zerofill auto_increment not null, name varchar(64) not null, age int(2) default null, create_time datetime, primary key (id)) default charset=utf8;
      
    2. 添加索引

      语法1:alter table 表名 add primary key (字段名);

      alter table stu add primary key (id);
      
  • 删除

    语法1:alter table 表名 drop primary key;

    -- 删除主键之前必须先删除自增约束
    -- 每张表只有一个主键,删除时直接drop primary key即可
    alter table stu drop primary key;
    
  • 查看

    语法1:show index from 表名\G

    语法2:show create table 表名\G

全文索引

全文索引是将存储在数据库中的文章或者句子等任意内容信息查找出来的索引,单位是词

数据准备

-- 建表
 create table tfulltext(id int(7) unique auto_increment, wdesc varchar(256),fulltext (wdesc)) engine=InnoDB charset=utf8;
-- 数据
insert into tfulltext (wdesc) values
('he Apache Tomcat software is an open source implementation of the Java Servlet'),
('Java Servlet, JavaServer Pages, Java Expression'),
('Apache Tomcat software powers numerous large-scale, mission-critical web applications '),
('Add new attribute persistAuthentication to both StandardManager'),
('Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器'),
('诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet'),
('Full details of these changes, and all the other changes'),
('ength AJP secret will now behave as if it has not been specified'),
('is yes no not you me'),
('这样配置好了,即使以后从一台服务器移植到另一台服务器,不做任何修改也能运行起来');
  • 创建

    1. 建表创建

       create table tfulltext(id int(7) unique auto_increment, wdesc varchar(256),fulltext (wdesc)) engine=InnoDB charset=utf8;
      
    2. 添加索引

      语法:alter table 表名 add fulltext(字段名);

      alter table tfulltext add fulltext(wdesc);
      
  • 删除

    语法1:drop index 索引名称 on 表名

    drop index wdesc on tfulltext;
    

    语法2:alter table 表名 drop index 索引名称;

    alter table tfulltext drop index wdesc;
    
  • 查看

    语法1:show index from 表名\G

    语法2:show create table 表名\G

  • 查询语句

    语法:select * from 表名 where match (字段名) against ('查询条件')

    select * from tfulltext where match(wdesc) against ('Tomcat');
    select * from tfulltext where match(wdesc) against ('属于轻量级应用服务器');
    
  • in boolean mode 查询模式

    语法:select * from 表名 where match (字段名) against ('*查询条件' in boolean mode)

    -- 注意通配符*只能放在词的后面
    select * from tfulltext where match(wdesc) against ('tomca*' in boolean mode);
    select * from tfulltext where match(wdesc) against ('属于轻量级应*' in boolean mode);
    
  • 查看匹配度

    mysql> select id, match(wdesc) against ('Tomcat') as matching from tfulltext;
    +----+--------------------+
    | id | matching           |
    +----+--------------------+
    |  1 | 0.2734021842479706 |
    |  2 |                  0 |
    |  3 | 0.2734021842479706 |
    |  4 |                  0 |
    |  5 | 0.2734021842479706 |
    |  6 |                  0 |
    |  7 |                  0 |
    |  8 |                  0 |
    |  9 |                  0 |
    | 10 |                  0 |
    +----+--------------------+
    10 rows in set (0.00 sec)
    -- matching:匹配度,为0不出现
    
  • 停止词

    -- 出现频率很高的词,将会使全文索引失效
    is,no,not,you,me,yes,...
    
  • 注意

    • 一般情况下创建全文索引的字段数据类型为 char、varchar、text 。其它字段类型不可以
    • 全文索引不针对非常频繁的词做索引。比如is,no,not,you,me,yes这些,我们称之为停止词
    • 对英文检索时忽略大小写

外键索引

外键就是作用于两个表数据之间的链接的一列或多列,用来保证表与表之间的数据的完整性和准确性

  • 创建

    1. 建表创建

      CREATE TABLE t_stu (
        stu_id int(11) NOT NULL COMMENT '学生编号',
        stu_name varchar(50) DEFAULT NULL COMMENT '学生姓名',
        class_id varcher(50) DEFAULT NULL COMMENT '班级编号',
        primary key(stu_id),
        foreign key(stu_id) references t_class(class_id)
      ) engine=InnoDB default charset=utf8;
      
    2. 添加

      语法:alter table 表名 add foreign key(字段名) references 关联表名(关联表字段);

      alter table t_stu add foreign key(stu_id) references t_class(stu_id);
      
  • 删除

    注意:删除外键索引之前,必须要先删外键约束

    -- 删除外键约束语法
    -- alter table 表名 drop foreign key 约束名称;
    alter table employee drop foreign key employee_ibfk_1;
    

    语法1:drop index 索引名称 on 表名;

    语法2:alter table 表名 drop index 索引名称

  • 查看

    语法1:show index from 表名\G

    语法2:show create table 表名\G

  • 注意

    • 俩个表,主键跟外键的字段类型一定要相同
    • 要使用外键约束表的引擎一定得是InnoDB引擎,MyISAM是不起作用的
    • 在干掉外键索引之前必须先把外键约束删除,才能删除索引

组合索引

联合索引又称组合索引或者复合索引,是建立在俩列或者多列以上的索引

  • 创建

    1. 建表创建

      create table stu ( id int(7) zerofill auto_increment not null, name varchar(64) not null, age int(2) default null,scope int(3) default null, class_id varchar (64) default null, create_time datetime, primary (id), index(name, age, scope)) default charset=utf8;
      
    2. 添加索引

      语法1:alter table 表名 add index [索引名称] (字段1, 字段2, ...);

      -- 注意:语法1创建索引时如果未指定索引名称,则默认的索引名称就是字段名称
      alter table teacher add index name (name, age, scope);
      

      语法2:create index 索引名称 on 表名 (字段1, 字段2, ...);

      create index name on teacher (name, age, scope);
      
  • 删除

    语法1:alter table 表名 drop index 索引名称;

    alter table stu drop index name;
    

    语法2:drop index 索引名称 on teacher;

    drop index name on stu;
    
  • 查看

    语法1:show index from 表名\G

    语法2:show create table 表名\G

  • 最左原则

    联合索引是以创建联合索引最左字段为基础进入查询,如果查询条件中没有最左字段,则该联合索引失效

    -- 最左字段为 (name, age, scope) 的name字段
    create index name on teacher (name, age, scope);
    

索引注意事项

  • 索引并非越多越好,过多的索引会增加数据的维护速度还有磁盘空间的浪费。

sql优化

慢查询日志

临时设置

mysql服务重启后,慢查询设置恢复默认设置

  • 查看慢查询配置 show variables like '%slow%';

    mysql> show variables like '%slow%';
    +---------------------------+------------------------------------------------------+
    | Variable_name             | Value                                                |
    +---------------------------+------------------------------------------------------+
    | log_slow_admin_statements | OFF                                                  |
    | log_slow_extra            | OFF                                                  |
    | log_slow_slave_statements | OFF                                                  |
    | slow_launch_time          | 2                                                    |
    | slow_query_log            | OFF                                                  |
    | slow_query_log_file       | /usr/local/software/mysql/mysqldb/localhost-slow.log |
    +---------------------------+------------------------------------------------------+
    6 rows in set (0.00 sec)
    
    mysql>
    
  • 打开慢查询 set global slow_query_log = on;

  • 设置慢查询日志目录:set global slow_query_log_file = '/usr/local/software/mysql/mysqldb/localhost-slow.log';

  • 查看慢查询的时间临界值show variables like '%long%';

    mysql> show variables like '%long%';
    +----------------------------------------------------------+-----------+
    | Variable_name                                            | Value     |
    +----------------------------------------------------------+-----------+
    | long_query_time                                          | 10.000000 |
    | performance_schema_events_stages_history_long_size       | 1000      |
    | performance_schema_events_statements_history_long_size   | 1000      |
    | performance_schema_events_transactions_history_long_size | 1000      |
    | performance_schema_events_waits_history_long_size        | 1000      |
    +----------------------------------------------------------+-----------+
    5 rows in set (0.01 sec)
    
    mysql> 
    
  • 设置慢查询的时间标准 set long_query_time = 0.05

永久设置

## 修改配置文件/etc/my.cnf 添加
[mysqld]
slow_query_log = 1
long_query_time = 0.05
slow_query_log_file =/usr/local/software/mysql/mysqldb/localhost-slow.log
## 重启服务

explain

语法:explain 查询语句;

mysql> explain select * from stu\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: stu
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 14
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from stu where id = '1'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: stu
   partitions: NULL
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

mysql>

-- possible_keys 可能使用到的索引列表
-- key 查询使用的索引名称

性能分析

  • 查看性能详情配置 show variables like '%profiling%';

    mysql> show variables like '%profiling%';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | have_profiling         | YES   |
    | profiling              | OFF   |
    | profiling_history_size | 15    |
    +------------------------+-------+
    3 rows in set (0.00 sec)
    
    mysql>
    
  • 开启性能记录功能 set profiling = on

  • 查看性能的记录 show profiles;

    mysql> show profiles;
    +----------+------------+-----------------------------------------------------+
    | Query_ID | Duration   | Query                                               |
    +----------+------------+-----------------------------------------------------+
    |        1 | 0.05210575 | select * from stu                                   |
    |        2 | 0.00084050 | select * from stu where id = '1'                    |
    +----------+------------+-----------------------------------------------------+
    2 rows in set, 1 warning (0.00 sec)
    
    mysql>
    
  • 查看语句的执行性能详情 show profile for query Query_ID

    参考:https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html

    mysql> show profile for  query 1;
    +--------------------------------+----------+
    | Status                         | Duration |
    +--------------------------------+----------+
    | starting                       | 0.049974 |
    | Executing hook on transaction  | 0.000023 |
    | starting                       | 0.000018 |
    | checking permissions           | 0.000023 |
    | Opening tables                 | 0.000091 |
    | init                           | 0.001285 |
    | System lock                    | 0.000044 |
    | optimizing                     | 0.000019 |
    | statistics                     | 0.000053 |
    | preparing                      | 0.000034 |
    | executing                      | 0.000008 |
    | Sending data                   | 0.000245 |
    | end                            | 0.000013 |
    | query end                      | 0.000007 |
    | waiting for handler commit     | 0.000021 |
    | closing tables                 | 0.000025 |
    | freeing items                  | 0.000187 |
    | cleaning up                    | 0.000039 |
    +--------------------------------+----------+
    18 rows in set, 1 warning (0.11 sec)
    mysql>
    

mysqldump备份恢复

备份

语法:mysqldump -u 用户 -h host -p 密码 库名 表名> 路径

  1. 单库(无建库语句)

    mysqldump -uroot -proot -h139.224.101.91 db1 > /opt/mysqlback/db1.sql
    
  2. 单库(有建库语句)

    mysqldump -uroot -proot -h139.224.101.91 --databases db1 > /opt/mysqlback/db1-db.sql
    
  3. 单库单表

    mysqldump -uroot -proot -h139.224.101.91 db1 stu > /opt/mysqlback/db1-stu.sql
    
  4. 多库

    mysqldump -uroot -proot -h139.224.101.91 --database db1 db2 > /opt/mysqlback/db12.sql
    
  5. 全库

    mysqldump -uroot -proot -h139.224.101.91 --all-databases > /opt/mysqlback/all.sql
    

恢复

语法:mysql -u用户名 -p密码 -hIP地址 < 备份文件路径

mysql -uroot -proot -h139.224.101.91  < /opt/mysqlback/db1-db.sql

字符集

  • 查看数据库字符集

    mysql> show variables like 'character%';
    +--------------------------+---------------------------------------------------------+
    | Variable_name            | Value                                                   |
    +--------------------------+---------------------------------------------------------+
    | character_set_client     | gbk                                                     |
    | character_set_connection | gbk                                                     |
    | character_set_database   | utf8mb4                                                 |
    | character_set_filesystem | binary                                                  |
    | character_set_results    | gbk                                                     |
    | character_set_server     | utf8mb4                                                 |
    | character_set_system     | utf8                                                    |
    | character_sets_dir       | C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\ |
    +--------------------------+---------------------------------------------------------+
    8 rows in set, 1 warning (0.00 sec)
    mysql>
    
  • 字符集配置解释

    # 客户端字符集
    character_set_client #客户端请求数据的字符集
    character_set_connection #客户端与服务器连接的字符集
    character_set_results #返回给客户端的字符集(从数据库读取到的数据是什么编码的)
    
    # 服务端字符吉
    character_set_database #数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将默认使用配置上的字符集
    character_set_server #为服务器安装时指定的默认字符集设定。
    
    # 系统字符集
    character_set_system #系统字符集(修改不了的,就是utf8)
    character_sets_dir #mysql字符集文件的保存路径
    
  • 客户端字符集修改

    • 临时

      set names 字符集
      
    • 永久

      ## 配置文件中修改
      [client]
      default-character-set=gbk
      
  • 服务端字符集修改

    • 永久

      # 配置文件中修改,会作用于创建库表时默认字符集
      [mysqld]
      character_set_server=gbk
      
  • 库的字符集修改

    alter database 库名 default character set utf8;
    
  • 表字符集修改

    alter table 表名 default character set utf8;
    

你可能感兴趣的:(MySQL基础)