一.什么是MySQL
问题1:之前在Java中有数组、集合等容器来装数据,为什么还要数据库?
因为数组、集合等容器存储的数据是在内存中,内存中的数据一旦断电或程序退出,数据就没有了,无法永久保存。
1.使用数据库的目的之一,为了持久化(永久保存)。、
2.内存容量有限,硬盘容量近乎无限
3.数据生命周期和程序解耦
4.数据库能解决数组 / 集合搞不定的「数据管理问题」
4.1支持多程序 / 多用户共享数据
4.2提供高效的查询能力(索引)
4.3支持事务,保证数据安全性
4.4支持数据约束,保证数据合法性
4.5支持并发操作,解决线程安全问题
问题2:之前在Java中有FileOutputStream、FileWriter、ObjectOutputStream等可以把数据写到文件中,实现持久化,为什么不直接用它们,还要用数据库呢?这些IO流可以实现数据的存储,但是后期的数据管理(检索、修改、删除等)不方便,效率低。
所以,使用数据库的目的之二,为了方便管理数据,高效实现增、删、改、查、备份、安全的管理等。而文件存储只是「原始字节 / 字符的持久化」,只是把数据扔到硬盘文件里,没有任何管理能力。
二.什么是关系数据库
1. 核心概念:表、行、列
关系数据库把数据存储在二维表中,结构和你在 Excel 里看到的表格非常像:
- 表(Table) :一个表对应一个实体(比如用户表
user、订单表order),是数据的容器。 - 行(Row):表中的每一行代表一条具体的数据记录(比如一个用户的信息)。
- 列(Column) :表中的每一列代表一个数据属性(比如用户的
id、name、phone),每个列都有固定的数据类型(比如整数、字符串、日期)。
2. 核心特性:关系与约束
关系数据库的 "关系" 体现在不同表之间可以通过 "键(Key)" 建立关联,同时通过约束保证数据的正确性:
- 主键(Primary Key) :每个表必须有一个唯一标识行的列(比如用户表的
user_id),确保每条记录唯一。 - 外键(Foreign Key) :一个表中的列引用另一个表的主键(比如订单表的
user_id引用用户表的user_id),用来表示 "订单属于某个用户" 这种关联关系。 - 约束(Constraint):通过唯一约束、非空约束、外键约束等,从底层保证数据的合法性(比如手机号不能重复、订单必须关联一个存在的用户)。
3. 核心操作:SQL
关系数据库使用 SQL(Structured Query Language) 来进行所有操作,包括:
- 增(Insert):插入新数据
- 删(Delete):删除数据
- 改(Update):修改数据
- 查(Select):查询数据,支持多表关联、复杂条件筛选、排序、分组等
三.基本语法
3.1登录连接MySQL服务器的命令

-
-h:主机地址,后面写主机名或IP地址
-
-P(大写):端口号,默认是3306
-
-u:用户名,默认的超级管理员用户名是root
-
-p(小写):密码

3.2SQL操作数据库
3.2.0SQL语法说明
-
标识符(库名、表名、字段名、函数名等)命名规则:
-
建议只用大小写的26英文字母、数字0-9、下划线。不太推荐使用中文等其他字符。
-
尽量不要数字开头。
-
不要使用关键字,例如:create、insert等
-
标识符中间不要包含空格,可以使用_连接。
-
-
所有的标点符号要用英文半角输入法
-
该成对的标点符号,要成对
-
MySQL中的字符串值、日期时间值要求使用 单引号 引起来
-
MySQL中的数据是否区分大小写,要取决于字符集和校对规则。如果校对规则以ci结尾表示不区分大小写,如果以cs或bin结尾区分大小写。

++一般默认为ci不区分大小写。(show create table student 查看表的属性)++
-
MySQL中的字段可以在查询时指定别名,但是不建议别名包含空格,如果包含空格要用双引号引起来。
-
MySQL中的字段可以在查询时指定别名,但是不建议别名包含空格,如果包含空格要用双引号引起来。

- MySQL中自己命名的部分,建议使用飘号(反引号)引起来。(避免与关键字重复)

- MySQL的注释

3.2.1 show databases

3.2.2 创建自己的数据库

3.2.3使用数据库


3.2.4创建表


3.2.5添加数据


3.2.6查看表中的数据


四.数据类型
4.1整数类型
4.1.1整数类型的图片整理一览


4.1.2一个查询code

/*
DataBase中整数类型有:
1.TINYINT 1byte
2.SMALLINT 2byte
3.MEDIUMINT 3byte
4.INT 4byte
int(num) : 不影响数的取值
UNSIGNED : 关键字表示无符号数,关键字一般大写
ZEROFILL : 零填充
*/
create table test1(a tinyint, b int, c int(3), d int(3) unsigned,e int(3) unsigned zerofill);
-- insert into test1 values(200,200,200,200,200); # 错误
insert into test1 values(100,200,200,200,200);
insert into test1 values(1,2,2,2,2);
insert into test1 values(1,20000,20000,20000,20000);
/*insert into test1 values(-1,-20000,-20000,-20000,-20000); # 错误 后面2个不支持负数
insert into test1 values(-1,-20000,-20000,20000,-20000); # 错误 后面2个不支持负数*/
select * from test1;
4.1.3现在int(num)很少用了,只有配合zerofill才有用
只有当你同时使用 ZEROFILL 时,int(3) 才会体现出效果:

4.1.4如果我往无符号数中插入负数呢


-
int(M)不影响数据的表示范围。但是如果与zerofill结合使用,表示最少M位,不够M位用0填充。其余情况int后面不需要加(M)。
-
unsigned表示无符号,即没有负数。
4.2小数类型

-
如果decimal没有指定精度要求,默认是取整数。float大约是6-7位,double大约是15-16位。
-
float(M,D),double(M,D),decimal(M,D),如果指定了(M,D),表示整数+小数最多M位,小数点后面是D位。
-
float和double是浮点型,误差要大一些。decimal是定点型,精确度要高一些。
4.2.1如果不给decimal指定M,D那么默认为整形

4.2.2如果超过范围怎么办


4.2.2.1如果是整数位超过了 -- 报错


4.2.2.2如果是小数位超过了 -- 第D+1位四舍五入

4.2.3谁精度高
- float和double是浮点型,误差要大一些。decimal是定点型,精确度要高一些。

4.2.4code
/* Java中的小数类型:float double BigDecimal
MySQL中的小数类型 : float,double,decimal
* BigDecimal bd = new BigDecimal("number");
*
* BigDecimal方法:
* 1. add(BigDecimal val) //加
* 2. subtract(BigDecimal val) //减
* 3. multiply(BigDecimal val) //乘
* 4. divide(BigDecimal val) //除
* 4.1除不尽时,会报异常
* .divide(BigDecimal val, int scale, int roundingMode)
* 4.2 roungdingMode的类型
* 1.CEILING //向上取整
* 2.FLOOR //向下取整
* 3.HALF_UP //四舍五入
* 4.HALF_EVEN //偶数就进位,一半概率
* 5. remainder(BigDecimal val) //求余数
*
BigDecimal bd = new BigDecimal("898877415.6023154060879859845612358874056123877989564132564894");
BigDecimal bd2 = new BigDecimal("8568498465321564898765321648994");
System.out.println(bd.add(bd2));
*/
create table t2(a float,b double,c decimal);
insert into t2 values(3.14,3.14,3.14);
SELECT * from t2;
create table t3(a float(5,2),b double(5,2),c decimal(5,2));
-- M : 代表整数加小数一共几位
-- D : 代表小数点后最多几位,如果超过了,小数点的数据会省略掉
-- 这里(5,2)表示,整数加小数最多5位,小数点后最多两位,如果超过了,小数点的数据会省略掉
SELECT * from t3;
4.3日期时间类型

4.3.1日期之间用- 时间之间用:

4.3.2除了年份year,其余的当字符串输入,要加''

4.3.3DATETIME和TIMESTAMP的区别 - timestamp可以根据时区调整时间值


eg:设置位东9区


eg:设置为东10区


4.4字符串类型
4.4.1MySQL字符串分类
4.4.1.1.文本字符串
普通文本,例如:用户名,地址,字符串等等信息。
1) 文本字符串类型一览

2) CHAR & VARCHAR
2).1 和java的对应关系

2).2 区别
char是定长字符串,varchar是变长字符串

2).3 什么时候用谁?

2).4 VARCHAR必须指定(M) -- 不然报错


3) TEXT

4) ENUM 枚举类型

4) .1 枚举是单选,集合可以多选
eg1:选单个爱好


eg2:选多个爱好


4).2 通过数字索引来找到枚举项和集合项


#set 输入1对应第一个,输入2对应第二个,输入3对应前2个,输入4对应第三个,输入7对应前三个,......。即element的index为2^n-1,要找前多少个就是:∑(2^n-1)

4.4.1.2.二进制字符串
存二进制的字符串,例如:一般用于存储二维码,图片等等。
二进制字符串类型一览

五.运算符
5.1算术运算符

5.1.1select直接查看算术运算的结果


5.1.2查看员工姓名,原薪资,和如果涨薪水1000的结果


5.1.3用\整数除整数得到的是小数,用div得到的是整数




5.1.4MySQL中+无法对字符串拼接,concat是字符串的拼接




5.2比较或关系运算符

5.2.1 = 是否相等
5.2.1.1 = -查看两个数值是否相等



5.2.1.2 = -查询叫陈浩的人的员工


5.2.2 > 大于
5.2.2.1 > -查询薪资大于15000的员工


5.2.3 != <> 不等于
5.2.3.1 <> != -查询部门id不是1的员工信息


5.2.4 between and
5.2.4.1 between and -查询薪资区间在10000~15000的员工


5.2.5 in
5.2.5.1 in-查询韩庚年、陈浩、陆风、贾宝玉这几个人的信息


5.2.6 like
5.2.6.1 like-查询姓名中包含'冰'这个字,不清楚这个字是名字中的第几个字


5.2.6.2 like-查询姓名中包含'冰'这个字,且它是第3个字


5.2.6.3 like-查询姓名中包含'冰'这个字,且它是第2个字


code:
/*
比较或关系运算符
Java中比较或关系运算符:>,<,>=,<=,==,!=
MySQL中比较或关系运算符:>,<,>=,<=,=, !=,<>,
is , is not(针对NULL值判断)
between x and y (用于区间范围的判断)或 not between x and y
in (值列表) 和not in(值列表) 集合元素的判断
like 配合 %和_实现模糊查询
结果0代表false
1(非0)代表true
*/
#查看1=2吗
select 1=2;
#查看1=1吗
select 1=1;
#查询姓名为陈浩的员工信息
select * from t_employee where ename == '陈浩'; # 错误,没有==
select * from t_employee where ename = '陈浩';
#查询薪资大于15000的员工信息
select * from t_employee where salary > 15000;
#查询部门编号不是1的员工
select * from t_employee where did != 1;
select * from t_employee where did <> 1;
#对于null值的判断不能使用=和!=
#查询奖金比例 commission_pct 不为NULL
select * from t_employee where commission_pct != null; # 错误
select * from t_employee where commission_pct is not null;
#查询奖金比例 commission_pct 为NULL
select * from t_employee where commission_pct = null; #错误
select * from t_employee where commission_pct is null;
#查询薪资在[10000, 15000]之间
select * from t_employee where salary between 10000 and 15000;
#查询韩庚年、陈浩、陆风、贾宝玉这几个人的信息
select * from t_employee where ename in('韩庚年','陈浩','陆风','贾宝玉');
#查询姓名中包含'冰'这个字,不清楚这个字是名字中的第几个字
select * from t_employee where ename = '冰'; #表示名字只有1个字,且是'冰'
select * from t_employee where ename like '冰'; # ename like '冰'等价于ename = '冰'
select * from t_employee where ename like '%冰%';
#查询姓名中包含'冰'这个字,且它是第3个字
select * from t_employee where ename like '__冰';
#查询姓名中包含'冰'这个字,且它是第2个字
select * from t_employee where ename like '冰';
5.3逻辑运算符

5.3.1与 && AND

5.3.2或 || OR

5.3.3非 ! NOT

5.3.4异或(二者满足一个) NOR

六.函数
6.1函数的分类:
6.1.1系统预定义的函数
(1)多行函数:多行合并起来一起计算,结果行数会减少
核心:对表中「每一行的单个字段」单独处理,输入一行、输出一行,最终结果的行数和原始表完全一致。
(2)单行函数:每一行独立计算,结果行数不变
核心:把「多行的同一个字段」合并成一组计算,输入多行、输出一行,最终结果行数远少于原始表。
eg:查询最高薪资

