华清远见-重庆中心-数据库/知识点梳理/个人总结

数据库


1.数据存储形式

1.文件(存储在硬盘)

文件存储格式,对数据处理可以通过Java代码实现

缺点:读写速度慢,

2.变量(存储在内存中)

读写速度快,临时数据存储

3.数据库(数据库管理系统)

数据库管理软件(DBMS- database manage system),是一种存储和管理数据表的软件系统,适用于大数据量,支持多人并发操作

数据库中的数据是永久存储,数据操作效率高

2.如何使用数据库

1.安装数据库的服务软件(server-服务器)

3.数据库分类

1.关系型数据库:MySQL,sql server, oracle,db2....

数据以二维表的方式存储,实体之间的关联关系

支持SQL(结构化查询语言)语言

2.非关系型数据库:redis,MongDB,Hbase....

数据按照不同的数据类型进行存储,不支持SQL

4.ER模型(E-entity 实体,R-realation关系)

1.ER模型,就是将数据库table之间的关系,以图形的方式展示出来

2.ER模型,就是创建数据表的依据

3.矩形代表实体,菱形代表关系,椭圆代表实体的属性

4.实体之间的关系:

一对多 一对一 多对多

5.MySQL的命令行操作

1.连接到MySQL服务器

mysql -u root -p

2.使用MySQL的命令

show database 显示所有的数据库

use sys; 选择要使用数据库的名字

show tables; 显示sys数据库中所有的表

desc user; 显示user表的结构

insert into user(字段)value() ; 插入数据

select * from user; 查询user表的数据

delete from user;删除数据

drop table user;删除user表

drop database sys;删除数据库

6.SQL(Struct Query Language):结构化查询语言

1.sql语言中,字符可以使用单引号或者双引号,保证引号匹配

2.注释:注释内容,/* */

3.sql语言中,关键字不区分大小写,数据内容有大小写之分

4.sql的使用

<1.创建数据库:create database 数据库名字 default charset set utf8;

<2.删除数据库:drop database 数据库名字;

<3.创建表:create table 表名(字段名 字段类型 约束条件.......);

如果字段名,表名和关键字重复了,那么就在字段名上或表名上添加引号

尽量避免和关键字重名

约束条件:not null,表示字段不能是null

主键约束:primary key,一般用于实现表中的每行数据不重复

7.MySQL中常见的数据类型

tinyint

短整型

对应Java的byte,short

int

整型

int

bigint

长整型

long

float

单精度浮点型

float

double

双精度浮点型

double

decimal

指定总长度,及其小数位数

decimal()

char

定长字符串

char(5),必须是5位,不够就用空格占位

varchar

可变长度字符串

text

文本

date

日期

yyyy-MM-dd

time

时间

HH:mm:ss

datetime

日期时间

yyyy-MM-dd HH:mm:ss

timestamp(14或8)

毫秒

8.约束

约束名字

概念

关键字

非空约束

是否允许字段为null

null表示可以为空,not null不能为空

主键约束

主键(primary key),保证每行数据不重复,并且主键不能为null

primary key

唯一约束

保证字段不重复

unique

外键约束

在有这个主从关系的表中,给有管理关系的字段,设置外键约束

9.建表的规则(范式)

1.字段不可再分,比如手机号码和座机号码不能放在同一字段中

2.每一个表都有一个主键,保证每条数据都是唯一的

3.每个字段都依赖主键,比如员工表,不能存放部门信息

10.数据添加-insert

数据添加,都是整行添加到,每一行数据叫做以恶搞record(记录)

insertinto 表名 values(字段1,字段2....);

没有默认值的非空字段,必须设置数据值

表明之后的字段顺序必须和values的值的顺序一致

批量添加

用insert into语句一次添加多个记录,效率更高

insertinto school(sc_code,sc_name,sc_birth,sc_address ,sc_total,sc_area) values("111","重庆大学","2011-1-1","重庆市渝北区",10000,1000.2),("222","重庆大学","2011-1-1","重庆市渝北区",10000,1000.2);

11.修改数据-update

1.修改单个字段的所有值

update 表名 set 字段名=值

--update school set sc_total=100;不合理,将所有的sc_total都改为100

2.修改多个字段值

update 表名 set 字段名=值,字段名1=值1....

--update school set sc_total=100,sc_area=100;不合理,将所有的sc_total都改为100

3.根据条件修改(where)

update 表名 set 字段名=值 where 条件

1.指定值

update 表名 set 字段名=值 where 字段名=字段值

update school set sc_name="bsd"where sc_code="100001";

--将school表中的学校编号为100001的学校的名字改为bsd

2.指定范围

--1. > < >= <= 范围 and or 将多个条件关联

update school sc_toal=61001where sc_code<1004;

--2.使用between... and 设置区间

update school sc_toal=61001where sc_code between1004and1006;

3.指定集合

--1.在某个集合中 in

update 表名 set 字段名=值 where 字段 in(值1,值2);

--修改1003,1005的值

update school sc_toal=61001where sc_code in(1003,1005);

--2.不在集合中 not in

update school sc_toal=61001where sc_code notin(1003,1005);

空值 -null

--1. is null

update school sc_toal=61001where 字段 isnull

update school sc_datetime='1999-2-1'where sc_datetime isnull;

--2. is not null

update school sc_datetime='1999-2-1'where sc_datetime isnotnull;

模糊匹配

--1.'-'代表任意一个字符(1个)

--2.'%'代表任意多个字符(一个或多个)

--以什么开始

sc_name like'重庆%'

--以什么结尾

sc_name like'%大学'

--包含什么

sc_name like'%交通%'

--只能包含四个字符

sc_name like'__大学' _ _大学 _是占位符

--倒数第二个是大

sc_name like'%大_'

12.删除数据-delete(remove,drop)

delete是删除数据本身,表结构还在

drop是删除表,数据库被删除了,都没有了

1.删除所有数据

delete会保留自增列删除前的值,新增数据后自增列的值从删除数据中最大的开始

truncate会重置自增列的值,效率高

如果主从表关系,建议先删除从表数据

deletefrom 表名

truncate table 表名

根据条件删除

1.根据主键删除

deletefrom 表名 where 主键字段=值;

deletefrom book where book_id=1001;--删除id为1001的书

2.其他条件

deletefrom book_ns where book_id in(1002,1004);

2.删除表结构

droptable 表名

13.查询-select

1.全表查询

select * from 表名 *表示的是所有字段

select * from school--查询school数据

select 列名1,列明2...from 表名

select sc_code,sc_name ...from school;

2.查询指定的列

select 列名1,列明2 from 表名

select sc_code,sc_name from school;

3.条件查询

--模糊查询

select * from school where s_name like"%大_"

4.数据的条件查询

--> < >= <= = != <>

select * from school where sc_area>=10001;

select * from school where sc_id=1004;

select * from school where sc_total<5000;

select * from school where sc_total<>444;

5.使用关键字,条件组合查询

select * from school where sc_area between500and1500;

select * from school where sc_code in (1001,1000,1010);

select * from school where sc_code between1001and1004or sc_address="五公里";

6.去掉重复的行-distinct

selectdistinct *from school where 条件

selectdistinct sc_address from school;

7.给字段取别名-as

select 字段1 as xx,字段2 as xx1 from school where ...--as 取别名

select sc_code as code,sc_name as name from school;--as 可以省略

select sc.sc_nameas name from school as sc;--给表去别名

--查询出学校的名字,列名显示为”学校名字“

14.修改表结构

1.drop table 然后再重建

2.给表增加字段

altertable 表名 add 字段名 字段类型

3.删除表中的字段

altertable 表名 drop 字段名;

4,修改表中的字段

如果被修改字段本身有数据,需要考虑数据类型是否匹配,谨慎修改

altertable 表名 modify 字段名 新字段类型

5.修改字段名

altertable 表名 change 原字段名 新字段名 新的字段类型;

6.修改表的名字

altertable 表名 rename to 新表名

7.增加外键约束

altertable 从表名 add constraint 约束名字 foreign key references 主表名(字段名);

8.删除外键约束

altertable 表名 drop foreign key 约束名字;

9.添加约束

--添加唯一约束

altertable 表名 add unique(字段名)

--添加非空约束

altertable 表名 change 原字段名 新字段名 数据类型 notnull;

--

15.多表关联的设计原则

1.一对多关系,通过外键约束实现,子啊多方的表中郑家一个外键约束,引用1方的主键值

2.多对多的关系,通过中间表实现关联关系,中间表存储两个表的关系

创建学生,课程,中间表

三张表的联合查询

--id为1的学生,选择了那些课程,显示学生的信息和课程信息

select * from course c,stu_cou t,student s where s.s_id=t.s_idand c.c_id=t.c_idand s.s_id=1;

select *from student s inner join stu_cou sc on s.s_id=sc.s_id inner join course c on c.c_id=sc.c_idwhere s.s_id=1;

--c_id 为2的课程有哪些学生选择了,显示学生的信息和课程信息

select * from course c,stu_cou t,student s where s.s_id=t.s_idand c.c_id=t.c_idand c.c_id=2;

select *from student s inner join stu_cou sc on s.s_id=sc.s_id inner join course c on c.c_id=sc.c_idwhere c.c_id=2;

--查询选课超过两门的学生

select s_name,count(*) ascountfrom student s,stu_cou sc where

s.s_id=sc.s_idgroupby s_name havingcount>2;

--查询出选择课程人数大于等于2的信息

select c_name,count(*) ascountfrom stu_cou sc,course c where

c.c_id=sc.c_idgroupby c_name havingcount>=2;

--查询没有选课的学生名字

select s_name from student s left join stu_cou sc on s.s_id=sc.s_idwhere sc.idisnull;

--找出没有学生选择课程的课程名

select c_name from course c left join stu_cou sc on c.c_id=sc.c_idwhere sc.idisnull;

--统计出没有学生选择的课程数量

selectcount(c_name) as 数量 fromfrom course c left join stu_cou sc on c.c_id=sc.c_idwhere sc.idisnull;

16.JDBC -JAVA Database Connection

jdbc:java连接数据库,进行数据库的操作,insert update delete select

jdk提供了一套操作数据库的接口:java.sql

1.核心接口:

Connection--用于设置连接数据库的地址,账号密码

PreparedStatement--用于预处理,执行SQL语句

ResultSet--用于接收查询返回的数据

17.事务

事务是由一组sql语句组成的执行单元 (几个sql是要一个整体操作) 这些sql 之间一般相互依赖 那么这些sql语句要么全部成功 要么全部失败

提交: commit 事务执行成功了 需要commit 更新了数据库的数据内容

回滚:rollback 事务执行失败了 需要rollback 回滚到事务执行之前的状态

java的jdbc 默认是自动提交了

con.setAutoCommit(false) 设置了 不自动提交 那么sql执行之后 需要主动提交 con.commit();

Connection con = DriverManager.getConnection(url,user,pwd)

con.setAutoCommit(false)

String sql = "insert into book_info values(null,?,?,?,?,?,?)";

PreparedStatement ps = con.prepareStatement(sql);

ps.setString(1,book.getBookName());

ps.setString(2,book.getBookAuthor());

ps.setDouble(3,book.getBookPrice());

ps.setDate(4, (Date) book.getBookDate());

ps.setLong(5,book.getBookNum());

ps.setLong(6,book.getTypeId());

int i = ps.executeUpdate();

if(i > 0 ){

System.out.println("添加成功");

}else{

System.out.println("添加失败");

}

con.commit();

1.事务的特性ACID

原子性 atomicity 事务时最小的执行单元

一致性 connsistency 事务执行的前后 必须让所有的数据保持一致状态 (总体数据守)

隔离性 isolation 事务并发时相互隔离 互补影响

持久性 durability 事务一旦提交 对数据的改变是永久的

2.事务并发可能出现问题

在同一时间同时执行多个事务 称为事务的并发

事务并发可能会出现一下问题

问题描述

脏读事务A读取到了事务B未提交的数据

不可重复读事务A 中如果读取俩次数据 在这期间 事务B对数据进行修改并提交 导致事务A读取俩次的数据情况不一致

幻读事务A读取id 从1-10之间的数据 假如只有 2,5 数据 在读取的期间 事务B 添加了id为3的数据 导致事务A多读到了事务B中的数据

3.事务的隔离级别

为了反正事务并发是出现以上的情况 数据库中设计了集中事务与事务之间的隔离级别

隔离级别是否出现脏读能否出现不可重复读是否出现幻读

你可能感兴趣的:(数据库,mysql,java)