DML数据操作语言:insert、update、delete(merge)
DDL数据定义语言:create、drop、alter、truncate、rename
DCL数据控制语言:grant
DQL数据查询语言:select
Transaction:commit、rollback、savepoint
1、 介绍
存储方式:文件、DB(DBMS)
SQL语句的分类
关系型数据库:二维表
SQLPLUS
2、 Select语句 选择、投影、连接
select …… from ……
distinct、算术表达式、字符串拼接||、[’字符串’、”列别名case sensitive、特殊字符如空格”]、NVL(salary,100)
[where ……]限制
可以出现列名、表达式、常量、运算符
<=、>=、!=、=、not between……and、in、like(%匹配0-n,_匹配一个,escape转义)、is (not) null、and、or、not
[group by……]
select语句只能出现group by从句中出现的字段或者组函数
mysql不做限制
[having ……]
对分组后的数据进行进一步限制
[order by ……]
默认asc、desc,select中未出现字段可做排序
标准的 SQL 的解析顺序为:
(1).FROM 子句, 组装来自不同数据源的数据
(2).WHERE 子句, 基于指定的条件对记录进行筛选
(3).GROUP BY 子句, 将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用 HAVING 子句筛选分组
(6).计算所有的表达式
(7).使用 ORDER BY 对结果集进行排序
举例说明: 在学生成绩表中 (暂记为 tb_Grade), 把 "考生姓名"内容不为空的记录按照 "考生姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 600 分的.
标准顺序的 SQL 语句为:
select 考生姓名, max(总成绩) as max总成绩
from tb_Grade
where 考生姓名 is not null
group by 考生姓名
having max(总成绩) > 600
order by max总成绩
在上面的示例中 SQL 语句的执行顺序如下:
(1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
(2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组
(4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600分的.
(7). 执行 ORDER BY 子句, 把最后的结果按"Max 成绩" 进行排序.
单行函数:数据计算、修改条目、控制输出、格式转换
操作字符串lower、nvl、to_char(number,”fmt”)、to_number(char)
多行函数(组函数):select或者having从句
count、avg、min、max、sum
多表:笛卡尔积
join 等值(=)、非等值(运算符)、外连接(+在右边相当于left outjoin)、自连接(用别名区分同一张表)
子查询:内部查询结束进行外部查询
oracle分页借助rownum实现
select salary from
(select salary,rownum rn from
(select salary from s_emp order by salary)
) where rn between 5 and 10;
数据库设计
实体、属性、关系(one-to-one、one-to-many、many-to-many)
数据库范式:
第一范式:记录唯一、列不可再分
第二范式:非主键列完全依赖主键列,主键唯一
第三范式:非主键列互不依赖
第四范式:禁止非主键列与主键列一对多关系不受约束
第五范式:尽可能细分、排除冗余
3、 Table
建表:表名字母开头、1-30、_/$/#开头、表名不能重复、与保留字不冲突
数据类型:varchar2(可变长20)、char(定长20)、number、number(p,s)、date(sysdate函数)、clob、blob(4G)
Date相关:to_date(date,’fmt’),DD-MON-RR、to_char(char[,’fmt’])、java语言SimpleDateFormat、last_day()、next_day()
约束Constraint:表级约束/行集约束,主键约束primary key、外键约束foreign key references、唯一性约束unique、非空约束not null、check约束
DML
insert into……values ……
delete from …… where (drop、truncate差异?)
update …… set …… where
4、 数据库事务
ACID:原子性、一致性、隔离性(事务并发)、持久性
事务开始:第一个DML
事务结束:手动控制commit/rollback、自动提交(DDL、DCL、会话正常结束)、系统异常终止即回滚
事务并发:脏读(读到未提交的数据)、不可重复读(两次读出的记录内容不一致)、幻读(两次读出来的记录条数不一致)
5、 数据库对象
Sequence(配合触发器实现主键自增,nextval、currval)
index索引由数据库自动维护(具体数据——rowid)相当于目录 唯一性索引(主键约束或唯一性约束自动创建)
好处:加快检索速度、减少IO、Oracle自动维护索引
view视图
方便检索数据、简单查询得到复杂的结果、数据独立多表检索、相同数据不同视图
简单视图(一个表、DML)、复杂视图(多个表、函数、分组、不能用DML)
创建视图时 withcheck option:插入或修改需满足定义的约束
with readonly:禁止DML
6、 其它
exists 子查询(判断子查询的结果是否存在) not exists
union多条查询语句的并集,不显示重复字段、unionall显示重复、intersect交集、minus差集
修改表和约束
alter 增删改列、增删约束、enable或disable约束
drop不能回滚、删除空间、约束、索引全部失效
truncate 不能回滚、释放空间、可以恢复
(删表——drop、删数据,可能需要回滚——delete、删数据,不要回滚truncate)
rename 重命名
SQL练习
JDBC
1、 JDBC使用
java数据库连接
API分为两部分:java程序员java.sql、javax.sql包、jdbc驱动程序开发人员
Driver:驱动程序
DriverManager:驱动程序的管理类,利用连接字符串测试已注册的一个或多个驱动中哪个可用
Connecton:数据库连接
Statement:数据库的操作对象,PreparedStatement预编译、CallableStatement存储过程等
ResultSet:结果集
DataBaseMetaData(通过Connection获得,isReadOnly),ResultSetMetaData(通过ResultSet获得,rowCount),元数据有关容器本身结构方面的数据
Types:类型
开发步骤:
注册驱动:三种方式(类加载器Class.forName,直接实例化驱动new ,使用java -Djdbc.drivers属性)
建立连接:DriverManager.getConnection()——Driver.connect (PPT19检索连接示意图)
创建Statement:createStatement,preparedStatement
执行SQL:无改变的传至数据库
处理结果集:while(rs.next()){rs.getInt…… setter/getter}
关闭连接:ResultSet、Statement、Connection
2、 高级特性
元数据
事务:事务包含若干条数据库操作,并且保证这些操作具有原子性,可以正确的恢复 ACID
默认自动提交,setAutoCommit(false)——执行若干数据库操作——提交/回滚
并发控制:脏读、不可重复读、幻读
3、2.0核心特性
可滚动、可更新结果集:前后滚动+相对/绝对定位,通过结果集对数据库进行增删改
可更新结果集限制(单表、不能join、包含主键、不能为空、不能有默认值)
批量更新:addBatch、executeBatch
新增加数据类型:clob、blob流式读取(PPT67-69)
4、2.0扩展
数据源和JNDI:封装了数据库连接的具体细节,制定特定的逻辑名称将其绑定到JNDI服务器上
连接池:利用对可重用数据库连接对象的缓存来提高数据库连接效率(牺牲空间换时间)
行集RowSet(继承ResultSet):ResultSet(可滚动可更新)+Statement+Connection
Hibernate
JDBC适用于数据量较大、表之间关系较为简单
Hibernate适用于数据量较小、表之间关系较为复杂
1、 概述
对象持久化:序列化、保存在数据库(CRUD)
对象关系映射:java对象和关系型数据库之间的映射(类——表,对象——条目,属性——字段,关系——表间关系或表)
PPT 8 Hibernate应用程序结构
Session:连接和事务之间,非线程安全,轻量级,一线程一session
Sessionfactory:获取Session,线程安全,重量级,多线程共享,缓存
Configuration:配置对象,读取hbm.cfg.xml,*.hbm.xml,创建SessionFactory
Transaction:jdbc事务/jta事务
Query:执行HQL
2、 实体映射
id生成方式(oid独立于数据库,唯一,与业务无关,简化对象到表的映射):native、hilo、seqhilo、sequence(DB2)、increment、identity(DB2)、assigned(默认)、foreign、uuid-hex等等
映射类型:java类型和SQL字段类型的映射类型
integer、string、class(java.lang.Class——varchar2类全限定名)、clob、blob
3、 持久化对象的管理
对象状态:暂态(new创建、与session无关、没有id)、持久态(session管理、有id)、游离态(session管理过了、有id)
状态管理 PPT38
get(直接查数据库,找不到返回null)和load(先查缓存,找不到抛异常)
list(Query接口下)、find(直接查数据库)和iterate(先通过id查缓存,找不到再去查数据库)
close、clear、evict、lock、saveOrUpdate、delete
自动脏检查
批量处理:循环save,超过限量会报错
Hibernatenate查询方式:根据id查询(单个)、HQL(常用、跟SQL类似、面向对象、只被Hibernate支持、不限制DB类型)、Criteria(模糊匹配、动态查询、只被Hibernate支持)、Native SQL(适用于不熟悉Hibernate,有些HQL不能实现的SQL,指定DB类型)
4、 实体映射
关联关系:单向、双向one-to-one(唯一外键、共享主键)one-to-many、many-to-many
inverse(true放弃维护关系,one方写)、lazy(延迟加载带来的问题?fetch)
传播性持久化:cascade:all、save-update、delete、delete-orphon、all-delete-orphon
组件映射:某些对象不要求共享,没必要重新分配一张表
集合映射:set(无序不重复)、bag(无序可重复,list实现)、list(有序可重复)、map(键值对)
继承映射:
table-per-class(支持多态、表太多)、table-per-concrete-class(表较少、重复定义属性、不支持多态)、table-per-class-hierarchy(表最少、表可能很大、支持多态)
5、 事务和并发控制
提交(某些查询,commit,flush)setFlushMode
beginTransaction——commit
读未提交(1)——读提交(2)——重复读(4)——串行(8)
应用程序事务:悲观锁(慎重使用、效率太低)、乐观锁(version、timestamp)
6、 高级查询
分页setFirstResult、setMaxResult
NamedQuery(查询语句写在映射文件按中)
集合过滤session.createFilter()
报表查询:like、投影、函数lower、分组、distinct、count(*)
join(fetch 解决延迟加载问题)
参数绑定(位置从1开始,名称:name)
多试,看执行SQL
标注可以补充
--转自