目录
1.数据库2.引擎3.数据表4.数据表字段5.运算符6.数据7.DML查询数据7.1单表查询(从指定表中查询数据)7.1.1模糊查询7.1.2比较运算符7.1.3排序7.1.4.分页(缓解数据库压力,提高客户体验)7.1.5分组
7.2聚合函数查询(根据一组数据求一个值)7.3连接查询(把不同表的记录连到一起)7.4子查询(从内到外运算符查询)7.5合并查询(并列到一起查询)7.6联表查询(join)7.7自连接(一张表拆为两张一样的表,树状图)7.8别名(定义表和字段的别名)
8.MySql函数(一些基础函数)8.1数学函数
8.1字符串函数8.3日期时间函数8.4判断条件函数8.5系统信息函数8.6加密函数8.7其他函数9.索引(查询时更快查询到需索引的文件,提高了查询效率)9.1创建索引9.1.1在建立数据表时创建索引9.1.2.在已建立数据表时创建索引
9.2索引原则9.3索引背后的数据结构(之后研究)
10.视图(虚拟表,方便操作且有安全权限)11.数据完整性约束11.1实体完整性11.2参照完整性(不推荐使用外键)11.3用户定义完整性11.4命名完整性约束11.5更新完整性约束
12. DML语言(数据库操作语言)12.1 Insert(插入语句,添加)12.2 Update(修改语句)12.3 Delete(删除)12.3.1 delete删除问题
13.事务(sql执行事件,要么都成功,要么都失败)13.1 原子性13.2 一致性13.3 隔离性13.3.1隔离性的级别:
13.4 持久性13.5 步骤13.5.1需了解:
13.6 具体步骤
14.权限管理和备份14.1用户管理14.2备份
15.规范数据库设计15.1当数据库比较复杂的时候,就需要设计15.2 三大范式(规范数据库的设计)15.2.1规范性与性能的问题
16.JDBC16.1数据库驱动16.2 IDEA连接数据库16.3 代码实现(增删改查)16.4 sql注入问题(漏洞,会被攻击导致数据泄露—SQL会被or拼接)16.5 PreparedStatement(防止SQL注入)16.6 IDEA连接数据库16.7 JDBC操作事务16.8 连接池操作(DataSource接口)
1.数据库
/*其他电脑连接本地数据库:需提供本地jar包和ip地址,且需要改允许外部服务器访问
use mysql
;
select host
,user from user;
update user set host
='%' where user ='root';
flush
privileges;
select host
,user from user; /再次查看
1.create schema XXX(新数据库)
;
2.show databases;
3.show databases like 'XX%'(数据库)
;
4.use XXX
;
5.alter database XXX(数据库)
default character set utf8
default collate utf8_general_ci
;
6.drop database demo
;
create database XXX
character set utf8
collate utf8_general_ci
;
2.引擎
1.show engines
; 或
show engines\g
2.show variables
like 'XX%';(数据库)
3.数据表
primary key : 设置主键
auto_increment:自增,自动编号,如果要写字段,会自动生成下一个空的字段
not null: 不为空值
default:新字段默认数据初始值
unique:唯一索引
binary(
32):
32位字符串(二进制)
unsigned:自定义类型
1.use XX;
create table if exists demo
(
id
int auto_increment primary key comment ‘序号’
,
name
varchar(30) not null,
like varchar(30) not null,
time datetime);
2.show columns from XX(数据表)
from XX (数据库)
;
3.use XX;
desc XX
;
4.数据表字段
1.use XX;
alter table XX (数据表)
add XX (新字段)
varchar(30) not null;
2.use XX;
alter table XX(原字段)
modify XX(新字段)
varchar(40);
3.alter table XX(数据库)
.XX(数据表)
change
column XX (原字段)XX(新字段)
varchar(30) null default null;
4.use XX;
alter table XX(表名)
drop XX(字段名)
;
5.use XX;
alter table XX(原表名)
rename as XX(新表名)
;
6.use XX ;
create table XX(新数据表名)
like XX
;(源数据表名)
7.use XX;
drop table if exists XX
;
5.运算符
1.select XX(字段名)
+XX(字段名)
from XX(数据表)
select id
+id
from tables1
;
2.select XX(字段名)
,XX(字段名)
,XX(字段名)
=XX(值)
from XX(数据表)
select id
,name
,id
=2 from tables1
; 值:
0 1 02
6.数据
1.insert into XX(数据表)
values(‘XX’
,’XX’
,’XX’
);(根据字段类型填数据)
2.insert into XX
(id
,name
) values(1,'菜七');
3.select * from XX
(数据表
); se
4.insert into tables set id
='4',name
='刘六',slike
='rap',time='2000-04-05';
5.update demo
.tables2
set slike
='足球' where id
='4';
6.select * from demo
.tables2
where id
='4';
7.delete from XX(数据表)
where id
='4';
8.truncate table demo
.tables2
;
7.DML查询数据
7.1单表查询(从指定表中查询数据)
1.select * from XX
(数据表
);
2.select XX(字段名)
,XX(字段名)
from XX(数据表)
3.select * from XX(数据表)
where XX
='XX'(数据内容)
7.1.1模糊查询
1.select * from XX(数据表)
where XX(字段名)
in('XX','XX')(数据内容)
2.select * from XX(数据表)
where id
between X(
1)
and X(
3)
;
3.select * from XX(数据表)
where name
like '%三%'
'三%'
'李%三'
4.select id
,name
from tables2
where name
is null;
7.1.2比较运算符
1.select * from tables2
where id
=’
1’
and name
=’张三’
;
2.select * from tables2
where id
=’
1’
or name
=’李四’;
3.select distinct name
from tables2
;
7.1.3排序
1.select* from tables2
order by id
desc(
asc)
; de:降 a:升
2.select* from tables2
order by id
asc limit 3;
7.1.4.分页(缓解数据库压力,提高客户体验)
在显示的数据表后 写 limit 0,5; //显示1~5条数据 总页数=(数据总数/页面大小)+1
7.1.5分组
//SubjectNo:是编号,这两个表都有同一个编号
7.2聚合函数查询(根据一组数据求一个值)
1.select count(*) from tables2
;
2.select sum(id
) from tables2
;
3.select avg(id
) from tables2
;
4.select max(id
) from tables2
;
5.select min(id
) from tables2
;
7.3连接查询(把不同表的记录连到一起)
1.select bname
,book
from tables1
,tables2
where students
.name
=b ooks
.name
;
2.select bname
,book
,students
.id
from tables1
,tables2
where students
.name
=books
.name
;
//两个表存在连接有name,则把两个表的bname和book连接起来
7.4子查询(从内到外运算符查询)
7.5合并查询(并列到一起查询)
7.6联表查询(join)
7.7自连接(一张表拆为两张一样的表,树状图)
pid=1:顶级(父类)
7.8别名(定义表和字段的别名)
1.select * from students t
where t
.name
=’张三’
;
2.select name
as students_name
,id
as students_id
from students
;
8.MySql函数(一些基础函数)
8.1数学函数
1.select abs
(5),abs
(-5);
2.select floor
(1.5),floor
(-2);
3.select round(rand
()*100),rand
(),floor
(rand
()*100);
4.select pi
();
5.select truncate(2.1234567,3)
6.select round(1.6),round(1.2),round(1.123456,3);
7.select sqrt
(16),sqrt
(25);
8.1字符串函数
1.select insert(‘mrkej’
,3,2,’book’
);
61select upper
(‘mrasd’
),ucase(‘asdasd’
) ;
62.select left(‘asdasd’
,2);
63.select concat
('+',rtrim
(' asd '),'+');
64.select field
(‘
as’
,’asd’
,’asdf’
,’
as’
);
65.select locate
(‘me’
,’I love you
,you love me
.’
);
select position
(‘me’
in’I love you
,you love me
.’
);
select instr
(’I love you
,you love me
.’
, ‘me’
);
8.3日期时间函数
1.select curdate(),current_date(); //获取当前日期 2.select curtime(),current_time(); //获取当前时间 3.select now(),current_timestamp(),localtime(),sysdate(); //获取当前时间日期 4.select datediff(‘2019-09-05’,’2011-07-01’); //获取时间间隔天数 5.select adddate(‘2020-09-05’,3); //返回+3天的日期 6.select adddate(‘2017-11-30 23:59:59’,interual ‘1:2’ year_month);//返回+1年2个月的日期
7.select adddate(‘2017-11-30 23:59:59’,interual ‘1’ year); //返回+1年的日期 8.select subdate(‘2017-07-09’,6); //返回-6天的日期
8.4判断条件函数
1. select id
,slike
, case when id
>3 then 'Very Good' when id
<3 and id
>1 then 'perfect' else 'not good' end llll
from tables2
;
8.5系统信息函数
1.select version
(),connection_id
();
2.select database(),schema();
3.select user(),system_user(),session_user();
4.select charset(‘aa’
),collation
(‘aa’
);
8.6加密函数
1.select password
(‘absc’
);
2.select md5
(‘absc’
);
8.7其他函数
1.select format(235.3456,3); //保留小数点后3位(四舍五入) 2(77).select charset(‘abc’),charset(convert(‘abc’ using gbk)); 3.select time,cast(time as date),convert(time(数据表里面的),time) from tables2; //改变字段数据类型,time改成date
9.索引(查询时更快查询到需索引的文件,提高了查询效率)
没加索引前,是遍历。加了索引后是定位
9.1创建索引
9.1.1在建立数据表时创建索引
create table tables3
(
id
int(11) auto_increment primary key not null;
name
varchar(50) not null;
math
int(5) not null;
index(id
));
good
geometry(空间数据类型
) not null
show create table score
;
9.1.2.在已建立数据表时创建索引
use demo
create index t_info
on tables2
(id
);
create unique index t_info
on tables2
(id
);
create fulltext
index t_info
on tables2
(id
);
create index t_info
on tables2
(name
(4));
create index t_info
on tables2
(name
,id
);
create spatial
index t_info
on tables2
(good
);
drop index id ont_info
;
9.2索引原则
不是索引越多越好不要对进程变动数据加索引小数据量的表不需要加索引索引一般加在常用来查询的的字段上
9.3索引背后的数据结构(之后研究)
索引(Index)是帮助MySQL高效获取数据的数据结构,本质:索引是数据结构不用索引为遍历,时间复杂度为O(n)(在大数据会很慢)
10.视图(虚拟表,方便操作且有安全权限)
1.select select_priv
,create_view_priv
from mysql
.user where user=’root’
;
2.ues demo
create view
View1
(v_id
,v_name
,v_like
)
As select id
,name
,like
From tables1
;
3.describe view1
;
4.show table status like ‘view1’
5.show create view view1
;
Select * from view1
;
6.create or replace
view view1
(v_id
,v_name
)
as select id
,name
from tables2
;
7.alter view view1
(v_name
)
As select name
From tables1
With check option;
8.update view1
set v_name
=’张张三’
where id
=1;
9.drop view if exists view1
;
11.数据完整性约束
11.1实体完整性
1.id
int auto_increment,
2.primary key (id
,classid
);
3.user vachar
(4) not null unique;
11.2参照完整性(不推荐使用外键)
1.两个表: 学生(学号,姓名,性别,生日,班级编号) //下划线为主键,班级编号为外键,正在创建的表 班级(班级编号,班级名称) //已经形成的表,且设置外键拒绝删除或更新
create table student
(
id
int auto_increment,
name
varchar(40) not null,
sex
varchar(2),
classid
int not null.
Birthday
date,
Primary key(id
))engine=innodb default charse
=utf8
Alter table student
add constraint fk_classid
foreign key(classid
) references class
(classid
);
11.3用户定义完整性
1.not null
2.age
int check(age
>6 and age
<18)
3.check(classid
in(select id
from class
));
11.4命名完整性约束
对完整性约束进行添加修改删除等操作,需要添加constraint语句
11.5更新完整性约束
1.alter table tables1
drop foreign key classid
;
primary key id
;
index name
2.alter table student
drop foreign key classid
;
alter table student
add constraint classid
foreign key (classid
)
aeferences class
(id
)
on delete cascade
on update cascade;
12. DML语言(数据库操作语言)
12.1 Insert(插入语句,添加)
1.Insert into `demo
` values(‘
1’
,’张三’
,’跳舞’
,’
2000-2-5’
);
12.2 Update(修改语句)
1.Update `tables1
` set ‘name
=上山’
where id
=1;
2.Update `tables1
` set ‘name
=上山’
;
12.3 Delete(删除)
1.delete from `tables1
` where id
=1;
2.truncate `tables1
`;
12.3.1 delete删除问题
InnoDB引擎:自增列会从1开始(存在内存当中,断电即失) MyISAM引擎:继续从上一个自增量开始(自增列还在)(存文件中,不会丢失)
13.事务(sql执行事件,要么都成功,要么都失败)
将一组SQL放在批次中去执行 ACID原则:是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).
13.1 原子性
原子性意味着数据库中的事务执行是作为原子(针对一个事务)。即不可再分,整个语句要么执行,要么不执行。
13.2 一致性
即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,针对一个事务操作前与操作后的状态一致
13.3 隔离性
事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。针对多个用户同时操作,主要是排除其他事务对本次事务的影响。
13.3.1隔离性的级别:
13.4 持久性
意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。表示事务结束后的数据不随着外界原因导致数据丢失。
13.5 步骤
set autocommit=0//关闭 /*默认开启事务自动提交 set autocommit=1//开启 */
手动处理事务: set autocommit=0 //关闭自动提交 事务开启: start transaction insert XX 提交:一旦提交持久化(成功) commit 回滚:回到原来的样子(失败) rollback 事务结束: Set autocommit=1 //开始自动提交
13.5.1需了解:
savepoint 保存点名 //设置一个事务的保存点 rollback to savepoint 保存点名 //回滚到保存点 release savepoint 保存点名 //撤销指定的保存点
13.6 具体步骤
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=utf8
;
Insert into account
(`name
`,`money
`) values (‘A’
,2000.00),(‘B’
,10000.00);
模拟转账:事务
Set autocommit
= 0;
start transaction
update acount
set money
=money
-500 where `name
`=’A’
;
update acount
set money
=money
+500 where `name
=’B’
;
如果想要提高数据库安全等级,可以在恢复回原有的设置,执行命令:
SET SQL_SAFE_UPDATES
= 1;
commit;
rollback;
set autocommit
=1;
14.权限管理和备份
14.1用户管理
1.Create user zhangyijian(用户名) identified
by ‘
123456’(密码);
2.Set password
=password
(‘
123456’
);
3.Set password
for root
=password
(‘
123456’
);
4.Rename user zhangyijian
(原名
) to root1(新名)
;
5.Grant all privileges *.*(数据库
.表)
to zhangyijian(用户)
;
6.Show grants
for root
@localhost(root需要加
@localhost,其他用户不需要)
;
7.Revoke all privileges on *.* from zhangyijian(用户)
;
8.Drop user zhangyijian
;
14.2备份
1.直接拷贝物理文件 2.Mysql workbench可视化工具导出 3.使用命令行导出mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 >物理磁盘位置
15.规范数据库设计
15.1当数据库比较复杂的时候,就需要设计
糟糕的数据库设计:
数据冗余,浪费时间数据库插入和删除都会出现麻烦和异常(屏蔽使用物理外键)程序的性能差 良好的数据库设计:节省内存空间保证数据库的完整性方便开发系统
设计: 分析需求:分析业务和需要处理的数据库的需求 概要设计:设计关系图E-R图(流程图) 个人博客:
收集信息,分析需求 用户表:(用户登陆注销,个人信息。写博客,创建分类)user 分类表:(文章分类)category 文章表:(文章信息)blog 评论表:(评论信息)comment 友链表:(友链信息)links 关注表:(关注人数,粉丝人数)follow 自定义表:(系统信息,某个关键的字)标识实体(把需求落地到每个字段,真正设计表) 标识实体之间的关系 写博客(需要的表):user->blog 创建分类:user->categoy 评论:user->blog->comment 友链:links 关注:user->follow
15.2 三大范式(规范数据库的设计)
如果没有规范,则可能出现:信息重复,更新异常,插入异常,删除异常
15.2.1规范性与性能的问题
关联查询的表不得超过3张表:大表分小表,每个表都关联,范式越高,性能越渣
考虑商业化的需求和目标(成本、用户体验)数据库的性能更重要在规范性能的问题的时候,需要适当的考虑一下规范问题故意给某些表增加一些冗余的字段。(从多表查询变为单标查询)->提高用户体验故意增加有些计算列(从大数据量降低为小数据量的查询:索引)->提高用户体验
第一范式(1NF) 原子性:列不能够再分成其他几列; //上表不满足 //上表满足
第二范式(2NF) 前提:满足第一范式 每张表只描述一件事情 //上表不满足产品与订单号有关,与订单金额和时间无关,需拆两张表 //上表满足
第三范式(3NF) 前提:满足第二范式 数据需要和主键直接相关,不能间接相关(消除传递依赖) //上表不满足,所有属性都依赖于学号,满足第二范式,但是‘班主任性别’和‘班主任年龄’直接依赖的是‘班主任姓名’ //上表满足
16.JDBC
16.1数据库驱动
JDBC(java database connect)
SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个java操作数据库的规范(JDBC)。 对于开发人员,掌握JDBC接口的操作即可
16.2 IDEA连接数据库
1.创建普通项目 2.导入数据库驱动(在directory创建lib文件,把jar包粘贴进去,再lib包右键add as library) 3.加载驱动(DriverManager)
Class
.forName("com.mysql.cj.jdbc.Driver");
4.连接数据库
Connection con
= DriverManager
.getConnection("jdbc:mysql://172.29.40.73:3306/demo?serverTimezone=UTC","root","123456");
5.执行sql对象(查询)
Statement statement
=con
.createStatement();
String sql
="SELECT * FROM tables1";
Statement:代表数据库。用于向数据库发送SQL语句,相当于数据库命令行(增删改查等等)
Statement statement
=con
.createStatement();
String sql
=”insert into tables1
values(‘
1’
,’张三’
,‘跳舞’,‘
2000-2-5’
)”
;
Int num
= statement
.executeUpdate(sql
);
If(num
>0){
sout(“插入成功!”
);
}
Statement statement
=con
.createStatement();
String sql
=”delete from tables1 where id
=1”
;
Int num
= statement
.executeUpdate(sql
);
If(num
>0){
sout(“删除成功!”
);
}
Statement statement
=con
.createStatement();
String sql
=”update tables1 set name
=’张张’ where name
=’张三’”
;
Int num
= statement
.executeUpdate(sql
);
If(num
>0){
sout(“修改成功!”
);
}
6.返回结果集
ResultSet resultSet
=statement
.executeQuery(sql
);
while (resultSet
.next()){
System
.out
.println("id="+resultSet
.getObject("id"));
System
.out
.println("id="+resultSet
.getObject("name"));
System
.out
.println("id="+resultSet
.getObject("like"));
System
.out
.println("id="+resultSet
.getObject("time"));
}
7.关闭(最后用的先关闭)
resultSet
.close();
statement
.close();
con
.close();
16.3 代码实现(增删改查)
1.创建一个配置文件,放到src里面;
2.创建一个类(JdbcUtils),实现调用配置文件(properties) (1)
static{
try{
}
}
(2)用输入流(读文件)读取配置文件:
InputStream in
= JdbcUtils
.class.getClassLoader().getResourceAsStream("db.properties配置");
(3)创建properties类
Properties properties
=new Properties();
(4)把输入流in(配置文件)传入到properties类中
properties
.load(in
);
(5)定义配置文件里面的内容
private static String driver
=null
;
private static String url
=null
;
private static String username
=null
;
private static String passwowrd
=null
;
(6)在try catch语句中给配置文件赋值
driver
=properties
.getProperty("driver");
url
=properties
.getProperty("url");
username
=properties
.getProperty("username");
passwowrd
=properties
.getProperty("passwowrd");
(7)加载驱动
Class
.forName(driver
);
(8)连接数据库
public static Connection
getConnection() throws SQLException
{
return DriverManager
.getConnection(url
,username
,passwowrd
);
}
(9)释放连接
public static void release(Connection connection
, Statement statement
, ResultSet resultSet
){
if(resultSet
!=null
){
try {
resultSet
.close();
} catch (SQLException throwables
) {
throwables
.printStackTrace();
}
}
if(statement
!=null
){
try {
statement
.close();
} catch (SQLException throwables
) {
throwables
.printStackTrace();
}
}
if(connection
!=null
){
try {
connection
.close();
} catch (SQLException throwables
) {
throwables
.printStackTrace();
}
}
}
}
3.创建testInset类(main函数,添加) (1)赋空值
Connection connection
=null
;
Statement statement
=null
;
ResultSet resultSet
=null
;
(2)连接并使用sql语句(自动生成try catch)
connection
=JdbcUtils
.getConnection();
statement
=connection
.createStatement();
String sql
="INSERT INTO tables1 VALUES(10,'涨涨','跳跳','2000-05-05')";
int i
=statement
.executeUpdate(sql
);
if(i
>0){
System
.out
.println("插入成功");
}
(3)添加finally,关闭链接(因为暂时没用到resultset(集合),所以为null)
finally {
JdbcUtils
.release(connection
,statement
,null
);
}
4 .创建testdelete类(main函数,删除) 与testinsert基本一样,改变sql语句即可
5 . 创建testupdate类(main函数,修改) 与testinsert基本一样,改变sql语句即可 6 . 创建testselect类(main函数,查询) 需要resultset
16.4 sql注入问题(漏洞,会被攻击导致数据泄露—SQL会被or拼接)
通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
username,like 判断 等于空或等于1=1(真) 则输出
正常是只输出张三和篮球 这却全部输出
由于Statement不安全,则由PreparedStatment对象,可以防止SQL注入,效率也更高(防止注入sql的本质,把传递进来的参数当成字符,假设其中存在转义字符,就直接忽略,“ ’” 会被直接转义)
16.5 PreparedStatement(防止SQL注入)
Mbatis涉及
16.6 IDEA连接数据库
16.7 JDBC操作事务
16.8 连接池操作(DataSource接口)
数据库连接 — 执行功能 —释放 每次都连接到释放 十分浪费系统资源 池化技术:装备一些预先的资源,过来就连接预先准备好的。 例子:一个人管理银行: 开门----接待—关门 耗时耗神 连接池:有接待员: 开门----接待员:等待—关门 常用连接数(接待员)10个,则最小连接数为10个 可设置最大连接数 100个 等待超时:100ms,自动断
开源数据源实现: DBCP,C3P0,Druid(阿里巴巴) 使用了这些数据库连接池后,我们在项目开发中就不需要编写连接数据库的代码 DBCP
下载两个jar包:pool,dbcp http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi http://commons.apache.org/proper/commons-pool/download_pool.cgi导入到IDEA项目中配置文件