MYSQL (基础内容)一

本文详细介绍了MySQL数据库的基础知识,包括数据库、数据库管理系统(DBMS)和SQL的概念,以及MySQL数据库的优缺点。重点讲解了MySQL的索引类型、查询流程、常用命令,如连接数据库、创建和删除数据库、查询数据等。此外,还讨论了字段类型、数据完整性、条件查询等核心概念,帮助读者全面理解MySQL数据库的使用。
摘要由CSDN通过智能技术生成

一、数据库概念基础

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、字段类型

数值型
类型 范围(有符号) 范围(无符号)

  1. Tinyint (-128,127) (0,255)
  2. Smallint (-32 768,32 767) (0,65 535)
  3. mediumint (-8 388 608,8 388 607) (0,16 777 215)
  4. Int (-2 147 483 648,2 147 483 647) (0,4 294 967 295)
  5. Bigint (-9 233 372 036 854 775 808,9 223 372 036 854 775 807)
    (0,18 446 744 073 709 551 615)
  6. 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)
  7. 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  * fromwhere 字段=null;  等号这种是不成功
select * fromwhere 字段is null ; 必须是is null

注意: 在数据库当中null不能使用等号进行衡量。需要使用 is null
因为数据库中的null代表什么也没有 , 他不是一个值,所有不能使用等号来衡量
查询不为空

  select * fromwhere 字段 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 * fromwhere 条件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%’ 一个下划线匹配一个字符
下划线怎么找?
用转义字符 \
'%\_%' 查下划线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Network porter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值