一.故事剧情
接下来要进入到一条比较长的路——mysql数据库,之后会用一段时间来学习mySQL数据库的内容,今天先从基础开始介绍mysql数据库。
二.MySQL数据库概述
1.数据库概念
数据库(Database)
简称DB,按照一定格式存储数据的一些文件的组合,顾名思义就是存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据 。数据库管理数据有诸多优点,如降低存储数据的冗余度,存储的数据可以共享,便于维护数据完整性,能够实现数据的安全性等。数据库的发展经历了萌芽、初级、中级、和高级阶段。
数据库管理系统(DateBase Management System)
简称DBMS,数据库管理系统是专门用来管理数据库中的数据的,可以对数据库当中的数据进行增、删、改、查 等操作,常见的数据库管理系统:MySql、Oracle、MS SQLServer(淘汰)、DB2、sysbase等…postgreSQL
SQL(Structured Query Language)
结构化查询语言,针对关系型数据库的一种语言;SQL 是一种操作数据库的语言,包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL在MySql中可以使用,同时在Oracle中也可以使用,在DB2中也可以使用 。
2.数据库的类型
关系型数据库(存储位置在磁盘)
-
MariaDB/MySQL
-
Oracle
-
DB2
-
MS SQLServer,只能用于windows系统
国产数据库
-
达梦
-
人大金仓
-
TiDB,分布式关系型数据库
NOSQL数据库
-
Redis,缓存数据库
-
MongoDB,文档型数据库
3.关系型数据库模型
-
层次模型
-
网状模型
-
关系模型
关系模型的相关概念:
-
实体(Entity) :实体是指现实世界中可以区分的对象,它可以是具体的人、事物或概念,也可以是抽象的物体。在数据库中,实体通常对应于表中的行,而表则实体的一种集合。例如,在一个学生信息管理系统中,学生、课程和教师都可以被视为实体。
-
属性(Attribute): 属性是实体的特征或性质,它提供了关于实体的具体信息。属性可以是简单的数据类型,如姓名、年龄或地址,也可以是更复杂的结构,如电话号码或电子邮件地址。在数据库中,属性通常对应于表中的列,每列代表实体的一种属性。例如,学生的姓名、学号和年龄都是学生的属性。
-
联系(Relationship): 联系描述了不同实体之间的关系。在现实世界中,实体之间往往存在各种形式的关联。在数据库中,联系通过关系表来实现,这个表通常包含两个或更多的实体作为表的列。例如,学生选修课程的关系表就包含了学生实体和课程实体的相关信息,描述了哪位学生选修了哪门课程。
在关系模型中,实体和联系通常通过以下三种类型来进一步分类:
-
一对一(1:1):这种联系表示两个实体之间存在一对一的关系,即每个实体只有一个相关的实体,反之亦然。例如,一个部门与一个负责人之间可能存在一对一的联系。
-
一对多(1:N):这种联系表示一个实体与多个实体相关,但每个相关实体只与一个实体相关。例如,一个教师可以教授多门课程,但每门课程只能由一个教师教授。
-
多对多(M:N):这种联系表示两个实体之间存在多对多的关系,即每个实体可以与多个实体相关,同时每个相关实体也可以与多个实体相关。例如,学生可以选修多门课程,同时每门课程也可以被多个选修。
在设计数据库时,正确地识别实体、属性和联系,以及它们之间的类型,对于创建一个结构良好、能够有效存储和检索数据的数据库至关重要。
4.关系数据库相关概念
-
库(Database): 库是一个存储数据的容器,它可以包含多个数据库。在某些管理系统中,库等同于数据库。
-
表(Table): 表是数据库中的一个表格,由行和列组成。表是存储数据的主要结构,每个表通常对应一个实体类型。表的列名称为属性,而表的行名称为记录。
-
行(Record): 行也称为记录,它是表中的一个单元,代表表中的一个具体实例。每一行包含了一组属性值,这些值共同描述了一个实体的状态。
-
列(Column): 列是表中的一列,它代表了表的一个属性。每列都有一个数据类型,用于定义存储在其中的数据的种类和格式。
-
字段(Field): 字段通常指的是表中的行与列的交叉点,它存储了单个数据项。在数据库中,每个字段都有其特定的数据类型和用途。
-
数据(Data): 数据是存储在数据库中的信息。它可以是文本、数字、日期、图像、声音等各种形式。数据是数据库管理和操作的核心。
二、MySQL数据库安装(CentOS7)
1.先下载安装源
https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
2.解压安装
然后解压到/usr/local下,并重命名
然后新建用户和组(将数据库开在新建用户上可以保证对系统绝大部分位置是不可写的,这样当数据库被攻击时可以限制受到的影响)
3.文件授权
然后将mysql目录授权给用户mysql
然后去根下创建一个用来存放数据库数据的文件,并且授权
4.修改配置文件
然后去/etc/my.cnf修改配置文件(将原有的注释掉)
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql8
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
lower_case_table_names=1[client]
default-character-set=utf8mb4
socket=/tmp/mysql.sock[mysql]
default-character-set=utf8mb4
socket=/tmp/mysql.sock
5.初始化信息
回到/usr/local/mysql8/bin/下,初始化基础信息,得到数据库的初始密码
参数: --basedir 为mysql解压目录,–datadir 为mysql数据存放目录。(注意安装路径是否一致)
6.创建MySQL服务
复制 mysql.server文件到/etc/init.d/并重命名为mysqld
此时启动mysqld服务,并检查状态
7.更改环境变量
然后再去/etc/profile,去编辑一下环境变量,再最下边加上
然后立即生效环境变量
8.登录数据库并改写密码
此时使用命令 mysql -uroot -p ,并且输入默认生成的密码即可进入数据库
第一次登录需要更改密码,需要满足复杂度要求
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx';
此时使用命令,会提醒你更改密码,使用命令更改结束后即可使用命令。
三.mysqld数据库配置与命令
服务启动时读取的默认配置文件
mysqld操作命令
mysql命令
mysql数据库登录的命令行工具,本地登录时且root用户没有密码,输入mysql,等效于”mysql -uroot -hlocalhost -P3306“
mysql [options] db_name
常用选项
选项 | 含义 |
-u | 指定登录用户 |
-p | 指定用户密码 |
-h | 指定登录数据库的IP或者域名 |
-P | 指定登录数据库的端口号 |
-e | 能够在终端执行数据库指令 |
使用案例
#直接在外部执行查看数据库的命令
mysqladmin命令
语法
mysqladmin [options] command [command-arg] [command [command-arg]] ...
设置root用户密码
mysqladmin -uroot password '123.com'
使用密码登录
mysql -uroot -p123.com -h127.0.0.1 -P3306
四、默认数据库
information_schema
信息数据库,存储所有的库、表、列的名称,任意可登录数据库的用户都可读;sql注入
表名 | 作用 |
---|---|
CHARACTER_SETS | 字符集信息表。用于查看和管理MySQL数据库中的字符集信息。 |
CLIENT_STATISTICS | 客户端统计信息表。用于查看和管理客户端的统计信息,例如连接数、请求次数等。 |
COLLATIONS | 排序规则信息表。用于查看和管理MySQL数据库中的排序规则信息。 |
COLLATION_CHARACTER_SET_APPLICABILITY | 字符集和排序规则的适用性表。用于查看和管理字符集和排序规则之间的适用关系。 |
COLUMNS | 数据表的列信息表。用于查看和管理MySQL数据库中数据表的列信息。 |
COLUMN_PRIVILEGES | 列级别的权限信息表。用于查看和管理列级别的权限信息,例如用户对各个列的SELECT、INSERT、UPDATE等权限。 |
ENGINES | 存储引擎信息表。用于查看和管理MySQL数据库中支持的存储引擎信息。 |
EVENTS | 定时事件信息表。用于查看和管理MySQL数据库中的定时事件信息。 |
FILES | 文件信息表。用于查看和管理MySQL数据库服务器上文件的信息。 |
GLOBAL_STATUS | 全局状态信息表。用于查看和管理MySQL数据库服务器的全局状态信息。 |
GLOBAL_VARIABLES | 全局变量信息表。用于查看和管理MySQL数据库服务器的全局变量信息。 |
INDEX_STATISTICS | 索引统计信息表。用于查看和管理MySQL数据库中索引的统计信息。 |
KEY_CACHES | 键缓存表。用于查看和管理MySQL数据库中的键缓存信息。 |
KEY_COLUMN_USAGE | 键列使用表。用于查看和管理键列的使用情况。 |
PARAMETERS | 参数表。用于查看和管理MySQL数据库的参数信息,例如连接超时时间、最大连接数等。 |
PARTITIONS | 分区表。用于查看和管理MySQL数据库中的分区信息。 |
PLUGINS | 插件表。用于查看和管理MySQL数据库中的插件信息。 |
PROCESSLIST | 进程列表表。用于查看当前正在运行的MySQL进程,包括连接的客户端和正在执行的查询等。 |
PROFILING | 性能分析表。用于启用性能分析,记录和分析SQL查询的性能数据。 |
REFERENTIAL_CONSTRAINTS | 外键约束表。用于查看和管理外键约束的信息,包括外键列和参考列等。 |
ROUTINES | 存储过程和函数表。用于查看和管理MySQL数据库中的存储过程和函数的信息,包括创建时间、修改时间、函数名等。 |
SCHEMATA | 架构表。用于查看和管理MySQL数据库中的架构信息,包括架构名、架构下的表名等。 |
SCHEMA_PRIVILEGES | 架构权限表。用于查看和管理架构下的权限信息,包括用户对架构下表的SELECT、INSERT、UPDATE等权限。 |
SESSION_STATUS | 会话状态信息表。用于查看和管理当前会话的状态信息,例如会话的连接时间、查询时间等。 |
SESSION_VARIABLES | 会话变量表。用于查看和管理当前会话的变量信息,例如会话的最大连接数、最大内存使用量等。 |
STATISTICS | 统计信息表。用于查看和管理MySQL数据库中表的统计信息,包括表的行数、平均行大小等。 |
TABLES | 数据表信息表。用于查看和管理MySQL数据库中的数据表信息,包括表名、引擎类型等。 |
TABLESPACES | 存储空间表。用于查看和管理MySQL数据库中的存储空间信息,包括存储空间名、大小等。 |
TABLE_CONSTRAINTS | 表约束信息表。用于查看和管理表的约束信息,包括主键约束、外键约束等。 |
TABLE_PRIVILEGES | 表级别的权限信息表。用于查看和管理表级别的权限信息,例如用户对各个表的SELECT、INSERT、UPDATE等权限。 |
INNODB_CMPMEM_RESET | InnoDB 内存比较器重置表。此表用于记录 InnoDB 内存比较器(comparison memory)的清除操作。 |
INNODB_RSEG | InnoDB 重做段表此表用于记录 InnoDB 数据文件的重做段信息。 |
INNODB_UNDO_LOGS | InnoDB 撤销日志表。此表用于记录 InnoDB 撤销操作的日志信息。 |
INNODB_CMPMEM | InnoDB 内存比较器表。此表用于记录 InnoDB 内存比较器的分配和使用情况。 |
INNODB_SYS_TABLESTATS | InnoDB 系统表统计信息表。此表用于记录 InnoDB 系统表的统计信息,如数据量、碎片率等。 |
INNODB_LOCK_WAITS | InnoDB 锁等待信息表。此表记录 InnoDB 锁等待的情况,包括等待锁的线程 ID、等待时间等。 |
INNODB_INDEX_STATS | InnoDB 索引统计信息表。此表用于记录 InnoDB 索引的统计信息,如索引大小、索引列的数据类型等。 |
INNODB_CMP | InnoDB 比较器表。此表用于记录 InnoDB 比较器的分配和使用情况。 |
INNODB_CHANGED_PAGES | InnoDB 更改页表。此表用于记录 InnoDB 数据文件中已更改的页的信息。 |
INNODB_BUFFER_POOL_PAGES | InnoDB 缓冲池页表。此表用于记录 InnoDB 缓冲池中每个页的信息,包括页的类型、页的状态等。 |
INNODB_TRX | InnoDB 事务表。此表用于记录 InnoDB 事务的信息,如事务 ID、事务状态等。 |
INNODB_BUFFER_POOL_PAGES_INDEX | InnoDB 缓冲池页索引表。此表用于记录 InnoDB 缓冲池中每个页的索引信息。 |
INNODB_LOCKS | InnoDB 锁表。此表用于记录 InnoDB 锁的信息,如锁的类型、锁的持有者等。 |
INNODB_BUFFER_PAGE_LRU | InnoDB 缓冲池页 LRU 表。此表用于记录 InnoDB 缓冲池中每个页的最近最少使用(Least Recently Used,LRU)信息。 |
INNODB_SYS_TABLES | InnoDB 系统表信息表。此表用于记录 InnoDB 系统表的信息,如表名、表状态等。 |
INNODB_SYS_FIELDS | InnoDB 系统字段信息表。此表用于记录 InnoDB 系统表中每个字段的信息,如字段名、字段类型等。 |
INNODB_SYS_COLUMNS | InnoDB 系统列信息表。此表用于记录 InnoDB 系统表中每个列的信息,如列名、列类型、列长度等。 |
INNODB_SYS_STATS | InnoDB 系统统计信息表。此表用于记录 InnoDB 系统统计信息,如表数量、数据量等。 |
INNODB_SYS_FOREIGN | InnoDB 系统外键信息表。此表用于记录 InnoDB 系统表中外键的信息,如外键约束条件等。 |
INNODB_SYS_INDEXES | InnoDB 系统索引信息表。此表用于记录 InnoDB 系统表中索引的信息,如索引名、索引类型等。 |
mysql
主数据库,mysqld运行的必须数据库,用户与配置信息
表名称 | 作用 |
---|---|
columns_priv | 保存了每个表的列级别的权限信息,包括用户对各个列的SELECT、INSERT、UPDATE、REFERENCES等权限。 |
db | 保存了每个数据库的权限信息,包括用户对每个数据库的CREATE、ALTER、DROP等权限。 |
event | 保存了MySQL中的事件信息,包括事件的名称、执行时间、执行语句等。 |
func | 保存了用户定义的存储函数的信息,包括函数的名称、参数、返回类型等。 |
general_log | 记录了MySQL服务器上所有的日志操作,包括查询、连接、错误日志等。 |
help_category | 保存了MySQL帮助文档中的分类信息,用于帮助查找和浏览文档。 |
help_keyword | 保存了MySQL帮助文档的关键字信息,用于快速搜索和查找文档。 |
help_relation | 保存了MySQL帮助文档中关键字之间的关系信息,用于帮助构建文档的结构。 |
help_topic | 保存了MySQL帮助文档的具体内容信息,包括每个主题的标题、内容等。 |
host | 保存了MySQL服务器上的主机信息,包括主机名、IP地址、连接权限等。 |
ndb_binlog_index | 保存了使用NDB存储引擎的MySQL服务器上的二进制日志索引信息。 |
plugin | 保存了MySQL服务器上安装的插件信息。 |
proc | 保存了用户定义的存储过程的信息,包括过程的名称、参数、语句等。 |
procs_priv | 保存了用户对存储过程的访问权限信息。 |
proxies_priv | 保存了MySQL服务器上的代理用户的权限信息。 |
servers | 实验性表,保存了MySQL服务器的外部服务器和复制配置信息。 |
slow_log | 记录了MySQL服务器上执行时间超过默认阈值的慢查询日志。 |
tables_priv | 保存了用户对表的访问权限信息。 |
time_zone | 保存了MySQL服务器上的时区信息。 |
time_zone_leap_second | 保存了时区闰秒的信息。 |
time_zone_name | 保存了时区的名称和相关信息。 |
time_zone_transition | 保存了时区的变化规则和信息。 |
time_zone_transition_type | 保存了时区变化类型的信息。 |
user | 保存了MySQL服务器上的用户账号信息,包括用户名、密码、权限等。 |
performance_schema
性能数据库,存储mysqld的资源使用、安全策略权限配置信息
表名 | 作用 |
---|---|
cond_instances | 条件实例表,该表用于存储各种条件或锁定的实例信息 |
events_waits_current | 当前等待事件表,记录了当前正在等待某个事件发生的线程或会话信息 |
events_waits_history | 历史等待事件表,记录了过去一段时间内等待事件的信息,包括等待事件的类型、等待时间等 |
events_waits_history_long | 长期等待事件表,记录了长时间等待事件的信息,包括等待事件的类型、等待时间、等待时长等 |
events_waits_summary_by_instance | 按实例总结等待事件表,提供了按实例总结的等待事件统计信息 |
events_waits_summary_by_thread_by_event_name | 按线程和事件总结等待事件表,提供了按线程和特定事件总结的等待事件统计信息 |
events_waits_summary_global_by_event_name | 按全局和事件总结等待事件表,提供了按全局和特定事件总结的等待事件统计信息 |
file_instances | 文件实例表,记录了数据库中各个文件的信息,包括文件路径、文件大小等 |
file_summary_by_event_name | 按事件名总结文件表,提供了按特定事件名总结的文件统计信息 |
file_summary_by_instance | 按实例总结文件表,提供了按实例总结的文件统计信息 |
mutex_instances | 互斥体实例表,记录了数据库中各个互斥体的信息,包括互斥体的名称、状态等 |
performance_timers | 性能计时器表,提供了数据库性能的计时信息,包括执行时间、资源使用情况等 |
rwlock_instances | 读写锁实例表,记录了数据库中各个读写锁的信息 |
setup_consumers | 设置消费者表,记录了数据库设置的各种消费者信息 |
setup_instruments | 设置仪器表,记录了数据库设置的各类性能指标信息 |
setup_timers | 设置定时器表,记录了数据库设置的各类定时器信息 |
threads | 线程表,记录了数据库中的各个线程信息,包括线程ID、线程状态等 |
sys库
五、 SQL语言
-
DDL:数据定义语言,对数据库结构操作
create:创建(用户,库,表)
alter:改变
drop:删除
-
DML:数据操作语言,对数据表的操作
insert:插入
update:更新
delete:删除数据
-
DCL:数据控制语言,针对用户权限设置
grant:用户赋权
revoke:移除用户权限
-
DQL:数据查询语言,对数据表的操作
select:查询
六、mysqld数据类型
常用的数据类型有:
1、整型
整数类型 | 占用字节 | 无符号数的取值范围 | 有符号数的取值范围 |
---|---|---|---|
TINYINT | 1 | 0~255 | -128~127 |
SMALLINT | 2 | 0~65535 | -32768~32767 |
MEDIUMINT | 3 | 0~16777215 | -8388608~8388607 |
INT | 4 | 0~4294967295 | -2147483648~2147483647 |
BIGINT | 8 | 0~18446744073709551615 | -9223372036854774808~9223372036854774807 |
整数列的可选属性有三个:
-
M: 宽度(在0填充的时候才有意义,否则不需要指定)
-
unsigned: 无符号类型(非负)
-
zerofill: 0填充,(如果某列是zerofill,那么默认就是无符号),如果指定了zerofill只是表示不够M位时,用0在左边填充,如果超过M位,只要不超过数据存储范围即可
在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 bytes 的存储空间。
各整数数据类型的使用场所
数据类型 | 应用场景 |
---|---|
TINYINT | 一般用于枚举数据,比如系统设定取值范围很小且固定的场景。 |
SMALLINT | 可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等。 |
MEDIUMINT | 用于较大整数的计算,比如车站每日的客流量等。 |
INT、INTEGER | 取值范围足够大,一般情况下不用考虑超限问题,用得最多。比如商品编号。 |
BIGINT | 只有当你处理特别巨大的整数时才会用到。比如双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等。 |
2、浮点型
数据类型 | 字节数 | 取值范围 |
---|---|---|
FLOAT | 4 | -2^128~2 ^128,即-3.40E+38~+3.40E+38 |
DOUBLE | 8 | -2^1024~ 2^1024,即-1.79E+308~1.79E+308 |
-
当浮点数类型使用unsigned修饰无符号时,取值范围将不包含负数。
-
浮点数的取值范围是理论上的极限值,但根据不同的硬件或操作系统,实际范围可能会小。
-
浮点数虽然取值范围很大,但精度并不高。float类型的精度为6位或7位,double类型的精度大约为15位。
-
如果给定的数值超出精度,可能会导致给定的数值与实际保存的数值不一致,发生精度损失。
-
当一个数字的整数部分和小数部分加起来达到7位时,第7位就会进行四舍五入操作。
-
要避免使用“=”来判断两个浮点数是否相等,因为浮点数是不准确的,存在精度损失。
3、BIT类型
函数 | 函数用途 |
---|---|
BIT(M) | 存储二进制数据 |
ASCll(M) | 获取M的ASCll值 |
BIN(M) | 获取M的二进制值 |
LENGTH(M) | 获取M的数字长度 |
-
BIT数据类型可用来保存位字段值。BIT(M)类型允许存储M位值。M范围为1~64,默认为1。
-
BIT其实就是存入二进制的值,类似010110。如果存入一个BIT类型的值,位数少于M值,则左补0。如果存入一个BIT类型的值,位数多于M值,MySQL的操作取决于此时有效的SQL模式:如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。
-
对于位字段,直接使用SELECT命令将不会看到结果,可以用bin()或hex()函数进行读取。
4、定点型
-
DECIMAL在MySQL内部以字符串形式存放,比浮点数更精确。定点类型占M+2个字节
-
DECIMAL(M,D)与浮点型一样处理规则。M的取值范围为0~65,D的取值范围为0~30,而且必须<=M,超出范围会报错。
-
DECIMAL如果指定精度时,默认的整数位是10,默认的小数位为0。
-
NUMERIC等价于DECIMAL。
-
例如,DECIMAL(5,2)表示的取值范围为-999.99~999.99。
5、日期时间类型
数据类型 | 字节 | 取值范围 | 日期格式 | 零值 |
---|---|---|---|---|
YEAR | 1 | 1901~2155 | YYYY | 0000 |
DATE | 3 | 1000-01-01~9999-12-31 | YYYY-MM-DD | 0000-00-00 |
TIME | 3 | -838:59:59~838:59:59 | HH:MM:SS | 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 1970-01-01 00:00:01~2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 0000-00-00 00:00:00 |
YEAR类型
YEAR类型用来表示年份,在所有的日期时间类型中所占用的存储空间最小,只需要1个字节的存储空间,格式为YYYY。
在MySQL中,可使用以下3种格式指定TEAR类型的值:
使用4位字符串或数字表示,为2025'2155或20252155。
例如,输入2022或’2022,插入到数据库中的值均为2022.
使用两位字符串表示,为00~99。
00 ~ '69的值会被转换为2000~2069的YEAR值
70 ~ '99的值会被自动转换为1970~1999的YEAR值
例如,输入22,插入到数据表中的值为2022。
使用两位数字表示,为1~99。
1 ~ 69的值会被转换为2001~2069的YEAR值
70 ~ 99的值会被自动转换为1970~1999的YEAR值
例如,输入22,插入到数据表中的值为2022。
注意:
当使用YEAR类型时,一定要区分0和0。
数字格式的0表示的YEAR值为0000
字符串格式的0表示的YEAR值为2000
DATE类型
DATE类型用来表示日期值,不包含时间部分,需要 3个字节 的存储空间,且其格式为 YYYY-MM-DD 。其中,YYYY表示年份,MM表示月份,DD表示日期。
在MySQL中,可以使用以下4种格式指定DATE类型的值:
以YYYY-MM-DD或者YYYYMMDD字符串格式表示。
以YY-MM-DD或者YYMMDD字符串格式表示。
以YY-MM-DD或者YYMMDD数字格式表示。
使用CURRENT_DATE或者NOW()输入当前系统日期。
注意:
通过"SELECT CURRENT_DATE;"或者"SELECT NOW();"可查询当前日期。
日期中的分隔符"-“,还可以使用”.“”,“”/"等符号来表示。
TIME类型
TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中HH表示小时,MM表示分,SS表示秒。
在MySQL中,可以使用以下3种格式指定TIME类型的值:
以HHMMSS字符串或者HHMMSS数学格式表示。
以HH:MM:SS字符串格式表示。
使用CURRENT_TIME或NOW()输入当前系统时间。
DATETIME类型
DATETIME类型在所有的日期时间类型中占用的存储空间最大,总共需要 8 个字节的存储空间,用来表示日期和时间,它的显示形式为YYYY-MM-DD HH:MM:SS。
在MySQL中,可以使用以下4种格式指定DATETIME类型的值:
以YYYY-MM-DD HH:MM:SS或YYYYMMDDHHMMSS字符串格式表示的日期和时间,取值范围为1000-01-01 00:00:00~9999-12-31-23-59-59。
以YY-MM-DD HH:MM:SS或YYMMDDHHMMSS字符串格式表示的日期和时间,
以YYYYMMDDHHMMSS或YYMMDDHHMMSS数字格式表示的日期和时间,
使用NOW()来输入当前系统的日期和时间。
TIMESTAMP类型
TIMESTAMP(时间戳)类型用于表示日期和时间,需要4个字节的存储空间,它的显示形式与DATETIME类型的相同,但取值范围比DATETIME类型的小。
TIMESTAMP类型与DATETIME类型的不同形式:
使用CURRENT_TIMESTAMP来输入系统当前的日期和时间。
无任何输入,或输入NULL时,实际保存的是系统当前日期和时间。
6、字符串型
数据类型 | 类型说明 |
---|---|
CHAR | 固定长度字符串 |
VARCHAR | 可变长度字符串 |
TEXT | 大文本数据 |
ENUM | 枚举类型 |
SET | 字符串类型 |
BINARY | 固定长度的二进制数据 |
VARBINARY | 可变长度是二进制数据 |
BLOB | 二进制大对象 |
CHAR和VARCHAR类型
CHAR和VARCHAR类型都是用来保存字符串数据,两者不同的是,VARCHAR可以存储可变长度的字符串数据。
字符串类型 | 特点 | 长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|---|
CHAR(M) | 固定长度 | M | 0<=M<=255 | M个字节 |
VARCHAR(M) | 可变长度 | M | 0<=M<=65535 | (实际长度 + 1) 个字节 |
TEXT类型
TEXT类型用于保存大文本数据,例如,文章内容,评论等比较长的文本。
数据类型 | 存储范围 | 存储空间占用量 | 特点 |
---|---|---|---|
TINYTEXT(tinytext) | 0~2^8-1 | 文本长度+2 | 小文本,可变长度 |
TEXT(text) | 0~2^16-1 | 文本长度+2 | 文本,可变长度 |
MEDIUMTEXT(mediumtext) | 0~2^24-1 | 文本长度+3 | 中等文本,可变长度 |
LONGTEXT(longtext) | 0~2^32-1 | 文本长度+4 | 大文本,可变长度 |
ENUM类型
ENUM类型又称为枚举类型,其定义格式为:
ENUM('值1','值2','值3','值4','值5',....,'值n')
-
ENUM类型的取值范围需要在定义字段时进行指定。
-
设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。
-
其所需要的存储空间由定义ENUM类型时指定的成员个数决定。
-
当ENUM类型包含1~255个成员时,需要1个字节的存储空间
-
当ENUM类型包含256~65535个成员时,需要2个字节的存储空间
-
ENUM类型的成员个数的上限为65535个
-
SET类型
SET类型用于保存字符串对象,其定义格式与ENUM类型相似。
SET('值1','值2','值3','值4','值5',....,'值n')
其所需要的存储空间由定SET类型时指定的成员个数决定。
SET类型包含的成员数 | 存储空间 |
---|---|
1~8 | 1个字节 |
9~16 | 2个字节 |
17~24 | 3个字节 |
25~32 | 4个字节 |
33~64 | 8个字节 |
SET类型在存储数据时成员个数越多,其占用的存储空间越大。
SET类型在选取成员时,与ENUM类型不同,其可以一次选择多个成员。
BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是,它们所表示的是二进制数据。
类型 | 特点 | 长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|---|
BINARY(M) | 固定长度 | M | 0<=M<=255 | M个字节 |
VARBINARY(M) | 可变长度 | M | 0<=M<=65535 | (M+ 1) 个字节 |
BLOB类型
BLOB类型用于保存数据量比较大的二进制数据,如图片,PDF文档等
数据类型 | 存储范围 | 占用空间 |
---|---|---|
TINYBLOB | 0~2^8 -1字节 | len+1个字节 |
BLOB | 0~2^16 -1字节(相当于64KB) | len+2个字节 |
MEDIUMBLOB | 0~2^24 -1字节(相当于16MB) | len+3个字节 |
LONGBLOB | 0~2^32 -1字节(相当于4GB) | len+4个字节 |
JSON数据类型
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式 ,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。
在MySQL 5.7中,就已经支持JSON数据类型。在MySQL中,JSON类型常见的表示方式有2种,分别为JSON数组和JSON对象。
#JSON数组
['abc',10,null,true]
#JSON对象
{"k1":"value","k2":10}
7、特殊的NULL类型
-
所有的类型的值都可以是null,包括int、float等数据类型
-
空字符串””,不等于null,0也不等于null,false也不等于null
-
任何运算符,判断符碰到NULL,都得NULL
-
NULL的判断只能用is null,is not null
-
NULL 影响查询速度,一般避免使值为NULL
七、数据库操作命令
库操作命令
查看数据库
查看所在数据库
查看当前登录用户
查看当前数据库版本
查看用户权限列表
创建用户登录
查看指定用户的权限
远程登录
切换数据库
创建数据库
删除数据库
表结构操作命令
查看数据表
查看表内user(举例)
alter命令用法
ALTER TABLE <表名> [修改选项]
ADD COLUMN <列名> <类型>
CHANGE COLUMN <旧列名> <新列名> <新列类型>
ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
MODIFY COLUMN <列名> <类型>
DROP COLUMN <列名>
RENAME TO <新表名>
CHARACTER SET <字符集名>
COLLATE <校对规则名>
案例
创建测试表
修改表名
修改字段类型(修改字段相对位置)
修改字段默认值/是否为空/自动增长
修改字段名/字段类型
添加字段
删除字段
表数据操作
插入数据
单行插入
单行删除
内容更改(整列)
删除数据库
where字句运算符
比较运算符
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符
运算符 | 说明 |
---|---|
AND (&&) | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR (||) | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT (!) | 条件为 TRUE(1),结果为 FALSE(0) |
更新数据
删除数据
全表删除
delete from tableName;
条件删除
delete from tableName where columnName=currentValue;
delete from stuS where id=6;
查询数据
生成测试表
构建一所学校数据库,要求学院3个,每个学院3个专业,每个专业3个年级,每个年级3个班,每个班50人,每个专业6门课,每个门课3个老师。
参考代码:
生成表
-- 学院表
CREATE TABLE college (college_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);-- 专业表
CREATE TABLE major (major_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,college_id INT NOT NULL,FOREIGN KEY (college_id) REFERENCES college(college_id)
);-- 班级表
CREATE TABLE class (class_id INT PRIMARY KEY AUTO_INCREMENT,class_name VARCHAR(20) NOT NULL,grade INT NOT NULL,major_id INT NOT NULL,FOREIGN KEY (major_id) REFERENCES major(major_id)
);-- 学生表
CREATE TABLE student (student_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,gender ENUM('男','女') NOT NULL,class_id INT NOT NULL,FOREIGN KEY (class_id) REFERENCES class(class_id)
);-- 课程表
CREATE TABLE course (course_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,credit FLOAT NOT NULL
);-- 教师表
CREATE TABLE teacher (teacher_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,college_id INT NOT NULL,FOREIGN KEY (college_id) REFERENCES college(college_id)
);-- 专业-课程关联表
CREATE TABLE major_course (major_id INT NOT NULL,course_id INT NOT NULL,PRIMARY KEY (major_id, course_id),FOREIGN KEY (major_id) REFERENCES major(major_id),FOREIGN KEY (course_id) REFERENCES course(course_id)
);-- 课程-教师关联表
CREATE TABLE course_teacher (course_id INT NOT NULL,teacher_id INT NOT NULL,PRIMARY KEY (course_id, teacher_id),FOREIGN KEY (course_id) REFERENCES course(course_id),FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id)
);-- 学生选课表
CREATE TABLE student_course (student_id INT NOT NULL,course_id INT NOT NULL,score FLOAT,PRIMARY KEY (student_id, course_id),FOREIGN KEY (student_id) REFERENCES student(student_id),FOREIGN KEY (course_id) REFERENCES course(course_id)
);
生成数据
-- 插入3个学院
INSERT INTO college (name) VALUES
('计算机学院'),
('经济管理学院'),
('机械工程学院');-- 每个学院插入3个专业 (共9个专业)
INSERT INTO major (name, college_id) VALUES
('计算机科学与技术', 1),('软件工程', 1),('人工智能', 1),
('金融学', 2),('会计学', 2),('市场营销', 2),
('机械工程', 3),('车辆工程', 3),('材料成型', 3);-- 每个专业插入3个年级,每个年级3个班 (共81个班级)
INSERT INTO class (class_name, grade, major_id)
SELECT CONCAT(grade, '级', c.class_no, '班') AS class_name,grade,major_id
FROM (SELECT major_id FROM major
) m
CROSS JOIN (SELECT 2021 AS grade UNION SELECT 2022 UNION SELECT 2023
) g
CROSS JOIN (SELECT '1' AS class_no UNION SELECT '2' UNION SELECT '3'
) c;-- 每个班插入50名学生 (共4050名学生)
INSERT INTO student (name, gender, class_id)
SELECT CONCAT('学生', class_id, '_', s) AS name,IF(RAND() > 0.5, '男', '女') AS gender,class_id
FROM class
CROSS JOIN (SELECT 1 AS s UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNIONSELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNIONSELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION SELECT 25 UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29 UNION SELECT 30 UNIONSELECT 31 UNION SELECT 32 UNION SELECT 33 UNION SELECT 34 UNION SELECT 35 UNION SELECT 36 UNION SELECT 37 UNION SELECT 38 UNION SELECT 39 UNION SELECT 40 UNIONSELECT 41 UNION SELECT 42 UNION SELECT 43 UNION SELECT 44 UNION SELECT 45 UNION SELECT 46 UNION SELECT 47 UNION SELECT 48 UNION SELECT 49 UNION SELECT 50
) seq;-- 每个专业插入6门课程 (共54门课程)
INSERT INTO course (name, credit)
SELECT CONCAT(m.name, '课程', c) AS name,ROUND(1 + RAND() * 3, 1) AS credit
FROM major m
CROSS JOIN (SELECT 1 AS c UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
) c;-- 建立专业-课程关联 (共54条记录)
INSERT INTO major_course (major_id, course_id)
SELECT FLOOR((course_id - 1) / 6) + 1 AS major_id,course_id
FROM course;-- 每个学院插入20名教师 (共60名教师)
INSERT INTO teacher (name, college_id)
SELECT CONCAT('教师', c.college_id, '_', t) AS name,c.college_id
FROM college c
CROSS JOIN (SELECT 1 AS t UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNIONSELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20
) t;-- 每门课程关联3名教师 (共162条记录)
INSERT INTO course_teacher (course_id, teacher_id)
WITH course_teacher_random AS (SELECT c.course_id,t.teacher_id,ROW_NUMBER() OVER (PARTITION BY c.course_id ORDER BY RAND()) AS rnFROM course cCROSS JOIN teacher t
)
SELECT course_id, teacher_id
FROM course_teacher_random
WHERE rn <= 3;-- 插入学生选课记录 (每个学生选修3-6门本专业的课程)
INSERT INTO student_course (student_id, course_id, score)
SELECT s.student_id,mc.course_id,ROUND(50 + RAND() * 50, 1) AS score -- 随机生成50-100分的成绩
FROM student s
JOIN class c ON s.class_id = c.class_id
JOIN major_course mc ON c.major_id = mc.major_id
WHERE NOT EXISTS (SELECT 1 FROM student_course sc WHERE sc.student_id = s.student_id AND sc.course_id = mc.course_id
) -- 确保不重复选课
GROUP BY s.student_id, mc.course_id
HAVING RAND() < 0.7 -- 70%的概率选择这门课
ORDER BY RAND()
LIMIT 20000; -- 大约20000条选课记录
全表查询
去重查询(distinct)
统计查询,非空数据
重新定义查询结果表中的列名称
聚合函数查询
#sum():计算和值
#avg():计算平均值
#max():最大值
#min():最小值
分组查询
#group by
每个同学的总成绩
排除第二位同学的每个人的总成绩
分组后的条件:having
查询总成绩大于300分的同学
排序查询
#升序(order by)
查询总成绩的升序排列结果
#降序
查询总成绩的降序排列结果
分页查询
limit number 显示前number行
查询总成绩第一名
limit [startNumber,显示的数据行数]
查询总成绩第二名
子查询
union联合查询
#字段个数必须相同
多表查询
内连接查询
将两个不同的表中一样的数据匹配,然后将不同的数据组合到一起,比如一个是学生名单(有名字和班级编号),一个是班级表(有班级编号和班级名称)。
内连接就是:只找出两边都有的“班级编号”,然后把对应的学生名字和班级名称拼在一起显示出来。举例公式:SELECT 学生表.名字, 班级表.班级名称 FROM 学生表 INNER JOIN 班级表 ON 学生表.班级编号 = 班级表.班级编号;
外连接查询
外连接会保留主表的所有数据,副表无匹配时用 NULL
填充。
与内连接的区别:
- 内连接:只显示两表完全匹配的行(交集)。
- 外连接:主表数据全显示,副表无匹配则补
NULL
左外连接
左表为主表,右表为副表。左表所有行 + 右表匹配的行(无匹配则右表显示 NULL
)
右外连接
- 以 右表为主表,左表为副表。右表所有行 + 左表匹配的行(无匹配则左表显示
NULL
)
实战模拟
题目要求
1.1、统计每个学院老师数量
1.2、统计每个学院专业数量
1.3、统计每个学院年级数量
1.4、统计每个学院班级数量
2.1、2021级计算机科学与技术成绩最高分姓名
2.2、2022级计算机科学与技术各个班的平均分
2.3、2023级会计学每个班总平均分
2.4、机械工程学院2023级总分第一名
八、mysqld用户权限管理
MySQL数据库权限分类
Privilege | Context | Comment |
---|---|---|
Alter | Tables | To alter the table |
Alter routine | Functions,Procedures | To alter or drop stored functions/procedures |
Create | Databases,Tables,Indexes | To create new databases and tables |
Create routine | Databases | To use CREATE FUNCTION/PROCEDURE |
Create temporary tables | Databases | To use CREATE TEMPORARY TABLE |
Create view | Tables | To create new views |
Create user | Server Admin | To create new users |
Delete | Tables | To delete existing rows |
Drop | Databases,Tables | To drop databases, tables, and views |
Event | Server Admin | To create, alter, drop and execute events |
Execute | Functions,Procedures | To execute stored routines |
File | File access on server | To read and write files on the server |
Grant option | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess |
Index | Tables | To create or drop indexes |
Insert | Tables | To insert data into tables |
Lock tables | Databases | To use LOCK TABLES (together with SELECT privilege) |
Process | Server Admin | To view the plain text of currently executing queries |
Proxy | Server Admin | To make proxy user possible |
References | Databases,Tables | To have references on tables |
Reload | Server Admin | To reload or refresh tables, logs and privileges |
Replication client | Server Admin | To ask where the slave or master servers are |
Replication slave | Server Admin | To read binary log events from the master |
Select | Tables | To retrieve rows from table |
Show databases | Server Admin | To see all databases with SHOW DATABASES |
Show view | Tables | To see views with SHOW CREATE VIEW |
Shutdown | Server Admin | To shut down the server |
Super | Server Admin | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc. |
Trigger | Tables | To use triggers |
Create tablespace | Server Admin | To create/alter/drop tablespaces |
Update | Tables | To update existing rows |
Usage | Server Admin | No privileges - allow connect only |
中文释义
在MySQL中,权限控制是通过Grant和Revoke命令来管理用户和角色的权限的。
- Alter:修改。允许用户修改数据库中的表结构。
- Alter routine:修改存储过程或函数。允许用户修改已创建的存储过程或函数。
- Create:创建。允许用户创建新的数据库对象,如表、视图、存储过程等。
- Create routine:创建存储过程或函数。允许用户创建新的存储过程或函数。
- Create temporary tables:创建临时表。允许用户创建临时表,这些表在会话结束时会自动删除。
- Create view:创建视图。允许用户创建新的视图。
- Create user:创建用户。允许用户创建新的数据库用户账户。
- Delete:删除。允许用户删除表中的数据。
- Drop:删除。允许用户删除数据库中的对象,如表、视图等。
- Event:事件。允许用户管理和修改事件调度器中的事件。
- Execute:执行。允许用户执行存储过程或函数。
- File:文件。允许用户访问数据库服务器的文件系统。
- Grant option:授予选项。允许用户将权限授予其他用户。
- Index:索引。允许用户在表上创建、修改或删除索引。
- Insert:插入。允许用户向表中插入数据。
- Lock tables:锁定表。允许用户锁定数据库中的表,以防止其他用户同时访问这些表。
- Process:进程。允许查看或杀死数据库服务器上的进程。
- Proxy:代理。允许用户作为代理登录,代表其他用户执行操作。
- References:引用。允许用户创建外键约束。
- Reload:重新加载。允许用户重新加载配置文件或刷新权限表。
- Replication client:复制客户端。允许用户从主服务器接收数据以进行复制。
- Replication slave:复制从机。允许用户作为数据复制的从服务器。
- Select:选择。允许用户查询表中的数据。
- Show databases:显示数据库。允许用户查看用的数据库列表。
- Show view:显示视图。允许用户查看数据库中的视图定义。
- Shutdown:关闭。允许用户关闭数据库服务器。
- Super:超级。允许用户所有的权限,并且可以不受限制地执行许多系统命令。
- Trigger:触发器。允许用户创建触发器,以在特定事件发生时自动执行代码。
- Create tablespace:创建表空间。允许用户创建新的表空间,用于存储数据库对象。
- Update:更新。允许用户更新表中的数据。
- Usage:使用。这个权限通常用于限制用户只能查看自己的权限,不能进行任何实际的数据库操作。
user_name | host_name | 说明 |
---|---|---|
zhx | 192.168.71.151 | zhx,只能从此ip连接 |
zhx | 192.168.71.% | zhx,从192.168.71子网中的任何主机 |
zhx | % | zhx,任何主机可连 |
创建远程管理用户
-- 只创建的用户默认具有USAGE权限
更改密码
-- 在mysql8之前的数据库,grant命令运行的时候,发现用户不存在,则隐式创建
创建远程web服务数据库的操作用户
grant all on britz.* to 'webuser'@'192.168.115.%' identified by '123.com';
flush privileges;
查看用户权限
删除用户权限
revoke all on 库.表 from 'username'@'ipaddress';
flush privileges;
总结
本次学习初步了解了MySQL数据库的一些操作和命令,还有编译安装的过程,后续还会补充本次文章的内容。
本次更新了数据库命令的使用,构建了一个库,并对其增删改查,主要是查上,对待不同情况进行使用方式不同查看。