摘自:http://blog.chinaunix.net/uid-28483822-id-3452582.html
Oralce 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 标注可以补充 原文来自 web开发网转载于:https://www.cnblogs.com/wh-king/archive/2012/12/28/2837226.html
相关资源:数据结构—成绩单生成器