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 start,rows
select 查询数据 —多表
多表查询是基于两个或者两个以上的表查询,在实际应用中,查询单个表可能不能满足需求,需要同时查询多个表来完成需求。
在默认情况下两个表同时查询时:
select * from 表1,表2
- 从第一张表中取出一行和第二张表的每一行进行组合,返回结果。
- 返回的记录数是第一张表行数 * 第二张表的行数。
- 多表查询默认查询方式称为 笛卡尔集。
- 解决多表的关键就是写出正确的过滤条件。
语法:
select * from 表1,表2 where 表1.字段 = 表2.字段
- 多表查询的条件不能小于表数-1,否则会出现笛卡尔集。
自连接
将一张表当作两张表使用,设置别名,当作两张独立的表
自连接的特点:
- 把同一张表当作两张表使用。
- 需要给表取别名 : 表名 别名
- 如果列名不明确可以指定列的别名:
列名 as 列的别名
或者列名 列的别名
select * from 表 别名1,表 别名2 where 别名1.字段 = 别名2.字段
合并查询
合并多个select语句的结果,可以使用集合操作符号union,union all
- union all 该操作符用于取得两个结果集的并集,不会取消重复行
select 字段,字段 from 表名 union all select 字段,字段 from 表名
- 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 条件语句
like 模糊查询
% 表示0个到多个字符,
_ 表示单个字符
group by 分组语句
group by 列 // 分组查询
select avg(列1),max(列1),列2 from 表名 group by 列2 //以列2为分组,将列2的每相同数据的对应列1处数据求平均值和最大值
- group by 列1,列2 //分组的依据可以是多个
select * from 表名 group by 列1, 列2 //先以列1为分组基础,再以列2为分组基础
having 条件 //设置分组的条件
select * from 表名 group by 列1, 列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 表名
删除重复记录
- 创建一张临时表 ,该表的结构和原表相同。
- 将原表的记录通过distinct的关键字处理后,把记录复制到临时表。
- 清除原表所有记录,将临时表记录复制到原表,删除临时表。
//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 //设置自增长
自增长赋值方法:
- insert into 表名(字段1,字段2……) values(null,‘值’……)
- insert into 表名(字段2……) values(‘值2’……)
- 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
修改索引
- 删除旧的索引
- 添加新的索引
开启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特性
- 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另一个一致性状态。
- 隔离性(Isolation) 事务的隔离性使多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间需要相互隔离。
- 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何的影响。
六. mysql表类型和存储引擎
基本介绍
- mysql的表类型由存储引擎(Storage Emhines)决定,主要包括MyISAM,innoDB,Memory等。
- MySQL数据表主要支持六种类型,分别是:CSV,Memory,ARCHIVE,MRG_MYISAM,MYISAM,innoBDB.
- 这六种又分为两类:
- ‘事务安全型’: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表重要字段说明:
- host: 允许登录的‘位置’,localhost表示该用户只允许在本机登录,也可以指定登陆地址。
- user: 用户名
- 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