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)
    数据控制语言
    控制访问权限 (GRANTREVOKE)

SQL 语句注意点:

  • 每一条语句是分号 ; 结束
  • 不区分大小写,建议:关键字使用大写,其他使用小写,单词之间用下划线连接
    比如 my_namemy_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.0000009999-12-31 23:59:59.999999
  • TIMESTAMP 支持范围:1970-01-01 00:00:01.0000002038-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:默认值

BLOBTEXTGEOMETRYJSON 类型 不能有默认值

AUTO_INCREMENT:自动增长

  • 适用于 INTFLOATDOUBLE 类型
  • 在插入记录时,如果不指定此列的值或者设置为 NULL,会在此前的基础上自动增长 1
  • 不能有默认值(不能使用 DEFAULT
  • 在一个表格中,最多只能有一列被设置为 AUTO_INCREMENT
    这一列必须被索引(UNIQUEPRIMARY KEYFOREIGN 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 基础相关推荐

  1. 【Java从0到架构师】Redis 基础 - 数据类型

    Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...

  2. 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装

    RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...

  3. 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级

    Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...

  4. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI

    分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...

  5. 【Java从0到架构师】Linux 基础知识、常用命令

    Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...

  6. 【Java从0到架构师】SpringMVC - 基础

    SpringMVC - 基础 SpringMVC - 入门 web.xml 配置 DispatcherServlet appliactionContext.xml 新建 Controller Spri ...

  7. 【Java从0到架构师(1),Java中高级面试题总结(全面)

    JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...

  8. 【Java从0到架构师】Zookeeper - 系统高可用、分布式的基本概念、Zookeeper 应用场景

    分布式基石 Zookeeper 框架全面剖析 系统高可用 集群 - 主备集群.主从集群.普通集群 分布式(系统部署方式) 微服务(架构设计方式) 分布式的基本概念 分布式存储.分布式计算 分布式协调服 ...

  9. 【Java从0到架构师】项目实战 - 驾考(旧)- Freemarker、MyBatis-Plus

    项目实战 - 驾考(旧)- Freemarker.MyBatis-Plus 各种 Object Freemarker 简单使用 常用功能 集成到 SpringBoot MyBatis-Plus 简单使 ...

最新文章

  1. NTU 课程笔记 CE7454(2) 概率论
  2. 编译内核,busybox,dropbear组装linux小系统
  3. 用python开启相机_如何用Python打开realsenseD435相机并获取相机参数
  4. 常用的几款工具让 Kubernetes 集群上的工作更容易
  5. 1.C#基础之简介(完成)
  6. git 常见问题的解决方案
  7. GCC编译器使用简介
  8. c#明华rf读卡器_:C# 实现明华读卡器(2)
  9. Makefile:94: recipe for target 'install-***-recurse' failed 解决方法
  10. C语言 三子棋 游戏
  11. Apple Swift学习资料汇总
  12. python如何返回一个列表_python如何返回元组,列表或字典的?
  13. 云计算技术文章的创作心得
  14. 智能语音计算器(二)
  15. 我在淘宝做前端的这三年 — 第一年
  16. java 拼音识别_JAVA实现汉字转拼音
  17. 跳槽首选,平均薪资2w+!现在入门快人一步
  18. oracle ora-各种常见java.sql.SQLException归纳
  19. 上网速度太慢?这样设置可以提升60%的上网速度!
  20. 今年好像没有金三银四了?

热门文章

  1. 失业几个月找不到工作是一种怎样的体验?
  2. 终于把Redis场景设计搞清楚了,需要掌握的都在这了
  3. 华为和荣耀蓝牙耳机为什么那么贵?
  4. VMware12部署windows xp虚拟机
  5. Java-占位符的使用
  6. sql过滤代码段_如何创建和管理T-SQL代码段
  7. oracle游标fetch_SQL游标@@ FETCH_STATUS函数概述
  8. 使用Spring容器最简单的代码姿势
  9. [NOIp2016]天天爱跑步 线段树合并
  10. js:{}与new Object()的区别是什么