Mysql梳理

本文详细介绍了MySQL的基础知识,包括SQL语句分类、数据类型、表的操作、数据操作、分页查询、多表查询、表复制、外键约束、索引原理、事务操作和数据库范式理解。还涵盖了视图和用户权限管理,是学习MySQL的全面指南。
摘要由CSDN通过智能技术生成

Mysql基础

一、SQL语句分类

  1. DDL:数据定义语句[create表,库...]

  2. DML:数据操作语句[增加insert,修改update,删除delete]

  3. DQL:数据查询语句[select]

  4. DCL:数据控制语句[Grant,revoke],管理用户权限

二、mysql列类型

  1. 数值类型

    1. 整型

      1. tinyint[一个字节]

      2. smallint[二个字节]

      3. mediumint[三个字节]

      4. int[4个字节]

      5. bigint[8个字节]

    2. 小数类型

      1. float[单精度4个字节]

      2. double[双精度8个字节]

      3. decimal[M,D]大小不确定,由M,D确定,M是小数位数的总数,D是小数点后面的位数

  2. 文本类型

    1. char[0-255]

    2. varchar[0-65535][0~2^16-1],char和varchar表示的是字符而不是字节,比如使用utf-8编码如果varchar(4),那么应该占用的字节是3*4=12个,不区分汉字字母,varchar是变长而char是定长,所有var需要预留1-3个字节来表示记录内容的长度。但是查询速度char>varchar。

      1. 总结定长用char,比如身份证,学号..

      2. 其他用varchar

    3. text[0-65535] [0~2^16-1]

    4. longtext [0~2^32-1]

  3. 二进制数据类型

    1. blob[0~2^16-1]

    2. longblob[0~2^32-1]

    3. ps:一般保存路径,不会直接存二进制文件

  4. 日期

    1. date[ 年月日 ]

    2. time[时分秒]

    3. datetime[年月日+时分秒 YYYY-MM-DD HH:mm:ss]

    4. timestamp 时间戳 自动更新

三、表的操作

1.创建表

create table 表名(
    字段名1 列数据类型,
    字段名2 列数据类型,
    字段名3 列数据类型,
    ....)
charset 字符集 collate 以什么方式分类 engine innodb

2.修改表

添加列

ALTER TABLE 表名
ADD(
    字段名1 列数据类型,
    字段名2 列数据类型,
    字段名3 列数据类型,
    ...
)

修改列

ALTER TABLE 表名
MODIFY(
    字段名1 列数据类型,
    字段名2 列数据类型,
    字段名3 列数据类型,
    ...
)

删除列

ALTER TABLE 表名
DROP (列名)

查看表结构

desc 表名;查看表中的列

修改表名: Rename table 表名 to 新表名

修改表字符集: alter table 表名 character set 字符集;

四、表内数据操作

1.插入insert:

insert into 表名(字段1,字段2...) values(xx,xx,xx)

注意:数据类型要匹配,长度符合,没有添加的字段默认为null,除非有默认值

2.修改:

update 表名 set 字段=值 where ..(要求的情况) ,如果没有where就代表所有的记录都更新

3.删除:

delete from 表名 where (要求的情况) ,如果没有where就代表所有的记录都删除

删除一张表 drop table 表名

4.查询 重点!

select [distinct] *或者{字段1,字段2...} from 表名

*代表所有字段, distinct代表去掉重复数据 ,distinct要去掉查询出的一行中所有值都相同

select可以运算比如学生的课表 chinese english math 的和可以用

select name,(chinese+english+math) as totol_score from student,其中

as totol_score 是给(chinese+english+math) 取别名,展示的时候列名会相应的更改

1.基本函数

  1. order by指定排序的列,排序的列既可以升序也可以降序,放到select语句的结尾Asc升序,desc降序

  2. count函数:返回查询出行的总数

    1. count(*)返回总行数,count(列名),返回非空的该列行数
  3. sun函数:返回满足where条件行的和,一般使用在数值列

  4. avg函数:求平均分

  5. max.min函数:求最大,最小值

  6. groupby ...having:grouby 对哪列分类,having限制条件

2.字符串函数

  1. charset(str) 返回字符串集

  2. concat(str1,str2...) 连接字符串

  3. instr(string,substring) 返回子串substring在string中的位置

  4. ucase(str) 转换成大写

  5. lcase(str) 转换成小写

  6. length(str) 取长度 ,按字节返回的

  7. left(string2,length) 从string2中左边起取length个字符

  8. replace(str,keyStr,replaceStr) 把str中的keyStr都换成replaceStr

  9. strcmp(str1,str2) 比较两字符串的大写

  10. substring(str,position,[,length]) 从positon开始,取length个字符,position从1开始

  11. ltrim(str),rtrim(str) 去除左端/右端空格 trim(str) 两端都去掉

3.数学相关函数

  1. ABS(num) 绝对值

  2. bin(decimal_number) 十进制转二进制

  3. ceiling(numver2) 向上取整

  4. conv(number2,from_base,to_base) 进制转换

  5. floor(num) 向下取整

  6. hex(num) 10转成16进制

  7. least(number1,number2,...) 取最小值

  8. format(num,decimal_places) 保留小数位数( 保留几位小数,四舍五入)

  9. rand() 返回一个[0,1]的随机数 ,如果使用rand(seed) ,seed不变,rand(seed)也不会变

  10. mod(num,denum) 取余数

4.日期函数

  1. current_date() 当前日期

  2. current_time() 当前时间

  3. current_timestamp() 当前时间戳

  4. date(datetime) 返回datetime的日期部分

  5. dateadd(date2,interval d_value d_type)在date2中加上日期或时间

  6. datesub(date2,interval d_value d_type)在date2中减去时间 

  7. datediff(date1,date2) 两个日期差(天)

  8. now() 返回现在的时间

  9. UNIX_TIMESTAMP() ,返回现在到1970-1-1的秒数

  10. FROM_UNIXTIME(unix_timestamp,'%Y-%m-%d %H:%i:%s') 按固定的格式将unix_timestamp进行转换

5.加密函数

  1. user()查询用户,可以查询登录到mysql的有哪用户,以及登录的ip

  2. database() 查询当前使用的数据库名称

  3. MD5(str) 为str字符串算出一个MD5 32的字符串,常用(用户密码)加密

  4. password(str) 另一种加密方式,mysql默认的加密方式

6.流程控制函数

  1. IF(expr1,expr2,expr3) 如果expr1是True,则返回expr2,否则返回expr3

  2. IFNULL(expr1,expr2) 如果expr1不为null,则返回expr1,否则返回expr2

  3. select case when expr1 then expr2 when expr3 then expr4 else expr5 end;如果expr1为真,就返回expr2,如果expr3为真,返回expr4,否则返回expr5

五、分页查询

基本语法:select ... limit start,rows 表示从start+1行开始取,取出rows行,start从0开始计算

例如:按雇员的id号升序取出,每页显示3条记录,分别显示第1.2.3页

#第一页
select * from emp
        ORDER BY empno
        LIMIT 0,3
#第二页
select * from emp
        ORDER BY empno
        LIMIT 3,3

公式:

select * from emp
 ORDER BY empno
 LIMIT 每页显示记录数 * (第几页-1),每页显示记录数

六、多表查询

  1. 笛卡尔积:

    1. 默认情况下,当两表查询时,会从第一张表取出一行和第二张表的每一行进行组合,返回结果

    2. 一共返回的记录数:第一张表行数 * 第二张表行数

    3. 这样的结果称为笛卡尔积

  2. 多表查询的连接操作,条件不能少于表的个数-1,否则会出现笛卡尔集

-- SELECT dname,ename,sal
--             from emp,dept
--             WHERE emp.deptno=dept.deptno
--                         and emp.deptno=10 

1.自连接

SELECT boss.ename,worker.ename
        from emp as boss,emp as worker
        where worker.mgr=boss.empno

把自己当成另外的一张表

2.临时表

-- 寻找每个部门工资最高的人
SELECT ename,deptno,max(sal)
        from emp
        GROUP BY deptno  --错误,grouby 函数已经将deptno分类

-- 正确
SELECT ename,emp.deptno,sal
        from (
            SELECT deptno,max(sal) as max_sal
                from emp
                GROUP BY deptno) as temp,emp
        where emp.deptno=temp.deptno and emp.sal=temp.max_sal

3.all和any

-- 显示工资比部门30的所有员工的工资高的 员工姓名、工资和部门号

SELECT ename,sal,deptno
        from emp
        where sal > ALL(  --大于表内所有的
             SELECT sal
                    from emp
                    where deptno=30
        )

-- 显示工资比部门30的其中一个员工的工资高的 员工姓名、工资和部门号    
SELECT ename,sal,deptno
        from emp
        where sal > ANY(  --大于表内其中一个
             SELECT sal
                    from emp
                    where deptno=30
        )        

4.多字段查询

-- 查询与ALLEN的部门和岗位完全相同的所有雇员(不含smith本人)
SELECT ename FROM emp WHERE ( deptno, job )=
( SELECT deptno, job FROM emp WHERE ename = 'ALLEN' ) 
AND ename <> 'ALLEN'

5.子查询练习

-- 查询每个部门比平均工资高的员工
SELECT * 
    from (
        SELECT deptno,avg(sal) as avg_sal
            from emp 
            GROUP BY deptno)as temp,emp
    where emp.deptno=temp.deptno and sal>avg_sal

-- 查询每个部门工资最高的人
SELECT *
        from emp,(
            SELECT max(sal) as max_sal,deptno
                from emp
                GROUP BY deptno
        ) as temp
        where max_sal=sal and temp.deptno=emp.deptno 

-- 查询每个部门的信息(包括:部门名,编号,地址)和人员数量

SELECT dname,dept.deptno,loc,totoal_people
    from dept,(
        SELECT deptno,count(ename) as totoal_people
            from emp
            GROUP BY deptno
    ) as temp
    where temp.deptno=dept.deptno

七、表的复制和去重

-- 自我复制,效率测试
INSERT INTO my_tab01
        SELECT * from my_tab01  --多次执行,得到庞大数据


-- 去重
CREATE TABLE my_tmp like my_tab02  --创建临时表

INSERT INTO my_tmp
        SELECT DISTINCT* from my_tab02 --将原表的数据distinct后放入tmp临时表

drop table my_tab02 -- 删除原表

rename table my_tmp to my_tab02  -- 将tmp表改名为原表

八、左右外连接

-- 使用左连接
-- (显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号,成绩显示为空)

SELECT `name`,stu.id,grade 
        from stu,exam
        where stu.id=exam.id  -- 这样无法满足需求


SELECT `name`,stu.id,grade 
        from stu LEFT JOIN exam
        ON stu.id=exam.id

select xx

    from 表1 left join 表2

    on 表1.xx=表2.xx    

九、表约束

1.主键

  1. 可以在创建表的列后加primary key来规定,也可以在最后规定primary key()

  2. 主键表示该列不能为空而且不能重复

  3. 一张表只能一个主键,但可以是复合主键,表示这两个字段不能同时重复

  4. 可以使用desc 表名看见primary key的情况

2.unique 唯一

  1. 表示唯一的,但可以为空,这和主键不同。

  2. 在列名后面进行添加unique 关键字来约束

  3. null可以被添加,而且null可以添加多个

  4. 一张表可以有多个unique字段

3.外键

  1. 被外键约束的表,和主表之间有外键约束关系的,被约束的列必须要添加主表约束列内存在的数据

  2. 主表内被约束的列必须为主键或者是unique,不允许可以重复的列

  3. 表的类型是innodb,这样的表才支持外键

  4. 外键字段的类型要和主键字段的类型一致(长度可以不同)

  5. 外键字段的值,必须在主键字段中出现过,或者为null[前提是外键字段允许为Null]

  6. 一旦建立主外键的关系,数据不能随意更改(尤其是主表)

CREATE TABLE my_class(
        id int PRIMARY KEY,
        `name` varchar(32) not null DEFAULT '');


CREATE TABLE my_stu(
        id int PRIMARY KEY,
        `name` varchar(32) not null DEFAULT '',
        class_id int,
        FOREIGN KEY (class_id) REFERENCES my_class(id) )

学生表的class_id的外键就是my_class中的id了,学生表的class_id不可以添加除了my_class.id列中出现的其他值。

INSERT INTO my_class
        VALUES(100,'java'),(200,'web')

INSERT into my_stu
        VALUES(1,'tom',100);
INSERT into my_stu
        VALUES(2,'jack',200);
INSERT into my_stu
        VALUES(3,'pc',300); -- 失败,因为my_class的id字段没有300

4.check约束

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

  2. mysql5.7目前不支持check,只做语法效验,但不会生效,mysql8可以。

CREATE TABLE t1(
        id int primary key,
        `name` varchar(32),
        sex varchar(6) check ( sex in('man','woman')),
        sal double check(sal>1000 and sal<2000)
        )
INSERT into t1
        VALUES(1,'jack','man',1500); -- 成功

INSERT into t1
        VALUES(2,'tom','woman',1200); -- 成功
INSERT into t1
        VALUES(3,'john','mid',1500);   -- 失败,mid not in('man,''woman)
INSERT into t1
        VALUES(4,'mary','woman',2100); -- 失败 2100>2000

5.商店表练习

CREATE TABLE goods(
        goods_id int PRIMARY KEY,
        goods_name varchar(64),
        goods_unitprice DOUBLE CHECK(goods_unitprice>=1 and goods_unitprice<10000),
        category VARCHAR(32),
        provider VARCHAR(32)
        );


CREATE TABLE customer(
        customer_id int PRIMARY KEY,
        `name` varchar(32),
        address varchar(128),
        email varchar(64),
        sex char(15) CHECK(sex in('男','女') ),
        card_id char(20)
        );

CREATE TABLE purchase(
        order_id int PRIMARY KEY,
        custom_id int,
        goods_id int,
        nums int,
        FOREIGN KEY (custom_id) REFERENCES customer(customer_id),
        FOREIGN KEY (goods_id) REFERENCES goods(goods_id) );

自增长 AUTO_INCREMENT

  1. 自增长列创建 加入AUTO_INCREMENT关键字
CREATE TABLE t2(
        id int PRIMARY KEY AUTO_INCREMENT,
        email VARCHAR(32),
        `name` VARCHAR(32))

id列为自增长列

自增长添加数据

  1. insert into xxx(字段1,字段2,...) values(NULL,'值'...)

  2. insert into xxx(字段2,字段3...) values('值1','值2')

  3. insert into xxx values(null,'值1',...)

细节:

  1. 自增长一般配合主键使用,也可以单独使用[但是需要配合unique]

  2. 自增长修饰的字段一般是整数型,但是小数型也支持(几乎不用)

  3. 自增长默认从1开始,也可以通过alter table 表名 auto_increment = 新的开始值 ,来修改

  4. 如果添加数据时,给了自增长列指定的值,则以指定的值为准。一般也不指定值。

十、索引

    目的:使用索引可以优化查询速度。

细节:创建索引后,只对创建了索引的列有效,对其他列查询的时间是没有变化的。

1.索引原理

  1. 如果没有索引, select * from emp where id=1这个指令,数据库会执行全表扫描,顺序查找一遍这一列有没有符合id=1的值

  2. 如果有索引,会创建一个二叉排序树,相当于用二分查找,时间复杂度变为log2n

    1. 索引的代价: 使用索引会占用磁盘空间。更重要的是,如果对表进行dml(添加,删除,修改)操作,语句的效率受到很大影响。

    2. 虽然如此,但是在实际的项目中,select语句比update,delete,insert往往占比多很多,因此索引的创建还是很有必要的。

2.索引的类型

  1. 主键索引,主键自动为主索引

  2. 唯一索引,unique

  3. 普通索引,index

  4. 全文索引(fulltext) [适用于mylsam]

    1. Mysql一般开发,不使用mysql自带的全文索引,而是使用全文搜索Solr和ElasticSearch(ES)

3.索引的操作

  1. 查询表是否有索引SHOW INDEXES FROM 表名

  2. 添加唯一索引CREATE UNIQUE INDEX 索引名 ON 表名 (列名); ,如果某列的值,是不会重复的,则优先考虑使用唯一索引,否则使用普通索引

  3. 添加普通索引CREATE INDEX 索引名 ON 表名 (列名); 或者

    ALTER TABLE 表名 ADD INDEX 索引名 (列名);

  4. 删除索引 DROP INDEX 索引名 ON 表名

  5. 删除主键索引 ALTER TABLE 表名 DROP PRIMARY KEY

4.小结

  1. 较频繁的作为查询的条件字段应该创建索引。

  2. 唯一性太差的字段不适合创建索引,比如性别字段。

  3. 更新非常频繁的字段不适合做索引。比如统计网站的浏览次数字段。

  4. 不会出现在WHERE字句的字段不该创建索引。

十一、mysql事务

1.事务的作用

  1. 用于保证数据的一致性,它将一组相关的dml(操作,修改,删除)语句看做一个整体,要么全部成功,要么全部失败。如:转账就要用事务处理,保证数据的一致性。

  2. 事务和锁:当执行事务操作时,mysql会在表上加锁,防止其他用户改表的数据。

2.事务的ACID特性

  1. 原子性(Atomicity):一个事务必须被视为一个不可分割的最小逻辑工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚

  2. 一致性(Consistency):事务执行的结果必须是从一个一致性的状态转换到另外一个一致性的状态。当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果事务因为崩溃或其他原因尚未完成,被迫中断最终事务没有提交,那么事务中所做的修改也不会保存到数据库中。

  3. 隔离性(IsoIation):一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

  4. 持久性(Durability):事务一旦提交,它对数据库中的数据的修改就应该是永久性的。此时即使系统崩溃,修改的数据也不会丢失。

2.事务的操作

  1. 回退事务:

    1. 保存点(savepoint)。保存点是事务中的点,用于取消部分事务,当结束事务时(commit),会自动的删除该事务所定义的所有保存点,当执行回退事务时,通过指定保存点可以回退到指定的点
  2. 提交事务:使用commit语句可以提交事务,当执行了commit语句后,会确认事物的变化,结束事务、删除保存点、释放锁,数据生效。当使用commit语句结束事务后,其他会话将可以查看到事物变化后的新数据。

CREATE TABLE t1
(
    id int,
    `name` varchar(32)
);
-- 开始事务
START TRANSACTION ;
-- 设置保存点
SAVEPOINT a;
-- 执行DML
INSERT INTO t1 VALUES(100,'tom');
SELECT * FROM t1;
SAVEPOINT b;
INSERT INTO t1 VALUES(200,'jack');
SELECT * FROM t1;

-- 回退到b
ROLLBACK TO a
-- 继续回退
ROLLBACK TO b

-- 如果后面不加任何保存点,表示回退到事务开始阶段
ROLLBACK

细节

  1. 如果不开始事务,默认情况下dml操作是自动提交的,不能回滚

  2. 如果开始一个事务,没有创建保存点,可以执行rollback

  3. 默认回滚到事务开始状态

  4. mysql的事务机制需要innodb来支持,myisam不支持

3.隔离级别

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

如果不考虑隔离性,可能会发生如下问题:

  1. 读脏数据:当一个事务读取另一个事务读取到另一个事务尚未提交的数据。

  2. 不可重复读:不可重复读是指在一个事务内多次读取同一数据集合。在这个事务还没有结束时,另外一个事务也访问该同一数据集合,并做了一些修改操作。因此,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的

    举个例子:事务 T1 读取一行数据 r,T2 将该行数据修改成了 v1。如果 T1 再次读取这行数据,此时读取的结果和第一次读取的结果是不同的

  3. 幻读:幻读本质上是属于不可重复读的一种情况,区别在于,不可重复读主要是针对数据的更新(即事务的两次读取结果值不一样),而幻读主要是针对数据的增加或减少(即事务的两次读取结果返回的数量不一样)

    举个例子:事务 T1 读取某个范围的数据,事务 T2 在这个范围内插入了一些新的数据,然后 T1 再次读取这个范围的数据,此时读取的结果比第一次读取的结果返回的记录数要多

Mysql隔离级别脏读不可重复读幻读加锁读
读未提交可能出现可能出现可能出现不加锁
读已提交不可能出现可能出现可能出现不加锁
可重复读不可能出现不可能出现可能出现不加锁
可串行化不可能出现不可能出现不可能出现加锁

查看当前隔离级别:SELECT @@tx_isolation

设置隔离级别:SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别

隔离级别:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE,READ,SERIALIZABLE

4.四种隔离级别的具体实现

读取未提交和可串行化的实现没什么好说的,一个是啥也不干,一个是直接无脑加锁避开并行化 让你啥也干不成。

重头戏就是读取已提交和可重复读是如何实现的。这就是我们要说的 MVCC 了,也就是面试中的超级高频题。

我先来简单说一下,对于这两个隔离级别,数据库会为每个事务创建一个视图 (ReadView),访问的时候以视图的逻辑结果为准

  • 在 “读取已提交” 隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的
  • 在 “可重复读” 隔离级别下,这个视图是在事务启动时就创建的,整个事务存在期间都用这个视图(这就是为什么说在可重复读隔离级别下,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的)

那么问题了就来了,已经执行了这么多的操作,事务该如何重新回到之前视图记录的状态数据库会通过某种手段记录这之间执行的种种操作吗

这就是 undo log 版本链做的事

十二、数据库范式的理解

核心点

灵活使用,优先范式设计,当范式设计成为系统的性能瓶颈的时候,使用反范式设计。

第一范式

定义:属于第一范式关系的所有属性都不可再分,即数据项不可分。简单理解:每个列都不可以再拆分。

第二范式

定义:要求数据库表中的每个实例或行必须可以被惟一地区分。简单理解:不要有部分依赖。该多对多就去做多对多,不要把多对多关系放在一张表

第三范式

定义:每一个非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主键对主键的传递依赖。简单理解:表关联有个主键就行,不要放除关联主键之外的其他关联表数据。

反范式设计

为了性能和读取效率的考虑而适当的对数据库设计范式的要求进行违反。允许存在少量的冗余,换句话来说反范式化就是使用空间来换取时间。

十三、视图View

1.视图的基本使用

  1. 创建视图:CREATE VIEW 视图名 AS SELECT xxx

  2. 删除视图:DROP VIEW 视图名

  3. 修改视图:UPDATE 视图名 Set 列名=值 WHERE 列名=值

  4. 查看视图:Select xxx from 视图名

2.视图的原理

  1. 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成

  2. 对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

  3. 视图是存储在数据库中的查询的SQL 语句,视图有两个特点:

    1. 安全。视图可以隐藏一些数据。如:个税表,可以用视图只显示姓名,地址,而不显示个税号和工资数等

    2. 可使复杂的查询易于理解和使用。这个视图就像一个窗口,从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT *,而你看到的将是你在视图定义里给出的那些数据列。

  4. 由于视图是从基本表上获取的数据,因此基本表更改了信息后,视图也会同步更新。同时,如果视图更改了数据,基本表也会同步更新,这是因为视图和基本表之间有链接。

十四、用户权限管理

Mysql用户都存在系统数据库mysql中的user表中

重要字段:

  1. host:允许登录的位置,localhost表示只允许本级登录,也可以指定ip地址,比如:192.168.1.100

  2. user:用户名

  3. authentication_string:密码,是通过password()函数加密之后的密码

原因:做项目开发时,可以根据不同的开发人员,赋给他相应的Mysql操作权限

1.对用户的操作

  1. 创建用户:CREATE USER 用户名@登录地址 IDENTIFIED BY 密码,这里的密码存放到mysql.user表中已经被password()函数自动加密过,如果登录地址不写,默认为%任意地址

  2. 查询 Select xxx from mysql.user

  3. 删除用户: DROP USER 用户名@登录地址

  4. 修改密码SET PASSWORD FOR 'PC'@'localhost' = 'abc';

  5. 删除用户:DROP USER '用户名'@'登录地址'

2.权限

  1. 授权:GRANT 权限名1,权限名2... ON 库名.表名 to '用户名' @ '登录位置' [identified by '密码']

    1. 如果用户不存在,表示创建一个有这些权限的用户。

    2. 如果用户存在,identified by语句也存在,表示赋予权限时同时修改了密码。

    3. 回收用户权限:revoke 权限名1,权限名2... ON 库名.表名 FROM '用户名' @ '登录位置'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值