百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

数据库管理入门之三(数据库管理基础知识)

nanshan 2024-10-15 11:28 6 浏览 0 评论

一、数据导入、导出

1.1定义:把系统文件的内容存储到数据库的表里

1.2步骤:

1.2.1创建存储文件内容的表

1.2.2执行导入数据的sql命令,要求文件在指定路径下才可以导入成功

1.3相关指令:

1.3.1.在数据库里执行系统命令只需要在命令前加system即可,如:

system cp /etc/passwd /var/lib/mysql-files

1.3.2产看默认使用目录(需要导入的文件所存放的的位置)以及目录是否存在

show variables like “secure_file_priv”;

1.3.3导入数据到表的基本格式:

load data infile “目录名/文件名” into table 库名.表名 fields terminated by “列分隔符“ lines terminated by “\n(换行符)”;

ps:字段分隔符与文件内的必须一致,路径为绝对路径,导入数据的表字段类型要与文件字段匹配,需要禁用selinux。

1.3.4为导入的数据增加编号,方便管理(非必要操作)

alter table 表名 add id int(2) primary key auto_increment first;

1.3.5eg:

mysql> create table user(

-> name char(30),

-> password char(1),

-> uid int(2),

-> gid int(2),

-> cooment char(100),

-> homedir char(150),

-> shell char(50),

-> key name(name))engine=innodb default charset=latin1;

mysql> show variables like "secure_file_priv";

mysql> system cp /etc/passwd /var/lib/mysql-files

mysql> load data infile "/var/lib/mysql-files/passwd" into table user

-> fields terminated by ":"

-> lines terminated by "\n";

mysql> alter table user add

-> id int(2) primary key auto_increment first;

mysql> select * from user;

1.4修改导入目录

[root@localhost ~]# mkdir /myload ; chown mysql /myload

[root@localhost ~]# vim /etc/my.cnf

[mysqld]

secure_file_priv="/myload"

[root@localhost ~]# systemctl restart mysqld

mysql> show variables like "secure_file_priv";

1.5表记录导出(表记录存储到系统文件里,不包括字段名)

导出时无需先建立文件名,直接指定即可,不然会重复冲突导不出;

基本用法:select xx from 表 into outfile “目录名/文件名” fields terminated by “分隔符” lines terminated by “换行符”;

ps:导出的内容由sql查询语句决定,需要禁用selinux,分隔符及换行符可不设置,默认为tab;

eg:

mysql> select * from user into outfile

-> "/var/lib/mysql-files/user1.txt";

mysql> select id ,name,password from user where id <=3

-> into outfile "/var/lib/mysql-files/user2.txt"

-> fields terminated by ":"

-> lines terminated by "\n";

二、管理表记录(增删改查)

2.1插入

2.1.1基本用法:

insert into 库.表 valules (字段值列表);

2.1.2一次插入多条记录:

insert into 库.表 valules (字段值列表1),(字段值列表2)...;

2.1.3给指定字段赋值,其他字段默认为空:

insert into 库.表(字段1,字段2...) values(值1,值2...);

2.1.4注意事项:

– 字段值要与字段类型相匹配;

– 对于字符类型的字段,要用双或单引号括起来;

– 依次给所有字段赋值时,字段名可以省略;

– 只给一部分字段赋值时,必须明确写出对应的字段名称。

2.2查

2.2.1基本用法:

select 字段名列表 from 库.表 where 条件;

ps:字段名列表决定显示哪些列,条件决定显示哪些行

2.3改

2.3.1基本用法:

update 库.表 set 字段名=”值“ where 条件;

ps:不加条件即为批量改1

2.4删

2.4.1基本用法:

delete from 库.表 条件;

ps:条件可不加,即删除表内所有记录。

三、匹配条件

3.1数值比较(= > >= < <= !=)

基本格式:

where 字段名 符号 值

where 字段名 符号 字段名(两个字段的字段值都是数值)

eg:

mysql> select * from user where id = 3;

mysql> select name,uid,gid from user where uid=gid;

mysql> update user set password="F",homedir="/student" where uid < 10;

3.2字符比较(只有两种,要么等,要么不等,= !=)

基本格式:

where 字段名 符号 “值”

where 字段名 is null //匹配空

where 字段名 is not null //匹配非空

eg:

mysql> select name from user where shell="/bin/bash";

mysql> select name,shell from user where shell != "/bin/bash";

mysql> select * from user where name="mysql";//查询是否有名字为mysql的用户;

mysql> insert into user values (89,"yaya","S",null,null,"MySQL_ Server","/var/lib/mysql","/bin/false");

mysql> select name,uid from user where uid is null;

mysql> update user set uid=4008 where uid is null and name="yaya";

mysql> select name,uid from user where name="yaya";

3.3逻辑比较

逻辑与 and 多个条件必须同时成立;

逻辑或 or 多个条件中某一个成立即可;

逻辑非 ! not 取反

eg:

mysql> select name,uid,shell from user where name="root" and uid=0 and shell ="/bin/bash";

mysql> select name,uid,shell from user where name="root" or uid=7 or shell="/sbin/nologin";

ps:逻辑判断默认顺序是从前往后执行,若要优先执行,可用“()”括起要优先判断的部分;

eg:

mysql> select name,uid from user where name="root" and uid=1 or uid=3;

mysql> select name,uid from user where uid=0 or uid=3 and name="root"的结果等于:

mysql> select name,uid from user where name="root" and (uid=0 or uid=3);

3.4范围内匹配

基本用法:

where 字段名 in (值1,值2...); //与其中的值匹配的都挑出来

where 字段名not in (值1,值2,...); //不包括值1,值2...其中任何一个值

where 字段名 between 10 and 20; //在10-20的范围内,包括10和20

eg:

mysql> select name from user where name in("apache","mysql","adm","bin");

mysql> select name,shell from user

-> where shell not in ("/bin/bash","/sbin/nologin");

mysql> select name,uid from user where uid in (10,20,30,40);

mysql> select name,uid from user where uid between 1 and 10;

3.5去重显示

当实际工作中只想查看字段下的值有多少种,可以不显示字段的重复值,只显示第一次出现时的值。

基本用法:

selsect distinct shell from ....

eg:

mysql> select distinct shell from user where uid<=10;

3.6高级查询条件

3.6.1模糊匹配

基本用法:

where 字段名 like ‘通配字串’

通配符:

“_”:匹配单个字符,匹配多个则输入相应数量的“_”;

“%”:匹配0~N个字符

ps:null是空值,指没有任何数据,不算0个字符,“”算0个字符;

eg:

mysql> select name,uid from user where name like "___";//“”里为3个_;

mysql> select name,uid from user where name like "r__";

mysql> select name,uid from user where name like "a%t";

mysql> select name ,uid from user where name like '__%__';//__为2个”_”;

//条件为name至少为4个字符才符合条件;

3.6.2正则匹配

基本用法:

where 字段名 regexp ‘正则表达式’;

常用正则符号:

“.”:单个字符;

“*”:任意个字符;

“^”:以什么开头;

“$”:以什么结尾;

“[]”:范围内;

eg:

mysql> select name ,uid from user where uid regexp '....';

条件为含有4个字符的,由于正则是包含即成立,因此包括了4个字符以上的,要严格匹配4个字符,可参考如下命令:

mysql> select name ,uid from user where uid regexp '^....

;

mysql> select name,uid from user where name regexp 't

;

匹配以t结尾的;

mysql> insert into user(name) values("yaya1"),("ys32"),("ya2ya");

mysql> select name from user where name regexp '[0-9]';

匹配字段值中含有数字的;

mysql> select name from user where name regexp '[0-9]

;

匹配以数字结尾的;

3.6.3四则运算

前提:字段必须是数值类型

基本用法

select 字段名 +/-/*/除/% [as] 新字段名 where ...

update 表名 set 字段名=字段名运算方式;

eg:

mysql> alter table user add age tinyint(2) unsigned default 18 after name;

mysql> select name ,age from user;

mysql> select name,age,2018 - age as syear from user where name="root";

mysql> update user set age=age+1;

mysql> select name ,uid,gid,(uid+gid)/2 pjz from user where uid>=10 and uid<=30;

3.6.4聚集函数

mysql内值数据统计函数

前提:字段类型为数值类型

基本用法:

select 函数名(字段名) from 表名....;

函数名:

avg:求平均值;

sum:求和;

min:统计最小值;

max:统计最大值;

count:统计个数;常用于统计行号,因为字段值有多少个相当于有多少行;

eg:

mysql> select avg(uid) from user where id <=10;

mysql> select sum(uid) from user;

mysql> select min(uid) from user;

mysql> select max(uid) from user;

mysql> select count(id) from user;

mysql> select count(name) from user;

mysql> select count(gid) from user;

mysql> select count(*) from user;

ps:使用count函数时,可用*代表所有列,结果显示有值的数量,可对比最后三条命令找规律。

四、操作查询结果

4.1查询结果排序

sql查询 order by 字段名(通常时数值类型字段) [asc(升序,默认)|desc(降序)];

eg:

mysql> select uid,name from user where uid>=10 and uid <=1000 order by uid desc;

4.2查询结果分组

sql 查询 group by 字段名(通常时字符类型字段);

eg:

mysql> select shell from user where uid>=10 and uid <=1000 group by shell;

效果类似于去重;

4.3查询结果过滤(将查询得到的结果再进行抓取)

用法有3种:

sql 查询 having 条件表达式;

sql 查询 where 条件 having 条件表达式;

sql 查询 group by 字段名 having 条件表达式;

eg:

mysql> select name from user having name="mysql";

mysql> select id ,name from user where name like '%' having name is null;

mysql> select shell from user group by shell having shell="/bin/bash";

4.4 限制查询结果显示行数

sql 查询 where 条件 limit n; //显示查询结果的前n调记录;

sql 查询 where 条件 limit n,m; //从第n+1条记录开始显示m调记录;

eg:

mysql> select name,id from user where uid<=10 limit 3;

mysql> select name,id from user where uid<=10 limit 3,2;

ps:当使用n,m显示行数时,n=0时表示第一行;

五、mysql存储引擎

5.1mysql体系结构

5.2什么是mysql存储引擎?

作为可插拔式的组件提供,是mysql服务软件自带的功能程序,是处理表的处理器,在mysql服务中,不同的存储引擎有不同的功能和数据存储方式。

不同的存储引擎所建立的表在数据库目录下所建立的文件数也不一样。

5.3默认的存储引擎

mysql 5.0/5.1--->myisam;

mysql 5.5/5.6--->innodb;

5.4相关指令

mysql> show engines;//列出可用的存储引擎类型,support字段下值为default对应的引擎是默认引擎;

设置默认引擎:

修改/etc/my.cnf配置文件添加如下行然后重启服务:

[mysqld]

default-storage-engine=xxx

创建表时指定存储引擎类型eg:

mysql> create table t2(id int) engine=innodb;

查看表的存储引擎:

mysql> show create table t2;

修改表的存储引擎:

mysql> alter table t1 engine=innodb;

5.5存储引擎的特点

5.5.1 myisam特点:

1)一个表使用3个文件存储,分别是:

-.FRM存储表结构的文件

-.MYI 存储索引信息的文件

-.MYD 存储表记录(数据)的文件

2)不支持外键和事务

3)支持表级锁(给当前被访问的表加锁)

5.5.2 innodb特点:

1)一个表使用2个文件存储,分别是:

-.ibd存储数据+索引

-.frm 表结构

2)支持外键和事物和事务回滚

3)支持行级锁(只给当前被访问的那些行加锁)

5.5.3 memory特点:

数据不存储在硬盘上,存储在内存中,是一个临时表,在数据库目录下只有一个表结构文件

5.6 mysql锁机制

5.6.1 什么是mysql锁

为了解决并发访问冲突问题,对正在进行操作的表进行不同程度的上锁,限制他人访问;

5.6.2锁粒度

-行锁:对正在进行操作的行上锁,用不到的行不上锁;

-表锁:一次直接对整张表进行加锁;

-页级锁:对整个页面(mysql管理数据的基本存储单位)进行加锁;(给内存里面的东西加锁,内存里面1m为1页)

5.6.3锁类型:

-读锁:又叫共享锁,支持并发读操作,即一个客户端在进行select操作时,另一个客户端-同时访问,mysql发现该表是读锁,则说明该客户端也可以去读该表;

写锁,又叫排他锁,互斥锁,多用于insert/update/delete操作中,即一个客户端对某个表进行操作时,另一个客户端无法同时对该表进行读或修改,只能等上一个客户端操作完成,写锁自动解锁,才可以进行操作;

ps:

执行查询操作多的表适合使用myisam存储引擎,这样可以节省系统操作资源,因为myisam支持表级锁;

执行写操作多的表时则使用innodb存储引擎,这样可以加大并发访问,因为innodb支持行级锁,可以多人同时对不同行操作,但是由于上锁次数多,会消耗系统操作资源。

5.7mysql事务

5.7.1什么是事务?

一次sql操作的开始到结束的过程称为事务

5.7.2 事物回滚

在事务执行过程中,任意一步操作失败,恢复所有的操作。

5.7.3事务日志:

记录事务过程中对表执行过的每一步操作,当需要回滚时,可以通过事务日志进行回滚操作;

事务日志有3个文件,分别是:

-ibdate1:记录所有未提交的sql命令,执行回滚时就是还原这些未提交的sql命令,一旦正确提交,则被记录到ib_logfile中,无法再回滚

-ib_logfile0:所有已提交的sql命令;

-ib_logfile1所有已提交的sql命令;

典型例子:银行转账,转账任何一部操作不成功,钱都会返回账户

5.7.4事务的4个特性:

atomic:原子性

-事务的整个操作是一个不可分割的整体,要么全部成功,要么全部失败;

consistency:一致性

事务操作的前后,表中的记录没有变化;

lsolation:隔离性

事务操作是相互隔离不受影响的;

durabulity:持久性

数据一旦提交,不可改变,永久改变表数据

ps:

mysql默认设置了自动提交,设置后当用户敲下回车的瞬间,操作即被提交,因此在另一个客户端会立刻看到数据被写入,看不到提交前的隔离性,可通过自主设置不自动提交检验;

当指令报错,相当于操作失败,数据就进行回滚,返回到没有操作之前,在取消了自动提交后,也可以通过rollback进行数据回滚;

5.8相关指令及演示

5.8.1创建不同存储引擎的表,对比数据库目录下锁产生的文件

mysql> create database db3; use db3;

mysql> create table t1(id int)engine=innodb;

mysql> create table t2(id int)engine=myisam;

5.8.2 验证事务的隔离性

[root@host50 db3]# ls /var/lib/mysql/db3

db.opt t1.frm t1.ibd t2.frm t2.MYD t2.MYI

mysql> show status like 'table_lock%';

查看当前的锁状态

mysql> show variables like "%auto%";

显示与auto相关的变量,找到autocommit值为on,此为开启自动提交;

mysql> set autocommit=off;

关闭自动提交

mysql> insert into t1 values(3),(2),(10);

mysql> select * from t1;

得到结果:

此时再开一个终端进入数据库进行查看:

[root@host50 db3]# mysql -uroot -p123456 db3

在第一个终端上执行提交:

mysql> commit;

在第二个终端上进行查看:

5.8.3 验证事务回滚功能

mysql> delete from t1;

mysql> select * from t1;

Empty set (0.00 sec)

mysql> rollback;

mysql> select * from t1;

...

3 rows in set (0.00 sec)

ps:

回滚一定要发生在commit前,若提交了则无法回滚;

同样的操作在myisam存储引擎上无法实现,因为其不支持事务及事务回滚功能。

相关推荐

实战派 | Java项目中玩转Redis6.0客户端缓存

铺垫首先介绍一下今天要使用到的工具Lettuce,它是一个可伸缩线程安全的redis客户端。多个线程可以共享同一个RedisConnection,利用nio框架Netty来高效地管理多个连接。放眼望向...

轻松掌握redis缓存穿透、击穿、雪崩问题解决方案(20230529版)

1、缓存穿透所谓缓存穿透就是非法传输了一个在数据库中不存在的条件,导致查询redis和数据库中都没有,并且有大量的请求进来,就会导致对数据库产生压力,解决这一问题的方法如下:1、使用空缓存解决对查询到...

Redis与本地缓存联手:多级缓存架构的奥秘

多级缓存(如Redis+本地缓存)是一种在系统架构中广泛应用的提高系统性能和响应速度的技术手段,它综合利用了不同类型缓存的优势,以下为你详细介绍:基本概念本地缓存:指的是在应用程序所在的服务器内...

腾讯云国际站:腾讯云服务器如何配置Redis缓存?

本文由【云老大】TG@yunlaoda360撰写一、安装Redis使用包管理器安装(推荐)在CentOS系统中,可以通过yum包管理器安装Redis:sudoyumupdate-...

Spring Boot3 整合 Redis 实现数据缓存,你做对了吗?

你是否在开发互联网大厂后端项目时,遇到过系统响应速度慢的问题?当高并发请求涌入,数据库压力剧增,响应时间拉长,用户体验直线下降。相信不少后端开发同行都被这个问题困扰过。其实,通过在SpringBo...

【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案

在我们使用redis时,也会存在一些问题,导致请求直接打到数据库上,导致数据库挂掉。下面我们来说说这些问题及解决方案。1、缓存穿透1.1场景一个请求进来后,先去redis进行查找,redis存在,则...

Spring boot 整合Redis缓存你了解多少

在前一篇里面讲到了Redis缓存击穿、缓存穿透、缓存雪崩这三者区别,接下来我们讲解Springboot整合Redis中的一些知识点:之前遇到过,有的了四五年,甚至更长时间的后端Java开发,并且...

揭秘!Redis 缓存与数据库一致性问题的终极解决方案

在现代软件开发中,Redis作为一款高性能的缓存数据库,被广泛应用于提升系统的响应速度和吞吐量。然而,缓存与数据库之间的数据一致性问题,一直是开发者们面临的一大挑战。本文将深入探讨Redis缓存...

高并发下Spring Cache缓存穿透?我用Caffeine+Redis破局

一、什么是缓存穿透?缓存穿透是指查询一个根本不存在的数据,导致请求直接穿透缓存层到达数据库,可能压垮数据库的现象。在高并发场景下,这尤其危险。典型场景:恶意攻击:故意查询不存在的ID(如负数或超大数值...

Redis缓存三剑客:穿透、雪崩、击穿—手把手教你解决

缓存穿透菜小弟:我先问问什么是缓存穿透?我听说是缓存查不到,直接去查数据库了。表哥:没错。缓存穿透是指查询一个缓存中不存在且数据库中也不存在的数据,导致每次请求都直接访问数据库的行为。这种行为会让缓存...

Redis中缓存穿透问题与解决方法

缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...

Redis客户端缓存的几种实现方式

前言:Redis作为当今最流行的内存数据库和缓存系统,被广泛应用于各类应用场景。然而,即使Redis本身性能卓越,在高并发场景下,应用于Redis服务器之间的网络通信仍可能成为性能瓶颈。所以客户端缓存...

Nginx合集-常用功能指导

1)启动、重启以及停止nginx进入sbin目录之后,输入以下命令#启动nginx./nginx#指定配置文件启动nginx./nginx-c/usr/local/nginx/conf/n...

腾讯云国际站:腾讯云怎么提升服务器速度?

本文由【云老大】TG@yunlaoda360撰写升级服务器规格选择更高性能的CPU、内存和带宽,以提供更好的处理能力和网络性能。优化网络配置调整网络接口卡(NIC)驱动,优化TCP/IP参数...

雷霆一击服务器管理员教程

本文转载莱卡云游戏服务器雷霆一击管理员教程(搜索莱卡云面版可搜到)首先你需要给服务器设置管理员密码,默认是空的管理员密码在启动页面进行设置设置完成后你需要重启服务器才可生效加入游戏后,点击键盘左上角E...

取消回复欢迎 发表评论: