MySql(基础内容)
一、数据库概念基础
1、什么是数据库?什么是数据库管理系统 什么是sql 他们之间的关系
数据库:
–英文单词DataBase ,简称DB。
安装一定格式存储数据的一些文件的组合。
本质就是一款基于网络通信的数据管理软件,它以精妙的存储结构保存数据和索引,提供高效的检索算法和操作语句操作数据,他的本质还是文件。
数据库管理系统:
–DataBaseManagement ,简称DBMS。
专门用来管理数据库中的数据,数据库管理系统可以对数据库进行增删改查
常见的数据库管理系统:
常用的关系型数据库: MySQL,Oracle,MS SqlServer, DB2 等等
常用的非关系型数据库:Redis、MongoDB、Memcached、ES
SQL:结构化查询语言
程序员需要学习SQL语句,通过编写SQL语句, 然后DBMS复制执行sql语句 ,最终来完成数据库中数据的增删改查
SQL是一套标准,学习数据库主要学习的就是SQL语句, sql语句可以在多个数据库管理系统里面使用
关系: DBMS–执行—》sql----》操作-----DB
2、MySQL数据库结构
查询流程
-
Server 层
主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 mysql 的大多数核心服务功能,以及所有的内置函数
(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 -
Store 层
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。
现在最常用的存储引擎是 InnoDB,它从 mysql 5.5.5 版本开始成为了默认存储引擎。也就是说如果我们在 createtable 时不指定表的存储引擎类型,默认会给你设置存储引擎为 InnoDB。
3、有哪些索引
mysql 采用 B+tree 结构存储数据和索引,每一个磁盘块在 mysql 中是一个页,页大小是固定的,mysql innodb 的默认的页大小是 16k,每个索引会分配在页上的数量是由字段的大小决定。当字段值的长度越长,每一页上的数量就会越少,因此在一定数据量的情况下,索引的深度会越深,影响索引的查找效率,所以说字段大小定义一定要准确,字段太大不适合做索引。
主要的索引有:
聚集索引(主键索引)(聚簇索引)、普通索引、唯一索引、复合索引
-
唯一索引
一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时
检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。 -
聚簇索引
即主键索引,也叫聚集索引,存储数据的顺序和索引顺序一致,且一个表只能有一个聚簇索
引,因为物理存储只能有一个顺序。主键索引一般都是聚簇索引,索引的叶子节点就是数据,
如下图所示:
-
非聚簇索引
即普通索引,以指定的字段排序,叶子节点的值是主键索引主键值,所以要获取数据有一个
回表的动作,如下图所示:
-
复合索引
即多个列联合一起组成索引,索引的顺序是先按照第一列的顺序排,在第一列值相同的情
况下,再按照第二列排,依次类推。如下图所示:
更多索引信息写在另一个文章里面
4、最左前置原则
如果索引有多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且
不跳过索引中的列。
4、索引覆盖
只需要在一棵索引树上就可以获取 sql 所需所有的列数据,不需要回表,较之回表速度要更快,即所要的数据在索引上都有了,被索引覆盖到了。
5、Explain
6、小心回表操作
我们知道 innodb 采用 B+树聚集索引,
主键和数据绑定在一起,主键索引 b+树的叶子节点存储了数据信息,而普通索引叶子节点存储的是主键值。因此,我们可以得知当通过普通索引查询时无法直接定位行记录,通常情况下,需要扫描两遍索引树。
二、Mysql数据库
1、MYSQL的优点
开源:MySQL源代码免费下载
简单:体积小,便于安装
性能优越:性能足够与商业数据库媲美
开源功能强大:提供的功能足够与商业数据库媲美
mysql的系统数据库
information_schema:提供了访问数据库元数据的方式。
mysql:是mysql的核心数据库。
performance_schema :主要用于收集数据库服务器性能参数。
test : mysql创建的测试库。
2、安装
安装(自己百度)
注意事项
配置环境变量后 可以直接cmd 命令操作数据库
计算机–》右键----管理—服务和应用程序—服务----找mysql服务
services.msc 服务管理器中进行启动并在其中将其设置为手动启动(避免每次开机就启动消耗内存)
在命令提示中启动和关闭: net start mysql net stop mysql
端口号:
端口号port是任何一个软件/应用都会有,端口号是应用的唯一代表。
端口号通常和ip地址在一块,ip地址用来定位计算机,端口号port是用来定位计算机上的服务或者应用的!
在同一个计算机上,端口号不能重复,具有唯一性。
mysql数据库启动的 默认端口号是3306
3、字符编码方式
一般设置mysql数据库的字符编码为 UTF-8
4、mysql登录使用 (基本命令)
在Windows操作系统 启动和关闭mysql服务
net stop 服务名称 停止
net start 服务名称 启动
其他服务也可以这样启停
cmd
mysql -uroot -p密码;
登录成功显示:
C:\Users\15836>mysql -uroot -p密码
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.26 MySQL Community Server - GPL
Copyright © 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>
exit 退出数据库
show databases; 查看数据库 注意以英文分号结尾
mysql> show databases; +--------------------+ | Database | +--------------------+ | changed | | information_schema | | kong | | mysql | | performance_schema | | scooldb | | shopdb | | sys | | 星期六1032 | +--------------------+
怎么使用数据库 use
mysql》 use 数据库名;
mysql> use kong
Database changed
怎么创建数据库 create database
create database 数据库名;
mysql> create database sdfsdsdsd;
Query OK, 1 row affected (2.21 sec)
mysql>
查看数据库下的表
show tables mysql> use kong Database changed mysql> show tables; +----------------+ | Tables_in_kong | +----------------+ | class | | students | +----------------+
查看表中的数据
统一 select * from 表名;
查询 这个表名的所有数据
**mysql> select * from class;** +-----------+ | tab.class | +-----------+ | QY141 | | QY142 | | QY143 | +-----------+
mysql>
mysql> select * from students;
+----+------+-----+------------+---------+-------+ | id | name | age | phone | address | class | +----+------+-----+------------+---------+-------+ | 1 | dd | 43 | 1351059305 | 河南 | QY141 | | 2 | 王五 | 45 | 1967305940 | 郑州 | QY142 | | 3 | 李四 | 45 | 2342351323 | 北上广 | QY143 | | 4 | 张三 | 44 | 1232312321 | 深圳 | NULL | +----+------+-----+------------+---------+-------+
- 查询列 并给列起别名
select 字段 as 新字段 from 表
改中文用单引号连接
mysql> select class_id,class_name,remark as name from class; +----------+------------+------+ | class_id | class_name | name | +----------+------------+------+ | 4 | QY142 | mr | | 6 | QY142 | mr | +----------+------------+------+
注意 原表的列名 remark 还是叫remark
记住::selec语句永远的不会进行修改操作(因为select只负责查询)
as 关键字其实可以省略
没毛病
mysql> select class_id,class_name,remark name from class;
- 假设起别名的时候别名里面有空格怎么办
用引号起来 单双都行
mysql> select class_id,class_name,remark ' n ame' from class; +----------+------------+-------+ | class_id | class_name | n ame | +----------+------------+-------+ | 4 | QY142 | mr | | 6 | QY142 | mr | +----------+------------+-------+
注意::在所有数据库中字符串是用单引号括起来 这是个标准
双引号在oracle 数据库中是用不了的
查询表的结构
desc 表名;
describe 表名
desc是describe的缩写
mysql> desc students;
mysql> desc students; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | PRI | NULL | | | age | int | NO | PRI | NULL | | | phone | varchar(11) | YES | | NULL | | | address | varchar(255) | YES | | NULL | | | class | varchar(255) | YES | MUL | NULL | | +---------+--------------+------+-----+---------+----------------+
查询数据库版本
select version(); mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.26 | +-----------+
查询数据库名
select database(); mysql> select database(); +------------+ | database() | +------------+ | kong | +------------+
注意 mysql 是不见 ; 分号不执行 “;” 表示结束
\c 是终止一条命令的语句。
数据库的最基本要素、单元 表 table
数据库是以表格的形式存储数据的。
因为表比较直观
任何一个表都有行和列 行(row):被称为数据、记录。 列(column):被称为字段。
姓名字段,性别字段 ,年龄字段。
了解字段名 数据类型 约束等属性。
字段名可以理解为一个普通的名字见名知意
数据类型: 字符串 ,数字,日期等。 约束。
sql语句分类
分类好记
DQL:数据查询语言(凡是带有select关键字的都是查询语句)
—select,,,,
DML:数据操作语言(凡是对表当中的数据进行增删改查的都是DML)
— insert delete update
— insert增
— delete删
— update改
对表中的数据操作
DDL:
— 数据定义语言
— 凡是带有create,drop,alter 都是DDL
— DDL主要数组的是表的结构操作 不对表中的数据操作
— create:新建
— drop:删除
— alter:修改
TCL:
– 事务控制语言
– 包括:
— 事务提交:commit;
— 事务回滚:rollback;
DCL:
– 数据控制语言
—授予grant 撤销权限 revoke
记得
sql语句
语句是一次性的针对一个库重复执行没有意义还有可能报错
sql语句出去了的目的:备份,或者这个sql需要去其他数据库在执行一次
5、字段类型
数值型
类型 范围(有符号) 范围(无符号)
- Tinyint (-128,127) (0,255)
- Smallint (-32 768,32 767) (0,65 535)
- mediumint (-8 388 608,8 388 607) (0,16 777 215)
- Int (-2 147 483 648,2 147 483 647) (0,4 294 967 295)
- Bigint (-9 233 372 036 854 775 808,9 223 372 036 854 775 807)
(0,18 446 744 073 709 551 615) - Double (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201
4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7
E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7
E+308) - decimal(M,D) M最大为65,D最大为30 如果M>D,为M+2否则为D+2
依赖于M和D的值 例:DECIMAL(6,3) -999.999 到 9999.999
字符型
- 类型 大小 用途
- Char 0-255字节 定长字符串
- Varchar 0-65535 字节 变长字符串
- Text 0-65 535字节 长文本数据
- Longtext 0-4 294 967 295字节 极大文本数据
数据库:char定长字符串:char(6)_这个字段就占6个字节——存储6个得字节——字符1个字节
中文在mysql中,如果是latin1字符集下,一个中文汉字占2个字节数;如果是utf8字符集下,一个中文汉字占3个字节数;如果是gbk字符集下,一个中文汉字占2个字节数。在char6列中存值:a——占6个,不足得地方补空——手机号
邮编 身份证varchar(1000)——最长1000,给值为1占1个字节 12占两个,占位跟着实际内容走
日期型
- 类型 范围 格式 用途
- Date 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
- Time ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
- Year 1901/2155 YYYY 年份值
- Datetime 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD
HH:MM:SS 混合日期和时间值 - timestamp 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS
混合日期和时间值,时间戳 创建时间或者修改时间
二进制文件存到磁盘上,路径存到数据库里
- 类型 大小 用途
- Blob 0-65 535字节 二进制形式的长文本数据
- Mediumblob 0-16 777 215字节 二进制形式的中等长度文本数据
- Longblob 0-4 294 967 295字节 二进制形式的极大文本数据
6、数据完整性
概念:数据完整性(Data integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)
分类
实体完整性(Entity integrity)
域完整性(Domain integrity)
引用完整性(Referential integrity)
用户自定义完整性(User-defined intergrity)
实体完整性: 实体完整性在表中的约束体现为:必须可以唯一性的标志这一行。必须有抑或多个字段可以让我直接找到这一行而且只找到这一行。
7、 约束
PRIMARY KEY(主键) 约束:唯一 并且非空一个表只能有一个主键,一个主键可以包含1或者多列。——主键包含得多列组合一起保证唯一
AUTO_INCREMENT (自增) 约束:一般为主键服务。新增时无需指明本列值,系统会自动配置一个自动增长的数字
UNIQUE(唯一) 约束:唯一但是可以为空
8、简单查询
1、查询一个字段
select 字段名 from 表名; mysql> select name from students; +------+ | name | +------+ | 张三 | | dd | | 王五 | | 李四 | +------+
select和from都是关键字。 字段名和表名都是标识符; 强调: 对于SQL语句来说,都是通用的 所有sql语句都是以“;”结尾。 另外sql语句不分大小写,都行 2、查询两个字段,或者多个字段怎么办? 使用逗号隔开“,” select 字段,字段,字段 from 表名;
mysql> select name,age from students; +------+-----+ | name | age | +------+-----+ | 张三 | 44 | | dd | 43 | | 王五 | 45 | | 李四 | 45 | +------+-----+
**3.查询所有字段怎么办?** 第一种:吧所有字段都写上 第二种: 可以使用* select * from 表名; 这种方式的缺点: 1、效率低 2.可读性差 在实际开发中不建议,因为*在查询的时候需要转换才能在查询 就在dos命令 里用吧 想快速查看全表数据就用这
查询出12倍的值这
mysql> select * from class -> ; +----------+------------+--------+ | class_id | CLASS_NAME | remark | +----------+------------+--------+ | 4 | QY142 | mr | | 6 | QY142 | mr | +----------+------------+--------+
结论 字段可以使用数学表达式
mysql> select class_id*12,class_name from class; // +-------------+------------+ | class_id*12 | class_name | +-------------+------------+ | 48 | QY142 | | 72 | QY142 | +-------------+------------+
9、条件查询
什么是条件查询
不是将表中的数据都查出来,是查询符合条件的
语法格式
select 字段,字段,字段 from 表名 where 条件;
有哪些条件
+------+------+------+ | LO | UP | RAN | +------+------+------+ | 90 | 100 | A | | 80 | 89 | B | | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+------+
=等于 查询up等于100的信息
mysql> select *from grade1 where up=100; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 90 | 100 | A | +------+------+------+
<>或者!= 不等于 查询不等于100的信息
mysql> select * from grade1 where up!=100; --select * from grade1 where up<>100; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 80 | 89 | B | | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+------+
<小于
mysql> select * from grade1 where up<89; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+------+
<= 小于等于
mysql> select * from grade1 where up<=89; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 80 | 89 | B | | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+------+
》 大于
mysql> select * from grade1 where up>89; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 90 | 100 | A | +------+------+------+
》= 大于等于
mysql> select * from grade1 where up>=89; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 90 | 100 | A | | 80 | 89 | B | +------+------+------+
between 。。。 and。。
注意 :数据必须是左小右大 between and是闭区间,包括两端的值
一 mysql> select * from grade1 where up<=89 and up>=59; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 80 | 89 | B | | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+------+ 二 mysql> select * from grade1 where up between 59 and 89; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 80 | 89 | B | | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+------+
is null 为 null (is not null 不为空)
查询 那些数据为空的
select * from 表 where 字段=null; 等号这种是不成功 select * from 表 where 字段is null ; 必须是is null
注意: 在数据库当中null不能使用等号进行衡量。需要使用 is null
因为数据库中的null代表什么也没有 , 他不是一个值,所有不能使用等号来衡量
查询不为空
select * from 表 where 字段 is not null;
and 并且
and的两个条件 必须都满足
mysql> select * from grade1 where up<=89 and up>=59; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 80 | 89 | B | | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+------+
or 或者
两个 条件必须都满足
select * from 表 where 条件1 or 条件2 mysql> select * from grade1 where up=89 or up=59; mysql> select * from grade1 where up=89 or up=59; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 80 | 89 | B | | 0 | 59 | E | +------+------+------+
and 的和 or 同时出现有优先级的问题吗?
and 会优先先执行 。 如果想人or先执行,需要加‘’小括号‘’
以后如果不确定优先级就加小括号就行了;
in 包含 ,相对于多个 or (not in 不在这个范围) 不是范围 是具体的几个值
select * from grade1 where up in(89,59)
+------+------+------+ | LO | UP | RAN | +------+------+------+ | 80 | 89 | B | | 0 | 59 | E | +------+------+------+
not not 取非 ,主要用在 is 或 in 中 不在 这个取值
mysql> select * from grade1 where up not in(89,59); +------+------+------+ | LO | UP | RAN | +------+------+------+ | 90 | 100 | A | | 70 | 79 | C | | 60 | 69 | D | +------+------+------+
is null
is not null
in
not in
like
----------- like 称为模糊查询,支持%或下划线匹配
-----------%匹配任意个字符串
-----------下划线,一个下划线只匹配一个字符 (%和_是一个特殊符号)
含有9的 mysql> select * from grade1 where up like '%9%'; +------+------+------+ | LO | UP | RAN | +------+------+------+ | 80 | 89 | B | | 70 | 79 | C | | 60 | 69 | D | | 0 | 59 | E | +------+------+------+ 以9结尾的 ‘%9’ 以9开始的 ‘9%’ 找到第二个数是9的 ‘_9%’ 一个下划线匹配一个字符 下划线怎么找? 用转义字符 \ '%\_%' 查下划线
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器