数据库常用查询 *** 作

数据库常用查询 *** 作,第1张

--注释

--select *|字段名1,字段名2... from 表名

--1)

--查询|检索|获取 所有员工的所有信息

--查询的数据: 员工的所有信息

--数据的来源:员工表  emp

--条件:

select * from emp

--2)

--查询所有的员工名字

select ename from emp

--3)

--查询所有的员工编号和员工名称,员工上级的编号

--查询的数据: empno,ename,mgr

--数据的来源:员工表  emp

select empno,ename,mgr from emp

--4)

--查询所有部门部门编号

select deptno from dept

--5)

--查询出所有员工所在的部门的部门编号

select distinct  deptno from emp

--对查询数据进行去重(非字段去重) distinct

--6)

--查询出所有存在员工的部门的部门编号,以及员工名称

select deptno,ename from emp

select distinct sal,deptno from emp

--7)

--查询表达式,结果是表达式的值,显示的字段名就是表达式,计算值

select 1+1 from emp

select 'a' from emp

--8)

--给字段取别名  select 字段1 (as) 别名1,字段2 别名2 from 表名 别名  表的别名不能加as

--查询所有员工的名称(别名为:名字),员工编号(编号)

--别名默认变大写,别名中的内容原封不动出现 ""->中的内容原封不动出现

select 123+456 "get sum" from emp

select empno as 员工编号,ename "员工 姓名" from emp

--9)

--字符串 ''  原封不动显示""

select distinct '哈哈' 笑 from emp e

--10)

--字符串拼接 java中使用+  这里使用||

--查询 ab--cd  表达式

select distinct 'ab-'||'-cd' from emp

--查询所有的员工名字,给他们来一个前缀SXT

select 'sxt-'||ename from emp

--11)

--伪列 : 不存在的列就是伪列  比如:表达式,字符串

--12)

--虚表: 在oracle中不存在的表,也可以说是这个表中没有任何数据,没有任何字段 --oracle中的虚表:dual

--虚表的作用:可以不使用distinct就可以去重的效果,因为里面没有数据,不会出现多行

select * from dual

select distinct 123*456 from emp

select 123*456 from dual

select sysdate from dual

--比如查询当前时间

--13)

--给每一个员工在原来的基础上+100块钱奖金

--null 空

--null与数字运算,结果还为null

--null与字符串运算,结果原串

--nvl(参数1,参数2) 处理null使用  如果参数1为null,最终结果参数2,如果参数1不为null,最终的结果就是参数1

select comm 原奖金,comm||'100' 新奖金 from emp

select comm 原奖金,nvl(comm,0)+100 新奖金  from emp

--一节结尾小练习

--查询所有员工的名字, 工种, 年薪(不带奖金)

select ename,job,sal*12 年薪 from emp

--查询所有员工的名字,工种,年薪(带12月奖金的)

select ename,job,(sal+nvl(comm,0))*12 年薪 from emp

--查询所有员工的名字, 工种, 年薪(带一次奖金的)

select ename,job,sal*12+nvl(comm,0) 年薪 from emp

--select *|表达式|字符串|伪列|字段1 别名1,字段2 as 别名2... from 表名 别名|结果集 where 行过滤条件

--执行流程: from-->where-->select确定结果集

-- 查询20部门的员工信息

--数据: *

--来源: emp

--条件: deptno=20

select * from emp where deptno=20

-- ><>=  <=  = !=  <>

-- 查询工资大于1000的员工的姓名 工作岗位  工资  所属部门编号

--数据: ename,job,sal,deptno

--来源: emp

--条件: sal>1000

select ename,job,sal,deptno from emp where sal=1000

-- 查询不在20部门工作的员工信息

select * from emp where deptno != 20

select * from emp where deptno <>20

--where 中不能使用字段的别名

-- 查询员工的年薪大于20000的 员工名称、岗位 年薪

select ename 姓名,job 岗位,(sal+nvl(comm,0))*12 sum from emp where ((sal+nvl(comm,0))*12)>20000

select ename 姓名,job 岗位,(sal+nvl(comm,0))*12 sum from emp

select 岗位, sum

  from (select ename 姓名, job 岗位, (sal + nvl(comm, 0)) * 12 sum from emp)

where sum >20000

-- 查询  any(任意一个)  some(任意一个)  all(所有)

select * from emp where deptno = any(10,20)

select * from emp where deptno = some(10,20)

--大于最小的

select * from emp where sal>any(1500,2000)--薪资>1500的就可以

--大于最大的

select * from emp where sal>all(1500,2000)--薪资>2000的就可以

-- 查询 工种不为’SALESMAN’的员工信息 (注意 内容区分大小写)

select * from emp where not job ='SALESMAN'

--or或 and并且|都  not取反

-- -检索 工资 1600, 3000员工名称 岗位 工资

select ename,job,sal from emp where sal=1600 or sal=3000

select ename,job,sal from emp where not (sal=1600 or sal=3000)

-- 工资在2000到3000之间的员工信息

select * from emp where sal>2000 and sal<3000

--between 小范围值  and 大范围的值  两者之间  <= >=

select * from emp where sal between 1600 and 3000

---查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门编号,工资

select ename ,deptno ,sal from emp where job='CLERK' and deptno=20

-- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job='CLERK' or deptno=20

--查询 岗位 不是 CLERK 员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job!='CLERK'

select ename ,deptno ,sal,job from emp where not job='CLERK'

select ename ,deptno ,sal,job from emp where job<>'CLERK'

-- 查询 岗位 不为 CLERK 并且部门编号不为 20的员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job!='CLERK' and deptno!=20

select ename ,deptno ,sal,job from emp where not (job='CLERK' or deptno=20)

--存在佣奖金的员工名称

select ename,comm from emp where not comm is null

select ename,comm from emp where comm is not null

--不存在奖金的员工名称

select ename,comm from emp where comm is null

--集合

--Union,并集(去重) 对两个结果集进行并集 *** 作,不包括重复行同时进行默认规则的排序;

--Union All,全集(不去重) 对两个结果集进行并集 *** 作,包括重复行,不进行排序 ;

--Intersect,交集(找出重复) 对两个结果集进行交集 *** 作,不包括重复行,同时进行默认规则的排序;

--Minus,差集( 减去重复 ) 对两个结果集进行差 *** 作,不包括重复行,同时进行默认规则的排序

--查询工资大于1500 或 含有佣金的人员姓名

select ename,sal,comm from emp where sal>1500 or comm is not null

select ename,sal,comm from emp where sal>1500

select ename,sal,comm from emp where comm is not null

--并集

select ename,sal,comm from emp where sal>1500

Union

select ename,sal,comm from emp where comm is not null

select ename,sal,comm from emp where sal>1500

Union all

select ename,sal,comm from emp where comm is not null

--查询显示不存在雇员的所有部门号。

--求出所有的部门号

select deptno from dept

--有员工的部门号

select distinct deptno from emp

select deptno from dept

Minus

select distinct deptno from emp

-- 查询显示存在雇员的所有部门号。

select deptno from dept

Intersect

select distinct deptno from emp

--模糊匹配  like %任意任意字符  _一个任意字符  一起使用

--查询员工姓名中包含字符A的员工信息

select * from emp where ename like '%A%'

--完全匹配

select * from emp where ename like 'SMITH'

--查询员工姓名以'A'结尾的员工信息

select * from emp where ename like 'A%'

--查询员工姓名中第二个字母为A的员工信息

select * from emp where ename like '_A%'

insert into emp(empno,ename,sal) values(1000,'t_%test',8989)

insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000)

--escape('单个字符')指定转义符

--查询员工姓名中包含字符%的员工信息

select * from emp where ename like '%B%%' escape('B')

--当执行插入数据,删除数据,修改的时候,默认开启事务

--可提交  commit 

--可回滚  rollback

--多个人中任意一个值就可以

select * from emp where sal=1600 or sal=3000 or sal=1500

select * from emp where sal in(1500,1600,3000)

--select 字段.. from 结果集 where 行过滤条件 order by 排序字段 desc降序|asc升序(默认)..

--执行流程: from-->where-->select-->排序

select empno,ename,sal from emp order by sal desc,empno asc

--按照奖金升序排序,如果存在null值,所有的奖金null值的数据最先显示

select empno,ename,sal,comm from emp where deptno in (10,30) order by comm asc nulls first

你说的应该是scott用户下的emp表吧,我们看下emp表的表结构你就知道保存的是什么信息了:

CREATE TABLE EMP

(EMPNO NUMBER(4) NOT NULL,

ENAME VARCHAR2(10),

JOB VARCHAR2(9),

MGR NUMBER(4),

HIREDATE DATE,

SAL NUMBER(7, 2),

COMM NUMBER(7, 2),

DEPTNO NUMBER(2))

emp表是employee 雇员信息表

empno 就是雇员的员工编号, employee number

ename 员工姓名, emlployee name

job 员工的工作是什么比如推销员,经理等

mgr 上级编号

hiredate受雇日期

sal薪金

comm佣金

deptno部门编号

Oracle主要数据类型

概述 各种数据库所支持的数据类型大同小异 与标准SQL语言中的数据类型可能略有出入

类型 varchar 可以在声明字段时设置它的长度上限 而且使用它之后 就不必再考虑空格的存在

若插入的字符串的长度低于长度上限 系统就会自动将其缩减为字符串的真实长度

number(m n) 既可以用来表示整型 也可以表示浮点型 但m不可以超过 如果n为 或者省略n 就代表它是整数

date 用来存放日期和时间

blob 通常是在应用程序中使用到它 而不是在数据库中利用SQL指令直接使用

比如通过JDBC技术访问数据库 读写blob或clob类型的字段 即读写长的字符串信息等等

char 它是一种定长的字符类型 在Oracle数据库不区分字符和字符串 它们被统称为字符型或文本型

所谓定长的字符型是指 插入的字符串若没有达到约定的字段长度 系统就会在字符串尾部自动补空格

同样 读取时的字段长度永远是声明时的字段长度 而且在比较字符串内容的时候 也需要考虑到空格的过滤

nchar 它也是定长的字符串类型 它是SQL语言标准中规定的 通常采用Unicode编码来保存不同国家或不同语言的字符

varchar SQL标准在定义varchar时并没有保证能够向前和向后兼容 即有可能随着语言标准的修改而产生不兼容的问题

所以Oracle定义了同varchar型类似的varchar 型 就是为了在Oracle以后的版本中 都永远支持varchar 类型

Oracle这么做就是为了确保此类型向前后兼容 以达到能够在Oracle系列数据库中进行数据的导入和导出的目的

long 它和varchar 的差别在于 它不支持对字符串内容进行检索 即查询时不可以对它的内容进行条件查询

而varchar 和char nchar型等等都可以在查询的时候直接检索字符串的内容

补充 select * from v$nls_parameters数据库的配置信息以数据表的形式存在 通常称其为关于数据的数据或数据字典

实际上它查询的是数据字典中的一个视图 其中NLS_CHARACTERSET对应的是当前的数据库字符集

缺省均为使用数据库字符集 教程中使用的是安装时默认的ZHS GBK字符集 即汉字占 个字节 英文占 个字节

而NLS_NCHAR_CHARACTERSET对应的是nchar或nvarchar 类型所采用的辅助字符集 即AL UTF 字符集

实际上AL UTF 是一种 位定长的Unicode编码的字符集 而数据库字符集以及这种国家字符集都可以修改

但数据库字符集修改后可能会面临很严重的后果 除非是数据库管理员 普通用户不必对这方面进行深究

数据库中的数据导入导出的时候 如果源数据库和目标数据库所采用的字符集不同 也很容易出问题

函数

概述 函数可以认为是能够完成相对独立的功能的一段代码的集合 Oracle函数相当于其它语言中的方法或过程

Oracle函数可以分为单行函数和多行函数两大类 Oracle函数都是有返回值的

所谓的单行函数是针对查询结果中的每一行都起作用 都会返回一个结果

多行函数也就是所谓分组函数 是针对一组查询的记录 或者说多行 返回一个结果

单行 *** 作数据项 接受参数并返回处理结果 对每一返回行均起作用 可修改数据类型 可嵌套使用

单行函数分为字符函数 数值函数 日期函数 转换函数 通用函数

多行 也称分组函数 即对一组数据进行运算 针对一组数据(多行记录)只能返回一个结果

多行函数包括avg() count() max() min() sum()等

比如select avg(sal) max(sal) min(sal) sum(sal) max(hiredate) min(hiredate) from emp

续一 使用Oracle的系统函数中的单行函数可实现诸多功能 如对数据进行计算 控制数据的输出格式

设置和改变日期的显示格式 进行数据类型转换 使用NVL等函数处理空值 实现IF THEN ELSE多路分支逻辑等等

续二 转换函数不会改变表中数据的字段类型和值 它就相当于将数据复制了一份 所转换的是复制之后的数据

数据类型转换包括隐含转换和显式转换两种方式 建议使用显式的数据类型转换 确保SQL语句的可靠性

续三 通用函数适用于包括空值在内的任何类型数据 通常用来实现空值的处理 空值的过滤或设置缺省值等

通用函数包括nvl() nvl () nullif() coalesce() case表达式 decode()等

嵌套 单行函数可以嵌套使用 嵌套层次无限制 分组函数最多可嵌套两层 嵌套函数的执行顺序是由内到外

单行比如select empno lpad(initcap(trim(ename)) ) 姓名 job sal from emp

多行比如select max(avg(sal)) from emp group by deptno其实这里再使用分组函数就没有意义了

说明 通常数据库层面提供的函数 只是进行数据的简单的处理 或者说是只能实现极为常规的功能

所以就不应该 或者说是不要指望在数据库查询的层面来实现特别复杂的业务逻辑

如果应用程序的逻辑跟数据库混在一起的话 会不利于代码的维护和更新

而且也不利于数据库的管理 包括数据移植 数据库导入导出等等

日期类型

概述 在计算机 *** 作系统或者各种高级编程语言中 日期通常会被保存成一个长整数 通常记录的是毫秒

Oracle内部以数字格式存储日期和时间信息 世纪 年 月 日 小时 分钟 秒

缺省的日期格式是DD—MON—YY 可使用sysdata函数获取当前系统日期和时间

运算 日期型数据可以直接加或减一个数值 结果认为日期 约定的该数值代表的是相加减的天数

两个日期型数据可以相减 结果为二者相差多少天 二者不能 因为日期相加是没有意义的

NVL()函数

概述 它用于将空值null替换为指定的缺省值 适用于字符 数字 日期等类型数据

格式 NVL(exp exp ) 如果表达式exp 值为null 则返回exp 值 否则返回exp 值

举例 select empno ename sal m sal+nvl(m ) from emp

select empno ename job nvl(job No job yet ) from emp

NVL ()函数

概述 它用于实现条件表达式功能

格式 NVL (exp exp exp ) 如果表达式exp 值不为null 则返回exp 值 否则返回exp 值

举例 select empno ename sal m nvl (m sal+m sal) 总收入 from emp

NULLIF()函数

概述 它用于数据等价性比较并根据比较结果返回null或其中一个被比较的数值 实际开发中应用并不是很多

格式 nullif(exp exp ) 如果表达式exp 与exp 的值相等 则返回null 否则返回exp 的值

举例 select name 原名 nullif(pen_name name) 化名 from author

COALESCE()函数

概述 它用于实现数据“接合”功能

格式 coalesec(exp exp ) 依次考察各参数表达式 遇到非null值即停止并返回该值

若表达式均为null值 则返回null 通常最后一个表达式都是能确保不是空值的字段

举例 select empno ename sal m coalesec(sal+m sal ) 总收入 from emp

CASE表达式

概述 它用于实现多路分支结构

格式 case exp when parison_exp then return_exp

[when parison_exp then return_exp

when parison_expn then return_expn

else else_exp]

end

举例 select empno ename sal

case deptno when then 财务部

when then 研发部

when then 销售部

else 未知部门

end 部门

from emp

说明 CASE中的每一个表达式(如deptno 财务部等)都可以是复合而成的

这种对齐方式的书写是为了增加可读性 当然也可以把代码写在同一行上

其中case到end之间的整体就相当于普通查询中的一个字段 end后面的“部门”是别名

DEDODE()函数

概述 和case表达式类似 它也用于实现多路分支结构

格式 decode(col|expression search result

[ search result ]

[ default])

举例 select empno ename sal

decode(deptno 财务部

研发部

销售部

未知部门 )

部门

from emp

COUNT()函数

格式 count(*)返回组中总记录数目

count(exp)返回表达式exp值非空的记录

count(distinct(exp))返回表达式exp值不重复的 非空的记录数目

举例 select count(*) from emp缺省的情况下 整个表就是一组

select count(m) from emp返回emp表中m字段不为空的记录(行)数目

select count(distinct(deptno)) from emp查找deptno值为非空且不重复的记录数目

分组函数与空值

概述 分组函数省略列中的空值 可使用NVL()函数强制分组函数处理空值

举例 select avg(m) from emp等价于sum(m)/count(m)

select sum(m) from emp计算表中非空的m值的总和

select avg(nvl(m )) from emp等价于avg(nvl(m ))/count(*)

GROUP BY子句

概述 它用于将表中数据分成若干小组

格式 select column group_function(column)

from table

[where condition]

[group by group_by_expression]

[order by column]

举例 select deptno avg(sal) from emp group by deptno

说明 出现在SELECT列表中的字段 如果不是包含在组函数中 那么该字段必须同时在GROUP BY子句中出现

包含在GROPY BY子句中的字段则不必须出现在SELECT列表中 子句执行顺序是where→group by→order by缺省按升序排列

补充 select deptno job avg(sal) from emp group by deptno job order by deptno desc基于多个字段的分组

select deptno avg(sal) from emp非法

注意 如果没有GROUP BY子句 SELECT列表中不允许出现字段(单行函数)与分组函数混用的情况

WHERE中不允许使用分组函数 如select deptno avg(sal) from emp where avg(sal)>group by deptno非法

这跟子句执行的顺序有关 where子句最先执行 在执行where子句的时候还没有执行过group by子句

于是程序不知道这是在分组 也不曾计算过avg(sal)的组内平均工资 所以在where子句中不允许使用分组函数

由于还没有执行过group by子句 所以此时就不确定如何怎么分组以及分多少个组

所以where子句中只能进行初级过滤 此时可以使用HAVING子句实现对平均工资的过滤

HAVING子句

概述 它用于过滤分组

格式 select column group_function(column)

from table

[where condition]

[group by group_by_expression]

[having group_condition]

[order by column]

举例 select deptno job avg(sal)

from emp

where hiredate >= to_date( yyyy mm dd )

group by by deptno job

having avg(sal) >

lishixinzhi/Article/program/Oracle/201311/19087


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9586274.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存