一、操作数
- mysql中,操作数可以是:数、列、函数、表达式、null等。
- 在mysql中 非0且非NULL都是true。
- null只有(注意是只有。如:null+1等结果都是null)在以下表达式中才有可能使表达式值为true:
is not null
is nul
<==>:当符号两端都不为NULL时,等同’=’;当一边为null,一边非null时,结果为0(null);两边都是null时,结果为1(true)
二、函数
字符串处理函数
名称 | 示例 | 示例结果 | 描述 |
---|---|---|---|
left | left(‘12345’,3) | ‘123’ | 从给定字符串左边取指定长度的子串 |
right | right(‘12345’,3) | ‘345’ | 从给定字符串右边取指定长度的子串 |
length | length(‘12345’) | 3 | 给定字符串占用的字节数 |
lower | lower(‘abCDEF’) | ‘abcdef’ | 将给定字符串转换为小写 |
upper | upper(‘abCDEF’) | ‘ABCDEF’ | 将给定字符串转换为大写 |
ltrim | ltrim(’ abc’) | ‘abc’ | 剔除字符串左边空格 |
rtrim | rtrim('abc ') | ‘abc’ | 剔除字符串右边空格 |
substring | substring(‘123456’,3,2) | ‘34’ | 截取字符串某部分 |
concat | concat(‘ab’,‘cd’,‘ef’) | ‘abcdef’ | 将若干个字符串按顺序合为一个 |
char_length | char_length(‘张三’) | 2 | 测出给定字符串的字符数 |
运用例子:
select concat('用户名是',姓名) as 姓名 from 用户;/*姓名列的值都是'用户名'+姓名列对应行的值*/
流程控制表达式与函数
流程表达式:
case表达式第一种写法:
case when 比较 then 结果 [else 默认结果] end:
select score,case when score>80 then '优秀' when scroe<60 then '不及格' else '及格' end as ShuiPing from student_score;
/*查询学生成绩,并将成绩分为及格与不及格。两列,一列为score,一列为ShuiPing*/
第二种写法:
case 带比较表达式 when 表达式1 then 结果1 [else 默认结果] end;
select case score when 80 then '得分80' else '得分不为80' end as is80 from student_score;
函数:
if(表达式1,表达式2,表达式3):当表达式1为true时,返回表达式2,否则返回表达式3.
ifnull(表达式1,表达式2)表达式1为null时返回表达式2,否则返回表达式1.
nullif(表达式1,表达式2)表达式1与表达式2的值相同时,返回null,否则返回表达式1.
汇总函数
针对于某一组。
max(表达式):求最大值。
min(表达式):求最小值.
sum(表达式):求和.
avg(表达式):求平均值。
count(表达式):从匹配结果中统计非NULL的表达式代表对象的数量。用它时,只会显示一个记录,若其他列有多个记录,也只会显示一个记录.如果只是想直到一个表中有多少个记录,可以用selcet count(1) from 表名;
三、隐式转换
只要某个表达式的类型与上下文要求的类型不符,mysql就会根据上下文环境的类型对该表达式进行类型转换。
1+'4'->5(double类型)
'1'+'4'->5(double类型)
'11abc'->11(double类型)/*截断现象*/
'abc11'->0(double类型)
where '2f'->where 2(double类型)
1>'a'=1>0=true
concat(1,2)->'12'
concat(1,'2')->'12'
在插入数据时不能发生截断现象。
四、列的属性
主键
主键:通过该键可以找到唯一的记录。主键列不能重复。主键列默认具有NOT NULL 属性。一个表必有且仅有一个主键。如果我们没有声明主键列或组合,mysql会将第一个具有not null和unique属性的列作为主键。
/*可以在创建表时,在列的类型后面加上 primary key;*/
create table if not exists 用户(
姓名 varchar(20),
电话 varchar(20) primary key,
性别 enum('男','女'),
爱好 set('跳舞','游戏','学习')
)comment '存储用户信息的表';
/*也可以把主键单独声明*/
create table if not exists 用户(
姓名 varchar(20),
电话 varchar(20),
性别 enum('男','女'),
爱好 set('跳舞','游戏','学习'),
primary key(电话[,××])
)comment '存储用户信息的表';
/*对于多个列组合作为主键的情况,需采取第二种情况,在"电话"后加上逗号,再加组合列.*/
unique键
该键可以约束某列或某列的组合的值是唯一的。一个表可以有多个unique列。允许重复存放NULL。
/*可以在创建表时,在列的类型后面加上 unique key;*/
create table if not exists 用户(
姓名 varchar(20),
电话 varchar(20) unique [key],
性别 enum('男','女'),
爱好 set('跳舞','游戏','学习')
)comment '存储用户信息的表';
/*也可以把键单独声明*/
create table if not exists 用户(
姓名 varchar(20),
电话 varchar(20),
性别 enum('男','女'),
爱好 set('跳舞','游戏','学习'),
unique [key] [自定义约束名称] (电话[,××])
)comment '存储用户信息的表';
约束:Mysql中一种规则,如主键,unique。
每一个约束都可以有一个名字,这个名字为约束名称。如:主键的约束名称是primary,它是mysql默认且无法改的。但unique允许我们自定义约束名称.
/*对于多个列组合,需采取第二种情况,在"电话"后加上逗号,再加组合列.*/
外键
- 如果某一列与另一个表中的某一列用外键关联起来,则在保证该列的值唯一的同时,也保证该列的值在另一个表中所关联列的值存在。如:成绩表中的学号必须在信息表中存在。
- 如果A表中的某个列或某些列依赖于B表中的某个列或者某些列,那么就称A表为父表,B表为子表.
- 子表和父表可以用外键关联起来。
/*可以在创建表时,在列的类型后面加上 primary key;*/
create table if not exists 用户(
姓名 varchar(20),
电话 varchar(20),
性别 enum('男','女'),
爱好 set('跳舞','游戏','学习'),
constraint foreign key(姓名) references 另一表名(姓名)
)comment '存储用户信息的表';
自增
- 在整型或浮点型类型后加上 auto_increment。当加入字段时,列值默认较上一字段加一。
- 一个表最多有一个自增属性的列。
列注释
create table if not exists 用户(
姓名 varchar(20) comment '存储用户名',
电话 varchar(20) comment '存储电话号码',
性别 enum('男','女'),
爱好 set('跳舞','游戏','学习'),
)comment '存储用户信息的表';
前补0
- 当列的属性有 zerofill 时,会默认将宽度设置为10,不够则前补0
- 声明属性zerofill 时,会自动声明unsigned属性h
create table if not exists 测试(
shuzi int(6) zerofill default 4;
);
然后
select * from 测试;
会发现 他的值时 000004
五、分组
- 分组查询时会把相同的去重。
- 与where的区别是,where针对所有的记录,优先级比分组高。即:先通过where条件筛选出结 果,再从结果中分组.
- having 用来过滤组,在分组后起效;where用来过滤记录,在分组前起效。
select subject,avg(score)as '平均分' from student_score group by subject;
通过学科来分组,假设数据库中仅有语文和数学两学科,那么这个查询会显示两列,一列是subject,一列是平均分。
若subject有100个不重复的值,当我们只需要语文和数学时可以这样写:
select subject,avg(score)as '平均分' from student_score group by subject having subject in ('语文','数学');
当然也可以以多个列进行分组:
select subject,sex,avg(score)as '平均分' from student_score group by subject,sex;
/*3列,四记录,数学、语文学科与男女平均分的笛卡尔积。*/
六、查询规范
select [distinct] 列 from 表名 [where] [group by] [having] [order by] [limit];
七、数据库操作
前言
数据库:一些表的集合。
基操
show databases;/*展示当前服务器有哪些数据库*/
create database if not exists 数据库名;/*创建一个数据库*/
show warnings;/*用来展示异常*/
use 数据库名;/*在某客户端中,切换默认操作的数据库,再次登录失效*/
drop database if exists 数据库名;/*删除一个数据库*/
八、表的操作
查看数据库中的表
show tables from 数据库名;/*展示某个数据库中所有表*/
show tables;/*展示默认数据库中的所有表*/
建表
建表时必须要有字段。
在创建一个表时,至少要完成以下结构:
create table if not exists 表名(列名1 类型 [列的属性],列名2 类型 [列的属性]……)[comment '注释'];
其中列的属性可以没有,comment也可以没有,comment后跟注释,以方便告诉这个表是干什么的。
表名和列名还可以用反引号修饰:
create table if not exists `表名`(`列名1` 类型 [列的属性],`列名2` 类型 [列的属性]……);
一个例子:
create table if not exists 用户(
姓名 varchar(20),
电话 varchar(20),
性别 enum('男','女'),
爱好 set('跳舞','游戏','学习')
)comment '存储用户信息的表';
/*创建了一个名称为用户的表,其中,有4列(字段)*/```
删表
drop table if exists 表名;/*删除一个表*/
查看表结构
describe 表名;
desc 表名;
explain 表名;
show columns from 表名;
show fields from 表名;
show create table 表名 \G;/*查看创建该表的语句,搭配\G效果更好*/
/*使用上述任意一条语句即可产看表的结构*/
show create table 数据库名.表名 \G;/*用于查看默认数据库外的数据库中的表*/
注意:没有这一语句:show table 表名;
修改表
alter table 表名 rename to 新表名;/*更改表名*/
rename table 表1名 to 新表1名,表2名 to 新表2名……;/*使用该语句可以一次性改多个表的表名*/
/*若加上数据库名,则会把该表删除,并移动到数据库中,以新的名字作为数据库中的表.
如:*/
alter table 表名 rename to 数据库名.新表名;
rename table 表1名 to 数据库1名.新表1名,表2名 to 数据库2名.新表2名……;
alter table 表名 add column 列名 类型 [列的属性];/*增加列,使其称为最后一列*/
alter table 表名 add column 列名 类型 [列的属性] first;/*增加列,并添加到第一列*/
alter table 表名 add column A列名 类型 [列的属性] after B列名;/*增加列,并添加到B列后*/
alter table 表名 modify 列名 类型 属性 first;/*将某列设置为第一列*/
alter table 表名 modify A列名 类型 属性 after B列名;/*将A列的位置设置到B列的后面*/
/*如果对一个表由多个操作,可以写成alter table 表名 操作1,操作2……*/
查记录
- 过于简单,select到底.……
结果集中列的别名:
select 姓名 [as 用户的名字] from 用户;/*起别名*/
select 姓名 用户的名字 from 用户;/*原名和别名之间可以省略as,但要加上空格*/
如果这样来查姓名列,显示结果时,会把结果的列名由姓名改为用户的名字,本次有效。
结果集去重:
select distinct 姓名 from 用户;/*返回单列去重结果集*/
select distinct A列名,B列名…… from 表名;/*返回多列去重的结果集,多列去重:如在A列中字段w与A列中字段e重复,且w对应的B列中的值x也在B列中与e对应的B列值重复*/
如:
专业 学院号
软工 1
计科 1
软工 2
软工 1
双列去重后:
专业 学院号
软工 1
计科 1
软工 2
限制结果集中记录数量:
select 姓名 from 用户 limit 4;/*可以通过limit来限制结果集中记录的个数,这个例子返回的结果集中仅有4个记录*/
结果集排序:
/*order命令使用在limit命令之后*/
select 得分 from 用户 order by 得分 [asc|desc];/*返回的结果集是以得分的升序或降序排列的,asc升序,desc降序。用order by默认升序*/
select 得分,进球数 from 用户 order by 得分 desc,进球数 [asc];
select * from 用户 order by 列名 [asc|desc],列名 [asc|desc],列名 [asc|desc]……
需要注意的语句:
select 得分+10 新得分 from 表名;
/*得分+10是一个表达式,列名和表达式都是操作数。这个例子会返回的列是得分都加10后的列,并且名字为新得分*/
where查记录
where true|false
为true则将查询的结果放入结果集。否则不放。
这个true|false通常是表达式返回的值。如:where 得分=10,将每列的值为10的记录加入结果集.
在mysql中 非0且非NULL都是true。
select 得分 from 用户 where 条件;
条件可以是:
比较运算符:
<>等同于'!='
其他不再啰嗦.
匹配运算符:
a in(x1,x2,x3)/*a是x1,x2,x3的任一个*/
a not in(x1,x2,x3)/*a不是x1,x2,x3的任一个*/
a is null/*a为空*/
a is not null/*a不为空*/
select 得分 from 用户 where 得分 is not null;/*返回得分列有值的记录*/
and运算符:连接俩条件.
or运算符/*and运算符优先级高于or运算符*/
通配符(不能通配到NULL):
/*如果待匹配的对象本身就有%或_,则要加上'\'
select 用户名 from 用户 where 用户名 like '\%%';
匹配所有以%开头的记录.*/
%:代表任意数量的字符,包括0个字符 。
_:代表任意一个字符。
这条语句可以匹配到用户名为 '小'、'小红'、'小刚'、'小哥哥'、'小姐姐'
select 用户名 from 用户 where 用户名 like '小%';
而这条语句只能匹配到 '小红'、'小刚'
select 用户名 from 用户 where 用户名 like '小_';
插记录
insert into 表名(列名,列名……) values(值,值);/*向表中插入一条记录.列为待插入数据的列,列与值相对,列可以不完全,没声明的数据为NULL*/
insert into 表(值,值);/*插入一条记录,这种方式需要按顺序插满*/
insert into 表名(列名,列名……) values(值,值),(列名,列名……) values(值,值),(列名,列名……) values(值,值);/*以这样的形式批量插入*/
/*对于set这种可以插入许多特定值的列,可以这样插入'值1,值2',注意只有两个单引号.*/
在向unique键等插入数据时,若不知道是否重复,可用 insert ignore 前缀来修饰插入语句。
insert ignore insert into 表名……;
当插入的数据时,若主键或unique或列组合等唯一键存在重复时,则不插入(而不是报错)。
如果存在重复,我们又想更新它们的值,则要用
insert ignore …… on duplicate key update 新值.
insert ignore insert into students(id,name) values(100,'小红') on duplicate key update id=101,name='小红';
更新记录
update 表名 set 列1=值1,列2=值2……[where 表达式];
删记录
delete from 表名 [where 表达式];
不加where会删除该表中所有数据.
九、子查询
子查询:一条查询语句中的子查询语句。
以结果集的类型可以分为:
- 标量子查询:子查询结果集为一行一列
- 列子查询:子查询结果集为一列多行
- 行子查询:子查询结果集为一行多列
- 表子查询:子查询结果集为多行多列
- exists月not exists子查询:exists(select语句),结果集不是空时,exists表达式为真。
select subject,score from student_score where id=(select id from students where id=2001);/*标量子查询*/
select subject,score from student_score where id in(select id from students);/*列子查询*/
select subject,score from student_score where (name,sex)=(select name,sex from students);/*行子查询*/
select subject,score from student_score where (name,sex)in(select name,sex from students where id=2001);/*表子查询*/
十、连接
在mysql中,连接的语法很随意,只需在from后跟多个表即可.
select * from s1,s2;
假设s1表只有2列为a,b,且只有2条记录,s2表也只有两列b,c,且也只有2条记录。
那么这个语句返回的结果集就有2×2个记录,即:两表结果集的笛卡尔积。
上面的查询等效于
select s1.a,s1.b,s2.c,s2.d from s1,s2;
select a,b,c,d from s1,s2;
select s1.*,s2.* from s1,s2;
当连接后有过滤条件时,可以这样理解:
先从各表中筛选出满足调教的结果集,再求这些结果集的笛卡尔积。
内连接和外连接产生的笛卡尔积是一样的!!!!!!!!!
内连接和外连接产生的笛卡尔积是一样的!!!!!!!!!
内连接和外连接产生的笛卡尔积是一样的!!!!!!!!!
外连接
- 对于外连接的两个表,即使驱动表中的记录再被驱动表中没有匹配的记录,也仍然需要加入到结果集中。
- on过滤:对于驱动表来说,若结果集中某一记录找不到on过滤条件后的被驱动表中的记录,则仍会加入到最后的结果集中。
左外连接
select 列 from s1 left [outer] join s2 on 过滤条件 [where 过滤条件];
left 左边的表称为驱动表。
右外连接
select 列 from s1 right [outer] join s2 on 过滤条件 [where 过滤条件];
right 右边的表称为驱动表。
内连接
- 对于内连接的两个表,如果驱动表中的记录在被驱动表中找不到匹配的记录,则该记录不会加入到结果集中。
- on过滤在内连接中等于where。
如:当两表内连接查询时,存在条件where 一个表中的某列=另一个表中的某列 或 一个表中的某列>另一个表中的某列 等类似条件时,若一个表的结果集中的某一记录不满足这个条件,则不会出现到最终的结果集,也不会参与笛卡尔积的形成。
对于内连接的两个表,谁是驱动表,谁是被驱动表,是没有意义的。
内连接语法:
select 列 from 表1,表2;
select 列 from 表1 join 表2;
select 列 from 表1 inner join 表2;(推荐写法)
select 列 from 表1 cross join 表2;
以上四种写法等价.
内连接和外连接产生的笛卡尔积是一样的!!!!!!!!!
内连接和外连接产生的笛卡尔积是一样的!!!!!!!!!
内连接和外连接产生的笛卡尔积是一样的!!!!!!!!!
十一、并集
select t1 from s1 union select t2 from s2;
从s1表中查找出t1列,并把从s2中查找到的t2列加到t1列中。
select t1 t11 from s1 union select t2 t22 from s2;
从s1表中查找出t1、t11列,并把从s2中查找到的t2列加到t1列中,t22列加入到t11列中。
使用 union 会默认过滤掉最终结果集中重复的记录。
十二、游标
游标(cursor)就像指针一样,可以获取记录的某一条。但这个获取是从头往后以遍历的方式获得的。就像一个循环,想要获得第二条记录就要在循环的第二次跳出循环。
一般与存储函数或存储过程搭配使用。
declare 游标名称 cursor for 查询语句
open 游标名称;#打开游标意味着开始执行查询语句.
fetch 游标名 into 变量1,变量2,变量3……;#将游标当前对应的记录各列的值依次赋值给后面的变量。只是获得一条记录!!!!!如果想获取多个,需要配合循环语句。
close 游标名称;#关闭游标意味着释放游标的相关资源。end也会关闭。
#当fetch获取不到记录时,会默认停止存储函数或存储过程,并报错。
可以这样处理:
declare continue handler for not found 处理语句;
处理语句可以是一条,也可以是begin与end包裹的多条.
十三、视图
- 视图是一个查询语句,并不是该查询语句的结果集。
- 视图也叫虚拟表。系统不会在磁盘维护虚拟表,当需要虚拟表时,会自动调用虚拟表对应的查询语句。
- 当视图中每条记录与查询语句表中每一条记录一一对应(不能出现多余)时,视图是可更新的,此时对视图的增删改操作,都会映射到视图所对应的表上。PS:若查询语句中包含了以下内容,则一定是不可更新的:汇总函数、distinct 、group by,having、union [all]、 子查询等。
create view 视图名 as 查询语句;/*创建视图*/
show tables;/*查看有哪些视图(也会显示表)*/
show create view 视图名;/*显示视图结构。搭配\G效果好*/
drop view 视图名;/*删除视图*/
十四、存储程序
存储程序分为:存储例程(包括存储函数、存储过程)、触发器、事件。
在mysql中,我们可以自定义变量.
set @a=1;/*定义了a变量,并赋值1*/
操作时,一定要加@,否则系统会认为这是一个操作系统变量。
同一变量可以存储不同类型的值。
也可以将标量子查询赋值给变量
select name from students where id=101 into @a;
存储例程
存储函数
创建存储函数:
create function 函数名([参数列表])
returns 返回值类型
begin 函数体; end;
/*创建一个存储函数*/
函数体:return (查询语句);,函数体中每一条语句都要加;,这个';'是单纯的';',而不是结束的标志.
/*mysql默认以';'结束语句,但该语句应在end结束,故需要修改这个默认符号*/
delimiter !;/*临时地以'!'作为语句结尾,但函数体中仍需';'。下次启动客户端就失效了。*/
存储函数的调用和普通函数一样,函数名([参数表]).
函数参数不能有默认值,故在使用时必须显示传入数值.
查、删存储函数:
show function status [like ……];/*查看存储函数*/
使用like 的原因是系统也有很多存储函数,所以要匹配名称.
show create function 函数名;/*查看函数结构*/
drop function 函数名;/*删除函数*/
存储函数体中的变量:
函数体中既可以有函数局部变量,也可以修改外部自定义变量.
create function 函数名([w int])
returns int
begin
declare c int;#声明一个int 类型的c变量。声明需要放在函数体首部。
set c=5;#赋值为5
set @a=10;#将外部自定义变量a的值改为10。
return c;#返回
end;
函数体中判断语句:
if 表达式 then 语句列表;
[elseif 表达式 then 语句列表;]
[else 语句列表;]
end if;
如:
create function 函数名(score int)
returns varchar(10)
begin
declare result varchar(10);
if score>80 then
set result='优秀';
elseif score<60 then
set result='不及格';
else set result='及格';
end if;
return result;
end;
函数体中的循环语句:
while循环:
while 表达式 do
语句列表;
end while;
repeat循环:
repeat
语句列表;
until 表达式 end repeat;
loop循环:
loop
语句列表;
end loop;
#除了用return直接结束函数以跳出loop循环外,还可以用flag与leave组合来跳出loop循环
#当然,flag与leave组合也可以用到while和repeat循环中.
loop循环:
flag:loop
if @a=10 then
leave flag;
end loop flag;
存储过程
存储过程创建:
create procedure 存储过程名称([参数列表])
begin
语句列表;
end;
#不需要返回值!!!
#不需要返回值!!!
#不需要返回值!!!
存储过程的调用:
call 存储过程名(参数列表);
#语句列表中语句产生的结果集将直接显示出来.
#只有查询语句才会产生结果集.
查、删存储过程:
show procedure status[like ];#产看存储过程
drop procedure 存储过程名称;#删
判断循环等语句,参考存储函数.
存储过程中参数前缀:
[in|out|inout] 参数名 参数类型;
in:被他修饰的参数只用于读。1、可以在语句列表中通过select 参数名;来查看参数的值。2、若语句列表里有对传入的参数修改的语句,则修改生效范围只是存储函数中。如:将原本值为10的自定义变量a,当作参数b传入,若存储过程的语句列表有set b=20;,则不会修改变量a 的值。在外部查看a 的值时,仍为10。
out:被他修饰的参数只用于赋值。1、无法通过语句列表中select 参数名;来查看参数值。2、语句列表对参数的修改,也会影响到传入的参数.
inout:具备in和out的全部优点。
create procedure 存储过程名称(in t int,inout w int)
begin
语句列表;
end;
触发器
它可以放在一个表上的预执行器.
创建:
create trigger 触发器名
{before|after}#触发器内容在何时执行
{insert|delete|update}#当表受到什么操作时会激活触发器,具体何时执行触发器内容看选择的是berfore,还是after
on 表名
for each row
begin
触发器内容;
end;
before:在表受到特定(创建触发器时定义的)操作时,在操作之前执行触发器内容。
after:在表受到特定(创建触发器时定义的)操作时,在操作之后执行触发器内容。
在触发器中还有old、new两个特定词,对于不同触发器激活条件,它们有不同含义。
insert:new代表准备插入的记录,old无意义。
delete:old代表删除前的记录,new无意义。
update:new代表修改后的记录,old代表修改前的记录。
查、删触发器:
show triggers;#查看当前数据库所以触发器
show create trigger 触发器名;#查看触发器结构
drop trigger 触发器名;#删除触发器
注意:
- 触发器内容中不能有输出结果集的语句(查询语句)。
- new代表的记录的列的值可以被修改,old的不能修改。
- berfore触发器中,可以使用 “set new.列名 = 某个值” 的形式来修改待插入或待更新记录的某个列的值。但是不能用于after触发器。
事件
事件可以让mysql服务器在某个时间点或每隔一段时间自动执行一些语句。
创建:
create event 事件名:
on shcedule
{
{at 某个确定的时间点|every 期望的时间间隔} [starts 开始日期和时间]
[end 结束日期和时间]
}
do
begin
具体的语句
end;
时间点可以是代表时间的常量(如:'2022-02-07 11:50:48')、变量、表达式()。
还要开启一项权限:
set global event_scheduler = on;
查、删事件:
show events;#查看所有事件
show create event 事件名;#查看事件结构
drop event 事件名;#删除事件
十五、备份与恢复
备份
命令行输入:
mysqldump -u用户名 -p密码 --databases 数据库名 [表1,表2……] > 所要备份到的文件/*注意没有';'*/
mysqldump是另一个客户端,与mysql客户端不同.
把上面命令中--database 数据库名换成--all-database时,备份对象为所有数据库中所有表。
恢复
在mysql客户端输入:
source 备份文件的路径;
导出
将结果集导出至指定文件:
select * from 数据库名 into outfile '文件路径' [导出选项];
一般导出选项有:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0038OBL-1646824922391)(6.jpg)]
导入
将指定文件中的记录导入表中
load data [local] infile '文件路径' into table 表名 [导入选项];
十六、用户与权限
- 在安装mysql时,会让我们创建一个root用户。它具有最高权限。
- 用户信息保存在mysql.uesr表中。名为mysql的数据库是系统创建的。
select user,host from mysql.user;/*查看mysql中有哪些用户,host列表示用户可以从哪些host上连接客户端*/
创建用户
create user '用户名'@'主机名' identified by '密码';
主机名:用于指定该用户可以从哪些主机上启动客户端,也可以填入ip。省则视为'%',即任意主机。
密码:省略则表示不需要密码。
修改密码
alter user '用户名'@'主机名' identified by '密码';
删除用户
drop user '用户名'@'主机名';
增加权限
grant 权限名称 on 权限应用范围 to '用户名'@'主机名' [with grant option];
with grant option 存在时,表示被授权用户还可以将自己的权限授予给其他用户。
权限应用范围:
1、*.*代表全局级别,即所有数据库中所有表。
2、数据库名.*表示某个数据库中所有表。
3、数据库名.表名 表示某个数据库中的某个表。
查看权限
show grant for '用户名'@'主机名';/*查看某用户的权限*/
show grant;/*查看当前用户的权限*/
移除权限
revoke 权限名称 on 应用级别 from '用户名'@'主机名';