本文主要是介绍mysql数据库的详解及知识点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
javaee:企业级Java开发web
前端:页面展示数据
后台:连接点:连接数据库JDBC,连接前端:控制,控制视图跳转,和给前端传递数据
数据库:存数据,Txt,Excel,word
只会写代码,学好数据库,基本混饭吃
操作系统,数据结构与算法!当一个不错的程序员
离散数学,数字电路,体系结构,编译原理。+实战经验,高级程序员,优秀程序员
为什么学习数据库库
1.岗位需求
2.现在世界大数据时代,得数据得天下
3.被迫需求:存数据,去IO
4.数据库是所有软件体系最核心的---DBA数据库管理员
什么是数据库
数据库DB
概念:数据仓库,软件,安装在操作系统上(window,linux,mac..)SQL是操作数据库的语句,可以存大量的数据,500万
作用:存数据,管理数据
DBMS数据库管理系统
数据库分类
关系型数据库Excel行列
MySQL,Oracle,sqlServer,DB2,SQLlite
通过表和表之间,行和列之间的关系进行存储,学员表,考情表
非关系型数据库{key:value}(NOSQL Not Only)
Redis/MongDB
非关系型数据库,对象存储,通过对象的属性来决定(会动态更新,可变的)
DBMS数据库管理系统
数据库的管理软件---数据库要用软件打开----科学有效维护和获取数据
MySQL关系型数据库管理系统RDBMS
MySQL简介
前:瑞典MySQL AB公司后:Oracle
体积小速度快成本低招人成本低所有人必须会
中小型网站,或大型网站,集群
sql的注释为--
mysql -uroot -p123456--连接数据库
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';---修改用户名密码
flush privileges;--刷新权限
----------------------------------------------------------
--所有语句都用;结尾
show databases--查看所有的数据库
mysql>use school--切换数据库use数据库名
Database changed
show tables;--查看数据库中所有的表
describe student;--显示数据库中所有表的信息
create database westos(名称);--创建一个数据库
exit;--退出链接
-- 单行注释(SQL的本来注释)
SQL的多行注释
/**/
数据库****语言 CRUD增删改查
DDL 定义
DML 操作
DQL 查询
DCL 控制
=================================================================================================================
操作数据库
操作数据库>操作数据库中的表>操作数据库中的数据
mysql关键字不区分大小写
操作数据库:
1.创建数据库
create database [if not exits]westos(名字)
2.删除数据库drop database [if exits]westos
3.使用数据库
如果你的表名或字段是一个特殊字符就要带··反引号.
use ·school·
4.查看数据库
show databases查看所有的数据库
学习思路
对照sqlyog历史记录查看sql
固定语法和关键字要强行记住
数据库的列类型
数值型
tinyint 十分小的数据 1个字节
smallint 较小的数据 2个字节
mediumint 中等大小 3个字节
int 标准的整数 4个字节==============《
bigint 较大的数据 8个字节
float 浮点数 4个字节
double 浮点数 8个字节(精度问题)
decimal 字符串形式的浮点数 金融计算的时候,一般是使用decimal(无限循环小数)
字符串型
char 字符串固定大小的0~255
varchar 可变字符串 0~65535 常用字符串 String==============《
tinytext 微型文本 2^8-1
text 文本串 2^16-1 保存大文本==============《
时间日期
java.util.Date
date YYYY-MM-DD,日期格式
time HH:mm:ss,时间格式
datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式==============《
timestamp 时间戳,1970.1.1到现在的毫秒数!也极为常用!==============《
year 年份表示
null
没有值,未知
注意,不要使用NULL进行计算,结果为NULL
数据库的字段属性(重点)
Unsigned--无符号的整数,声明不能为负数
zerofill零填充---int(3),5->005
自增
通常理解为自增,自动在一条记录的基础上+1(默认)
通常用来设计唯一主键~index,必须是整数类型
可以自定义设计主键自增的起始值和步长
非空NULL not null
假设设置为not null,如果不给它赋值,就会报错、
Null,如果不写默认值,默认就是null
默认
设置默认值
sex,默认值为男,如果不指定该值,则会有默认值
每个表都必须有这五个字段,未来做项目用的,表示一个记录存在的意义
PRIMARY KEY主键
version --乐观锁
is_delete--伪删除
gmt_create--创建时间
gmt_update--修改时间
-------------1月7号 --------------------------------------------mysql
创建一schools数据库
创建学生表(列字段)使用sql
注意点;使用英文,表的名称和字段用反引号
AUTO_INCREMENT自增
字符串使用单引号括起来
所有的语句后面加,逗号(英文的),最后一个不用加
PRIMARY KEY主键,一般一个表只有一个唯一的主键
常用命令
SHOW CREATE DATABASE school -- 查看创建数据库的语句
SHOW CREATE TABLE students -- 查看students表的定义语句
DESC students -- 显示表的结构
=============================================================================================================
数据表的类型innodb和myisam
数据库的引擎
默认使用INNODB事务支持(mysql多个数据表同时成功才算成功)支持数据行锁定(两个mysql查同一个表,锁定其中的一行)外键约束,表空间较大是myisam两倍
早些年MYISAM--支持全文索引,表空间较小
常规使用
MYISAM-节约空间速度较快
INNODB安全性高,事务的处理,多表多用户操作
所有的数据库文件都在data目录下,一个文件就定义一个数据库
本质还是文件存储
MySQL在物理文件的区别
INNODB在数据库表中只有一个文件*.frm文件,以及上级目录的ibdatal文件
MYISAM对应的文件
*.frm表结构的定义文件
MYD数据文件(data)
MYI索引文件(index)
设置数据库表的字符集编码
1.CHARSET=utf8
不设置就默认不支持中文的Latin1
可以在my.ini里面设置character-set-server=utf8
================================================================================================================
修改删除表
-- 修改表名 : ALTER TABLE 旧表明 RENAME AS 新表名
ALTER TABLE student RENAME AS teachar1
-- 增加表的字段 : ALTER TABLE 表名 ADD 新字段名 列属性
ALTER TABLE teacher ADD age INT(11)
-- 修改表的字段 (重命名,修改约束)
-- ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE teacher MODIFY age VARCHAR (11)-- 修改约束
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[]
ALTER TABLE teacher CHANGE age age1 INT(1) -- 字段重命名
-- 删除表
DROP TABLE IF EXISTS teacher1
-- 所有创建和删除尽量加上判断,以免报错
============================================================================================================
数据库级别的外键
REFERENCES 引用
KEY `FK_greadeid` (`gradeid`),
CONSTRAINT `FK_greadeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
创建表的时候增加约束比较复杂
删除有外键表的时候,必须先删除引用别人的表(从表),再删除被引用的表(主表)
可以用修改表
-- 创建表的是没有外键关系`FK_greadeid`--约束名
ALTER TABLE `teachar`
ADD CONSTRAINT `FK_greadeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`);
以上外键都是物理外键,数据库级别的外键不建议使用---避免数据库过多造成困扰
最佳实现
数据库就是单纯的表,只是用来存数据,只有行数据,列字段
我们为你想使用多张表的数据,想使用外键(用程序趋实行)
DMl数据库管理语言(全部记住)
数据库意义:数据储存数据管理
DML数据操作语言
增加插入字段
语法:insert into 表名(`字段名1`,`字段名1`,`字段名1`)values('值1','值1','值1')
注意事项:
1.字段和字段之间使用英文逗号隔开
2.字段是可以省略的,但后面的值必须要以一一对应,不能少些
3.INSERT INTO `grade`(`gradename`) VALUES('大一'),('大二')可以同时插入多条数据VALUES后面的值要VALUES(),()
4.插入的主键必须是下一位数
Update 修改
Update `数据表名` set `字段名`=`value`
-- update 表名 set colnum_name=value,[colnum_name=value,] where[条件],colnum_name是列字段要带``
条件;where子句运算符id等于某个值,大于某个值,在某个区间内修改
操作符会返回布尔值
=
<>或!=不等于
>
<
<=
>=
between...and...区间
and
or或
不指定情况where 会改动所有数据--删库跑路
修改多个属性用英文逗号隔开
通过多个条件定位数据,无上限
value可以是具体的值,也可以是变量(current_time)
colnum_name是列字段要带``
DELETE和TRUNCATE区别
INSERT INTO `test`(`coll`)VALUES('1'),('2'),('3')
DELETE FROM `test`-- 不会影响自增,继续从上一个自增量开始(存在内存中,断电即失)
TRUNCATE TABLE `test`-- 自增回归零,不影响事务
了解即可:DELETE删除问题,重启数据库
INNODB 自增列会重1开始(存在内存中,断电即失)
MYISAM 继续从上一个自增量开始(存在文件中的,不会丢失)
===================================1月8号========mysql===============================================================
DQL查询数据(最重要)
(Data Query LANGUAGE: 数据查询语言)
所有的查询操作都用它 Select
简单的查询,复杂的查询都能做
数据库中最核心的语句,最重要的语句
使用频率最该的语句
1.指定查询字段
查询全部的表信息--select * from 表名
2.查询指定的字段
select `字段名`,`字段名` from 表名
3.给字段或者表起别名
select `字段名` as 别名,`字段名` as 别名 from 表名(不用反引号) as 别名
4.函数--拼接字符串Concat(a,b)作为新字段
select concat('姓名:',Studemtname) as 新名字 from 表名
有时候表名和列名不是见名知义用 `` as 别名
SELECT VERSION() -- 查询系统版本(函数)
SELECT 100*3-1 AS 计算结果 -- 用来计算(表达式)
SELECT DISTINCT `name` FROM teachar -- 去重
SELECT @@auto_increment_increment -- 查询步长(变量)
-- 学员成绩加1分查看
SELECT `id`,`score`+1 AS '提分后' FROM teachar
where子句之逻辑运算符
and &&
===============================================================================================================
-- 模糊查询(区间)
between and
not n=100---------not n!=100
is null | a is null 查询为空的
is not null | a is not 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,a3其中某一个值
like结合%----%代表0~任意一个字符--不具体的值
where 字段名 like '%刘%'
查询名字后面有一个字的
where 字段名 like '刘_'
查询名字后面有一个字的
where 字段名 like '刘__'
查询中间有加字
where 字段名 like '%加%'
where 字段名 in(一个或多个具体的值,不能有%)
not null 和null
查询为空的字符串
where address='' or address is null
==================================================================================================================
联表查询JoinON
--思考题(查询了参加考试的同学的信息:学号,学生姓名,科目名,分数)
思路:
1.分析需求,分析查询的字段来那些表,student,result,subject(连接查询)
2.确定使用哪种链接方式7种
3.确定交叉点(这两个表哪个数据是相同的)
4.判断的条件:学生表中studentNO=成绩表studentNO
----
1.我要查询哪些数据,重叠的数据一定要加表的别名
2.从哪几个表中查询from表(right/left/inner)join 链接的表--一定返回右/左/不会返回空字段
3.on/where 交叉点 4.判断条件r.a=l.a
要给表起别名
可以多个链表查询
join on 连接查询
where 等值查寻
================================================================================================================
1月9号------------mysql
select语法
[]可选{}必选
select[All/DISTINCT]
{*|table.*|table.field[as alias1][,table.field2[as alia2]]}
from table_name[as table_alias]
[left|right|inner join table_name2]--联合查询
[where ...[and..]]--指定结果需要满足的条件
[group by..]-- 指定结果按照哪几个字段来分组
[having]----过滤分组的纪录必须按一个或多个条件
[order by ..]--指定查询记录按一个或多个条件排序
[limit {[offset,]row_countOffset offset}];--指定查询的纪录从哪条至那条
======================================================================================================
自联查询
-- 查询父子信息:把一张表看为两张一摸一样的表
select a.`name` as '父项目', b.`name` as '子项目'
from `teacher` as a,`teacher` as b
where a.`id`=b.`score`
=========================================================================================================
分页和排序
排序:order by
升序asc降序desc
order by 字段名 asc/desc通过那个字段排序
分页:limit
为什么要分页
缓解数据库压力,给人体验更好,瀑布流
limit 起始下标,页面条数
这里有个公式:起始下标=(n-1)*页面条数,页面条数
总页数=数据总数/页面大小
==========================================================================================================
子查询和嵌套查询
子查询本质:在where里面嵌套一个子查询语句
子查询效率比连表查询高
子查询是想查询里面的(由里及外)
where `subjectResult`>=80 and `subjectNo` = (select subjectNo from `subject` where `subjectName` = `高等数学`)
===========================================================================================================
mysql函数 官网:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
常用函数
数学运算abs,ceiling,floor,rand,sign
字符串函数char_length,concat,insert,lower,upper,instr,replace,substr,reverse,
时间和日期函数:current_date,curdate,now,localtime
系统函数:system_user,user,version
聚合函数及分组过滤
having先group by..分组后过滤
count,sum,avg,max,min
count(*)和count(1)都不会忽略null,count(1)效率高
===============================================================================================================
数据库级别的MD5加密(扩展)
什么是MD5
主要是增强算法复杂度和不可逆性
MD5不可逆性,具体的值的md5是一样的
md5破解网站的原理,背后有一个字典,md5加密后的值,加密前的值
update 表名 set pwd =MD5(pwd) where id=1
插入的时候加密:insert into 表名 values(4,'yonghuming',MD5('123456'))
校验select from 表名 where (`name`='yonghuming', and pwd=MD5('123456'))--将用户传进来的加密密码进行对比
=======================================================================================================
事务
什么是事务
将一组数据放在一个批次去执行
要么成功要么失败
事务原则:acid原则 原子性,一致性,隔离性,持久性
原子性a:要么成功要么失败
一致性c:事务前后的数据完整性要保持一致,1000
隔离性i:事物的隔离性是多个用户并发访问数据库时,数据库为每一个用户开放其的事务,不能被其他的事务操作的数据所干扰,事物之间要相互隔离
持久性d:事务一旦提交则不可逆转,被持久到数据库中
隔离所导致的一些问题
脏读:指一个事务读取了,另外一个事务未提交的数据--两人只有一人转钱成功
不可重复读:在一个事务读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)---先看到值,后转进来
虚读(幻读):指一个事务内读到了别的插入的数据,导致前后读取不一致。----转错钱了
========================================================================================================
事务提交--转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE `account`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2)NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO account(`name`,`money`)
VALUES ('A',2000.00),('B',1000.00)
-- 模拟转账:事务
SET autocommint=0;-- 关闭自动提交
START TRANSACTION-- 开启一个事务
UPDATE account SET money=money-500 WHERE `name` = 'A' -- A减去500
UPDATE account SET money=money+500 WHERE `name`='B'-- B加500
COMMIT; -- 提交成功,就被持久化了
ROLLBACK; -- 回滚
SET autocommint=1; -- 恢复开启自动提交默认值
=======================================================================================================
索引分类
-- 索引的使用
-- 1.在创建表的时候给字段增加索引
-- 2.创建完毕后,增加索引
-- 显示所有的索引信息
show index from student
-- 增加一个全文索引 (索引名) 列名
alter table school.student add fulltext index `student` (`studentName`);
-- explain 分析sql执行的状况
explain select * from student;-- 非全文索引
explain select * from where match(studentName) Against('刘')
主键索引(primary key)
唯一标识,主键不可重复,只能有一个列作为主键
唯一索引(UNIQUE KEY)
避免重复索引的出现,唯一索引可以重复,多个列都可以标识 唯一索引
常规索引(key/index)
默认的,index ,key 关键字来设置
全文索引(fulltext)
快速定位数据
记住主键有主键名
1月10号------------------mysql
测试索引用处
索引小数据用处不大,大数据非常明显-- create index 索引名 on表(字段名)
索引原则
索引不是越多越好
不要对进程变动的数据加索引
小数据量的表不需要加索引
索引一般加在常用来查询的字段上
索引的数据结构
Hash 类型的索引
Btree: InnoDB的默认数据结构
阅读:http//:blog.codinglabs.org/articles/theory-of-mysql-index.html
==================================================================================================
数据库备份
mysql备份
为什么要备份
保存重要的数据不丢失
数据转移
mysql数据库备份的方式
直接拷贝data物理文件
在sqlyog中手动右键单机导出写导出位置导出的新名字
使用命令行导出 mysqldump 命令行使用
mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 >物理磁盘位置/文件名
mysqldump -hlocalhost -uroot -p123456 school student>D:/a.sql
mysqldump -h 主机 -u 用户名 -p 密码 数据库 表1 表2 表3 > 物理磁盘位置/文件名
mysqldump -hlocalhost -uroot -p123456 school student>D:/b.sql
mysqldump -u 主机 -u 用户名 -p 密码 数据库 >物理磁盘位置/文件名
mysqldump -hlocalhost -uroot -p123456 school >D:/b.sql
导入
登陆情况下
source 备份文件
source d/:a.sql
mysql -u用户名 -p密码 库名<备份文件
给被人检查错误,备份
===========================================================================================================
权限管理
修改密码
set password =password('新密码')
查看权限show grants for root@localhost
用户授权 all privileges 全部权限grant all privileges on *.* to kuangsheng
revoke 撤销权限revoke all privileges on *.* from kuangsheng
删除用户
drop user kuangshen
=====================================================================================================
数据库的归约,
为什么需要设计
当数据库比较复杂的时候,我们就需要设计了
糟糕的数据库设计:
数据库插入和删除都会麻烦,异常【屏蔽使用物理外键】
程序的性能差
良好的数据库设计
节省内存空间
保证数据库的完整性
方便我们开发系统
软件开发中,关于数据库的设计
分析需求:分析业务和需要处理的数据库的需求
概要设计:设计关系图E-R图
设计数据库的步骤(个人博客)
收集信息,分析需求
用户表(用户登录注销,用户的个人信息,写博客,创建分类)
分类表(文章分类,谁创建的)
评论表
文章表(文章信息)
友情表(友情信息)
自定义表(系统信息,某个关键的字,或者一些主字段)key:value
表示实体把需求落实到每一个字段
多列名不要大小写用下划线表示
字段写注释
写博客:user--blog
创建分类:user--category
关注;user--user
友链接:links
评论:user--user
========================================================================================================
为生么需要数据规范化
信息重复
更新异常
插入异常
无法正常显示信息
删除异常
丢失有效数据
三大范式
第一范式
原子性:保证每一列不可再分割
第二范式
前提:满足第一范式
每张表只是描述一件事
第三范式
前提满足第一和第二
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
规范数据库的设计
规范性和性能问题
关联查询的表不得超过三张表
考虑商业化的需求和目标,(成本,用户体验)数据库的性能更加重要
在规范性能问题的时候,需要适当的考虑一下规范性
故意给某些表增加一些冗余的字段(从多表查询中变为单表查询)
故意增加一些计算列(从大数据量将为小数据量的查询:索引)
====================================================================================================
JDBC
数据库驱动
驱动:声卡,显卡,数据库
数据库驱动是由数据库厂商生产
我们的程序会通过数据库驱动和数据库打交道
为了简化对数据库的统一操作,sum提供了Java操作数据库的规范JDBC
这些规范的实现有具体的厂商去做
JDBC控制数据库驱动
我们要掌握JDBC的接口
java.sql
javax.sql
还需要导入一个数据库驱动包
mysql-connector-java-5.1.47
1.加载驱动
2.链接数据库DriverManger
3.获得执行返回结果集
4.释放连接
业务级别的mysql学习
Class.formName("com.mysql.jdbc.Driver");//固定写法,加载驱动
String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
//mysql-- 3306 oracle--1521
协议://主机地址:端口号:数据库名?参数&参数
提取工具类
编写增删改查
ResultSet结果集
executeUpdate(String sql)方法完成数据修改操作
executeQuery(String sql)方法完成数据查询操作
statement对象不安全,sql会拼接 or
sql注入
sql存在漏洞,会被攻击导致数据泄露
不正常登录:login(username:" 'or'1=1",password:" 'or'1=1");
PreparedStatement对象防止注入的本质,把传递进来的参数当作字符
假设其中存在转义字符比如''会被直接转移
去jdbc看idea链接的mysql
数据库连接池
DBCP-C3PO连接池
数据库连接--执行完毕--释放 连接--释放十分浪费资源
池化技术:准备一些预先的资源,过来就连接预先准备好的
编写连接池实现一个接口DataSource
开源数据源实现
DBCP
C3P0
Druid:阿里巴巴
使用了这些数据库连接池后,我们在项目开发中不需要编写连接数据库的代码
DBCP
需要用到的jar包commons-dbcp-1.4.jar;commons-pool-1.6.jar
C3p0
这篇关于mysql数据库的详解及知识点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!