Mysql 简易入门
文章目录
- 1、数据库
- 1.1、数据库分类
- 1.2、DBMS(数据库管理系统)
- 1.3、MySQL
- 1.4、安装 MySQL
- 1.5、SQLyog / navicat 连接..
- 1.6、数据库连接
- 2、操作数据库
- 2.1、操作数据库
- 2.2、数据库的数据类型
- 2.3、数据库的字段属性
- 2.4、创建数据库
- 2.5、数据表的类型
- 2.6、修改/删除 表
- 3、MySQL 数据管理
- 3.1、外键
- 3.2、DML语言
- 3.3、添加
- 3.4、修改
- 3.5、删除
- 4、DQL 查询数据
- 4.1、查询指定字段
- 4.2、where 条件子句
- 4.3、联表查询
- 4.4、分页和排序
- 4.5、子查询
- 4.6、分组与过滤
- 5、MySQL 函数
- 5.1、常用函数
- 5.2、聚合函数(常用)
- 5.3、数据库级别的MD5加密(扩展)
- 6、事务
- 7、索引
- 7.1、索引的分类
- 7.2、索引原则
- 8、权限管理和备份
- 8.1、用户管理
- 8.2、MySQL 备份
- 9、规范数据库设计
- 9.1、设计的理由
- 9.2、三大范式
- 10、JDBC
- 10.1、数据库驱动
- 10.2、JDBC
1、数据库
数据库 (DB,DataBase)
作用:存储、管理数据
1.1、数据库分类
关系型数据库:(SQL)
MySQL,Oracle,SQL server…
通过表和表间行与列之间的关系进行数据存储
非关系型数据库:(NoSQL:Not Only SQL)
- Redis,MongDB
- 存储对象,通过对象的属性来决定
1.2、DBMS(数据库管理系统)
- 数据库管理软件,方便管理与操作数据库
- MySQL ,关系型数据库管理系统
1.3、MySQL
MySQL 是一个关系型数据库管理系统,开源的数据库软件,体积小、速度快
官网链接:https://www.mysql.com/
1.4、安装 MySQL
尽量使用压缩包安装,或者 Docker 安装
方式一:压缩包解压安装
下载官方 mysql 压缩包,解压到 自定义环境目录
添加环境变量:path中配置 mysql 安装包下 bin 目录 例如:
D:\Program Files\mysql-8.0.25-winx64\bin
新建 MySQL 配置文件 my.ini
[mysqld]# 设置 3306 端口port=3306# 设置 mysql 的安装目录basedir=D:\Program Files\mysql-8.0.25-winx64\# 设置 mysql 数据库的数据存放目录datadir=D:\Program Files\mysql-8.0.25-winx64\data\# 跳过密码验证skip-grant-tables
启动管理员模式下的 CMD ,切换至 MySQL 的bin目录下,输入
mysqld -install
(安装mysql服务)再输入
mysqld --initialize-insecure --user=mysql
初始化数据文件启动mysql 输入:
net start mysqlmysql -u root -p(回车,不要在p后面输入空格,回车后无需输入密码,直接回车,进入数据库)
修改密码,刷新权限 (SQL语句注意格式,需要分号;)
mysql> update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost';mysql> flush privileges;
修改 my.ini 文件,将最后一句
skip-grant-tables
进行删除或注释重启 mysql
exit/Ctrl + cnet stop mysqlnet start mysqlmysql -u root -p123456
方式二:Docker 安装
docker pull mysql:5.7
数据 挂载 启动 配置密码
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
启动成功后,本地使用 sqlyog 连接测试,连接服务器3310, 和容器内的3306映射
在本地创建一个数据库,测试一下映射的路径是否仍然存在
1.5、SQLyog / navicat 连接…
SQLyog 下载地址
2aj7
安装
证书
名称:any证书秘钥:dd987f34-f358-4894-bd0f-21f3f04be9c1
连接
navicat 下载 参考文章
1.6、数据库连接
命令行连接
mysql -uroot -p123456 --连接数据库show databases; --查看所有数据库
use db01; -- 切换数据库: use 数据库名;show tables; -- 查看数据库中所有表
describe student; -- 显示数据库中所有表的信息create database westos; -- 创建数据库exit; --退出连接-- 单行注释
/*
多行注释
*/
语言:
- DDL 定义
- DML 操作
- DQL 查询
- DCL 控制
2、操作数据库
2.1、操作数据库
1、创建数据库
CREATE DATABASE IF NOT EXISTS mydb;
2、删除数据库
DROP DATABASE IF EXISTS mydb;
3、使用数据库
USE `mydb`;
4、查看数据库
SHOW DATABASES; --查看所有数据库
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 时间格式
- datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
- timestamp 时间戳
- year 年份
- null
- 没有值
- 不要使用 null 进行运算,如果运算结果为null
2.3、数据库的字段属性
Unsigned:
- 无符号整数
- 声明该列不能声明为负数
zerofill:
- 0填充
- 不足的位数,使用0来填充
自增:
- 新的记录自动默认在上一条记录的基础上 +1
- 唯一主键,整数类型
- 可以自定义自增起始值和步长
非空:null ,not null
- not null,不赋值,将报错
- null,默认赋值null
默认:
- 设置默认的值!
- 默认为’xx’,如果不指定值,则为默认值
拓展
在项目中,每个表必须存在的五个字段,表示记录存在的意义id 主键
`version` 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
2.4、创建数据库
-- 表的名称 和 字段尽量使用 `` 括起来
-- 字符串使用 单引号括起来
-- 所有的语句后面加 , 最后一个不用加
CREATE TABLE IF NOT EXISTS `student` (`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
格式
CREATE TABLE [IF NOT EXISTS] `表名` (`字段名` 列类型 [属性] [索引] [注释],`字段名` 列类型 [属性] [索引] [注释],...`字段名` 列类型 [属性] [索引] [注释][PRIMARY KEY(`id`)]
)[表类型] [字符集设置] [注释]
常用命令
--
SHOW CREATE DATABASE 数据库名 -- 查看创建数据库的语句
SHOW CREATE TABLE 表 -- 查看 数据表的创建定义语句
DESC 表 -- 显示表的结构
2.5、数据表的类型
-- 数据库引擎
/*
INNODB 默认使用
MYISAM
*/
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大 |
常规使用操作:
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务处理,多表多用户操作
物理空间的位置
所有的数据库文件都存在 data 目录下
本质是文件存储
设置数据库表的字符集编码
创建数据库时设置
CHARSET=utf8
2.6、修改/删除 表
修改
-- 修改表名 ALTER TABLE 旧表名 RENAME AS 新表名;
ALTER TABLE student RENAME AS `student1`;-- 增加表的字段
ALTER TABLE `student` ADD name VARCHAR(10)-- 修改表的字段
-- 重命名字段
ALTER TABLE 表名 CHANGE age age1 INT(2)
-- 修改约束
ALTER TABLE 表名 MODIFY age VARCHAR(11)-- 删除表的字段
ALTER TABLE 表名 DROP age
删除
-- 删除表 (存在再删除)
DROP TABLE IF EXISTS 表名
3、MySQL 数据管理
3.1、外键
方式一:
CREATE TABLE `grade`(`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',`gradename` VARCHAR(50) NOT NULL COMMENT '年级',PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;CREATE TABLE `student` (`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',`gradeid` INT(10) NOT NULL COMMENT '学生年级',`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (`id`),KEY `FK_gradeid` (`gradeid`),CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
方式二:
CREATE TABLE `grade`(`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',`gradename` VARCHAR(50) NOT NULL COMMENT '年级',PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;CREATE TABLE `student` (`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',`gradeid` INT(10) NOT NULL COMMENT '学生年级',`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
以上两种方式皆属于物理外键,会使数据库表的关系复杂,而使操作数据库(删除,更新)不方便,不推荐使用
避免数据库级别的外键(物理外键)过多造成复杂化,推荐将数据库用来存储数据,使用程序去实现外键
3.2、DML语言
数据库意义:数据存储,数据管理
DML语言:数据操作语言
- insert
- update
- delete
3.3、添加
语法: insert into 表名([字段名1,字段名2,字段名3,…])values(‘值1’),(‘值2’),(‘值3’),…
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES('张三','abc','男');INSERT INTO `grade`(`gradename`)
VALUES('大二'),('大三');
注意:
- 可以省略字段名,values后的数据必须一一对应
- 添加多条数据,使用 , 隔开,即 values(),(),()
3.4、修改
语法:update 表名 set column_name=value [,column_name=value,…] where 条件
UPDATE `student` SET `name`='k',`age`=1 WHERE id = 1;
3.5、删除
delete
语法:
DELETE FROM `student` WHERE id=1;
truncate命令
作用:完全清空一个数据库表,表的结构、索引和约束不会改变。
TRUNCATE `grade`;
delete 与 truncate 的区别
- 相同点:删除表数据,不会删除表结构
- 不同点:
- truncate 重新设置自增列,计数器归零
- truncate 不会影响事务
4、DQL 查询数据
Data Query Language 数据查询语言
- 数据库中最核心的语言
select 语法
select [all | distinct] <select_expr>, <select_expr>, ...
from <table_reference>
[left | right |inner join table_reference_2 on <on_condition>]
[where <where_condition>]
[group by <col_list>] -- 通过字段分组
[having <having_condition>] -- 过滤分组的信息
[order by <order_condition>] -- 排序(ASC,DESC)
[distribute by <distribute_condition> [sort by <sort_condition>] ]
[limit <number>]
4.1、查询指定字段
-- 查询全部的
select * from 表-- 查询指定字段
select `studentId`,`studentName` from `student`-- 起别名
select `studentId` as 学号,`studentName` as 姓名 from `student`-- 函数 concat(a,b) 拼接
select concat('姓名:',studentName) as 姓名 from `student`
去重: DISTINCT
SELECT DISTINCT `name` FROM `student`
4.2、where 条件子句
作用:检索数据中符合条件的值
返回结果为布尔值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and , && | a and b , a&&b | 逻辑与,两个为真,结果为真 |
or ,|| | a or b ,a||b | 逻辑或,有一个为真,结果为真 |
not ! | not a , ! a | 逻辑非,真为假,假为真 |
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
is null | a is null | 若操作符为 null ,结果为真 |
is not null | a is not null | 若操作符不为 null ,结果为真 |
between | a between b and c | 若 a 在 [b,c] 中,结果为真 |
like | a like b | SQL 匹配,如果a 匹配 b,结果为真 |
in | a in (a1,a2,a3…) | 假设 a 在 a1,或者a2…其中某个值中,结果为真 |
like
-- 查询姓赵的同学
SELECT `id`,`name` FROM `student`
WHERE `name` LIKE '赵%';-- 查询名字中有五的同学
SELECT `id`,`name` FROM `student`
WHERE `name` LIKE '%五%';-- 查询姓王的同学,名字只有一个字
SELECT `id`,`name` FROM `student`
WHERE `name` LIKE '王_';-- 查询姓王的同学,名字只有两个字
SELECT `id`,`name` FROM `student`
WHERE `name` LIKE '王__';
in (具体的一个或多个值)
SELECT `id`,`name` FROM `student`
WHERE `id` IN ('1','2');
null, not null
SELECT * FROM `student`
WHERE `address` IS NULLSELECT * FROM `student`
WHERE `birthday` IS NOT NULL
4.3、联表查询
join
SELECT `name`,s.`gradeid`,`gradename`
FROM `student` s
INNER JOIN `grade` g
ON s.`gradeid` = g.`gradeid`
操作 | 描述 |
---|---|
inner join | 如果表中至少有一个匹配,就返回行 |
left join | 从左表中返回所有的值,即使右表中没有匹配 |
right join | 从右表中返回所有的值,即使左表中没有匹配 |
自连接
自己的表和自己的表连接,核心:一张表拆成两张一样的表
select a.`catName` as '父栏目',b.`catName` as '子栏目'
from `cat` as a,`cat` as b
where a.`id` = b.`pid`
4.4、分页和排序
order by 排序 :升序 ASC,降序 DESC
SELECT * FROM `student`
ORDER BY `gradeid` DESC
limit 分页:缓解数据库压力
语法:limit + 起始值,页面大小
第一页 limit 0,5 (1-1)*5
第二页 limit 1,5 (2-1)*5
第三页 limit 2,5 (3-1)*5
第 n 页 limit (n-1)*pagesize, pagesizepagesize: 页面大小
(n-1)*pagesize: 起始值
n:当前页
数据总数/页面大小 = 总页数-----SELECT * FROM `student`
ORDER BY `gradeid` DESC
LIMIT 0,3 -- 可以理解为分页,也可与 order by 结合 找到前几名
4.5、子查询
本质:在 where 中嵌套一个子查询语句
4.6、分组与过滤
分组:group by
过滤:having
注意点:通过分组后,不能使用 where 进行条件过滤,需要使用 having 来配合使用
-- 查询不同课程的平均分,最高分,最低分,平均分大于80
-- 核心——根据不同的课程分组
SELECT subjectName,AVG(StudentResult) as 平均分,MAX(StudentResult) as 最高分,MIN(StudentResult) as 最低分
from result r
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
GROUP BY r.`SubjectNo` -- 通过什么字段来分组
HAVING 平均分>80
5、MySQL 函数
5.1、常用函数
数学运算
SELECT ABS(-9) -- 绝对值
SELECT CEILING(8.4) --向上取整
SELECT FLOOR(8.2) --向下取整
SELECT RAND() -- 返回一个 0~1之间的随机数
SELECT SIGN(10) --判断一个数的符号 0-0,正数为1,负数为-1
字符串函数
SELECT CHAR_LENGTH('MySQL数据库') -- 字符串长度 8
SELECT CONCAT('I',' love ','you') -- 拼接字符串
SELECT INSERT('how are you,',4,1,' old ') -- 从某个位置开始替换某个长度 how old are you, SELECT LOWER('Hello') --小写字母
SELECT UPPER('Hello') --大写字母SELECT INSTR('hello','e') -- 查询第一次出现的子串的索引 2
SELECT REPLACE('how are you','you','them') -- 替换出现的字串 how are them
SELECT SUBSTR('I am fine,thank you. And you?',6,4) --返回指定的位置的字符串 fine
时间和日期
SELECT CURRENT_DATE(); --获取当前日期
SELECT CURDATE(); --获取当前日期
SELECT NOW(); --获取当前的时间
SELECT LOCALTIME(); --获取本地时间
SELECT SYSDATE();--获取系统时间/*
CURRENT_DATE() CURDATE() NOW() LOCALTIME()
2021-06-28 2021-06-28 2021-06-28 15:12:43 2021-06-28 15:12:43
*/
-- 年月日,时分秒
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())
系统
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()
-- root@192.168.199.1 root@192.168.199.1 5.7.34
5.2、聚合函数(常用)
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
… |
5.3、数据库级别的MD5加密(扩展)
MD5:增强算法复杂度和不可逆性
INSERT INTO `testmd5`(`name`,`pwd`) VALUES('xiaoming',MD5('123456'));SELECT * FROM `testmd5` WHERE `name`='xiaoming' AND pwd=MD5('123456')
6、事务
什么是事务
要么都成功,要么都失败
核心:将一组SQL放在一个批次去执行
原则:ACID 原则:原子性,一致性,隔离性,持久性。
参考博客 链接
原子性:要么都成功,要么都失败
一致性:事务前后的数据完整性要保持一致
持久性:事务一旦提交则不可逆,被持久化到数据库
隔离性:事务之间要互相隔离。
隔离所导致的一些问题
脏读:
指一个事务读取了另外一个事务未提交的数据。
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。
-- mysql 默认开启事务自动提交的
SET autocommit = 0 -- 关闭
SET autocommit = 1 -- 开启(默认的)-- 手动处理事务
SET autocommit = 0-- 事务开启
START TRANSACTION -- 标记一个事务的开始,这个之后的SQL都在同一个事务中-- 提交:持久化(成功)
COMMIT-- 回滚:回到原来的样子(失败)
ROLLBACK-- 事务结束
SET autocommit = 1 -- 开启自动提交SAVEPOINT 保存点名 -- 设置一个事物的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名 -- 撤销保存点
模拟转账场景
CREATE DATABASE `shop` CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE `account`(`id` INT(3) NOT NULL AUTO_INCREMENT,`name` VARCHAR(30) NOT NULL,`money` DECIMAL(9,2) NOT NULL,PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `account`(`name`,`money`)
VALUES ('A',2000.00),('B',10000.00)-- 模拟转账:事务SET autocommit = 0; -- 关闭自动提交
START TRANSACTION -- 开启一个事务
UPDATE account SET money=money-500 WHERE `name`='A'; -- A-500
UPDATE account SET money=money+500 WHERE `name`='B'; -- B+500COMMIT; -- 提交事务,一旦提交就被持久化,回滚也无效ROLLBACK; -- 回滚SET autocommit = 1; -- 恢复默认值
7、索引
索引(index)是帮助MySQL高效获取数据的数据结构。
7.1、索引的分类
- 主键索引(PRIMARY KEY)
- 唯一标识,不可重复,只有一个列作为主键
- 唯一索引(UNIQUE KEY)
- 避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
- 常规索引(KEY/INDEX)
- 默认,index,key
- 全文索引(FullText)
- 快速定位数据
7.2、索引原则
- 索引不是越多越好
- 不要对经常变动数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
索引的数据结构
阅读文章: MySQL索引背后的数据结构及算法原理
8、权限管理和备份
8.1、用户管理
SQL 操作
-- 创建用户
CREATE USER kkk IDENTIFIED BY '123456'-- 修改密码(当前用户)
SET PASSWORD=PASSWORD('123456')-- 修改密码(指定用户)
SET PASSWORD FOR kkk=PASSWORD('123456')-- 重命名
RENAME USER kkk TO kkk_2-- 用户授权(全部权限),库,表
GRANT ALL PRIVILEGES ON *.* TO kkk_2-- ALL PRIVILEGES 除了给其他人授权,其它都能干-- 查询权限
SHOW GRANTS FOR kkk_2; -- 查看指定用户的权限
SHOW GRANTS FOR root@localhost;-- 撤销权限 revoke 哪些权限,在哪个库,给谁撤销
REVOKE ALL PRIVILEGES ON *.* FROM kkk_2-- 删除用户
DROP USER kkk_2
8.2、MySQL 备份
方式:
- 拷贝物理文件
- 在 可视化工具中手动导出(选择表或者数据库 ,右键备份或导出)
- 使用命令行导出 mysqldump
命令行:
导出到 宿主机:
# mysqldump -h主机 -u用户名 -p密码 数据库 >文件路径/文件名
mysqldump -hlocalhost -uroot -p123456 school >D:/a.sql# mysqldump -h主机 -u用户名 -p密码 数据库 表 >文件路径/文件名
mysqldump -hlocalhost -uroot -p123456 school student >D:/a.sql# 导出多张表 mysqldump -h主机 -u用户名 -p密码 数据库 表1 表2 >文件路径/文件名
mysqldump -hlocalhost -uroot -p123456 school student grade >D:/a.sql
宿主机导入到MySQL:
# 登录后MySQL后输入
# source 备份文件
source d:/a.sql# 直接命令行输入
mysql -u用户名 -p密码 库名< 备份文件
docker
# 导入
docker exec -it 0e11c1bbdeb9 mysqldump -uroot -p123456 school > /home/tmp/test_db.sqldocker exec -it 0e11c1bbdeb9 mysqldump -uroot -p123456 school student > /home/tmp/test_db.sql
9、规范数据库设计
9.1、设计的理由
数据库比较复杂时,需要设计
糟糕的数据库设计:
- 数据冗余,浪费空间
- 数据库插入和删除都会麻烦、异常
- 程序的性能差
良好的数据库设计:
- 节省内存空间
- 保证数据库的完整性
- 方便开发系统
数据库设计:
- 分析需求:分析业务和需求处理的数据库需求
- 概要设计:设计关系图
9.2、三大范式
第一范式(1NF):
原子性:每一列不可再分。
第二范式(2NF):
先满足第一范式,每张表只描述一件事情
第三范式(3NF):
先满足第一、二范式;确保数据表中的每一列数据都和主键直接相关,不能有间接关系
规范性 和 性能问题
- 考虑商业化的需求和目标,数据库性能更加重要
- 故意增加一些冗余字段(从多表查询变为单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
10、JDBC
10.1、数据库驱动
10.2、JDBC
简化开发人员对数据库的统一操作,提供一个 Java操作数据库的规范,称为JDBC
规范的实现由具体的厂商解决,开发人员只需掌握JDBC 的接口操作
步骤:
- 加载驱动
- 连接数据库 DriverManager
- 获取执行SQL的对象 statement
- 获得返回的结果集
- 释放连接
Mysql 简易入门相关推荐
- webpack简易入门
webpack简易学习教程 1.为什么要用webpack? 模块化开发 代码压缩,合并,提取公共代码, 编译ES6,CoffeeScript: Scss,Less等css预处理器 2.webpack简 ...
- mysql从入门到精通之数据库安装图解
Mysql是基于C/S架构的.客户端/服务器Clinent /Server 安装版本建议:对于开源软件,不要追求最新的版本,最好是经过线上测试比较稳定的,也就是生产环境中的稳定版的,请务必选用稳定版本 ...
- MySQL 快速入门教程
转:MySQL快速 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数据 ...
- 一、mysql使用入门
一.mysql使用入门 1 mysql -h localhost -u root -p123456 登录mysql服务器 2 show databases 列出所拥有的数据库 3 use www 选择 ...
- 【Python基础】科学计算库Scipy简易入门
0.导语 Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工 ...
- AI基础:机器学习简易入门
0.导语 Machine Learning(机器学习)是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能.它是人工智能的核心,是使计算机具有智 ...
- AI 基础:Python 简易入门
0.导语 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的 ...
- AI基础:数据可视化简易入门(Matplotlib 和 Seaborn)
0 导语 Matplotlib 是一个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 . 通过 Matplotlib,开发者可以仅需要几行代码,便可以生 ...
- AI基础:Pandas简易入门
Pandas 简易入门 0.导语 pandas 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工 ...
最新文章
- matlab如何求传递函数的幅值_自动控制原理2.2.1 什么是传递函数,为什么要使用传递函数的概念...
- Coolite Toolkit学习笔记九:表单布局控件FormLayout与FromPanel
- 泛函分析——有界线性算子和函数
- golang 文件(文件打开,文件写入,文件读取,文件删除)的基本操作
- 【数据结构与算法】【算法思想】【MySQL数据库索引】B+树
- 协议森林14 逆袭 (CIDR与NAT)
- Matlab滤波器的verilog实现,FIR滤波器的Verilog实现
- Java基础拾遗:线程相关问题
- 辛辛苦苦写100条测试用例,为何只被正经执行的只有50条?
- python 迭代器 生成器_python 迭代器与生成器
- 谷歌浏览器修改CSS和js后同步保存到文件中 (译)
- 由内而外全面造就自己(七)
- 用html和css制作日历,CSS3制作日历
- SCI、EI论文框架
- app软件小程序开发
- 一个线上运营着3000+人的游戏,因为我不小心一个DROP DATABASE,全没了。 怎么办??跟我HOLD住!!!...
- 【毕业设计】基于单片机的宠物自动喂食系统 - 物联网 嵌入式 单片机 宠物喂食系统 宠物投食系统
- 计算机CD_ROM表示中文,CD-ROM是指什么?
- 取模(mod)与取余(rem)的区别
- 量子力学顺口溜_圆周率前五百位背诵顺口溜
热门文章
- Alamofire Async Await
- 《WOOP思维心理学》 读书笔记
- 计算机硬件维修ppt,计算机维修工取证辅导01-计算机硬件基础课件.ppt
- loss下降auc下降_随机梯度下降法介绍及其参数讲解
- java类似金山打字的键盘模拟_Java仿金山打字通打字母游戏《Java就该这样学》
- 2020年2月全国程序员工资统计,附大厂新入职员工职级对应表
- 抖音短视频APP开发如何生成二维码?
- 有哪些好用的工作汇报工具?
- SCMS读书笔记三——证书类型实现的特征
- linux 解压rar格式的文件怎么打开,linux服务器怎么解压rar格式的文件