Oracle 横表和纵表
前一段时间了解到的,今天有空写下,备忘~
先来说说横表和纵坐表的概念,先来看看以下两图:
第一张图就是横表,一行表示了一个实体记录,这就是我们传统的设计表的形式
第二张图就是纵表,他的一行记录,是用于表示某个学生的属性名和属性值对应关系,像这边有两个属性(名字和性别),在纵表中就要用两条记录来表示一个学生。
从上面可以观察出,横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者利弊在于此。所以,应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。
在实际开发中,经常需要互相转换横表和纵表的形式,这里贴个从纵表数据转成横表显示的形式。
Select student_no, max(decode(field_name,'student_name',field_value)) As student_name, max(decode(field_name,'student_sex',field_value )) As student_sex From cuc_student_y Group By student_no;
横转纵暂时不知~~望高人指点~~
Oracle 树状查询
在实际应用中,经常利用数据库保存树状结构的数据,通常用一张表中的两个字段表示,一个是自身的ID,一个是保存父类的ID。在这样具有这种关系中的数据,要求查出的数据具有我们想要的树状显示。这里需要引入Oracle的一个查询语句。
Select * from tablename start with [condition1] Connect By Prior [condition2] where [condition3]
condition1 通常是用于筛选某颗树或者多颗树的结点,这里所的树包括子树,
condtion2 通常是用于连接父结点和子结点的关系,prior 所表示的是上一条记录,通常用法:prior id = pid,(上一条的的ID号是本条记录的父类ID号)这样就把整个树状结构给建立起来了。
conditon3 就是我们通常的where语句,过滤某些记录。
现在看下具体例子。
其中Test_ID 表示本身的ID,Test_PID表示父类的ID
这边记录的描述成树状结构就是如下:
现在,假设我们查询的福州以及福州下的所有子东西,就可以这样查询,
只要取福州的根结点就可以,福州的根结点翻译成数据库中存的数据就是 test_id =1
因此得到的sql如下:
Select * From Test_ t Start With Test_Id = 1 Connect By Prior Test_Id = Test_Pid
查询结果:
用结构图表示就是如下信息:
因此想要查询某些信息,只要抓住根结点的条件就可以。。Over~~
远程连接Oracle10g数据库
百度之~在问问上搜到的答案并解决。
要进行远程连接Oracle数据库,首先需要对远程连接进行设置。具体做法如下:
【开始】>>【所有程序】>>【Oracle-OraDb10g_home1】>>【配置和移植工具】>>【Net Configuration Assistant】
选择【本地Net服务名配置】>>【添加】之后根据要连接的远程 数据库的IP 和 服务名 即可。之后就可以用PLSQL Developer进行登陆了。
具体操作可见下图:
1.选择Net Configuration Assistant
2.配置服务名
3.配置主机名
4.PLSQL Developer登录
PL/SQL笔记之table和record类型
今天,继续学了PL/SQL的语法,总结下table和record类型的知识:
①table类型(table有点 类似于可增长的数组)
举两个例子:
/* * ①定义一个user_table_type类型, * 这个类型中的元素属性类型是和t_user表中username字段一样的. */ Type user_table_type Is Table Of t_user.username%Type Index By Binary_Integer; /* 声明一个user_table_type类型的变量user_table */ user_table user_table_type /* * ②定义一个user_table_type类型, * 这个类型中的元素属性类型是和t_user表中一行记录类型一样的。 */ Type user_table_type Is Table Of t_user%Type Index By Binary_Integer;
②record类型(可根据需要定义所想要的类型,一般是用于保存数据库中取出的行信息,有点类似于C语言中的结构体)
举一个例子:
/* * 定义一个记录类型,是有number和varchar2(25)类型构成 */ Type user_record_type IS RECORD ( userid number, username varchar2(25) ); /* 定义一个user_record_type类型的变量user_record */ user_record user_record_type;
PS:table可以看作是多行单列,record可以看作是单行多列,二者合起来就是多行多列,可保存查询出来的记录。
PL/SQL笔记之%type和%rowtype
昨晚学习了下PL/SQL的基本语法~对于属性%type和%rowtype作了一些了解。笔记总结如下:
1.%type属性 |
---|
declare v_userid t_user.userid%type /*** 表示声明一个变量v_userid,这个变量的类型是和t_user表中的userid属性一样。 |
2.%rowtype属性 |
---|
declare v_userRecord t_user%rowtype /*** 表示v_userRecord是一个记录,该记录中的字段将与t_user表中的列相对应。 |
PL/SQL之dbms_output.put_line不显示结果解决方法
今天练习PL/SQL的时候~想用dbms_output.put_line来输出变量的一些信息,却总是看不到结果~~百度之~~
得到解决方法:
原来要先输入以下代码才可以:
SQL>set serveroutput on
之后再用dbms_output.put_line输出就可以了~~