笔记之_Java数据库整理
Posted 莫轩ASL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记之_Java数据库整理相关的知识,希望对你有一定的参考价值。
sqlserver复制表结构:并删除数据: select T.* into TABLE_ORDER_CANCEL from TABLE_ORDER T TRUNCATE TABLE TABLE_ORDER_CANCEL Count(*)后不能排序 数据库的四个特性: 原子性、一致性、隔离性、持久性 事务隔离级别: 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 脏读:未提交的数据被读取 不可重复读:同一时间多个读取不被允许 幻读:在读取数据的同时被修改或新增数据 数据库cascade是级联操作 Oracle安装后不能用,将用户权限降到最低,不能安装到x86文件夹中 在cmd中SqlPlus进入oracle数据库 数据库时间用数字number(10)表示,乘以1000后就是date.getTime()的long类型 备注: select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 select table_name from dba_tables; //包括系统表 select table_name from dba_tables where owner=‘用户名‘ comment on column TableName.ColumnName is ‘备注名’;//为列添加备注 comment on table TableName is ‘备注名‘;//为表添加备注 select * from user_tab_comments//获取表的备注 select * from user_col_comments//获取列的备注 分页查询先排序后分页 创建临时表数据: create table 临时表名 as insert into 临时表名 select * from 表名 where id=1;commit; 数据库视图权限:grant create view to baiyun 备份表数据: create table 备份表表名 as select * from 表名 还原表数据:insert into 备份表表名 select * from 表名 创建视图:create or replace view 视图名 as Create or replace view sss as select c.classId,c.className,c.marjorId,m.marjorName from student t,marjor m,classes c where c.marjorId=m.marjorId 变量,数组,集合的数据都存在内存,不能持久化数据 硬盘只能存文件 XML:移动数据岛,数据持久化 ,XML可以跨平台,兼容多种语言,体积小巧 数据存储的性价比不高,不安全 可扩展标记语言 标签<自定义的单词或拼音> ,成对出现 html:预格式标记语言 ,它被称为网页的源码 创建XML文件 <?xml version="1.0" encoding="UTF-8"?> 用于说明XML的版本号和转码方式 常用的转码方式:utf-8:一个中文 3个字节 gbk/gb2312:一个中文2个字节 iso-8859-1 如何使用XML文件保存数据 Xml文件中有且仅有且必须有一个根节点 读写操作的准备 在读写操作进行前 先为我们的项目导入dom4j.1.6.1.jar包 下载 复制jar包文件进入包资源管理器中 选中jar包文件,右键?build path?add to build path?变成牛奶瓶就可以使用了 常用的软件:NotePad++、DW Adote Dreaweaver CS6 Ctrl+shift+O删除没用的代码 Ctrl+shift+F调整格式 文件中读写的内容都是String字符串,所以必要时要转型 文件路径中:用一个/,用两个\每个项目新建都要重新导入dom4j.jar包 关系型数据库:mysql、SQLserver 关系对象型数据库:Oracle 应用程序(客户端):作用:响应操作并显示结果,向数据库请求数据;要求:界面美观,操作简单 控制台 窗体程序 Jsp、asp站点 移动端 服务器:作用:存储数据,检索数据,生成新的数据;要求: 统一、安全、性能等 站点服务器 数据服务器 服务器优点: 存储大量数据,高效检索数据 保持数据一致、完整 共享安全 通过组合分析,产生新的有用信息 Oracle: Oracle公司产品 关系-对象型数据库 产品免费,服务收费 SQLserver: 微软公司产品,针对不同的群体的多个版本 易用性好(兼容性差) MySql: Oracle公司产品 支持多操作系统多种类型的硬件和设备、免费、小巧 Db2: IBM公司产品 跨操作系统跨平台 Access: 微软公司产品 超轻量级数据库 体积小巧,不安全 卸载与安装数据库: 卸载mysql数据库 1.控制面板卸载程序 2.删除mysql数据库残留文件夹 program file里面 和 programdata里面的mysql文件夹 3.删除注册表信息 regedit 打开注册表 4.HKEY_LOCAL_MACHINE/System/ControlSet00?|ControlSet/services/eventlog/Application/MySql 删除 安装mysql数据库 1. 安装很简单 只要你不想调整安装路径 for-下一步 2. 访问人数 20/500/自定义 设置转码方式 设置密码和允许远程访问 3. 安装最后一步 execute执行时 安装程序会短暂未响应 千万不要强关 安装一个数据库的操作工具 Navicat for mysql / xxxxfront 项目开发步骤: a) 需求分析 客户经理 和客户进行沟通 确认用户的需求 b) 概要设计 架构师 搭建程序框架 设计数据库结构 安排开发步骤 c) 详细设计 程序猿 建库建表建约束 增删改查 d) 编码实现 程序猿 使用JDBC技术用应用程序连接数据库 实现各种功能操作 e) 代码测试 测试部 junit 单元测试(白盒测试/黑盒测试) f) 安装部署 软件实施 技术30% 口才 g) 后期维护 维护工程师 数据库技术 三大范式:范式无穷多,设计数据库的辅助工具 第一范式:表中的每个列必须是不可再分的最小数据单元 第二范式:在满足第一范式的前提下,一张表只描述一个实体 第三范式:在满足第二范式的前提下,除主键外的其他列不得传递依赖其他列 ER图: 矩形:实体,名词 椭圆:属性,名词 菱形:关系,动词 映射: 一对一: 一对多:双向约束 多对一:双向约束 多对多: 应用程序中的一个实体对应数据库中的一张表,表中的列对应类中的属性,表中的一行数据对应一个对象 服务器?数据库?表?数据 关系型数据库必须存在冗余,因为要建立关联 本机:localhost、本机ip、127.0.0.1 数据库名加后缀db不加. 主键具有唯一性 Oracle检查约束不生效,使用的是触发器 整型才可以自增 一张表有且仅有一个主键 所谓数据的完整性是指数据的准确性 数据库中的数据类型 字符型 (sqlserver nchar nvarchar ntext) Varchar 可变长字符串 varchar(max) Char 定长字符串 char(10) Text 长文本字符串 数值型 整型 Bigint smallint int Bit 二进制 小数:Double float decimal numeric (sqlServer money) 日期类型 Time Date Datetime T-sql(通用sql命令语法)/ pl-sql/n-sql(特定的数据库识别的sql语法) 完整性 实体完整性 -->行 主键 primary key 是一种特殊的唯一键 一张表有且仅有一个主键 具备不重复 唯一的特性 学号 身份证 电话 邮箱。。。 不宜太过复杂 排除身份证 银行卡号 不宜选取长期需要修改的列 排除 qq 邮箱 电话 主键可以没有意义 唯一键 unique 标识列 auto_increment 域完整性 -->列 限制数据类型 默认值 非空约束 Oracle?数据库服务器实例?表空间?表?数据 Oracle中没有标识列不能自增长不能创建时建约束,注释用-- 映射关系中一对多与多对一,一为主表,多为子表,子表对主表有依赖 默认值不是一种约束而是对列的修改 引用完整性:主外约束,建立在两张表上的,位置是在子表上,子表外键连接主表主键 外键:子表中类型和长度且长度不为空的与主表主键一致,没有约束,有无数个 Oracle相关的一些概念 Db database 数据库 Dba database administrator 数据库管理员 Dbma databaseManageradministrator 数据库管理系统管理员 Dbs database system 数据库系统 Oracle的安装 打开安装包 找到setup.exe的执行文件 右键?属性?兼容性 勾选 兼容xp系统启动 和 以管理员身份运行 如果要运行 也必须使用右键?以管理员身份运行 在安装过程中需要注意的几点: 安装的默认路径 c:/windows/programfiles (x86) 删掉 设置账号和密码的过程中 安装程序上 会显示管理员身份登录的账号 system PLSQLDev安装 安装程序 安装汉化 启动输入注册码 操作 创建新的个人账号 (区分tables 存放系统表 tablespaces 存放我们自己创建的表 的区别) 账号的角色权限 至少要包含两个 Connect 是账号可以登录的权限 Resource 可以执行 建表, 建约束, 数据增删改查的权限 Oracle中的数据类型 字符型 varchar2(200) char(3) Oracle中默认utf-8编码 一个中文 3个字符长度 数字类型 number(有效位数,小数点后面的位数) 日期类型 date 日期 使用存在的细节?? Oracle中的运算符 算数运算 + - * / mod(被除数,除数) 关系运算 > < >= <= = <> 逻辑运算 and or not 创建表(不允许同时设置约束) Oracle日期格式: to_date(‘200-1-1 00:00:00’,’yyyy-MM-dd hh24:mi:ss’); 1-1月-2000 增删改查执行时会把数据存入insert临时表中,提交(commit)或(rollback)才会生效 查询本质是循环,查询的结果是一张虚拟表 Unidotbsi缓存临时表空间 Select: Oracle中只能用作查询表数据和from结合使用 MySQL中以表格形式打印后边内容 Union:连接查询结果,列的顺序内容一致只打印一条 Union all:无论是否重复都拼接打印 数据操作十大功能:增、删、改、单查、全查、平均、总和、最大、最小、排序 临时表可以取别名:空格+别名 Sql语句的分类 DDL definition 定义 数据定义语句 create alter drop DCL control 控制 数据控制语句 use DQL query 检索 数据查询语句 select DML manipulation 操作 数据的操作语句 insert update delete 1.数据新增 Insert into tableName(col1,col2,...) values(value1,value2,....) 列名列表可以省略不写 提供的列值必须是完整的 顺序和结构保持一致的 允许为空的列可以不提供值 列名列表中也不应该包含该列 在新增操作后 需要通过commit来提交操作 或 rollback来回滚操作 多行新增 insert into classInfo select 5,‘java13班‘ from dual union select 2,‘java12班‘ from dual 注意:多行新增不能使用 序列序号 Union 的说明: 该关键词用户连接两个不同查询的查询结果 多个参与连接的查询结果集 必须拥有相同的列数 使用union连接的多个结果集 如果数据完全相同 则重复的数据不显示 Union all也是连接结果集的语法 但不再考虑重复数据的不显示问题 多行新增的语法 可以用于做表的数据备份; 备份数据的表没有继承原表的任何约束 insert into 备份表 select 要备份的列名列表 from 原表; 2.查询 Select 列筛选 from 表名; Select * from 表名; 既没有列筛选 也没有行筛选 该查询被称为全查询 查询的本质 是一个循环 查询的结果是一张虚拟表 条件查询 是在基本的查询语句后加上 where 子句 where 子句 Select 列筛选 from 表名 Where 行筛选条件 Group by 分组参照列 Having 分组后条件 Order by 排序参照列 说明:1. 查询的主句必须出现 2.子句可以根据需求选择出现 但子句只要出现就要依照顺序书写 3.having 对 group by 有依赖 3.排序 Order by 排序参照列1 asc升序(默认)/desc 降序,排序参照列2 asc/desc,... 聚合函数 Sum Max Min Avg Count 当使用聚合函数后 数据表中的数据被压缩了 形成了一个新的单元格数据 该数据不属于原来表中的任何一个列,所以列名编程了聚合函数的操作 聚合函数是对表的压缩,聚合列不能和其他列放到一起,和其他列放到一起时先分组 select deptId,avg(empSalary) from employees where deptId=20 group by(deptId) 4.修改 Update 表名 set 列名1=新的列值1,列名2=新的列值2,.... Where 筛选条件; 5.删除 delete from 表名 ; 慎用 一般我们都是用条件删除 delete from 表名 where 筛选条件 Mysql truncate table 表名 删除所有数据 重置标识列 Drop table 表名 直接删掉表结构 表数据随之清除 备份表数据: insert into 备份表 select 要备份的列名列表 from 原表; 查询进阶 Select 列筛选 from 表名 Where 行筛选条件,筛选常规列 Group by 分组参照列,后面放非聚合的常规列,有几个常规列放几个 Having 分组后筛选,筛选聚合列 Order by 排序参照列 desc/asc 分组查询一般会配合聚合函数 数据的组别压缩 聚合函数 Sum avg max min 一般针对数字类型的列进行算术聚合,操作对象一般是单列 Count 针对的是各种数据类的列 统计的是行数据 Count计数时有两种产生误差的情况 情况1: 使用外链接连接表时 情况2: 统计允许为空列的数据时 结论: 计数时推荐使用主键计数,分组的列就是计数的列 执行顺序:Where?group by?聚合函数?having?order by 模糊查询 :条件不准确,不具体的查询被称为模糊查询,均可取反,放在where后 1. Like:通配符(函数 正则表达式) 是用来描述字符串规则(取值范围,字符个数)通配符: % : 任意多个任意字符 _ :一个任意字符 [0-9]:一个在范围内的字符 (只在sqlserver使用) [^0-9] :一个不在范围内的字符 (只在sqlserver使用) 2:between and:进行连续的范围查询,可以使用关系运算和逻辑运算替代,效率较高,但使用时数值的顺序不能调换,小的在前,大的在后 3.In:进行点值范围查询 一对多的等值比较 (使用:in(‘总裁’,’销售人员’)) 4.is null/is not null:在数据库中与空值做比较 高级查询 表链接: 大前提 具有主外关系的表(自连接 self join) 当需要筛选的数据来自于2张或多张表时需要使用表链接 实现原理 交叉组合/交叉匹配 参照表:表中的数据在结果集中至少出现一次 分类 内链接(inner join): 有效数据 ,默认选择子表为参照表 Select * from employees inner join department on employees. deptId= department.deptId; 外链接: 左外链接(left join) 右外链接(right join) 全外链接:full join 子查询 相关子查询 非相关子查询:可以单独拿来做查询的子查询语句 降序取前5行: SqlServer: Select top 5(或者50 percent) * from employee Order by empBounus desc; MySQL: Select * from employee Order by empBounus desc Limit 0,5; Oracle: Select * from (select * from employee Order by empBounus) Where rownum<6; Rownum:可以用<、<=、<>只可以用=1 为表或列取别名直接在表或列后面:空格+别名,且只在本次中有效 查询的虚拟表可以增加列: Select e.*,(select count(empId) from employee em Where em.empSalary>e.empSalary ) from employee e 列值替换: Select empId,case When 条件1 then 替换值1 When 条件2 then 替换值2 Else 默认替换值 End From employee Select empSalary,count(empId) from employee Exists: 判断子查询是否存在查询结果,返回真假值,真就执行,假就不保留,放在where后 Oracle数据库中获得当前日期: select To_Char (SYSDATE,‘YYYY-MM-DD‘) from dual; Oracle数据库中获得当前时间小时差: Select ceil((To_date(‘2008-05-02‘,‘yyyy-mm-dd‘)-To_date(‘2008-04-30‘ , ‘yyyy-mm-dd‘))*24) FROM DUAL; Oracle数据库中拆分字符串: select substr(‘abc123‘,1,3),substr(‘abc123‘,4,3) from dual; to_char将数字转化为字符串 Oracle系统默认的日期格式为01-7月 -92 Oracle编程 如何在Oracle中开启一个代码块 declare?声明部分,后面对变量声明 变量赋值: i number : = 10; i:=10; begin ?逻辑代码块的开始相当于{ 打印语句:dbms_output.put_line(i); Select sum(empSalary) into I from employee; end;? 逻辑代码块的结束相当于} 条件语句:没有switch if mod(num,2)=1 then elsif then else endif; 循环语句:while、for、loop While循环: while i<100 loop end loop; if循环: for i in 1..100 loop end loop; Oracle的函数 函数 function 必带返回值 和 存储过程的区别 procedure 没有返回值 内置函数(系统函数) 数学函数 数学运算的问题 Abs(操作数) Round(操作数,参数2) 参数2可以省略 省略时默认为0,代表不保留小数部分 Ceil(操作数); 向上取整 Floor(操作数); 向下取整 Mod(被除数,除数) 求余数 Power(基数,幂数); 求某个数的N次幂 Sqrt(操作数) 开平方 Sin cos tan asin 字符函数 获取字符串长度 Length(str) 返回str的字符个数 len(); 转大写 转小写 Upper(str); 将str中所有的英文转大写 Lower(str); 将str中所有的英文转小写 initcap(str); 将str中首字符转大写 截取函数 Substr(str,start,number); 查找且替换 Trim(char2 from str1) 从字符串str1中去除字符char2 Ltrim(被操作的字符串,要去除的字符) 清除左边的字符 Rtrim(被操作的字符串,要去除的字符) 清除右边的字符 Replace(操作字符串,源字符串,新字符串); 查找字符串 instr(在哪个字符串中找,找什么,从哪里开始找,找第几个); 连接函数 Concat(str1,str2); str1||str2 日期函数 获取服务器当前时间(年月日 时分秒) Add_months(基础日期,月份值); 在基础日期的基础之上,加多少个月 Next_day(基础日期,’星期几’); 在基础日期上 计算下一个星期几 是几号 Months_between(日期1,日期2) 日期一距离日期2 相差多少个月 Sqlserver date_diff(日期1,日期2); Extract(month from 日期) 提取日期中的某个时间部分 转换函数 To_char(); 将日期或数字转为字符串,s表示正号S带负号的负值,MI在指明的位置的负号,PL在指明的位置的正号 To_number(); 将字符串转为数字 To_date(); 将字符串转为日期 自定义函数 储存过程:不能有返回值procedure 函数:必须有返回值function rr:代表月份时使用的是12月 XML读写操作: 读:将文件读入程序 1.1创建文件对象 File f=new File("d:\\student.xml"); 1.2把文件对象 变为xml文件对象 SAXReader sreader=new SAXReader(); try { Document doc=sreader.read(f); 2.找到文档对象的根节点 Element root=doc.getRootElement(); 3.找到根节点下的 Student子节点 List<Element> stus=root.elements("Student"); 4.循环遍历 访问每个 Student节点下的属性节点 Student stu; for (Element el : stus) stu=new Student(); stu.setStuId(el.elementText("stuId")); stu.setStuName(el.element("stuName").getText()); stu.setStuAge(Integer.parseInt(el.elementText("stuAge"))); this.stus.add(stu); 写:将程序内容写入文件 1.创建文档对象 如果路径和某个文件路径相同 则覆盖 Document doc=DocumentHelper.createDocument(); 2.为文档对象创建根节点 保存该节点 便于后续操作 Element root=doc.addElement("Students");//根节点的名字叫 Students 3.循环集合中的对象 每个对象应该对应一个Students的子节点 for (Student st : stus) { Element stu=root.addElement("Student"); stu.addElement("stuId").setText(st.getStuId()); stu.addElement("stuName").setText(st.getStuName()); stu.addElement("stuAge").setText(st.getStuAge()+""); } 上面的步骤可以保证xml文档的节点结构 以及数据来源 带还没有真正的存入文件 4.将整个操作存入文件中,要创建文档的写入对象,需要准备 1.输出流 2.调整格式 try { FileOutputStream outStream=new FileOutputStream("d:\\student.xml"); OutputFormat fom=OutputFormat.createPrettyPrint(); XMLWriter writer=new XMLWriter(outStream,fom); writer.write(doc); writer.close(); outStream.close(); Mysql的代码: use schooldb; #在创建表前 判断对应表名的表是否已经存在 如果存在 删除它 drop table if exists classes; #创建表 同时定制表中的列 create table classes ( classId int not null, #主键 不能为空 className varchar(20) not null ); drop table if exists students; #触发器 create table students ( id int primary key not null auto_increment, stuName varchar(20) not null, stuAge int not null,# 开始思考数据范围约束的问题 stuScore numeric(4,1) not null, stuSex enum(‘男‘,‘女‘) not null, stuPhone char(11) unique not null, stuAddress varchar(200) not null, stuBirthday date not null, classId int not null #外键 ); Insert into students(stuName,stuAge,stuScore,stuSex,stuPhone,stuAddress,stuBirthday,classId)#插入 values(‘张三‘,48,95,‘男‘,‘13634581439‘,‘南岸区‘,‘1988-1-1‘,1); select * from students;#全查 Oracle代码: --了解Oracle的数据类型 --建表(班级表 1 班级的编号 班级名称 学生表 n 学号 姓名 年龄 性别 地址 电话 生日 班级编号) --映射关系 一对多 多对一 一的一边 是主表 多的一边是子表 --先创建主表 在创建子表 子表对主表有依赖 drop table classInfo; create table classInfo ( classId number(6) not null, className varchar2(20) not null ); drop table studentInfo; create table studentInfo ( stuId number(6) not null, stuName varchar2(20) not null, stuAge number(3) not null, stuSex char(3) not null, stuAddress varchar2(200) not null, stuPhone char(11) not null, stuBirthday date not null, classId number(6) not null ); --建立约束(数据完整性) --实体完整性(每行数据的唯一性 主键 唯一键 ) alter table classInfo add constraint PK_classInfo_classId primary key (classId); alter table studentInfo add constraint PK_studentInfo_stuId primary key (stuId); --建立外键 alter table 子表名 add constraint FK_子表名_主表名_外键名 foreign key(外键名) references 主表名(外键名); --唯一约束 alter table STUDENTINFO add constraint UQ_STUPHONE unique (STUPHONE); --域完整性 自定义完整性 类型约束 长度约束 非空约束 --年龄 18-40 性别 ‘男‘ ‘女‘ alter table studentInfo add constraint CK_stuAge check(stuAge>=18 and stuAge<=40); alter table studentInfo add constraint CK_stuSex check(stuSex=‘男‘ or stuSex=‘女‘); --为学员地址设置默认值 默认值不是一种约束 而是对列的修改 alter table studentInfo modify stuAddress default ‘地址不详‘; --如何在表创建语法以外使用语法改变现有的表结构 --为学生表添加一个列 成绩列 alter table studentInfo add stuScore number(4,1) not null; --修改列 alter table studentInfo modify stuScore number(5,1); --删除列 alter table studentInfo drop column stuScore ; --删除约束 alter table studentInfo drop constraint CK_stuAge; --引用完整性 主外约束 该约束是建立在两张表上的 --主外的约束的创建位置 确定 一定 以及肯定 是在子表上 --创建的方式是 子表的外键 连接 主表的主键 alter table studentInfo --序列 类似于mysql中的自增长 create sequence classInfo_seq start with 1 increment by 1 cache 20; create sequence studentInfo_seq start with 1 increment by 1 cache 20; --基础的数据新增 先新增主表数据 insert into classInfo(classid,classname) values(classInfo_seq.Nextval,‘java16班‘); commit; delete from studentInfo; commit; insert into studentInfo(stuid, stuname, stuage, stusex, stuAddress, stuphone, stubirthday, classid) values(studentInfo_seq.Nextval,‘张三‘,25,‘男‘,default,‘22789143452‘,to_date(‘2000-1-1‘,‘yyyy-MM-dd‘),4); commit;
以上是关于笔记之_Java数据库整理的主要内容,如果未能解决你的问题,请参考以下文章