[数据库]数据库

一.什么是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) :表中的每一列代表一个数据属性(比如用户的 idnamephone),每个列都有固定的数据类型(比如整数、字符串、日期)。

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:查询最高薪资

6.1.2用户自定义的函数

6.2函数

6.2.1分组函数

6.2.2多行函数

6.2.3聚合函数

相关推荐
左灯右行的爱情2 小时前
导出重复问题记录-bugs专辑
数据库·mysql
熊文豪2 小时前
Oracle迁移KingbaseES:从痛点到破局之道
数据库·kingbasees·电科金仓
洋不写bug2 小时前
基础联合查询和连接查询
数据库
砚边数影2 小时前
决策树原理(一):信息增益与特征选择 —— Java 实现 ID3 算法
java·数据库·决策树·机器学习·kingbase·数据库平替用金仓·金仓数据库
2401_832402752 小时前
使用Docker容器化你的Python应用
jvm·数据库·python
仍然.2 小时前
MySQL--库的操作、数据类型、表的操作
数据库·mysql
让我上个超影吧2 小时前
天机学堂——BitMap实现签到
java·数据库·spring boot·redis·spring cloud
宇神城主_蒋浩宇2 小时前
最简单的es理解 数据库视角看写 ES 加 java正删改查深度分页
大数据·数据库·elasticsearch
2301_817497333 小时前
自然语言处理(NLP)入门:使用NLTK和Spacy
jvm·数据库·python