数据库常用操作

数据库常用操作

库相关

创建数据库

1
create database 数据库名称;

删除数据库

1
drop database 数据库名称;

创建一个使用 utf8 字符集的名为test的 数据库

1
create database test character set utf8

创建一个使用 utf8 字符集,并带校对规则的 test_db 数据库

1
create database test_db character set utf8 collate utf8_bin

校对规则 utf8_bin 区分大小 默认 utf8_general_ci 不区分大小写

查看当前数据库服务器中的所有数据库

1
show databases;

查看前面创建的test 数据库的定义信息

1
show create database `test`;

在创建数据库,表的时候,为了规避关键字,可以使用反引号解决

备份与恢复

备份恢复数据库

备份, 要在 Dos 下执行 mysqldump 指令其实在 mysql 安装目录bin

语法:(-p后面不带密码,回车之后要输入密码)

1
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql

例如:(数据库空格之后,再加数据库可以同时备份多个数据库)

1
mysqldump -u root -proot -B test > d://1.sql

image-20220912220150715

恢复数据库(注意:进入 Mysql 命令行再执行)

1
mysql> source d://1.sql

image-20220912220438275

第二个恢复方法, 直接将 1.sql 的内容放到查询编辑器中,执行

备份恢复数据库的表

备份表:

1
mysqldump -u 用户名 -p密码 数据库 表1 表2 表n > d:\\文件名.sql

image-20220912220940978

恢复表

1
mysql> source d://1.sql

image-20220912221152215

创建表

image-20220912221359249

1
2
3
4
5
6
create table `user`(
id int,
`name` varchar(255),
`password` varchar(255),
`birthday` date
)character set utf8 collate utf8_bin engine innodb;

t3的时间会自动更新

1
2
3
4
5
6
7
mysql> create table birthday (
-> t1 date,
-> t2 datetime,
-> t3 timestamp not null default current_timestamp on update current_timestamp
-> );

insert into birthday (t1,t2) values('2022-09-27','2022-09-27 14:39:20');

修改表

image-20220927150714911

添加一个name字段

1
2
alter table 表名 add (字段名 字段类型,字段名 字段类型);
alter table birthday add name varchar(5) not null;

查看表结构

1
desc 表名;

image-20220927185816132

修改表字段

1
alter table birthday modify name varchar(10) not null;

删除某列

1
2
alter table 表名 drop 字段名;
alter table birthday drop t4;

修改表名

1
2
rename table 旧表名 to 新表名;
rename table birthday to bir;

修改表的字符集

1
2
alter table 表名 character set 字符集编码;
alter table bir character set utf8;

修改列名

1
2
alter table 表名 change 旧字段名 新字段名 类型;
alter table bir change name username varchar(5);

删除表

1
drop table 表名;

插入数据

image-20220927195136453

1
insert into bir (t1,t2,username) values('2022-09-27','2022-09-27 19:43:10','张三');

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

列可以插入空值[前提是该字段允许为空]

insert into tab_name (列名..) values (),(),() 形式添加多条记录

1
INSERT INTO `goods` (id, goods_name, price) VALUES(50, '三星手机', 2300),(60, '海尔手机', 1800);

如果是给表中的所有字段添加数据,可以不写前面的字段名称

1
INSERT INTO `goods` VALUES(70, 'IBM 手机', 5000);

更新数据

image-20220927195347552

image-20220927195643491

1
2
update 表名 set 字段名1 = 新值,字段名2 = 新值 ... where 
update bir set t1 = '2000-12-12', t2 = '2000-12-12 12:12:12' where username = '张三';

删除数据

image-20220927200013609

1
delete from bir where username = '张三';

image-20220927200334178

查询语句

image-20220927200401394

image-20220927200441233

查询 * 表示所有字段 FROM 从哪个表

1
2
3
select *
from t1
where name = 'tom'

要查询的记录,每个字段都相同,才会去重

1
SELECT DISTINCT `name`, english FROM student;

在 select 语句中可使用 as 语句

image-20220927200616494

where 子句中经常使用的运算符

image-20220927200728716

查询英语分数在 80-90 之间的同学

1
2
SELECT * FROM student WHERE english >= 80 AND english <= 90;
SELECT * FROM student WHERE english BETWEEN 80 AND 90; -- between .. and .. 是 闭区间

查询数学分数为 89,90,91 的同学。

1
2
SELECT * FROM student WHERE math = 89 OR math = 90 OR math = 91; 
SELECT * FROM student WHERE math IN (89, 90, 91);

使用 order by 子句排序查询结果

image-20220927212621546

image-20220927212640719

合计/统计函数

image-20220927213103371

count(*) 和 count(列) 的区别

解释 :count(*) 返回满足条件的记录的行数

count(列): 统计满足条件的某列有多少个,但是会排除 为 null 的情况

统计一个班级语文成绩平均分

1
SELECT SUM(chinese)/ COUNT(*) FROM student;

求一个班级数学平均分

1
SELECT AVG(math) FROM student;

求班级最高分和最低分

1
SELECT MAX(math + english + chinese), MIN(math + english + chinese) FROM student;

image-20220927213704900

image-20220927213734534

image-20220927213759169

使用 group by 子句对列进行分组

image-20220927213844362

使用 having 子句对分组后的结果进行过滤

image-20220927214547521

image-20220927214628469

1
SELECT AVG(sal), deptno FROM emp GROUP BY deptno HAVING AVG(sal) < 2000;

字符串相关函数

image-20220927220611938

CHARSET(str) 返回字串字符集

1
SELECT CHARSET(ename) FROM emp;

CONCAT (string2 [,… ]) 连接字串, 将多个列拼接成一列

1
SELECT CONCAT(ename, ' 工作是 ', job) FROM emp;

INSTR (string ,substring )返回 substring 在 string 中出现的位置,没有返回 0

1
SELECT INSTR('hanshunping', 'ping') FROM DUAL;

UCASE (string2 ) 转换成大写

1
SELECT UCASE(ename) FROM emp;

LCASE (string2 ) 转换成小写

1
SELECT LCASE(ename) FROM emp;

LEFT (string2 ,length )从 string2 中的左边起取 length 个字符

RIGHT (string2 ,length ) 从 string2 中的右边起取 length 个字符

1
SELECT LEFT(ename, 2) FROM emp;

LENGTH (string )string 长度

1
SELECT LENGTH(ename) FROM emp;

REPLACE (str ,search_str ,replace_str )

– 在 str 中用 replace_str 替换 search_str

– 如果是 manager 就替换成 经理

1
SELECT ename, REPLACE(job,'MANAGER', '经理') FROM emp;

STRCMP (string1 ,string2 )

逐字符比较两字串大小

1
SELECT STRCMP('hsp', 'hsp') FROM DUAL;

SUBSTRING (str , position [,length ])

– 从 str 的 position 开始【从 1 开始计算】,取 length 个字符

– 从 ename 列的第一个位置开始取出 2 个字符

1
SELECT SUBSTRING(ename, 1, 2) FROM emp;

LTRIM (string2 ) RTRIM (string2 ) TRIM(string)

去除前端空格或后端空格

1
2
3
SELECT LTRIM(' 你好啊') FROM DUAL; 
SELECT RTRIM('你好啊 ') FROM DUAL;
SELECT TRIM(' 你好啊 ') FROM DUAL;

数学相关函数

image-20220928103329128

ABS(num)

绝对值

1
SELECT ABS(-10) FROM DUAL;

BIN (decimal_number )十进制转二进制

1
SELECT BIN(10) FROM DUAL;

CEILING (number2 ) 向上取整

得到比 num2 大的最小整数

1
SELECT CEILING(-1.1) FROM DUAL;

CONV(number2,from_base,to_base)

进制转换

下面的含义是 8 是十进制的 8, 转成 2 进制输出

1
SELECT CONV(8, 10, 2) FROM DUAL;

下面的含义是 8 是 16 进制的 8, 转成 2 进制输出

1
SELECT CONV(8, 16, 10) FROM DUAL;

FLOOR (number2 )

向下取整,得到比 num2 小的最大整数

1
SELECT FLOOR(-1.1) FROM DUAL;

FORMAT (number,decimal_places )

保留小数位数(四舍五入)

1
SELECT FORMAT(78.125458,2) FROM DUAL;

HEX (DecimalNumber )

LEAST (number , number2 [,..])

1
SELECT LEAST(0,1, -10, 4) FROM DUAL;

MOD (numerator ,denominator )

求余

1
SELECT MOD(10, 3) FROM DUAL;

RAND([seed])

RAND([seed]) 返回随机数 其范围为 0 ≤ v ≤ 1.0

– 1. 如果使用 rand() 每次返回不同的随机数 ,在 0 ≤ v ≤ 1.0

– 2. 如果使用 rand(seed) 返回随机数, 范围 0 ≤ v ≤ 1.0, 如果 seed 不变,

-- 该随机数也不变了

1
SELECT RAND() FROM DUAL;

时间日期相关函数

image-20220928110627070

CURRENT_DATE ( )

当前日期

1
SELECT CURRENT_DATE() FROM DUAL;

CURRENT_TIME ( )

当前时间

1
SELECT CURRENT_TIME() FROM DUAL;

CURRENT_TIMESTAMP ( )

当前时间戳

1
SELECT CURRENT_TIMESTAMP() FROM DUAL;

– 显示所有新闻信息,发布日期只显示 日期,不用显示时间.

1
SELECT id, content, DATE(send_time) FROM mes; 

– 请查询在 10 分钟内发布的新闻, 思路一定要梳理一下.

1
2
3
4
5
6
SELECT * 
FROM mes
WHERE DATE_ADD(send_time, INTERVAL 10 MINUTE) >= NOW()
SELECT *
FROM mes
WHERE send_time >= DATE_SUB(NOW(), INTERVAL 10 MINUTE)

– 请在 mysql 的 sql 语句中求出 2011-11-11 和 1990-1-1 相差多少天

1
SELECT DATEDIFF('2011-11-11', '1990-01-01') FROM DUAL; 

– 请用 mysql 的 sql 语句求出你活了多少天? [练习] 1986-11-11 出生

1
SELECT DATEDIFF(NOW(), '1986-11-11') FROM DUAL; 

– 如果你能活 80 岁,求出你还能活多少天.[练习] 1986-11-11 出生

– 先求出活 80 岁 时, 是什么日期 X

– 然后在使用 datediff(x, now()); 1986-11-11->datetime

– INTERVAL 80 YEAR : YEAR 可以是 年月日,时分秒

– ‘1986-11-11’ 可以 date,datetime timestamp

1
2
SELECT DATEDIFF(DATE_ADD('1986-11-11', INTERVAL 80 YEAR), NOW()) FROM DUAL; 
SELECT TIMEDIFF('10:11:11', '06:10:10') FROM DUAL;

– YEAR|Month|DAY| DATE (datetime )

1
2
3
4
SELECT YEAR(NOW()) FROM DUAL; 
SELECT MONTH(NOW()) FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
SELECT MONTH('2013-11-10') FROM DUAL;

– unix_timestamp() : 返回的是 1970-1-1 到现在的秒数

1
SELECT UNIX_TIMESTAMP() FROM DUAL; 

– FROM_UNIXTIME() : 可以把一个 unix_timestamp 秒数[时间戳],转成指定格式的日期

– %Y-%m-%d 格式是规定好的,表示年月日

– 意义:在开发中,可以存放一个整数,然后表示时间,通过 FROM_UNIXTIME 转换

--

1
2
3
SELECT FROM_UNIXTIME(1618483484, '%Y-%m-%d') FROM DUAL;
SELECT FROM_UNIXTIME(1618483100, '%Y-%m-%d %H:%i:%s') FROM DUAL;
SELECT * FROM mysql.user \G

加密和系统函数

image-20220928135657933

user()

可以查看登录到 mysql 的有哪些用户,以及登录的 IP

用户@IP 地址

1
SELECT USER() FROM DUAL;

DATABASE()

查询当前使用数据库名称

1
select database();

MD5(str)

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

root 密码是 abc -> 加密 abc -> 在数据库中存放的是加密后的密码

1
select md5('abc') from dual;

PASSWORD(str)

加密函数

MySQL 数据库的用户密码就是 PASSWORD 函数加密 (测试未使用成功)

1
SELECT PASSWORD('abc') FROM DUAL;

从原文密码 str 计算并返回密码字符串

1
select * from mysql.user \G

通常用于对 mysql 数据库的用户密码加密

mysql.user 表示 数据库.表

流程控制函数

image-20220928141740748

IF(expr1,expr2,expr3)

如果 expr1 为 True ,则返回 expr2 否则返回 expr3

1
SELECT IF(TRUE, '北京', '上海') FROM DUAL;

IFNULL(expr1,expr2)

如果 expr1 不为空 NULL,则返回 expr1,否则返回 expr2

1
SELECT IFNULL( NULL, '哈哈哈哈') FROM DUAL;

SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END;

如果 expr1 为 TRUE,则返回 expr2,如果 expr2 为 t, 返回 expr4, 否则返回 expr5

1
2
3
4
SELECT CASE 
WHEN TRUE THEN 'jack'
WHEN FALSE THEN 'tom'
ELSE 'mary' END;

分页查询

image-20220928143329891

按雇员的 id 号升序取出, 每页显示 3 条记录,请分别显示 第 1 页,第 2 页,第 3 页

1
2
3
4
5
6
7
8
9
-- 第 1 页 
SELECT * FROM emp ORDER BY empno LIMIT 0, 3;
-- 第 2 页
SELECT * FROM emp ORDER BY empno LIMIT 3, 3;
-- 第 3 页
SELECT * FROM emp ORDER BY empno LIMIT 6, 3;

-- 推导一个公式
SELECT * FROM emp ORDER BY empno LIMIT 每页显示记录数 * (第几页-1) , 每页显示记录数

数据分组

image-20220928143641174

image-20220928143657180

多表查询

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

自连接

自连接是指在同一张表的连接查询

自连接的特点

​ 1. 把同一张表当做两张表使用

  1. 需要给表取别名 表名 表别名

  2. 列名不明确,可以指定列的别名 列名 as 列的别名

1
2
3
SELECT worker.ename AS '职员名' , boss.ename AS '上级名' 
FROM emp worker, emp boss
WHERE worker.mgr = boss.empno;

子查询

子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询

单行子查询是指只返回一行数据的子查询语句

多行子查询指返回多行数据的子查询 使用关键字 in

在多行子查询中使用 all 操作符

1
2
3
4
5
6
7
8
SELECT ename, sal, deptno FROM emp 
WHERE sal > ALL( SELECT sal FROM emp WHERE deptno = 30 )
-- 可以这样写
SELECT ename, sal, deptno FROM emp
WHERE sal > ( SELECT MAX(sal) FROM emp WHERE deptno = 30 )

SELECT ename, sal, deptno FROM emp
WHERE sal > any( SELECT sal FROM emp WHERE deptno = 30 )

外连接

image-20220928155053235

image-20220928155129568

image-20220928155140524

1
2
3
4
5
-- 改成左外连接 
SELECT `name`, stu.id, grade FROM stu LEFT JOIN exam ON stu.id = exam.id;
-- 使用右外连接(显示所有成绩,如果没有名字匹配,显示空)
-- 即:右边的表(exam) 和左表没有匹配的记录,也会把右表的记录显示出来
SELECT `name`, stu.id, grade FROM stu RIGHT JOIN exam ON stu.id = exam.id;

表复制

自我复制数据

1
2
3
4
INSERT INTO my_tab01 (id, `name`, sal, job,deptno) 
SELECT empno, ename, sal, job, deptno FROM emp;
-- 2. 自我复制
INSERT INTO my_tab01 SELECT * FROM my_tab01;

如何删除掉一张表重复记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
(2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
(3) 清除掉 my_tab02 记录
(4) 把 my_tmp 表的记录复制到 my_tab02
(5) drop 掉 临时表 my_tmp
-- (1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
create table my_tmp like my_tab02
-- (2) 把 my_tab02 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
insert into my_tmp select distinct * from my_tab02;
-- (3) 清除掉 my_tab02 记录
delete from my_tab02;
-- (4) 把 my_tmp 表的记录复制到 my_tab02
insert into my_tab02 select * from my_tmp;
-- (5) drop 掉 临时表 my_tmp
drop table my_tmp;
select * from my_tab02;

合并查询

image-20220928154746274

image-20220928154802883

1
2
3
4
5
6
7
-- union all 就是将两个查询结果合并,不会去重
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION ALL SELECT ename,sal,job FROM emp WHERE job='MANAGER'
-- union 就是将两个查询结果合并,会去重
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION
SELECT ename,sal,job FROM emp WHERE job='MANAGER'

mysql 约束

image-20220928155456335

primary key(主键)

1
字段名 字段类型 primary key

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

  1. primary key不能重复而且不能为null。
  2. 一张表最多只能有一个主键,但可以是复合主键主键的指定方式有两种
  3. 直接在字段名后指定:字段名primakry key在表定义最后写 primary key(列名);
  4. 使用desc表名,可以看到primary key的情况.
  5. 在实际开发中,每个表往往都会设计一个主键.
1
2
3
4
CREATE TABLE t18 (id INT PRIMARY KEY) -- 表示 id 列是主键
-- 演示复合主键 (id 和 name 做成复合主键)
CREATE TABLE t18 (id INT , `name` VARCHAR(32), email VARCHAR(32), PRIMARY KEY (id, `name`) );
-- 这里就是复合主键 );

not null(非空)

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

unique(唯一)

当定义了唯一约束后,该列值是不能重复的。

  1. 如果没有指定not null,则unique字段可以有多个null
  2. 一张表可以有多个unique字段

foreign key(外键)

image-20220928161118937

image-20220928161146346

image-20220928161230368

1
2
3
4
5
6
7
8
9
10
-- 创建 主表 my_class 
CREATE TABLE my_class ( id INT PRIMARY KEY , -- 班级编号
`name` VARCHAR(32) NOT NULL DEFAULT '');
-- 创建 从表 my_stu
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)
)

check

image-20220928161718654

1
2
3
4
5
6
7
-- 测试 
CREATE TABLE t23 (
id INT PRIMARY KEY,
`name` VARCHAR(32) ,
sex VARCHAR(6) CHECK (sex IN('man','woman')),
sal DOUBLE CHECK ( sal > 1000 AND sal < 2000)
);

MySql索引

image-20220928165700671

创建索引

1
2
3
CREATE INDEX 索引名称 ON 表名 (字段名);
CREATE INDEX empno_index ON emp (empno);
CREATE INDEX ename_index ON emp (ename) -- 在 ename 上创建索引

索引的类型

image-20220928214006829

索引使用

image-20220928214056599

image-20220928214113489

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- 查询表是否有索引
SHOW INDEXES FROM t25;
-- 添加索引
-- 添加唯一索引
CREATE UNIQUE INDEX id_index ON t25 (id);
-- 添加普通索引方式 1
CREATE INDEX id_index ON t25 (id);
-- 如何选择
-- 1. 如果某列的值,是不会重复的,则优先考虑使用 unique 索引, 否则使用普通索引
-- 添加普通索引方式 2
ALTER TABLE t25 ADD INDEX id_index (id)

-- 添加主键索引
CREATE TABLE t26 ( id INT , `name` VARCHAR(32));
ALTER TABLE t26 ADD PRIMARY KEY (id) ;
SHOW INDEX FROM t25;

-- 删除索引
DROP INDEX id_index ON t25;
-- 删除主键索引
ALTER TABLE t26 DROP PRIMARY KEY;

-- 修改索引 , 先删除,在添加新的索引

-- 查询索引
-- 1. 方式
SHOW INDEX FROM t25;
-- 2. 方式
SHOW INDEXES FROM t25;
-- 3. 方式
SHOW KEYS FROM t25;
-- 4 方式
DESC t25;

mysql 事务

image-20220928214945861

image-20220928220518441

事务和锁

image-20220928220546370

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- 1. 创建一张测试表 
CREATE TABLE t27 ( id INT, `name` VARCHAR(32));
-- 2. 开始事务
START TRANSACTION
-- 3. 设置保存点
SAVEPOINT a

-- 执行 dml 操作
INSERT INTO t27 VALUES(100, 'tom');
SELECT * FROM t27;
SAVEPOINT b

-- 执行 dml 操作
INSERT INTO t27 VALUES(200, 'jack');
-- 回退到 b
ROLLBACK TO b
-- 继续回退 a
ROLLBACK TO a
-- 如果这样, 表示直接回退到事务开始的状态.
ROLLBACK
COMMIT

回退事务

在介绍回退事务前,先介绍一下保存点(savepoint),保存点是事务中的点.用于取消部分事务,当结束事务时(commit),会自动的删除该事务所定义的所有保存点当执行回退事务时,通过指定保存点可以回退到指定的点,这里我们作图说明

提交事务

使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。当使用commit语句结束事务子后,其它会话[其他连接]将可以查着到事务变化后的新数据[所有数据就正式生效.]

image-20220929091657443

mysql 事务隔离级别

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

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

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

image-20220929092106135

事务隔离级别

image-20220929093134508

设置事务隔离级别

image-20220929095531997

image-20220929095623004

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 1. 开了两个 mysql 的控制台 
-- 2. 查看当前 mysql 的隔离级别
SELECT @@tx_isolation;
-- mysql> SELECT @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+
-- 3.把其中一个控制台的隔离级别设置
Read uncommitted SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 4. 创建表
CREATE TABLE `account`( id INT, `name` VARCHAR(32), money INT);
-- 查看当前会话隔离级别
SELECT @@tx_isolation -- 查看系统当前隔离级别
SELECT @@global.tx_isolation
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [你设置的级别]

mysql 事务 ACID

image-20220929100420281

mysql 表类型和存储引擎

image-20220929100539243

image-20220929100608996

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- 表类型和存储引擎 
-- 查看所有的存储引擎
SHOW ENGINES
-- innodb 存储引擎,是前面使用过.
-- 1. 支持事务 2. 支持外键 3. 支持行级锁
-- myisam 存储引擎
CREATE TABLE t28 ( id INT, `name` VARCHAR(32)) ENGINE MYISAM
-- 1. 添加速度快 2. 不支持外键和事务 3. 支持表级锁

-- memory 存储引擎
-- 1. 数据存储在内存中[关闭了 Mysql 服务,数据丢失, 但是表结构还在]
-- 2. 执行速度很快(没有 IO 读写) 3. 默认支持索引(hash 表)
CREATE TABLE t29 ( id INT, `name` VARCHAR(32)) ENGINE MEMORY
DESC t29
INSERT INTO t29 VALUES(1,'tom'), (2,'jack'), (3, 'hsp');
SELECT * FROM t29

-- 指令修改存储引擎
ALTER TABLE `t29` ENGINE = INNODB

修改存储引擎

image-20220929105404547

视图(view)

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

image-20220929110047027

视图的基本使用

image-20220929110115892

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 创建视图
create view bir_view as select t1,t2,t3 from bir;
-- 查看视图
desc bir_view;
-- 查看创建视图的指令
show create view bir_view;
-- 删除视图
DROP VIEW bir_view;

-- 视图的细节
-- 1. 创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式: 视图名.frm)
-- 2. 视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]
-- 修改视图 会影响到基表
-- 修改基本表, 会影响到视图

image-20220929123115201

Mysql 管理

image-20220929123438395

创建用户

image-20220929123618840

1
2
3
4
5
create user 'testuser' @localhost identified by '123';
-- 创建用户 zhangsan 密码 123 , 从本地登录
CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY '123';
-- create user 'xxx'@'192.168.1.%' 表示 xxx 用户在 192.168.1.*的 ip 可以登录 mysql
CREATE USER 'smith'@'192.168.1.%'

删除用户

image-20220929124107561

1
2
3
4
5
6
7
drop user 'testuser' @localhost;
-- 删除 zhangsan
DROP USER 'zhangsan'@'localhost'

-- 在删除用户的时候,如果 host 不是 %, 需要明确指定 '用户'@'host 值'
DROP USER jack -- 默认就是 DROP USER 'jack'@'%'
DROP USER 'smith'@'192.168.1.%'

用户修改密码

image-20220929124142389

1
SET PASSWORD FOR 'zhangsan'@'localhost' = PASSWORD('abc');

给用户授权

image-20220929124747615

1
2
3
4
-- 给 zhangsan 分配查看 news 表和 添加 news 的权限
GRANT SELECT , INSERT ON testdb.news TO 'zhangsan'@'localhost';
-- 可以增加 update 权限
GRANT UPDATE ON testdb.news TO 'zhangsan'@'localhost';

回收用户授权

image-20220929124814206

1
2
3
-- 回收 shunping 用户在 testdb.news 表的所有权限 
REVOKE SELECT , UPDATE, INSERT ON testdb.news FROM 'zhangsan'@'localhost'
REVOKE ALL ON testdb.news FROM 'zhangsan'@'localhost

权限生效指令

image-20220929124842527

常用数据类型

image-20220927141757933

image-20220927142129714

image-20220927142545347

image-20220927142607567

image-20220927142641844

image-20220927142708227

image-20220927143053242


数据库常用操作
http://example.com/2022/09/29/数据库常用操作/
作者
Deng ErPu
发布于
2022年9月29日
许可协议