文件存储格式,对数据处理可以通过Java代码实现
缺点:读写速度慢,
读写速度快,临时数据存储
数据库管理软件(DBMS- database manage system),是一种存储和管理数据表的软件系统,适用于大数据量,支持多人并发操作
数据库中的数据是永久存储,数据操作效率高
数据以二维表的方式存储,实体之间的关联关系
支持SQL(结构化查询语言)语言
数据按照不同的数据类型进行存储,不支持SQL
1.ER模型,就是将数据库table之间的关系,以图形的方式展示出来
2.ER模型,就是创建数据表的依据
3.矩形代表实体,菱形代表关系,椭圆代表实体的属性
4.实体之间的关系:
一对多 一对一 多对多
mysql -u root -p
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;删除数据库
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,一般用于实现表中的每行数据不重复
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) |
毫秒 |
约束名字 |
概念 |
关键字 |
非空约束 |
是否允许字段为null |
null表示可以为空,not null不能为空 |
主键约束 |
主键(primary key),保证每行数据不重复,并且主键不能为null |
primary key |
唯一约束 |
保证字段不重复 |
unique |
外键约束 |
在有这个主从关系的表中,给有管理关系的字段,设置外键约束 |
|
1.字段不可再分,比如手机号码和座机号码不能放在同一字段中
2.每一个表都有一个主键,保证每条数据都是唯一的
3.每个字段都依赖主键,比如员工表,不能存放部门信息
数据添加,都是整行添加到,每一行数据叫做以恶搞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);
update 表名 set 字段名=值
--update school set sc_total=100;不合理,将所有的sc_total都改为100
update 表名 set 字段名=值,字段名1=值1....
--update school set sc_total=100,sc_area=100;不合理,将所有的sc_total都改为100
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'%大_'
delete是删除数据本身,表结构还在
drop是删除表,数据库被删除了,都没有了
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);
droptable 表名
select * from 表名 *表示的是所有字段
select * from school--查询school数据
select 列名1,列明2...from 表名
select sc_code,sc_name ...from school;
select 列名1,列明2 from 表名
select sc_code,sc_name from school;
--模糊查询
select * from school where s_name like"%大_"
--> < >= <= = != <>
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;
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="五公里";
selectdistinct *from school where 条件
selectdistinct sc_address from school;
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;--给表去别名
--查询出学校的名字,列名显示为”学校名字“
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;
--
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;
jdbc:java连接数据库,进行数据库的操作,insert update delete select
jdk提供了一套操作数据库的接口:java.sql
1.核心接口:
Connection--用于设置连接数据库的地址,账号密码
PreparedStatement--用于预处理,执行SQL语句
ResultSet--用于接收查询返回的数据
事务是由一组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();
原子性 atomicity 事务时最小的执行单元
一致性 connsistency 事务执行的前后 必须让所有的数据保持一致状态 (总体数据守)
隔离性 isolation 事务并发时相互隔离 互补影响
持久性 durability 事务一旦提交 对数据的改变是永久的
在同一时间同时执行多个事务 称为事务的并发
事务并发可能会出现一下问题
问题描述
脏读事务A读取到了事务B未提交的数据
不可重复读事务A 中如果读取俩次数据 在这期间 事务B对数据进行修改并提交 导致事务A读取俩次的数据情况不一致
幻读事务A读取id 从1-10之间的数据 假如只有 2,5 数据 在读取的期间 事务B 添加了id为3的数据 导致事务A多读到了事务B中的数据
为了反正事务并发是出现以上的情况 数据库中设计了集中事务与事务之间的隔离级别
隔离级别是否出现脏读能否出现不可重复读是否出现幻读