数据库
最早期我们要存数据,是要通过多个 Excel 表格实现,而此操作会带来大量的管理和分类, 并且程序员的工作量
也会变得十分繁琐. 所以, 后期通过把数据的具体操作交由一个数据库软件去管理, 程序员只需要学习如何使用该软件即可, 而这个软件就是存储和管理数据的仓库, 简称数据库
-- 数据库软件运行后会转为一个后台的 DBMS
DB: DATABASE --数据库
M: Management --管理
S: System --系统
主流的 DBMS 有哪些
1. MySQL: 开源产品
--注: MySQL8及其以上的版本被收购后进行的维护更新,变成了闭源产品
--MariaDB 是MySQL低版本的一种整合改良版
2. Oracle: Oracle(甲骨文)公司的闭源产品, 效率最好, 安全性最高, 市场占比第二
3. SQLServer: 微软公司的闭源产品, 常见于微软成套开发中
4. DB2: IBM 公司旗下的闭源产品, 常见于银行项目开发
SQL
S: Structured --结构化
Q: Query --查询
L: Language --语言
--作用: 用于程序员和数据库软件进行交流的一门通用性语言
MySQL 的环境检查及软件连接
1. 检查是否安装了MySQL
(右键)此电脑->管理->(展开)服务和应用程序->服务
-- 检查所有的服务项中,是否有 MySQL 或者 MariadDB
2. 打开运行窗体
WIN + R, 输入cmd, 弹出终端小黑窗
3. 数据库的启动指令
完整指令: mysql.exe -uroot -proot -hlocalhost -P 3306
-u user 用户名 --mysql默认只有一个管理员用户: root
-p password 密码 --安装mysql数据库的过程自行设置
-h host 服务器主机 --本机: localhost/127.0.0.1
-P port 端口号 --mysql默认端口号为:3306
简化指令: (数据库就在本机,其他设置都默认的情况下)
方式一: --密码明文式
mysql -uroot -proot
方式二: --密码暗文式
mysql -uroot -p --回车
再输入密码 root --回车
-- 注: 如果小黑窗的最后一行显示 "mysql>" 或者 "MariaDB [(none)]>" 表示成功进入mysql数据库
-- 注:如果小黑窗显示'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件. 说明没有做"环境变量"的配置,访问数据库服务器失败
4. 不配置环境变量的登录方式
1) Win + R, 输入 cmd 回车, 在小黑窗输入指令 "cd 数据库安装目录的bin目录" (如: "cd C:\Program Files\MariaDB 10.6\bin") 回车,然后再输入mysql的启动指令 "mysql -uroot -proot" 回车即可
2) 直接按win键, 在开始菜单中找到MySQL或者MariaDB 的快捷终端, 点击运行直接输入密码回车即可
5. 配置环境变量
-- 注: 配置环境变量, 等同于告诉计算机中的"Path"数据库软件所在的位置,可以实现无论在计算机任何位置, 都能直接访问到数据库软件, 因为"Path" 会帮忙跳转到该位置
1) (右键)此电脑->属性->高级系统设置->环境变量(N)-> 在系统变量(S)下的列表中找到"Path"
2) 双击"Path"或者选中"Path"点击编辑, 点击新建(N), 将"数据库安装目录的bin目录"添加到列表中
3) 优化操作
在"系统变量(S)"下的列表中, 新建一个变量
变量名:SQL_HOME
变量值:"C:\Program Files\MariaDB 10.6"
"Path"中的改动:
由原来的:
C:\Program Files\MariaDB 10.6\bin
变更为:
%SQL_HOME%\bin
MySQL 部署架构
一个完整的 MySQL DBMS 分为两大部分:
1) 客户端:为用户提供操作界面, 以便于向服务器发送 "增删改查" 操作
2) 服务器端:服务于客户端, 接收并处理用户发送的请求, 以此对数据进行存储, 管理和分类
MySQL 层级架构
数据库服务器(DBServer) -> 子数据库(DataBase) -> 数据表(Table) -> 数据(Data)
1) 数据库服务器:在安装好数据库软件之后, 数据库服务器会自行搭建完毕
-- 数据库服务器中的操作的是 子数据库
-- 操作 子数据库 要学习 库相关的SQL
2) 子数据库:mysql 数据库服务器搭建好之后, 系统默认会自带一些子数据库
-- 子数据库中操作的是数据表
-- 操作 数据表 要学习 表相关的SQL
3) 数据表:系统不会自带数据表, 所以使用前要自行创建
-- 数据表中操作的是 数据
-- 操作 数据 要学习 数据相关的SQL
大文件夹 -> 分类文件夹 -> 数据表 -> 数据
库相关的SQL(库 database)
1. 查询所有数据库
格式: show databases;
2. 创建数据库
格式: CREATE DATABASE 库名;
案例: CREATE DATABASE db1;
拓展1:当指定创建的数据库"不存在"时, 才执行创建
格式: CREATE DATABASE IF NOT EXISTS 库名;
案例: CREATE DATABASE IF NOT EXISTS db1;
-- 性能 安全性
扩展2: 创建的同时指定字符集编码
格式: CREATE DATABASE 库名 character SET latin1/gbk/utf8;
案例: CREATE DATABASE db2 character SET utf8;
-- 注: 数据库服务器默认使用 latin1 作为字符集编码, 如果后期在创建子数据库时, 没有设置子字符编码, 那该子数据库会沿用数据库服务器的字符集编码
-- latin1 1个中文字符 对应1个字节
-- gbk 1个中文字符 对应2个字节
-- utf8 1个中文字符 对应3个字节
latin1: 拉丁码/欧洲编码 里面收录了英文
gbk: 国标编码 里面收录了中文和英文
utf-8: 国际编码 里面收录了世界各国语言
3. 查询库详情(查询创建时的库)
格式: show CREATE DATABASE 库名;
案例: show CREATE DATABASE db2;
4. 删除数据库
格式: DROP DATABASE 库名;
案例: DROP DATABASE db1;
拓展:当指定删除的数据库"存在"时, 才执行删除
格式: DROP DATABASE IF EXISTS 库名;
案例: DROP DATABASE IF EXISTS db1;
5. 使用数据库
格式: USE 库名;
案例: USE db1;
-- 该语言可以不写 ";"
6. 修改数据库编码
格式: alter database 数据库名 character set 编码方式 //修改数据库编码方式
案例: alter database db1 character set utf8;
表相关的SQL(表 TABLE )
-- 注: 为了避免创建的是一张无用表, 所以在创建表格时, 要求必须有"字段"
-- 网页表格中的表头 等同于 java中的属性 等同于 数据库中的字段
1. 创建表
格式: CREATE TABLE 表名(字段1 字段1类型, 字段2 字段2类型...);
案例: CREATE TABLE t1(name varchar(10), age int, salary double);
扩展: 创建表的同时指定表引擎和字符集编码
-- 引擎:
--1) myisam: 只支持最基本的增删改查, 不具备任何SQL 高级的功能
--2) innoDB(mysql默认): 除了支持基本的增删改查外, 还具备事务, 外键等SQL高级特性
格式1: CREATE TABLE 表名(字段1 字段1类型, 字段2 字段2类型...)charset=latin1/gbk/utf8;
格式2: CREATE TABLE 表名(字段1 字段1类型, 字段2 字段2类型...)engine=myisam/innoDB;
格式3: CREATE TABLE 表名(字段1 字段1类型, 字段2 字段2类型...)engine=myisam/innoDB charset=latin1/gbk/utf8;
案例1: CREATE TABLE t2(name varchar(10), age int, salary double)charset=gbk;
案例2: CREATE TABLE t3(name varchar(10), age int, salary double)engine=myisam;
案例3: CREATE TABLE t4(name varchar(10), age int, salary double)engine=myisam charset=utf8;
2. 查询所有表
格式: show tables;
3.查询表详情(查询创建时的表)
格式: show CREATE TABLE 表名;
案例: show CREATE TABLE t2;
4. 查询表字段信息
格式: DESC 表名;
案例: DESC t4;
5.修改表名 --rename 不属于修改的通用关键字, 只专属于改名
格式: rename TABLE 原表名 TO 新表名;
案例: rename TABLE t1 TO t001;
6.修改表字符集和引擎
格式: ALTER TABLE 表名 engin=myisam/innoDB charset=latin1/gbk/utf8;
案例: ALTER TABLE t2 engine=innodb charset=utf8;
7.修改(添加)表字段
格式: ALTER TABLE 表名 ADD 字段名 字段类型;
案例: ALTER TABLE t4 ADD gender varchar(2); --追加
格式: ALTER TABLE 表名 ADD 字段名 字段类型 first;
案例: ALTER TABLE t4 ADD id INT first;
格式: ALTER TABLE 表名 ADD 字段名 字段类型 after xx字段;
案例: ALTER TABLE t4 ADD phone varchar(20) after age;
8. 修改(修改)字段名和字段类型
格式: ALTER TABLE 表名 change 原字段名 新字段名 新字段类型;
案例: ALTER TABLE t4 change gender sex int;
9.修改(修改)字段类型和位置
格式: ALTER TABLE 表名 modify 字段名 新字段类型 first /after xx字段;
案例: ALTER TABLE t4 modify sex varchar(5) after name;
10. 修改(删除)表字段
格式: ALTER TABLE 表名 DROP 字段名;
案例: ALTER TABLE t4 DROP sex;
11. 删除表
格式: DROP TABLE 表名;
案例: DROP TABLE t4;
-- 总结: 库表相关的通用关键字
增: CREATE
查: show
改: ALTER
删: DROP
-- 注: 数据相关的通用关键字与库表相关不同
show databases;
CREATE DATABASE db3;
USE db3;
CREATE TABLE t1(name VARCHAR(10),age INT,salary double);
show tables;
show CREATE TABLE t1;
DESC t1;
数据相关的sql
1. 插入数据(增: INSERT INTO)
1) 全表插入
-- 所谓全表插入, 就是该表有多少个字段, 就必须对应插入多少个值
格式: INSERT INTO 表名 VALUES(值1, 值2, 值3...);
--注: value和values 的效果在mysql中是完全一致的, 官方建议用values
案例:
INSERT INTO
t1
VALUES(
'a', 18, 2345.21
);
INSERT INTO
t1
VALUES(
'a1', 22, 2222
);
-- 注: 在数据库中的文本类型的数据建议使用单引号, 后期便于对接java服务器
String sql = "INSERT INTO t1 VALUES ('a', 18, 2745.21)"
String sql = "INSERT INTO t1 VALUES ("a", 18, 2745.21)"
INSERT INTO
t1
value(
'a', 18, 2745.21
);
INSERT INTO
t1
value(
'c', '19', 5945.21
);
INSERT INTO
t1
VALUES(
'c1', '19', 3945.21
),(
'c2', '19', 4945.21
),(
'c3', '19', 6945.21
);
-- 注: mysql 的优化 使用该方式插入数据时, 要按照字段的顺序进行插入(即: 插入顺序要与表字段顺序一致), 而一致的要求不是绝对的, 因为有些数据可以进行转换, 如: 字符串的'18'可以转成int类型的18. 但有些数据不能转换就会出现error从而导致程序强制关闭, 如: 字符串的'十八'不能转成int类型的18
2) 指定字段插入
格式: INSERT INTO 表名(字段1, 字段3) VALUES(值1, 值3);
案例:
INSERT INTO
t1(
name, salary
)VALUES(
'd', 5555
);
INSERT INTO
t1(
name, age
)VALUES(
'e', 18.6
);
INSERT INTO
t1(
name, salary
)VALUES(
'a4',2659
),(
'a5',3659
),(
'a6',4659
);
--注: 在插入数据的过程中, 如果类型不一致, mysql可能会对数据进行转换, 如: double类型的35.7转成int类型的36, 虽然没有出现error, 但数据产生了误差也是要绝对避免的
3) 批量全表插入
格式:
INSERT INTO
表名
VALUES(
值1, 值2....
),(
值1, 值2....
);
案例:
INSERT INTO
t1
VALUES(
"f1", 21, 2313
),(
"f2", 22, 2821
);
4) 批量指定字段插入
格式:
INSERT INTO
表名(
字段1, 字段3
)VALUES(
值1, 值3
),(
值1, 值3
);
案例:
INSERT INTO
t1(
name, salary
)VALUES(
"f3", 5648
),(
"f4", 6423
);
--总结: 凡是提到全表的, 表名后面直接跟values; 凡是提到指定字段的, 表名后面先跟"()", 再加values
2. 查询数据(查: SELECT )
1) 查询所有数据
格式: SELECT * FROM 表名;
案例: SELECT * FROM t1;
2) 条件查询(WHERE 是条件过滤筛选的关键字)
格式:
SELECT
*
FROM
表名
WHERE
普通条件;
--注: where 后面决定"行数", select 后面决定"列数"
案例:
SELECT
name, salary
FROM
t1
WHERE
salary > 10000;
3.修改数据(改 UPDATE )
1) 修改给定字段的值 --应用于给定字段的所有数据, 极少用
格式: UPDATE 表名 SET 字段=xxx;
案例:
UPDATE
t1
SET
salary=4000;
2) 条件修改
格式:
UPDATE
表名
SET
字段名=xxx
WHERE
普通条件;
案例:
UPDATE
t1
SET
salary=4000
WHERE
salary<3000;
UPDATE
t1
SET
salary=4000
WHERE
salary IS null;
4. 删除数据(删 DELETE )
1) 删除表中的所有数据 --清空表数据, 极少用
格式: DELETE FROM 表名;
2) 条件删除
格式:
DELETE FROM
表名
WHERE
普通条件;
案例:
DELETE FROM
t1
WHERE
age IS NULL;
-- 注: 对于null值, 删除的条件不能使用"=", 因为"="比较的是数值, 要使用is
-- 错误: delete from t1 where age = null;
-- 此处的错误表示语法不生效, 不会出现error
-- 正确: delete from t1 where age is null;
数据类型(常用)
1. 整数
TINYINT -- 较常用
占1个字节, 相当于java中的byte -- -128~127
SMALLINT -- 极少用
占2个字节, 相当于java中的short -- -32768~32767
INT -- 最常用
占4个字节, 相当于java中的int -- -21亿多~21亿多
-- int(m) m表示显示长度, 如: m=4 插入18时, 结果显示0018
-- 上述的补零操作, 必须是在创建表时, 给字段类型后加上 zerofill 关键字
BIGINT -- 最常用
占8个字节, 相当于java中的long
案例:
CREATE TABLE
t2(
tint TINYINT,
sint SMALLINT,
int01 INT(4) zerofill,
bint BIGINT
);
INSERT INTO
t2(
tint,
sint,
int01,
bint
)VALUES(
127,
32767,
18,
2200000000
);
-- 低版本: error, 超出了tinyint的取值范围
-- 最新版: 不报错! 将超出的值删掉替换为该类型的最大值(优化操作)
SELECT * FROM t2;
DROP TABLE t2;
2. 浮点数
FLOAT(m,d)
占4个字节, 相当于java中的float
DOUBLE(m,d) --最常用
占8个字节, 相当于java中的double
-- 注: float和double都是不安全的, 容易出现精度偏移
DECIMAL(m,d) -- 精度安全
-- 注: m表示总长, d为小数点后的个数 金融行业
案例:
CREATE TABLE t3(salary DOUBLE(4,2));
INSERT INTO t3 VALUES(12.233); -- 正确, mysql做了优化, 小数位上超出的部分四舍五入
INSERT INTO t3 VALUES(12.23); -- 正确
INSERT INTO t3 VALUES(122.3); -- error
SELECT * FROM t3;
3. 字符串(文本)
CHAR(n): 定长字符串, 最长不超过255个字符, n表示字符数. 所谓定长是指当"插入的字符长度"小于"给定长度n"时, 剩余的空间会用空格填充. -- 浪费空间, 运行效率高于VARCHAR
VARCHAR(n): 变长字符串, 最长不超过65523个字符, n表示字符数. 所谓定长是指当"插入的字符长度"小于"给定长度n"时, 剩余的空间会截取掉留给后面数据使用. -- 节省空间, 运行效率低于CHAR
TEXT(n): 大本文/长文本类型, 一般超过255个字符时建议使用该类型
tinytext 最大长度 256 字节 -- 字符集latin1
TEXT 最大长度 64 kb
mediumtext 最大长度 64 mb
longtext 最大长度 4 gb
4. 日期
DATE(保存年月日) 'xxxx-xx-xx' --注:插入时, 中间支持"-"衔接, 也支持"/", 但最终数据库都会同意转为"-"
TIME(保存时分秒) 'xx:xx:xx'
timestamp(保存年日月时分秒) 'xxxx-xx-xx xx:xx:xx'
-- 最大值为 2038-1-19
DATETIME(保存年月日时分秒)
-- 最大值为 9999-12-31
SQL分类
1. 数据定义语言 DDL
1) 负责数据库"结构"的定义与修改
2) 常见: CREATE ALTER DROP
2. 数据操纵语言 DML
1) 负责对数据库中的"数据"进行操作
2) 常见: INSERT SELECT UPDATE DELETE
--注: 把"增查该删"称为"CRUD"
3) 由于使用频繁, select后期被单独划分为一类
3. 数据查询语言 DQL
1) 用于查询表内的数据
2) 常见: SELECT
-- 注: DQL 其实也是DML的一部分
-- 其他:
-- select now(); 查看当前时间
-- select version(); 查看当前版本
-- select user(); 查看当前用户
-- select database(); 查看当前数据库
-- show variables like '%connections%'; 查看最大连接数
-- show variables like '%datadir%'; 查看数据库储存路径
-- status 查看当前配置
-- set password for root@localhost=password('root'); 修改密码
-- grant all on *.* to lll@localhost; grant 高级 lll 管理 MySQL 中所有数据库的权限。