MySQL数据库

mySQL数据库

安装数据库就是在主机安装一个数据库管理系统(DBMS),这个管理系统可以管理多个数据库。

一个数据库中可以创建多个表,可以保存数据。

数据库管理系统,数据库,和表的关系。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkaKHEnv-1650011841996)(./img/mysql本质.png)]

SQL语句分类

DDL : 数据定义语句 {create}

DML : 数据操作语句 {insert updata delete}

DQL : 数据查询语句 { select}

DCL : 数据控制语句 { grand revoke}

一. 操作数据库

创建数据库

语法:

CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER SET 字符集] [COLLATE 校验规则]

  • IF NOT EXISTS 表示如果有数据库不会创建,如果不加重复创建报错.
  • CHARACTER SET 指定数据库采用的字符集,如果不指定默认为utf8.
  • COLLATE 指定数据库字符集的校对规则.
    • utf8_general_ci //不区分大小写
    • utf8_bin //区分大小写
  • 在创建数据库,表的时候,为了规避关键字,可以使用反引号解决。

删除数据库

语法:

DROP DATABASE [IF EXISTS] 数据库名

显示数据库语句

语法:

SHOW DATABASES //显示数据库语句

SHOW CREATE DATABASE 数据库名 //显示数据库创建时的创建语句。

数据库的备份和恢复

备份数据库可以在图像界面中备份也可以使用命令行执行备份命令。

备份数据库:

mysqldump -u 用户名 -p密码 -B 数据库1 数据库2 n> 保存路径文件名.sql

mysqldump -u 用户名 -p密码 数据库名 表名1 表名2 n> 保存路径文件名.sql

恢复数据库:

Source 文件名.sql

二. 操作表

创建表

语法:

CREATE TABLE 表名 ( 字段 数据类型 [UNSIGNED], 字段 数据类型 …… ) [CHARACTER SET 字符集] [COLLATE 校对规则] [engine 存储引擎]

  • CHARACTER SET 如果不指定,则为所在数据库的字符集
  • COLLATE 如果不指定,则为所在数据库的校对规则
  • UNSIGNED 是否是无符号数字,无符号数字没有负数

删除表

语法:

​ DROP TABLE 表名

修改表结构

添加列:

​ ALTER TABLE 表名 ADD( 列名 数据类型 [NOT NULL DEFAULT ‘默认值’] [AFTER 列名] );

  • NOT NULL DEFAULT 不允许为空,设置默认值
  • NOT NULL 不允许为空
  • AFTER 设置在指定列之后

修改列:

​ ALTER TABLE 表名 MODIFY 列名 数据类型 约束;

删除列:

​ ALTER TABLE 表名 DROP 列名;

查看表结构:

​ desc 表名;

修改表名:

RENAME TABLE 表名 TO 新表名;

修改字符集:

ALTER TABLE 表名 CHARACTER SET 字符集;

修改列名:

ALTER TABLE 表名 CHANGE 列名 新列名 数据类型 NOT NULL DEFAULT ‘默认值’;

数据库的CRUD语句

insert 插入语句

INSERT INTO 表名 [ (列名…… ) ] VALUES (值……)

  • 插入的数据应该与对应字段的数据类型相同,否则会报错。

  • 数据长度应该在列的规定范围内

  • 在values中添加的数据必须与被加入的列名排列顺序相对应。

  • 字符和日期型数据应该包含在单引号中。

  • 列可以插入空值的前提是这个字段允许为空。

  • 可以使用一个sql语句为多行赋值

    • INSERT INTO  表名  [ (列名…… ) ]   VALUES (值……)(值……)
      
  • 如果给表中的所有字段添加数据这可以不写前方列名

  • 默认值使用: 如果不给某个字段值时如果有默认值就会添加,否则会报错。

updata 修改数据

UPDATA 表名 SET 列名 = 值 [ WHERE 条件 ]

  • update语法用来更新表行中的值。
  • set 用来指定要修改的列与改成的值。
  • where 子句用于指定应该更新的语句符合的条件,如果不指定则更新所有语句。
  • 如果需要更新多个子句可以通过set 字段1 = 值1,字段2=值2……来改变。
delete 删除数据

DELETE FROM 表名 [ WHERE 条件 ]

  • 如果不使用where子句,将删除表中所有数据。
  • delete语句不能删除某一列的值,可以使用update将一列的值设置为null。
select 查询数据 —单表

SELECT [DISTINCT] *| 列名,列名…… FROM 表名

  • DISTINCT 可选, 去除重复语句(需要查询的所有字段都相同)

  • * 号表示查询所有列,也可以单独指定要查询的列。

  • FROM 指定要查询哪一张表。

  • select可以对查询的列进行运算。

    • select `name` , (1 +2 +3) from 表名;
      
  • 可以指定别名

    • select `name` as 别名, (1 +2 +3) as 别名 from 表名 表的别名;
      

加强后的写法:

select 显示元素 as 别名 from 表名 别名
group by 分组基准
having 排序条件
order by 排序基准 asc/desc 
limit startrows
select 查询数据 —多表

多表查询是基于两个或者两个以上的表查询,在实际应用中,查询单个表可能不能满足需求,需要同时查询多个表来完成需求。

在默认情况下两个表同时查询时:

select * from 表1,表2

  1. 从第一张表中取出一行和第二张表的每一行进行组合,返回结果。
  2. 返回的记录数是第一张表行数 * 第二张表的行数。
  3. 多表查询默认查询方式称为 笛卡尔集。
  4. 解决多表的关键就是写出正确的过滤条件

语法:

​ select * from 表1,表2 where 表1.字段 = 表2.字段

  • 多表查询的条件不能小于表数-1,否则会出现笛卡尔集。

自连接

将一张表当作两张表使用,设置别名,当作两张独立的表

自连接的特点:

  • 把同一张表当作两张表使用。
  • 需要给表取别名 : 表名 别名
  • 如果列名不明确可以指定列的别名: 列名 as 列的别名 或者 列名 列的别名
select * from 表 别名1,表 别名2
where 别名1.字段  = 别名2.字段
合并查询

合并多个select语句的结果,可以使用集合操作符号union,union all

  1. union all 该操作符用于取得两个结果集的并集,不会取消重复行
select 字段,字段 from 表名
union all
select 字段,字段 from 表名
  1. union 该操作与union all相似,但是会自动去掉结果集中的重复行
select 字段,字段 from 表名
union 
select 字段,字段 from 表名
子查询

子查询指嵌入到其他sql语句中的select语句,也叫嵌套子查询,分为单行子查询和多行子查询。

  • 单行子查询指只返回一行数据的子查询语句。
  • 多行子查询指返回多行数据的子查询,使用关键字 in。
  • 可以将子查询当作临时表使用。

子查询可以当作一张临时表使用。

select * from   
(select * from 表名) 临时表名  ,表名
where 临时表明.字段 = 表名.字段

多列子查询

select * from 表名
where (字段1,字段2) =select 对比字段1,对比字段2 from 表名
)

查询指定表中多个对比字段和字段相同的行

all any in

all 表示符合所有子查询中的条件。

any表示符合子查询中的一个就成立。

in 表示存在于

where 条件语句
  • 比较运算符

    • < > <= >= = <> !=

    • BETWEEN AND //显示在某一区间的值(闭区间)
    • IN(set列表) // 显示在列表中的值 例子: in(100,200)
    • LIKE ’ ‘ //模糊查询
    • NOT LIKE ’ ’
    • IS NULL 判断是否为空
  • 逻辑运算符

    • AND //多个条件同时成立
    • OR 多个条件任一成立
    • NOT 不成立
like 模糊查询

% 表示0个到多个字符,

_ 表示单个字符

group by 分组语句

group by 列 // 分组查询

select avg(1)max(1),列2 from 表名 group by2
//以列2为分组,将列2的每相同数据的对应列1处数据求平均值和最大值
  • group by 列1,列2 //分组的依据可以是多个
select * from 表名 group by1, 列2
//先以列1为分组基础,再以列2为分组基础

having 条件 //设置分组的条件

  • select * from 表名 group by1, 列2 
    having 条件
    //先以列1为分组基础,再以列2为分组基础
    
  • 过滤可以使用别名

分页查询

limit start , rows

  • 表示从start + 1行开始取,取到rows行,start从0开始计算

  • select * from 表名 limit 开始行-1 ,结束行
    
  • limit 每页显示的记录数 * (第几页 - 1) ,每页显示记录数

order by 排序子句

ORDER BY 列名 排序方式

  • order by 指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的别名
  • asc 升序排列(默认),desc 降序排列
  • order by子句应该在select语句得到结尾。
表复制(蠕虫复制)

为了对某个sql语句进行效率测试,需要使用海量数据时,可以使用表的复制得到海量数据。

将别的表的结构复制到指定表

create table 表名 like 指定表

将别的表内容复制到指定表

insert into 表名(字段,字段,字段)
	select 字段,字段,字段 from 表名

自我复制

//查询本表并将查询到的数据插入本表
insert into 表名
	select * from 表名

删除重复记录

  1. 创建一张临时表 ,该表的结构和原表相同。
  2. 将原表的记录通过distinct的关键字处理后,把记录复制到临时表。
  3. 清除原表所有记录,将临时表记录复制到原表,删除临时表。
//1.
create table 新表 like 原表;
//2.
insert into 新表 
	select distinct * from 原表;
//3.
delete from 原表
insert into 原表
	select * from新表
drop table 新表

外连接

  • 左外连接(如果左侧的表完全显示就是左外连接)
//如果左表和右表没有匹配的记录也会将左表显示出来
select 字段 from 左表 left join 右表 on 条件
  • 右外连接(如果右侧的表完全显示就是右外连接)
//如果左表和右表没有匹配的记录也会将右表显示出来
select 字段 from 左表 right join 右表 on 条件

函数

合计/统计函数

Count(*) |Count(列表) //Count 返回行的总数

  • Count(*)  //返回满足条件的记录的行数
    select Count(*) from 表名
    
  • Count()   //返回满足条件的列数,凡是会排除null
    select Count() from 表名
    

Sum (列 ) //返回指定列的总和

  • Sum()
    

Avg( 列 ) //返回指定列的平均值

  • select avg() from 表名
    

Max(列) //求指定列的最大值

  • select max() from 表名
    

Min(列) //求指定列的最小值

  • select min() from 表名
    
字符串相关函数
函数功能
charset(str)返回字符串字符集
concat(str,str)连接字符串
instr(str,substr)返回substr在str中出现的位置,没有返回0
ucase(str)转换为大写
lcase(str)转换为小写
left(str,lenght)从str的左面取lenght个字符
length(str)返回str的长度(按照字节)
replace(str,str1.str2)将str字符串中的str1使用str2替换
strcmp(str1,str2)逐个字符比较两个字符串的大小
substring(str,start,lenght)从str的start(从1开始)取得length个字符
ltrim(str)去除前方空格
rtrim(str)去除后方空格
trim(str)去除左右两端的空格
  • 函数可以嵌套使用
数学函数
函数功能
abs( num )绝对值
bin( num )十进制转二进制
ceiling(num)向上取整
floor(num)向下取整
format(num,保留小数位数)保留小数位数(四舍五入)
conv(num , 初始进制 , 输出进制)进制转换
hex(num)转换为十六进制
least(num.num……)求最小值
mod(num.num1)取余
rand() / rand(种子)每次返回随机数,添加种子返回相同的随机数 例子: rand(2)
日期相关函数
函数功能
current_date()当前日期
current_time()当前时间
current_timestamp当前时间戳
date_add(date,add_date)在指定日期上加上指定时间
date_sub(date,sub_date)在指定日期上减去指定时间
date(datetime)返回datetimede 日期部分
time(datetime)返回datetime的时间部分
datediff( date1,date2 )两个日期差(结果为天)
timediff(time1,time2)两个时间差(结果具体到时分秒)
now()当前日期加时间
year|month|date(datetime)年月日
unix_timestamp()返回1970-1-1到现在的秒数
form_unixtime(unixtime,%Y-%m-%d %H:%i:%s)将秒数转换为指定的日期格式
  • date_add( date ,interval 时间 单位 ) 单位可以是 year minute second day hour
加密函数
函数功能
user()返回 正在查询的用户 @ 地址
database()返回当前重在使用的数据库名字
MD5(str)为字符串算出一个MD5的32的字符串,常用(用户加密)
password()为字符串计算返回密码字符串返回41位字符串
流程控制函数

if(判断表达式 ,表达式1,表达式2 )

如果判断表达式结果为true则执行表达式1,否则执行表达式2

select if(name = null,name,'noName')

ifnull(表达式1,表达式2)

如果表达式1不为null返回表达式1,否则返回表达式2.

select ifnull(name.'noname')

case when 判断1 then 表达式1 when 判断2 then 表达式2 else 表达式3 end;

如果判断1成立则执行表达式1,如果判断2成立则执行表达式2,都不成立返回else后表达式

mysql约束

primary key (主键)
字段名 字段类型 primary key

用于唯一的表示表行的数据,当定义逐渐约束后,该列不能重复

  • primary key 不能重复而且不能为null

  • 一张表最多只能有一个主键但是可以复合主键,复合主键必须复合主键中的多个字段同时相同才不能加入。

    • //复合主键
      create table 表名(
      	id int ,
        	'name' varchar(32),
        	primary key(id,'name')
      )
      
  • 主键的指定方式有两种:

    • 直接在字段名后定义: 字段名 primary key
    • 在表定义最后写primary key(列名);
  • 使用desc表名可以看到primary key的情况。

not null (非空)

如果在列上定义了not null ,那么当插入数据时,必须为列提供数据。

字段 字段类型 not null
unique (唯一)

定义唯一约束后,该列值不可重复。

字段 类型 unique
  • 如果没有指定not null,则unique字段可以有多个null
  • 一张表可以有多个unique字段
foreign key (外键)

用于定义主表和从表之间的关系,外键约束要定义在从表上,主表则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或者为null。

//foreign key 本表字段名 references 主表名(主键名或unique字段名)

create table 本表(
	字段1 类型 ,
  foreign key (字段1) references 主表名(主表非重复字段)
)
  • 外键指向的表的字段,要求时primary key或者是unique
  • 表的类型是innodb,这样的表才支持外键。
  • 外键字段的类型要和主键字段的类型一致(长度可以不同)
  • 外键字段的值,必须在主键字段中出现过,或者为null(前提是外键字段允许为null)
  • 一旦建立主外键的关系,数据不能随意删除了。
check

用于强制行数据必须满足的条件,假定在sal列上定义check约束,并要求sal列值在1000 ~ 2000之间,如果不在就会提示出错。

  • oracle和sql server均支持check,但是mysql5.7不支持check,只是做语法的校验,不会生效。
字段 字段类型 check ( 字段 in(  ) )
字段 字段类型 check ( 字段 > 1000 and 字段 < 2000 )

自增长

使一个字段不赋值或者赋予null实现自增长

字段 类型 primary key auto_increment //设置自增长

自增长赋值方法:

  1. insert into 表名(字段1,字段2……) values(null,‘值’……)
  2. insert into 表名(字段2……) values(‘值2’……)
  3. insert into 表名 values(null,‘值1’……) //理论上这种写法错误,但是指定自增长之后系统会自动为自增长赋值null。
  • 自增长是和primary key 配合使用的。
  • 自增长的列需要被指定唯一性才会生效,所以要unique或者主键配合使用。
  • 自增长修饰的字段为整数型(小数型也可以使用)。
  • 自增长默认从1开始,可以通过如下命令修改:
    • alter table 表名 auto_increment = xxx;
  • 如果添加数据时为自增长字段指定有值,则以指定的值为准。以后自增长以本次指定值开始。
create table 表名(
	id int primary key auto_increment,
	name varchar(10)
)

insert into lzy values(
	null,'姓名'    //需要在自增长的列指定null,或者不知道值
)

mysql常用数据类型

Mysql列类型

  • 数值类型
    • 整型
      • tinyint [1个字节]
      • smallint [2个字节]
      • mediumint [3个字节]
      • int [4个字节]
      • bigint [8个字节]
    • 小数类型
      • float [单精度 4个字节]
      • double [双精度 8个字节]
      • decimal [M,D] 大小不确定
        • 可以支持更加精确的小数位,M是数字位数(精度)的总数,D是小数点(标度)后面是位数。
        • 如果D为0,则值没有小数点或者分数部分,M最大65,D最大30,如果D被省略默认为0,如果M被省略默认为10.
        • 可以将decimal的小数精度设为0,存储整数类型。
  • 文本类型
    • char [0 - 255]
    • varchar [0 - 65535]
    • text [0 - 2^32-1]
    • mediumtext [0 - 2^24-1]
    • longtext [0 - 2^32-1]
  • 二进制数据类型
    • blob [0 - 2^16-1]
    • longblob [0 - 2^32-1]
  • 日期类型 //日期类型也可以直接比较大小
    • data [日期 年 月 日]
    • time [时 分 秒]
    • datetime [年月日 时分秒 YYYY-MM-DD HH-mm-ss]
    • year [年]
    • timestamp [时间戳]
      • NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 自动写入当前事件
  • 位类型
    • bit (m) [m的范围为 1 - 64]
      • 查询时可以直接查询大小

字符串类型:

​ CHAR(size)

  • 固定字符长度字符串最大为255字符

  • 不管是中文还是字母都算作一个字符。

  • CHAR类型会占用分配的所有空间,有可能浪费空间。

  • CHAR的查询速度比较快。

    ​ VARCHAR(size)

  • 可变长度字符串,size最大为65535字节去除保留大小除以编码所得到的字节数,会保留三个字节存储大小,剩下能存储的字符数按照编码不同会发生改变。

  • CHAR(size)和VARCHAR(size)的size都表示能存放的字符数,但是最大存储一个是固定255,一个是根据编码方式变化的。

  • VARCHAR 会占有实际需要的空间。(内容的实际大小 + 存放长度)

三. 索引

对字段建立索引可以提升对该字段的查询速度。

  • 没有使用索引,查询时会全表扫描比较慢。
  • 使用索引会形成一个数据结构,加快查找的速度。
  • 使用索引会增大磁盘的占用用来维护数据结构。
  • 使用索引会对(update,delete,insert)语句的执行效率产生影响。(维护数据结构)
索引类型
  • 主键索引,主键自动称为主键索引(primary)
  • 唯一索引,定义字段为唯一字段时自动为唯一索引 (unique)
  • 普通索引 (index)
  • 全文索引(fulltext)

查询表中是否有索引

​ show index from 表名

索引创建规则

  • 较为频繁的作为查询条件的字段应该创建索引。
  • 唯一性太差的字段不适合单独创建索引,即使频繁作为查询的条件。
  • 更新非常频繁的字段不适合创建索引。
  • 不会出现在where子句中的字段不该创建索引。
查询索引

语法:

  • show index from 表名
  • show indexes from 表名
  • show keys from 表名
  • desc 表名
添加唯一索引

如果列的值不会重复使用唯一索引

语法:

create table 表名( 字段名 字段类型 unique);//在创建表时为字段定义unique约束将自动创建唯一索引

create unique index 索引名 on 表名(列名) ;

添加普通索引

语法:

create index 索引名 on 表名(列名) ;

alter table 表名 add index 索引名 列名;

添加主键索引

语法:

create table 表名( 字段名 字段类型 primary key);//在创建表时为字段定义主键约束将自动创建主键索引

alter table 表名 add primary key (列名)

删除索引

语法:

删除普通索引与唯一索引:

drop index 索引名 on 表名

删除主键索引

alter table 表名 drop primary key

修改索引
  1. 删除旧的索引
  2. 添加新的索引

开启mysql服务:net start mysql

关闭mysql服务: net stop mysql

用命令行连接数据库指令:

mysql -h 主机Ip -P 端口 -u 用户名 -p密码

  • -p和密码之间不要有空格
  • -p后没有写密码,回车会要求输入密码
  • 如果-h没有指定,默认为本机
  • 如果没有指定-P端口,默认为3306

退出mysql指令:

quit

四. 事务

事物用于保证数据的一致性,它是由一组相关的dml语句组成,改组dml语句要么全部成功要么全部失败。

当执行事物操作时,mysql会在表上添加锁,防止其他用户修改表的数据。

  • start transaction --开始一个事务
  • savepoint 存档名 – 存档点名
  • rollback to 存档名 – 回退事务
  • rollback --回退所有事务
  • commit --提交事务,所有操作生效,不能回退
    • 当执行了conmmit提交事务语句后,回确认事务的变化,结束事务,删除保存点,释放锁,数据生效,当使用commit语句结束事务之后没其他会话将可以查到事务变化后的新数据。
  • 如果不开始事务,默认情况下dml操作时自动提交的,不能回滚。
  • 如果开始一个事务,没有设置保存点,可以执行rollback语句,默认时回退到事务开始的状态。(开始一个事务时回默认生成一个存档点)
  • 可以在这个事务没有提交时创建多个保存点。
  • 可以在事务没有提交前,创建多个存档点,选择回退到指定存档点。
  • mysql的事务机制需要innodb的存储引擎才可以使用,myisam不能使用。
  • 开始一个事务 start transation,set autocommit=off;

五. 隔离级别

多个连接开启各自的事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。

如果不考虑隔离级别,可能回引发以下问题:

  • 脏读
  • 不可重复读
  • 幻读

查看事务隔离级别:

  • 脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
  • 不可重复读(nonrepeatable read): 同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。
  • 幻读(phantom read): 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,发生幻读。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibG0aZpO-1650011841998)(./img/隔离级别.png)]

事务隔离级别相关操作:

select @@tx_isolation //查看当前会话隔离级别。

select @@global.tx_isolation; //查看系统当前隔离级别。

set session transaction isolation level 隔离级别 //设置会话隔离级别。

set global transaction isolation level repeatable read; //设置系统当前隔离级别。

mysql默认级别为可重复读(repeatable read),一般情况下,没有特殊要求,没有必要修改。

事务的acid特性

  1. 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  2. 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  3. 隔离性(Isolation) 事务的隔离性使多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间需要相互隔离。
  4. 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何的影响。

六. mysql表类型和存储引擎

基本介绍

  1. mysql的表类型由存储引擎(Storage Emhines)决定,主要包括MyISAM,innoDB,Memory等。
  2. MySQL数据表主要支持六种类型,分别是:CSV,Memory,ARCHIVE,MRG_MYISAM,MYISAM,innoBDB.
  3. 这六种又分为两类:
    • ‘事务安全型’:InnoDB
    • ‘非事务安全型’ :CSV,Memory,ARCHIVE,MRG_MYISAM,MYISAM

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8bV4X450-1650011841999)(./img/存储引擎.png)]

  • MyISAM不支持事务,也不支持外键,但其访问速度快,对事务完整性没有要求。
  • InnoDB存储引擎提供了具有提交,回滚和崩溃恢复能力的事务安全,但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
  • MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件,MEMORY类型的表访问速度非常快,因为数据是放在内存中的,并且默认使用哈希索引,但是一旦服务关闭,表中的数据就会全部丢失,但是表结构还在。
    • 如果不需要事务,处理只是使用最基本的CRUD操作,使用MyISAM速度比较快。
    • 如果需要支持事务则使用InnoBD。
    • Memory存储引擎就是将数据存储在内存中,由于没有磁盘的IO等待,速度比较快,但是由于是内存存储引擎,所作的任何修改在服务器重启后都将消失。

更改引擎:

alter table 表名 engine = 引擎名

视图(view)

视图就是一个虚拟的表,其内容来自于查询定义,同真实的表一样,视图包含列,其数据来自与对应的真是表(基表)。

  • 视图是根据创建的表(可以是多个)映射而来虚拟的表。
  • 视图也有列,数据来自于基表。
  • 通过视图可以修改基表的数据。
  • 基表的改变会影响到视图的数据。

视图的基本使用

create view 视图名 as select语句 //创建新的视图

updata 视图名 set 修改数据 where 条件

alter view 视图名 as select语句 //替换视图

show create view 视图名 //显示创建视图的命令

drop view 视图名 //删除视图

  • 创建视图后,数据库中,只有对应视图的一个视图结构文件(视图名.frm)
  • 视图的数据变化会影响到基表,对基表的操作也会影响到视图。
  • 视图中可以再次使用视图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rpoeKLVj-1650011841999)(./img/结构文件和数据文件.png)]

视图的优点

  • 安全。一些数据表有着重要的信息,有些字段是保密的,不能让用户直接看到,这时就创建了一个视图,在视图中只保留一部分字段,用户就可以查询自己需要的字段,不能差点看保密的字段。
  • 性能。关系数据库的数据常常会分表存储,使用外键建立这些表之间的关系,这是数据库查询通常会使用到连接,使用连接比较麻烦,效率也相对比较低,可以建立一个视图,将相关的字段和表组合在一起,就可以避免使用join查询数据。
  • 灵活。如果系统中有一张旧的表,这张表由于设计问题即将废弃,然而很多应用都是基于这张表,不易修改,这是就可以建立一个视图,视图中的数据直接映射到新建的表中,这样就可以做很少的改动,也达到了升级数据表的目的。

mysql管理

mysql用户

mysql中的用户,都存储在系统数据库的mysql中user表中。

user表重要字段说明:

  1. host: 允许登录的‘位置’,localhost表示该用户只允许在本机登录,也可以指定登陆地址。
  2. user: 用户名
  3. authentication_string: 密码,不是明文,是使用mysql的password()函数加密之后的密码。
创建用户:

create user ‘用户名’ @ ‘允许登录的位置’ identified by ‘密码’ //创建用户同时指定密码

删除用户

drop user ‘用户名’ @ ‘允许登录的位置’

用户修改密码

修改自己的密码:

set password = password(‘密码’)

修改他人的密码(需要修改的用户密码的权限)

set password for ‘用户名’ @ ‘允许登录的位置’ = password(‘密码’);

用户权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7rLf85j8-1650011842000)(./img/用户权限.png)]

赋予权限:

grant 权限列表 on 库.对象名 to ‘用户名’ @ ‘ 登录位置’ [ identified by ‘密码’ ]

  • 多个权限使用逗号分隔。
    • grant select on ……
    • grant select,delete,create on ……
    • grant all [privileges] on ……
  • 特别说明
    • *. * 表示所有库的所有表。
    • 库.* 表示某个数据库中的所有数据对象(表,视图,存储过程)
  • identified by ‘密码’ 可以省略,也可以写出。
    • 如果用户存在就是在修改该用户的密码。
    • 如果该用户不存在,就是在创建该用户。
  • 增加权限时使用的还是赋予权限语句。
  • 在创建用户的时候,如果不指定host,则为% ,表示所有ip都能连接权限。 create user xxxxx
  • create user ‘xxx’@‘192.168.1.%’ 表示xxxx用户在 192.168.1.*的ip可以登录mysql。
  • 在删除用户的时候,如果host不是%,需要明确指定 ‘用户’@’host值‘

撤销权限:

revoke 权限列表 on 库.对象名 from ‘用户名’@‘登录位置’

权限生效指令:

如果权限没有生效,可以执行下面的命令。

基本语法: FLUSH PRIVILEGES

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值