走进数据库数据库!

1、初识MySQL

JavaEE : 企业级Javan Web前端(页面:展示,数据!)后台(连接点: 连接数据库JDBC,链接前端(控制,控制视图跳转,和给前端传递数据))数据库(存数据, ITxt, Excel, word)

只会写代码,学好数据库,基本混饭吃!
操作系统,数据结构与算法!当一个不错的程序猿!
离散数学,散字电路,体系结构,编译原理,+实战经验,高级程序猿优秀的程序猿

1.1、为什么学习数据库

1、岗位需求
2、现在的世界,大数据时代-,得数据库者得天下。
3、被迫需求:存数据
4、数据库是所有软件体系中最核心的存在DBA

1.2、什么是数据库

数据库(DB,DataBase) 概念:数据仓库,软件,安装在操作系统(window,inux,mac、
.….)之上!SQL,可以存储大量的数据。500万!
作用:存储数据,管理数据Excel

1.3、数据库分类

关系型数据库:
• MySQL, Oracle, Sql Server, DB2, SQLlite
• 通过表和表之间,行和列之间的关系进行数据的存储,学员信息表,考勤表,…

非关系型数据库:(NoSQL) Not Only
• Redis, MongDB
• 非关系型数据库,对象存储,通过对象的自身的属性来决定。

DBMS(数据库管理系统)
• 数据库的管理软件,科学有效的管理我们的数据。维护和获取数据;
• MysQL 数据库管理系统!

1.4、MySQL简介

MySQL是一个关系型数据库管理系统
前世:瑞典MySQLAB公司
今生:属于Oracle旗下产品
MySQL是最好的RDBMS(Relational Database Management System,关系数据库管理系统)应用软件之一。
开软的数据库软件~
体积小、速度快、总体拥有成本低,招人成本较低,所有人必须会
中小型网站、或者大型网站,集群!
官网:https://www.mysql.com
官网下载地址:https://dev.mysql.com/downloads/mysql/

安装建议:
1、尽量不要使用exe,注册表,否侧卸载很麻烦
2、尽可能使用压缩包安装~

1.5、安装Mysql

教程:教你安装mysql 含有下载资源

1.6、安装Sqlyog

  • 无脑安装下一步完成运行
    在这里插入图片描述
  • 注册
  • 打开连接数据库

在这里插入图片描述

2、操作数据库

操作数据库>操作数据库中的表>操作数据库中表的数据
mysql关键字不分区大小写

2.1、操作数据库

1、创建数据库
CREATE DATABASE [IF NOT EXISTS] westos;
2、删除数据库
DROR DATABASE [IF EXISTS] westos
3、使用数据库
– tab 健的上面,如果你的表名或者字段名是一个特殊字符,就需要带`‘’ USE ‘school’
4、查看数据库
show datanase

2.2、数据库的列类型

数值:

  • tinyint 十分小的数据 1个字节
  • smallint 较小的数据 2字节
  • mediumint 中等大小数据 3字节
  • int 标准的整数 4字节
  • bigint 较大的数据 8字节
  • float 浮点数 4字节
  • double 浮点数 8字节
  • decimal 字符串形式的浮点数 金融计算时候,一般使用

字符串:

  • char 字符串 0~255
  • varchar 可变字符串 0~65535
  • tinytext 微型文本2^8-1
  • text 文本串 2^16-1

时间日期

  • date YYYY-MM-DD日期
  • time HH: mm: ss 时间格式
  • datatime YYYY-MM-DD HH: mm: ss最常用时间格式
  • timestamp 时间戳 1970.1.1到现在的毫秒数
  • year 年份表示

null

  • 没有值,未知

2.3、数据库的字段属性

Unsigned

  • 无符号的整数
  • 声明了该列不能声明为负数

zerofill

  • 0填充
  • 不足的位数,使用0来填充

自增

  • 自动在上一条的基础上加1
  • 通常设置唯一主键 index

非空 Null not null

  • 假设设置为 not null 如果不给他值会报错
  • null 不填写值,默认就是null

默认

  • 设置默认的值

2.5、数据表类型

INNODB 默认使用
MYISAM 早些年使用

MYISAM INNODB
事务支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小 较大,约为2倍

常规使用操作:

  • MYISAM 节约空间,速度快
  • INNODB 安全性高,事务的处理,多表多用户操作

在物理空间存在的位置所有的数据文件都存在data目录下本质还是文件的存储

在这里插入图片描述

2.6、修改删除表

在这里插入图片描述

3、mysql数据管理

3.1、外键
在这里插入图片描述

3.2、DML语言

在这里插入图片描述

3.3、添加

在这里插入图片描述
在这里插入图片描述

3.4、修改

在这里插入图片描述
在这里插入图片描述

3.5、删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、DQL查询数据

4.1、DQL

在这里插入图片描述

4.2、指定查询字段

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3、条件子句

在这里插入图片描述
在这里插入图片描述
模糊查询
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4、联表查询

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
自连接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5、分页和排序

在这里插入图片描述

分页
在这里插入图片描述
语法:limit(查询起始下标,pageSize)

4.6、子查询

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.7、分组过滤

在这里插入图片描述

5、Mysql函数

官网:https://dev.mysql.com/doc/

5.1、常用函数

在这里插入图片描述

5.2、聚合函数(常用)

在这里插入图片描述
在这里插入图片描述

5.3、数据库级别的MD5加密

在这里插入图片描述
在这里插入图片描述

6、事务

6.1、什么是事务

要么都成功,要么都失败


1、sql执行,a给b转账 a 1000 —> b 200
2、sql执行 b收到a的钱 a 800 --> b 400


将一组sql放在一个批次中去执行

事务原则:

  • acid原则 原子性,一致性,隔离性,持久性(脏读,幻读…)

原子性

  • 要么都成功,要么都失败

一致性

  • 事务前后的完整性要保证一至,1000

持久性 – 事务提交

  • 事务一旦提交则不可逆,被持久化到数据库

隔离性
在这里插入图片描述
在这里插入图片描述
执行事务
在这里插入图片描述

7、索引

在这里插入图片描述

7.1、索引分类

  • 主键索引 (primary key)
    唯一标识,主键不可重复,只能有一个列作为主键
  • 唯一索引 (unique key)
    避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一索引
  • 常规索引(key/index)
    默认的,index,key关键字来设置
  • 全文索引(fullText)
    在特定的数据库引擎下才有,mylsam
    快速定位数据
    在这里插入图片描述

7.2、测试

建表

CREATE TABLE `app_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT '' COMMENT '用户昵称',
`email` varchar(50) NOT NULL COMMENT '用户邮箱',
`phone` varchar(20) DEFAULT '' COMMENT '手机号',
`gender` tinyint(4) unsigned DEFAULT '0' COMMENT '性别(0:男;1:女)',
`password` varchar(100) NOT NULL COMMENT '密码',
`age` tinyint(4) DEFAULT '0' COMMENT '年龄',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'

批量插入数据:100w

DROP FUNCTION IF EXISTS mock_data;
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i < num DO
  INSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`)
   VALUES(CONCAT('用户', i), '[email protected]', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));
  SET i = i + 1;
END WHILE;
RETURN i;
END;
SELECT mock_data();

索引效率测试

无索引

SELECT * FROM app_user WHERE name = '用户9999'; -- 查看耗时
SELECT * FROM app_user WHERE name = '用户9999';
SELECT * FROM app_user WHERE name = '用户9999';

mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用户9999'\G
*************************** 1. row ***************************
          id: 1
select_type: SIMPLE
       table: app_user
  partitions: NULL
        type: ALL
possible_keys: NULL
        key: NULL
    key_len: NULL
        ref: NULL
        rows: 992759
    filtered: 10.00
      Extra: Using where
1 row in set, 1 warning (0.00 sec)

创建索引

CREATE INDEX idx_app_user_name ON app_user(name);

测试普通索引

mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用户9999'\G
*************************** 1. row ***************************
          id: 1
select_type: SIMPLE
       table: app_user
  partitions: NULL
        type: ref
possible_keys: idx_app_user_name
        key: idx_app_user_name
    key_len: 203
        ref: const
        rows: 1
    filtered: 100.00
      Extra: NULL
1 row in set, 1 warning (0.00 sec)

mysql> SELECT * FROM app_user WHERE name = '用户9999';
1 row in set (0.00 sec)

mysql> SELECT * FROM app_user WHERE name = '用户9999';
1 row in set (0.00 sec)

mysql> SELECT * FROM app_user WHERE name = '用户9999';
1 row in set (0.00 sec)

7.3、索引准则

  • 索引不是越多越好

  • 不要对经常变动的数据加索引

  • 小数据量的表建议不要加索引

  • 索引一般应加在查找条件的字段

8、权限管理和备份

8.1、用户管理

使用SQLyog 可视化管理
基本命令

/* 用户和权限管理 */ ------------------
用户信息表:mysql.user

-- 刷新权限
FLUSH PRIVILEGES

-- 增加用户 CREATE USER kuangshen IDENTIFIED BY '123456'
CREATE USER 用户名 IDENTIFIED BY [PASSWORD] 密码(字符串)
  - 必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
  - 只能创建用户,不能赋予权限。
  - 用户名,注意引号:如 'user_name'@'192.168.1.1'
  - 密码也需引号,纯数字密码也要加引号
  - 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD

-- 重命名用户 RENAME USER kuangshen TO kuangshen2
RENAME USER old_user TO new_user

-- 设置密码
SET PASSWORD = PASSWORD('密码')    -- 为当前用户设置密码
SET PASSWORD FOR 用户名 = PASSWORD('密码')    -- 为指定用户设置密码

-- 删除用户 DROP USER kuangshen2
DROP USER 用户名

-- 分配权限/添加用户
GRANT 权限列表 ON 表名 TO 用户名 [IDENTIFIED BY [PASSWORD] 'password']
  - all privileges 表示所有权限
  - *.* 表示所有库的所有表
  - 库名.表名 表示某库下面的某表

-- 查看权限   SHOW GRANTS FOR root@localhost;
SHOW GRANTS FOR 用户名
   -- 查看当前用户权限
  SHOW GRANTS;SHOW GRANTS FOR CURRENT_USER;SHOW GRANTS FOR CURRENT_USER();

-- 撤消权限
REVOKE 权限列表 ON 表名 FROM 用户名
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户名    -- 撤销所有权限

权限解释

-- 权限列表
ALL [PRIVILEGES]    -- 设置除GRANT OPTION之外的所有简单权限
ALTER    -- 允许使用ALTER TABLE
ALTER ROUTINE    -- 更改或取消已存储的子程序
CREATE    -- 允许使用CREATE TABLE
CREATE ROUTINE    -- 创建已存储的子程序
CREATE TEMPORARY TABLES        -- 允许使用CREATE TEMPORARY TABLE
CREATE USER        -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW        -- 允许使用CREATE VIEW
DELETE    -- 允许使用DELETE
DROP    -- 允许使用DROP TABLE
EXECUTE        -- 允许用户运行已存储的子程序
FILE    -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX     -- 允许使用CREATE INDEX和DROP INDEX
INSERT    -- 允许使用INSERT
LOCK TABLES        -- 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS     -- 允许使用SHOW FULL PROCESSLIST
REFERENCES    -- 未被实施
RELOAD    -- 允许使用FLUSH
REPLICATION CLIENT    -- 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE    -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT    -- 允许使用SELECT
SHOW DATABASES    -- 显示所有数据库
SHOW VIEW    -- 允许使用SHOW CREATE VIEW
SHUTDOWN    -- 允许使用mysqladmin shutdown
SUPER    -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE    -- 允许使用UPDATE
USAGE    -- “无权限”的同义词
GRANT OPTION    -- 允许授予权限


/* 表维护 */

-- 分析和存储表的关键字分布
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...
-- 检查一个或多个表是否有错误
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {
   
   QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- 整理数据文件的碎片
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

8.2、MySQL备份

  • 数据库备份必要性

    保证重要数据不丢失

  • 数据转移

    1.MySQL数据库备份方法:
    1.1直接拷贝数据库文件和相关配置文件.
    1.2在SQLyog这种可视化工具中手动导出
    在这里插入图片描述

1.3使用命令行导出 mysqldump

-- 导出
1. 导出一张表 -- mysqldump -uroot -p123456 school student >D:/a.sql
  mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)
2. 导出多张表 -- mysqldump -uroot -p123456 school student result >D:/a.sql
  mysqldump -u用户名 -p密码 库名 表123 > 文件名(D:/a.sql)
3. 导出所有表 -- mysqldump -uroot -p123456 school >D:/a.sql
  mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)
4. 导出一个库 -- mysqldump -uroot -p123456 -B school >D:/a.sql
  mysqldump -u用户名 -p密码 -B 库名 > 文件名(D:/a.sql)

可以-w携带备份条件

-- 导入
1. 在登录mysql的情况下:-- source D:/a.sql
  source 备份文件
2. 在不登录的情况下
  mysql -u用户名 -p密码 库名 < 备份文件

9、规范化数据库设计

9.1、为什么需要数据库设计

当数据库比较复杂时我们需要设计数据库

糟糕的数据库设计 :

  • 数据冗余,存储空间浪费

  • 数据更新和插入的异常

  • 程序的性能差

良好的数据库设计 :

  • 节省数据的存储空间

  • 能够保证数据的完整性

  • 方便进行数据库应用系统的开发

软件项目开发周期中数据库设计 :

  • 需求分析阶段: 分析客户的业务和数据处理需求

  • 概要设计阶段:设计数据库的E-R模型图 , 确认需求信息的正确和完整.

设计数据库步骤(个人博客)
在这里插入图片描述

9.2、三大范式

为什么需要数据规范化

  • 信息重复

  • 更新异常

  • 插入异常
    无法正常显示信息

  • 删除异常
    丢失有效的信息

三大范式

第一范式 (1st NF)
原子性:保证每一列不可再分

第二范式(2nd NF)

前提:满足第一范式
每张表只描述一件事情

第三范式(3rd NF)

前提:满足第一范式,第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能简介相关。

规范数据库的设计

规范性 和 性能的问题
关联查询的表不得超过三张表

  • 考虑商业化的需求和目标,(成本,用户体验)数据库性能更加重要
  • 在规范性能问题的时候,需要适当的考虑一下 规范性
  • 故意给某些表增加一些冗余的字段。(从多表查询中变为单表查询)
  • 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)

10、JDBC

10.1、数据库驱动

驱动:声卡、显示、数据库
在这里插入图片描述
我们的程序会通过 数据库 驱动,和数据库打交道!

10.2、JDBC

SUN 公司为了简化开发人员的(对数据库的统一)操作,提供了一个(Java操作数据库的)规范,俗称JDBC
这些规范的实现由具体的厂商去做~
对于开发人员来说,我们只需要掌握JDBC接口的操作即可
在这里插入图片描述
java.sql
javax.sql
还需要导入一个数据库驱动包

10.3、第一个JDBC程序

在这里插入图片描述
在这里插入图片描述

步骤总结:
1、链接数据库
2、连接数据库与DriverManager
3、获取执行的sql的对象 statement
4、获得返回的结果集
5、释放连接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.4、statement对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.8、事务

要么都成功,要么都失败
ACID
原子性:要么全不完成,要么都不完成
一致性:总数不变
隔离性:多个进程互不干扰
持久性:一旦提交不可逆,持久化到数据库

隔离性的问题
脏读:一个事务读取了另一个没有提交的事务
不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变
虚度(幻读):在一个事务内,读取到了别人插入的数据,导致前后读不出来结果不一致

10.9、数据库连接池

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_55400356/article/details/125228806