数据库基础知识:
数据库由一批数据构成的有序集合,这些数据被分门别类地存放在一些结构化的数据表里,而数据表之间又往往存在交叉引用的关系,这种关系使数据库又被称为关系型数据库。
数据库:按照数据结构来组织、存储、和管理数据的仓库。
数据库发展历史:
- 人工管理阶段
人力手工整理存储数据 - 文件系统阶段
使用磁盘文件来存储数据 - 数据库系统阶段
关系型数据库 - 高级数据库阶段
关系-对象型数据库
常用的数据库:
- Oracle
应用广泛、功能强大、分布式数据库系统 “关系-对象“型数据库 - MySQL
快捷 可靠 开源 免费 与PHP组成经典的LAMP组合
特征:性能快捷、优化SQL语言 容易使用 多线程和可靠性 多用户支持
可移植性和开放源代码 遵循国际标准和国际化支持 为多种编程语言提供API - SQL Server
针对不同用户群体的五个特殊的版本 易用性好 - DB2
应用于大型应用系统,具有较好的可伸缩性
MySQL命令:
登录命令:mysql -h 127.0.0.1 -u root -p root;
选定默认数据库:use dbname;
显示所有数据库:show databases;
显示默认数据库中所有的表:show tables;
放弃正在输入的命令:\c
显示命令清单:\h
退出mysql程序:\q
查看mysql服务器状态信息:\s
用来备份:mysqldump
mysqladmin命令:
创建数据库:mysqladmin -u root -p create newdb
删除数据库:mysqladmin -u root -p drop newdb
更改密码:mysqladmin -u root -p password “newpassword”
SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。
SQL语法组成:
-
DML(Data Manipulation Language数据操作语言)
查询、插入、删除和修改数据库中的数据
select insert update delete等 -
DCL(Data Control Language数据控制语言)
用来控制存取许可、存取权限等
grant revoke等 -
DDL(Data Definition Language数据定义语言)
用来建立数据库、数据库对象和定义其列
create table、drop table、alter table等 -
功能函数
日期函数、数学函数、字符函数、系统函数等
DDL语句
- 创建表:
create table 表名(
列名1 列类型 列约束,
列名2 列类型 列约束,
…); - 显示表结构:desc 表名
- 表复制:
create table 新表 select * from 旧表 ;复制表结构和数据
create table 新表 select * from 旧表 where 1=2; 只复制表结构 - 删除表:
drop table if exists 表名; - 修改表:
alter table 表名 action(修改的具体内容);
action可为以下语句:
add 列名 列类型 列约束 [first|after 列名]
add primary key (列名)
add foreign key(列名) references 表名(列名)
add 列名 set default 默认值
change 旧列名 新列名 列类型 列约束[first|after 列名]
modify 列名 列类型 列约束[first|after 列名]
drop 列名
drop primary key
engine 类型名 改变表类型
rename as 新列名 将表名更改 - 截断表:
truncate table 表名; 作用:将表中的所有数据全部清空,并且不能回退
drop与truncate的区别:
drop是删除表及数据
truncate只是清空表中的数据,表并没有删除
数值列类型:
tinyint 非常小的整数 1字节
smallint 较小的整数 2字节
mediumint 中等大小的整数 3字节
int 标准整数 4字节
bigint 大整数 8字节
float 单精度浮点数 4字节
double 双精度浮点数 8字节
decimal 一个串的浮点数
字符串列类型:
char 定长字符串
varchar 可变长字符串
tinyblob 非常小的blob(二进制大对象)
blob 小blob
mediumblob 中等的blob
longblob 大blob
tinytext 非常小的文本串
text 小文本串
mediumtext 中等文本串
longtext 大文本串
enum 枚举 列可赋予某个枚举成员
set 集合 列可赋予多个集合成员
日期和时间列类型:
date “1000-01-01"到"9999-12-31” 3字节
time “-838:59:59"到"838:59:59” 3字节
datetime “1000-01-01 00:00:00"到"9999-12-31 23:59:59” 8字节
timestamp 19700101000000到2037年的某个时刻 4字节
year 1901到2155 1字节
约束:
not null 非空约束
auto_increment 自动标识列 自增1,唯一标志符号或者顺序值
primary key 主键约束 列值不能重复且不为空
unique 唯一约束 被约束的列的取值不能重复,但可以为空
unsigned 无符号 此属性禁用负值,将数值的取值范围从零开始
foreign key 外键约束 通常为另外一个表的主键
default 默认值约束
character set name 指定字符集(仅适用于字符串)
check age>18 (mysql不支持) 检查约束
主表和从表:
- 当主表中没有对应的记录时,不能将记录添加到子表
- 不能更改主表中的值而导致子表中的记录孤立
- 子表存在与主表对应的记录,不能从主表删除该行
- 删除主表前,先删子表
DML语句:
-
插入数据:
insert into 表名(列名) values(值列表);
insert into 表名(列名) select 列名 from 源表名; -
查询数据:
select *|列名,列名 from 表名
where 条件
group by (having)分组统计
order by 列名|表达式 排序(默认升序asc,desc为倒序)
limit start,length 对结果范围的限制
where子句中使用:
(not) between and:(不)在两数之间
in(值列表):在一个范围内相当于or
like:模糊查询 %通配符 _占位符
regexp:正则
is (not) null:(不)空
<=>:判断两列一样的值
五个聚合函数:
count( 列名| * ):计数
sum(列):求总和
avg(列):求平均值
max(列):最大值
min(列):最小值
where与having的区别:
where在分组统计之前执行,having在分组统计之后执行
where中不能使用聚合函数作为条件,having中可以使用聚合函数 -
修改数据:
update 表名 set 列名=值 where 条件; -
删除数据:
delete from 表名 where条件;
delete from 表名 where 字段名 in(值列表);
drop,truncate,delete的区别:
drop:删除表结构和表中的所有数据,不可回退
truncate:清空表中的数据,但不删除表结构,也不可回退
delete:可以有选择性的删除部分数据,可以回退
高级查询:
-
多表查询:
select * from 表1,表2;
查询结果为两个表中数据的乘积,笛卡尔积
表连接条件可以使用等值连接和非等值连接
内连接就是等值连接 -
子查询
也称为嵌套查询,可以放置的位置:from之后 where having
子查询在主查询之前一次执行完成,子查询的结果被主查询使用
数据库事务:
事务是用户定义的一个数据库操作序列,这些操作序列要么全做要么全不做,是一个不可分割的工作单位。
事务的四个特性:
原子性:最小的执行单元,不能再分
一致性:从一个状态到另一个状态后,应保持一致
隔离性:两个事务互不干扰
持久性:一旦提交,不能回退
事务操作的三个语句:
commit:提交
rollback:回退到事务开始处,撤销当前事务的所有操作
savepoint:设置保存点
mysql的事务:
默认是自动提交事务
通过set autocommit=0 修改成手动提交
元数据:
获取数据的数据就是元数据
数据库表的数据放到jdbc的ResultSet中
元数据是在执行查询操作的时候获取的
常用方法:
getColumnCount();获取数据库的字段个数
getColumnName(第一个); 获取数据库的字段名字
getColumnType(1);字段类型
getCatalogName(1);获取数据库名
java中提供了 三种获取反射对象的方式:
1.Class.forName(“类的全路径名包括 类名”);
2.对象.getClass(); 方法 , 这个方法是 Object 类的
3.类名.class
我们拿到这个反射对象就可以 获取类的结构
类由哪些属性,方法,构造器组成,属性的访问修饰符, 数据类型…
通过反射对象获取类的属性 Field
Field[] field = clazz.getFields(); 获取所有公共的属性对象
Field类的常用方法:
getName();获取共有的属性名
Field[] field = clazz.getDeclaredFields();获取所有属性 包括私有
getName();
field.getModifiers();
field.getType();