oracle中distinct的用法详解,Oracle知识整理笔记

下面先来看看例子:

小编整理的一篇关于Oracle知识的学习笔记,希望对大家有帮助。

简单得说,通过dbms_random包调用随机数的方法大致有4种:

table表

1.简单对比一下SQL Server 和Oracle
  先给大家看一张我画得图:

1、dbms_random.normal

字段1     字段2    id        name    1           a    2           b   
3           c    4           c    5           b

图片 1

    这个函数不带参数,能返回normal
distribution的一个number类型,所以基本上随机数会在-1到1之间。
    简单测试了一下,产生100000次最大能到5左右:

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

  安装完Sql
Server后,我们打开、连接数据库引擎后可以看到很多的数据库有系统数据库也有用户数据库。而Oracle安装后,一个数据库都对应一个服务,我们在使用前需要在计算机服务中开启相应的服务,如图中所示,服务开启,用户登录后看到的是一个数据库,一个数据库中可以有表、视图、存储过程等数据对象。一个Oracle数据库可以有多个用户,用户的权限不同,进入到数据库中看到的数据对象也是不同的。

Sql代码

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

2.Oracle中基本的概念和关系
 
我总结了一下Oracle中有5个必须要知道的概念:用户、权限、角色、方案和数据对象。
用户的概念大家都知道不用赘述;权限就是能不能做某一件事的证明;而角色可以看做是某些权限的集合体。在Oracle中权限有很多种,如果挨个给用户授权会很麻烦,所以就把一些权限分配给一个角色,那么给用户授予这个角色就解决挨个授予权限的麻烦。方案这里和用户相对应。一个用户,Oracle会默认给它一个方案,这个方案里会存放数据对象。那么数据对象又是什么?一想便知,数据对象就是表、视图、存储过程等的总称。他们之间的关系我用一张图来说明。

 declare 
  i number:=;  
  j number:=;  
 begin 
  for k in .. loop  
  i:= dbms_random.normal;  
   if i > j  
    then j:=i;  
   end if;  
  end loop;  
  dbms_output.put_line(j);  
 end; 

select distinct name from table 得到的结果是:

  
图片 2

    5.15325081797418404136433867107468983182


 系统权限是用户对数据库的相关权限,比如:登录。对象权限是用户对其他用户的数据对象的操作权限。比如:更新其他方案的表。看到这张图不知道大家有没有疑问:Oracle的权限有哪些?角色有哪些?我们怎么操作这个数据库呢?后面的博客会介绍这些。

    PL/SQL procedure successfully completed

name    a    b    c

3.Oracle的一种管理工具pl/sql Developer     pl/sql developer
是用于开发pl/sql块的集成开发环境,它是一个独立的产品,而不是oracle的一个附带品。pl/sql是procedural
language/sql是Oracle在标准sql语言上的扩展。pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用例外处理各种错误,使得它的功能变得更强大。
pl/sql块由三部分构成:定义部分、执行部分、例外处理部分。定义部分和例外部分可选。

2、dbms_random.random

好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

Declear 
/* 定义部分-----定义变量,常量,游标,例外,复杂数据类型*/ 
Begin 
/*执行部分-----要执行的pl/sql语句和sql语句*/ 
Exception 
/*例外处理部分-----处理运行的各种错误*/ 
End; 
举个最简单的例子: 
Begin 
dbms_output.put_line('hello,world'); 
End; 

    这个也没有参数,返回一个从-power(2,31)到power(2,31)的整数值

select distinct name, id from table

为什么会出现pl/sql中文乱码问题?
  
前提是:本机没有安装Oracle,采用pl/sql远程访问Oracle数据库。本机安装了Oracle客户端和pl/sql。
  
服务器上的Oracle有一个字符设置,比如UTF-8或者简体中文,若没有手动修改那么会有一个默认的。在本机上Oracle客户端和pl/sql也需要字符设置.如果服务器和客户端的字符编码不一致,就会出现中文乱码问题。所以,我们要做得就是修改他们使他们一致。(现在看来是如此简单,当时怎么会那么纠结!)
   怎么解决pl/sql中文乱码问题?
  
首先,我们要先知道服务器端的Oracle是什么字符编码。打开你的pl/sql,在命令窗口中输入 
select userenv(‘language’) from dual;   就会先看到。如图:

3、dbms_random.value

结果会是:

图片 3

    这个函数分为两种,一种是没有参数,则直接返回>=0 and
<1之间的38位小数


然后要做的就是设置本机的字符设置为 SIMPLIFIED
CHINESE_CHINA.ZHS16GBK。办法是设置环境变量。步骤:我的电脑–>右击–>属性–>环境变量–>系统变量–>把nls_lang修改成SIMPLIFIED
CHINESE_CHINA.ZHS16GBK,然后需要重启pl/sql。网上很多资料说做到这一步就可以解决问题了。但是我的乱码问题还是解决不了。若你的问题也解决不了,请这样做:打开你的注册表找到这样的目录:找到:HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE

  SQL > column value format 9.99999999999999999999999999999999999999
  SQL > select dbms_random.value from dual;

                    VALUE
  -----------------------------------------
   .58983014999643548701631750396301271752

id name    1 a    2 b    3 c    4 c    5 b

图片 4

    第二种是加上两个参数a、b,则返回值在>=a and <b之间的38位小数

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

设置右侧NLS_LANG,将它的值也设置为SIMPLIFIED
CHINESE_CHINA.ZHS16GBK。重启pl/sql后,将已经添加进去的记录删除,重新添加一条再测试。以前添加的记录很可能就是乱码写入的,看不到效果。

  SQL > column value format 999.999999999999999999999999999999999999
  SQL > select dbms_random.value(100,500) value from dual;
                    VALUE
  -----------------------------------------
   412.150194612502916808701157054098274240

发表评论