mysql专题上

发布于:2025-06-03 ⋅ 阅读:(26) ⋅ 点赞:(0)

连接服务器

mysql -h 127.0.0.1 -P 3306 -u root -p 

-h后接的是要连接的部署了mysql的主机,127.0.0.1指的是单机访问,如果没有指令则直接连接本地
-P后接的是端口号 一般是3306
-u后接的是要登入的用户
-p指要登陆密码
在这里插入图片描述
如果要退出可以直接quit
在这里插入图片描述

mysql和mysqld

mysql是数据库服务的客户端,mysqld是数据库服务的服务器端,所以MySQL本质上是基于CS模式的一种网络服务,既然是网络服务,那我们就可以查到端口号,数据库一般指的是未来我们在磁盘或者内存中存储的有特定结构或者组织的数据,而数据库服务一般指的是mysqld
在这里插入图片描述

在这里插入图片描述

MySQL的架构

在这里插入图片描述
第一层:做链接安全管理
第二层:词法语法分析
第三层:用用户指定的存储引擎去操作文件
在这里插入图片描述

第四层:内存/磁盘

sql语句分类

DDL

数据定义语言,用来维护存储数据的结构,比如说创建表或者修改表结构

DML

数据操纵语言,用来对数据进行操纵,比如说插入一条数据,删除一条数据

DCL

数据控制语言,主要负责权限管理和事务,比如说commit

数据库的操作

查看数据库

show databases;

在这里插入图片描述
如果我们想看数据库存放的文件,可以通过

vim /etc/my.cnf

查看datadir可以看到自己的数据库存储的内容放在哪一个目录下
在这里插入图片描述

在这里插入图片描述
如果我们想查看自己现在处于哪个数据库里,可以使用

select database();

在这里插入图片描述
如果想查看数据库的属性,可以使用

show create database d1;

在这里插入图片描述
如果想看此时的连接情况

show processlist;

在这里插入图片描述

创建数据库

本质上是在/var/lib/mysql目录下创建一个目录

create database [if not exists] databasename [specification];
sepcification:
	character set charset_name #字符集
	collate collation_name #校验规则
	#这两个字符集都符合就近原则

在创建数据库的时候有两个编码集,一个是数据库编码集,用于数据库未来存储数据,一个是数据库校验集,支持数据库字段比较使用的编码,这两个编码必须匹配,不同的校验规则作用不一样,有的导致大小写敏感,有的导致大小写不敏感等
在这里插入图片描述

在这里插入图片描述

如果想查看相应的编码集可以用以下指令

show variables like 'character_set_database';

在这里插入图片描述
如果想查看校验集可以使用

show variables like 'collation_database';

在这里插入图片描述
如果我们想查看所有数据库支持的编码集

show charset;

在这里插入图片描述
如果想查看所有校验集

show collation;

在这里插入图片描述

create database if not exists db1 charset=utf8 collate utf8_general_ci;

在这里插入图片描述
可以看到文件里也同步了
在这里插入图片描述

使用数据库

use databasename;

在这里插入图片描述

删除数据库

本质上是在/var/lib/mysql删除一个目录,删除之后有两个结果,第一是数据库内部看不到对应的数据库,第二个是数据库文件夹被删除,里面的数据表也全部被删除

drop database [if exists] databasename;
drop database db1;

在这里插入图片描述

修改数据库

alter database d1 charset=gbk;

在这里插入图片描述
/*!40100 DEFAULT CHARACTER SET gbk */这句话表示MySQL版本大于4.01,就执行后面这一句

数据库备份

备份
mysqldump -P 3306 -u root -p -B databasename > databasename.sql

-B指明数据库
如果备份的时候忘记带上-B,就可以先创建一个新数据库,然后再use这个数据库,再source还原
如果只是备份其中的表

mysqldump -P 3306 -u root -p -B databasename 表1 表2 > databasename.sql

如果要同时备份多个数据库

mysqldump -P 3306 -u root -p -B databasename1 databasename2 > databasename.sql

在这里插入图片描述
这里面也可以看到我们过去的动作
在这里插入图片描述

还原

在这里插入图片描述
可以看到现在是没有d1 的

source /var/lib/mysql/test1.sql

在这里插入图片描述
这样就有d1了
在这里插入图片描述

表的操作

创建表

创建的表是在磁盘中以二进制存放的普通文件

create table student(
	file1 datatype1 comment '注释',
	file2 datatype2,
	file3 datatype3...
)character set 字符集 collate 校验规则 engine 存储引擎;
create table student (
   id int,
   name varchar(20) comment '姓名',
   password varchar(50) comment '密码',
   age int,
   sex varchar(1),
   birthday timestamp,
   amout decimal(13,2),
   resume text
)character set utf8 engine MyISAM;#也可以用等号

在这里插入图片描述

在这里插入图片描述
而且我们可以看到不同的存储引擎的文件个数是不一样的
在这里插入图片描述

查看表

如果我们想查看表结构

desc tablename;

在这里插入图片描述
也可以

show create table tablename\G

在这里插入图片描述

修改表

修改表名
alter table tablename1 rename to tablename2;

在这里插入图片描述

新增一列
alter table tablename1 add column datatype;

在这里插入图片描述

修改一列的属性
alter table tablename1 modify column 新属性;

是把这一列创建的所有字段全部覆盖掉
在这里插入图片描述

删除一列
alter table tablename1 drop column;

在这里插入图片描述

修改列名称
alter table tablename1 change columnold columnnew 新定义;

在这里插入图片描述

数据类型

在这里插入图片描述
范围问题
float会自动四舍五入
在这里插入图片描述
这边创建一个表
在这里插入图片描述
关于tinyint有符号
在这里插入图片描述

关于tinyint无符号
在这里插入图片描述
如果我们插入的数据范围超过了指定的类型,mysql会直接阻止插入
在这里插入图片描述
add:如果是set和enum,可以用数字代替
在这里插入图片描述
如果需要找到set里的一部分,下图表示1在1,2这个集合里
在这里插入图片描述
在这里插入图片描述
也可以直接用数字
在这里插入图片描述

表的约束

空属性null和默认值default

一般不参与计算,包括null和not null
在这里插入图片描述
当在表中建立约束为not null的时候,在插入的时候这个字段必须有值,不能为空
在这里插入图片描述
在这里插入图片描述
如果设置了默认值,再执行一次刚才的插入
在这里插入图片描述
下图是修改后的表结构
在这里插入图片描述

在这里插入图片描述
如果我们没有指定一列要插入,默认使用的是default,但如果没有default为null,且有加not null约束,那就会报错

列描述comment

comment类似于c/c++里的注释
在这里插入图片描述

zerofill

可以看到int后面是有数字的
在这里插入图片描述
但如果加入zerofill
在这里插入图片描述
在这里插入图片描述
在插入数据的时候可以看到a和b是有区别的,zerofill的意思是,插入数据的宽度小于规定的宽度,如果多于规定的宽度则不变,mysql会自动补零进行显示,未来显示的表格是等宽的,存储的数据是不变的,只是显示有区别:
在这里插入图片描述

主键primary key

primary key不能为空,不能重复,一张表中只能有一个,通常是整数类型,在建表的时候自动加上not null非空约束
在这里插入图片描述
以下是不能为空和重复的证明
在这里插入图片描述
在这里插入图片描述

也可以这样创建
在这里插入图片描述
当表建好了之后可以添加主键

alter table 表名 add primary key(字段名);

也可以删除主键

alter table 表名 drop primary key;

也可以做一个复合主键,表示这几个合起来为主键,合起来不重复即可
在这里插入图片描述

自增长auto_increment

当对应的字段不给值会被自动触发,会选择表中字段最大的值+1,自增长字段必须有值,key列必须有值,也就是说本身必须是一个索引,一张表最多只能有一个自增长,在删除表中所有数据的时候,auto_increment不变
在这里插入图片描述
在这里插入图片描述
如果id修改了,最大值为1000,会从新的起始值开始插入
在这里插入图片描述
下图可以看到auto_increment是在表外的
在这里插入图片描述

唯一键unique key

唯一键不能重复,但可以为空,一个表中可以有多个唯一键
在这里插入图片描述
如果要删除唯一键,可以先用以下查找索引名称
在这里插入图片描述
在这里插入图片描述

外键foreign key

外键用于定义主表和从表的关系,主表必须有主键约束或者unique约束,在主表中的数据必须存在或者为null
在这里插入图片描述
在这里插入图片描述
不能插入主表没有的值,主表不能删除从表还在的值,比如说班级表必须保证学生表不能存在隶属于一个班级的学生后才能删除这个班级
在这里插入图片描述
在这里插入图片描述

表的增删改查

表的插入

insert into 表名 (列名) values (cloumn1,column2...);

如果要全列插入可以不写列名
在这里插入图片描述
也可以多行插入
在这里插入图片描述
插入否则更新
在这里插入图片描述
在这里插入图片描述
如果遇到主键冲突了可以变成更新操作,两行被影响表示冲突并修改,但不能和其他的主键唯一键冲突
在这里插入图片描述
如果不冲突是一行受影响,表示直接插入
在这里插入图片描述
如果插入的数据是一样的,则0行受影响
在这里插入图片描述
可以使用select row_count()查看有哪几行受影响
在这里插入图片描述

表的替换

insert into 表名 (列名) values (cloumn1,column2...);

如果不出现冲突,相当于直接插入
在这里插入图片描述

如果出现主键或者唯一键冲突,则删除后再插入,这里的主键是有设置auto_increment的,所以证明这是删除后重新插入的结果
在这里插入图片描述
两行受影响表示冲突后替换
在这里插入图片描述

表的查询

select
[distinct]{*|column1,column2...}
from table_name
where{...}
order by ...{asc|desc}
limit...
全列查询

在这里插入图片描述
但一般不会全部查询,因为数据传输量太大,也会影响索引的使用
所以可以用limit限定
在这里插入图片描述
也可以重命名,重命名不能用于where的筛选,但可以用于order by
在这里插入图片描述
如果想去重可以
在这里插入图片描述

where子句

null不参与比较运算
在这里插入图片描述
在这里插入图片描述

in(option1,option2…,)
select* from class where class_id in(1,2,3,4);

在这里插入图片描述

模糊匹配like

%表示可以匹配多个,_只能匹配一个
在这里插入图片描述
也可以使用not like
在这里插入图片描述

排序

order by用于对结果做排序,默认升序,asc表示升序,desc表示降序
在这里插入图片描述
也可以先对class_id做完排序后再对class_pid做排序,表示在class_id相等的情况下对class_pid做排序
在这里插入图片描述
如果null参与排序,它比任何值都要小
在这里插入图片描述

limit
limit n;取前几行
limit s n;取从s行开始的n行
limit n offset s;取从s行开始的n行

在这里插入图片描述
在这里插入图片描述

聚合函数

在这里插入图片描述
在这里插入图片描述

统计一个表中有多少个记录
在这里插入图片描述
统计有效数据
在这里插入图片描述
也可以直接去重
在这里插入图片描述
也可以先where在聚合函数
在这里插入图片描述
在这里插入图片描述

group by分组

在select中使用group by可以对指定列进行分组查询

select 聚合函数/分组列 as 重命名 from table where{...} group by 列1,列2,列3...;

在这里插入图片描述
经常配合having 配合使用,having类似于where

[select 聚合函数/分组列 as 重命名 from table where {...}] group by {列1,列2,列3..}{having...}

在这里插入图片描述
having是对分组后的结果进行筛选,where是对原来的表的任意行进行筛选,having也可以像where一样使用,因为一切都是表

表的更新

update tablename set column={exp...}
where{...}#如果没有where则会全列修改
order by{...}
limit{...} 

在这里插入图片描述
关于order by和limit
比如说我们需要找到class_id倒数三名的行,把class_pid设置为5
在这里插入图片描述

表的删除

```bash
delete from tablename
where{...}#如果没有where则会全列修改
order by{...}
limit{...} 

在这里插入图片描述

清空表

如果想删除整表数据,可以直接
在这里插入图片描述

截断表

无法针对性的对某数据做出删除,只能对整表使用,比delete更快,不经过事物,所以无法回滚,会重置auto_increment

truncate tablename;

在这里插入图片描述
在这里插入图片描述
但如果我们只是清空表,auto_increment是不会清0的,而truncate是会清0的
这张是delete
在这里插入图片描述
这张是truncate
在这里插入图片描述

删除表中重复记录

在这里插入图片描述

我们有一张这种表,需要去重,但不能直接用select,因为直接select只能查询,不能改变表内容,所以我们可以创建一张空的表,空的表要和原本的表结构一模一样,可以直接创建create,也可以直接用like语句创建,把去重后的结果插入这张表中,最后进行rename重命名
在这里插入图片描述
在这里插入图片描述

MySQL函数

日期函数

在这里插入图片描述

select 函数#在mysql中,select可以执行对应的函数

在这里插入图片描述

字符串函数

在这里插入图片描述
在这里插入图片描述

数学函数

在这里插入图片描述

其他函数

user()查询当前用户
md5(str)对一个字符串进行md5摘要,得到一个32位字符串
database()显示当前正在使用的数据库
ifnull(val1,val2)如果val1为空,返回val2,否则返回val1
password() MySQL使用这个函数对用户加密


网站公告

今日签到

点亮在社区的每一天
去签到