【Java从0到架构师】MySQL 基础
MySQL
- MySQL
- MySQL 的使用步骤
- 数据库的内部存储细节
- GUI 工具
- SQL 语句
- DDL 语句
- DDL 语句 - 数据库
- DDL 语句 - 表
- 常用数据类型 - 数字类型
- 常用数据类型 - 字符串类型
- 常用类型 - 日期和时间类型
- TRUNCATE
- 表的复制
- 列的常用属性
- DML 语句
- DQL 语句
- 聚合函数 (Aggregate Function)
- 常见的 WHERE 字句
- UNIQUE 索引
- 主键 (PRIMARY KEY)
- 外键 (FOREIGN KEY)
- 级联 (CASCADE)
Java 从 0 到架构师目录:【Java从0到架构师】学习记录
如何长久地存储数据?(持久化)
- 通常会使用数据库 (Database) 来长久地存储数据
使用数据库的明显好处?
- 可以高效地存储、查询数据
- 减少重复、冗余数据
- 提高数据的安全性
数据库分为:关系型数据库 (Relational Database)、非关系型数据库 (NoSQL Database)
MySQL
MySQL 是一款开源的关系型数据库,有免费版(社区版)、商业版
2008 年被 Sun 公司在 2009 年被 Oracle 公司收购
关于 MySQL 的发音:
https://dev.mysql.com/doc/refman/8.0/en/what-is-mysql.html
官方发音:My-S-Q-L,基本都习惯发音为 My Sequel
MySQL 下载地址:https://downloads.mysql.com/archives/installer/
MySQL 官方文档
MySQL 的使用步骤
登录、连接MySQL服务器(管理员账户名是 root)
mysql -uroot -proot # 密码为root
mysol -uroot -p # 回车后输入密码
使用 SQL 对数据库进行 CRUD:
- Create:创建,增
- Read:读取,查
- Update:更新,改
- Delete:删除,删
在 Windows 中,可以通过以下命令查看占用 3306 端口号的进程 ID:
netstat -aon|findstr 3306
数据库的内部存储细节
- 一个数据库 (Database) 中可以存放多张表 (Table)
- 每个表 (Table) 中包含一些列 (Column,也叫做字段)
- 每个表 (Table) 中存放的数据,一般称为记录 (Record)
GUI 工具
在实际开发过程中,经常会使用图形化界面工具来管理数据库。
- Navicat Premium
支持 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgresQL、SQLite - SQLyog
仅支持 MySQL
SQL 语句
SQL 是 Structured Query Language 的简称,译为"结构化查询语言",用于操作关系型数据库
SQL 语句主要可以分成 4 大类:
- DDL (Data Definition Language)
数据定义语言
创建 (CREATE
)、修改 (ALTER
)、删除 (DROP
) 数据库 \ 表 - DQL (Data Query Language)
数据查询语言
查询 记录 (SELECT
) - DML (Data Manipulation Language)
数据操纵语言
增加 (INSERT
)、删除 (DELETE
)、修改(UPDATE
) 记录 - DCL (Data Control Language)
数据控制语言
控制访问权限 (GRANT
、REVOKE
)
SQL 语句注意点:
- 每一条语句是分号
;
结束 - 不区分大小写,建议:关键字使用大写,其他使用小写,单词之间用下划线连接
比如my_name
、my_first_name
- 单行注释
-- 注释内容 #注释内容
- 多行注释
/* 注释内容 */
参考资料:【官方文档】第13章SQL语句语法
DDL 语句
DDL 语句 - 数据库
创建:
CREATE DATABASE 数据库名 # 创建数据库(使用默认的字符编码)
CREATE DATABASE 数据库名 CHARACTER SET 字符编码 # 创建数据库(使用指定的字符编码)
CREATE DEFAULT IF NOT EXISTS 数据库名 # 如果这个数据库不存在,才创建它
CREATE DEFAULT IF NOT EXISTS 数据库名 CHARACTER SET 字符编码
查询:
SHOW DATABASES # 查询所有的数据库
SHOW CREATE DATABASE 数据库名 # 查询数据库的创建语句
USE 数据库名 # 使用数据库
SELECT DATABASE() # 查询正在使用的数据库
修改:
ALTER DATABASE 数据库名 CHARACTER SET 字符编码 # 修改数据库的字符编码
删除:
DROP DATABASE 数据库名
DROP DATABASE IF EXISTS 数据库名 # 如果这个数据库存在,才删除它
DDL 语句 - 表
创建(基本语法):
CREATE TABLE 表名 {列名1 数据类型1,列名2 数据类型2,列名3 数据类型3,...列名n 数据类型n
}
查询:
SHOW TABLES # 查询当前数据库的所有表
DESC 表名 # 查看表结构
删除:
DROP TABLE 表名
DROP TABLE IF EXISTS 表名 # 如果这个表存在,才删除它
修改:
ALTER TABLE 表名 RENAME TO 新表名 # 修改表名
ALTER TABLE 表名 CHARACTER SET 字符编码 # 修改表格的字符编码
ALTER TABLE 表名 ADD 列名 数据类型 # 增加新的一列
ALTER TABLE 表名 MODIFY 列名 新数据类型 # 修改某一列的数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型 # 修改某一列的列名、数据类型
ALTER TABLE 表名 DROP 列名 # 删除某一列
常用数据类型 - 数字类型
参考资料:【官方文档】11.1.1数字类型概述、【官方文档】11.8数据类型存储要求
上述整数类型的使用格式:TYPE[(M)] [UNSIGNED] [ZEROFILL]
UNSIGNED
:无符号ZEROFILL
:等价于UNSIGNED ZEROFILL
,显示数值时,若数字不足 M 位,在前面用 0 填充
常用数据类型 - 字符串类型
参考资料:【官方文档】11.4.1 CHAR和VARCHAR类型
常用类型 - 日期和时间类型
从 MySQL 5.6.4 开始,允许 TIME
\ DATETIME
\ TIMESTAMP
有小数部分,需要 0 ~ 3 字节的存储
- DATETIME 支持范围:
1001-01-01 00:00:00.000000
到9999-12-31 23:59:59.999999
- TIMESTAMP 支持范围:
1970-01-01 00:00:01.000000
到2038-01-19 03:14:07.999999
DATETIME \ TIMESTAMP 的自动设置:
DEFAULT CURRENT_TIMESTAMP
当插入记录时,如果没有指定时间值,就设置时间为当前的系统时间ON UPDATE CURRENT_TIMESTAMP
当修改记录时,如果没有指定时间值,就设置时间为当前的系统时间
TRUNCATE
如果要删除表中的所有数据(保留表结构),有 2 种常见做法:
DELETE FROM 表名 # 逐行删除每一条记录
TRUNCATE [TABLE] 表名 # 先删除后重新创建表(效率更高)
- TRUNCATE 归类于 DDL 语句,而非 DML 语句
- 为了实现高性能,TRUNCATE 绕过了删除数据的 DML 方法。因此它不能被回滚,不会导致 ON DELETE 触发器触发,并且不能对 InnoDB 具有父子外键关系的表执行
参考资料:【官方文档】13.1.34 TRUNCATE TABLE语法
表的复制
创建一张拥有相同表结构的空表(只复制表结构,不复制记录)
CREATE TABLE new_table LIKE old_table
创建一张拥有相同表结构、相同记录的表(复制表结构、复制记录)
CREATE TABLE new_table AS (SELECT * FROM old_table) # 可以省略 AS
列的常用属性
NOT NULL
:不能设置为 NULL 值
COMMENT
:注释
DEFAULT
:默认值
BLOB
、TEXT
、GEOMETRY
、JSON
类型 不能有默认值
AUTO_INCREMENT
:自动增长
- 适用于
INT
、FLOAT
、DOUBLE
类型 - 在插入记录时,如果不指定此列的值或者设置为 NULL,会在此前的基础上自动增长 1
- 不能有默认值(不能使用
DEFAULT
) - 在一个表格中,最多只能有一列被设置为
AUTO_INCREMENT
这一列必须被索引(UNIQUE
、PRIMARY KEY
、FOREIGN KEY
等)
DML 语句
增加:
INSERT INTO 表名(列名1, 列名2, ..., 列名n) VALUES (值1, 值2, ..., 值n)
非数字类型的值,一般需要用引号括住(单引号或双引号,建议使用单引号)
INSERT INTO 表名 VALUES (值1, 值2, ..., 值n) # 从左至右按顺序给所有列添加值
修改:如果没有添加条件,将会修改表中的所有记录
UPDATE 表名 SET 列名1=值1, 列名2=值2, ..., 列名n=值n [WHERE条件]
删除:如果没有添加条件,将会删除表中的所有记录
DELETE FROM 表名 [WHERE 条件]
DQL 语句
SELECT [DISTINCT] 列名1, 列名2, ..., 列名n
FROM 表名
[WHERE ...]
[GROUP BY ...]
[HAVING ...]
[ORDER BY ...]
[LIMIT ...]
SELECT * FROM customer # 查询表中的所有记录
SELECT DISTINCT * FROM customer # 查询表中的所有记录(去除了重复的记录)
聚合函数 (Aggregate Function)
参考资料:【官方文档】12.19.1聚合函数描述
SELECT COUNT(*) FROM customer # 查询表中的记录总数
SELECT COUNT(phone) FROM customer # 查询表中phone的总数(不包括NULL)SELECT COUNT(DISTINCT phone) FROM customer
# 查询表中phone的总数(不包括NULL,去除重复的记录)
SELECT SUM(salary) FROM customer # 计算所有salary的总和
SELECT MIN(age) FROM customer # 查询最小的age
SELECT MAX(age) FROM customer # 查询最大的age
SELECT AVG(salary) FROM customer # 计算所有salary的平均值
常见的 WHERE 字句
比较运算:
WHERE age > 18 # age大于18
WHERE age <= 30 # age小于等于30
WHERE age = 20 # age等于20
WHERE name = '张三' # name是张三
WHERE age != 25 # age不等于25
WHERE age <> 25 # age不等于25
NULL 值判断:不能使用 =
、!=
、<>
WHERE phone IS NULL # phone的值为NULL
WHERE phone IS NOT NULL # phone的值不为NULL
逻辑运算:
# age大于18并且小于等于30
WHERE age > 18 AND age <= 30
WHERE age > 18 && age <= 30WHERE age BETWEEN 20 AND 30 # age大于等于20并且小于等于30# age等于18或者等于20或者等于22
WHERE age = 18 OR age = 20 OR age = 22
WHERE age in (18, 20, 22)# age大于等于18
WHERE NOT (age < 18)
WHERE !(age < 18)
模糊查询:_
代表单个任意字符,%
代表任意个任意字符
WHERE name LIKE '___' # name是3个字符
WHERE name LIKE '_码_' # name是3个字符并且中间是'码'
WHERE name LIKE '李%' # name是以'李'字开头
WHERE name LIKE '_码%' # name的第2个字符是'码'字
WHERE name LIKE '%码%' # name中包含'码'字
UNIQUE 索引
一旦某一列被设置了 UNIQUE
索引
- 所有值必须是唯一的
- 允许存在多个 NULL 值
2 种常见写法:
列名 数据类型 UNIQUE [KEY]
UNIQUE [KEY] (列名)
使用示例:
CREATE TABLE student {id INT UNIQUE, # 写法1name VARCHAR(20),UNIQUE(name) # 写法2
}
主键 (PRIMARY KEY)
主键的作用:可以保证在一张表中的每一条记录都是唯一的
- 如果将某一列设置为主键,那么这一列相当于加上了
NOT NULL UNIQUE
- 建议每一张表都有主键
- 主键最好跟业务无关,尝设置为 INT AUTO_INCREMENT
2 种常见写法:
列名 数据类型 PRIMARY KEY
PRIMARY KEY (列名)
使用示例:
CREATE TABLE company (id INT AUTO_INCREMENT PRIMARY KEY, # 写法1name VARCHAR(20) NOT NULL UNIQUE
);
CREATE TABLE company (id INT AUTO_INCREMENT,name VARCHAR(20) NOT NULL UNIQUE,PRIMARY KEY(id) # 写法2
);
外键 (FOREIGN KEY)
一般用外键来引用其他表的主键
常见写法:
FOREIGN KEY (列名) REFERENCES 表名(列名)
示例代码:
CREATE TABLE company(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20) NOT NULL UNIQUE
);
CREATE TABLE customer(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20) NOT NULL,company_id INT NOT NULL,FOREIGN KEY (company_id) REFERENCES company(id)
);
级联 (CASCADE)
定义外键时,可以设置级联
ON DELETE CASCADE
- 当删除被引用的记录时,引用了此记录的其他所有记录都会被自动删除
ON UPDATE CASCADE
- 当修改被引用的记录时,引用了此记录的其他所有记录都会被自动更新
【Java从0到架构师】MySQL 基础相关推荐
- 【Java从0到架构师】Redis 基础 - 数据类型
Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...
- 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装
RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...
- 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级
Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...
- 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI
分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...
- 【Java从0到架构师】Linux 基础知识、常用命令
Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...
- 【Java从0到架构师】SpringMVC - 基础
SpringMVC - 基础 SpringMVC - 入门 web.xml 配置 DispatcherServlet appliactionContext.xml 新建 Controller Spri ...
- 【Java从0到架构师(1),Java中高级面试题总结(全面)
JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...
- 【Java从0到架构师】Zookeeper - 系统高可用、分布式的基本概念、Zookeeper 应用场景
分布式基石 Zookeeper 框架全面剖析 系统高可用 集群 - 主备集群.主从集群.普通集群 分布式(系统部署方式) 微服务(架构设计方式) 分布式的基本概念 分布式存储.分布式计算 分布式协调服 ...
- 【Java从0到架构师】项目实战 - 驾考(旧)- Freemarker、MyBatis-Plus
项目实战 - 驾考(旧)- Freemarker.MyBatis-Plus 各种 Object Freemarker 简单使用 常用功能 集成到 SpringBoot MyBatis-Plus 简单使 ...
最新文章
- NTU 课程笔记 CE7454(2) 概率论
- 编译内核,busybox,dropbear组装linux小系统
- 用python开启相机_如何用Python打开realsenseD435相机并获取相机参数
- 常用的几款工具让 Kubernetes 集群上的工作更容易
- 1.C#基础之简介(完成)
- git 常见问题的解决方案
- GCC编译器使用简介
- c#明华rf读卡器_:C# 实现明华读卡器(2)
- Makefile:94: recipe for target 'install-***-recurse' failed 解决方法
- C语言 三子棋 游戏
- Apple Swift学习资料汇总
- python如何返回一个列表_python如何返回元组,列表或字典的?
- 云计算技术文章的创作心得
- 智能语音计算器(二)
- 我在淘宝做前端的这三年 — 第一年
- java 拼音识别_JAVA实现汉字转拼音
- 跳槽首选,平均薪资2w+!现在入门快人一步
- oracle ora-各种常见java.sql.SQLException归纳
- 上网速度太慢?这样设置可以提升60%的上网速度!
- 今年好像没有金三银四了?