oracle数据库对象 表 --高级查询

本文详细介绍了Oracle数据库中的一些高级查询技术,包括过滤和排序、单行函数、多表查询、组函数以及高级子查询。内容涵盖where子句、order by用于排序,单行函数如to_char()、to_date(),多表查询的内连接、外连接,以及组函数如SUM、AVG、COUNT和MIN/MAX。此外,还讨论了子查询的使用,如单行、多行、多列子查询,以及EXISTS和NOT EXISTS操作符。通过with子句简化查询表达式,并探讨了相关更新和删除操作。
摘要由CSDN通过智能技术生成

上一篇介绍了数据库的两个基本对象表和视图,并介绍了一些基本的DML和DDL操作,但是在实际开发中执行的操作可不是那些最基本的操作,所以本篇将介绍在实际开发中用到的一些复杂的查询语句和一些相应的函数。
在介绍之前首先展示下我的演示数据的表结构,主表为员工表employees ,然后又部门表表结构展示

1.过滤和排序

在过滤查询中主要是利用where子句添加条件达到数据过滤的目的。
下面将通过实际问题来展示过滤查询中的一些关键字:

过滤:

1.where 子句的应用,where 后面加限制条件,其中where必须紧接着from后面。
--查询90号部门的员工的基本信息`这里写代码片`
select * from employees where department_id=90;

2.字符和日期
在oracle中规定,字符必须放在单引号里面,日期的默认格式为 DD-mon月-RR。但是我们在实际中一般可以通过to_char
和to_date
函数,把日期和字符之间进行相互转换,然后再进行比较。

--eg:查询last_name为walle的员工的基本信息
select * from employees where last_name = 'walle';
--eg:查询入职时间为1995812的员工的信息
select * from employees where hire_date = '12-8-1995';
或者是
select * from employees where hire_date = to_date('1995-8-12','yyyy-mm-dd')
或者是
select * from employees where to_char(hire_date,'yyyy-mm-dd') = '1995-8-12';

3.比较运算,常见的比较符号有 =, <, >,<=,>=,其中<>和!=是一个意思。赋值运算用的是:=。除此之外还有其他的一些比较
运算符,包括 betweent...and  ...(在两数之间,包括边界), inset)(等于值列表中的一个);like (这是做模糊
查询时候用到的关键字) is null (为空值)

--eg:选择工资不在500012000的员工的姓名和工资
select last_name,salary from employees where salary <5000 or salary >12000;
或者
select last_name, salary from employees where salary not between 5000 and 12000;

--eg:选择在2050号部门工作的员工姓名和部门号
select last_name ,department_id from employees where department_id in(20,50);

--eg:选择在1994年雇用的员工的姓名和雇用时间
select last_name,hire_date from employees where hire_date like '%94';
或者
select last_name ,hire_date from employees where to_char(hire_date,'yyyy') =1994;

--eg:选择公司中有奖金的员工姓名,工资和奖金级别
select last_name ,salary,commission_pct from employees where commission is not null;

--eg:选择员工姓名的第三个字母是a的员工姓名
select last_name from employees where last_name like '__a%';--使用'--'可以代表一个未知字符。

--eg:选择姓名中有字母a和e的员工姓名
select last_name from employees where last_name like '%a%e%' or last_name like '%e%a%';

排序:
排序就很简单了,使用 order by col_name [DESC / ASC] 既可以实现根据指定字段对数据进行排序,其中,DESC是
降序排列,而ASC是升序排列。不写的话默认的是ASC升序排列。

eg:查询员工的姓名,部门号,薪水,并按照部门号升序排列,薪水降序排列

select last_name,department_id ,salary from employees order by department_id,salary desc;

2、单行函数

为了数据的操作方便,SQL中已经帮我封装了一些函数,让我们在应用的时候可以直接调用,总体可以将这些函数分为两大类,一类称为单行行数,另一类称为多行函数。
单行行数的核心在于只对一行数据进行操作,并返回一个结果,之前已经接触了2个了,在做时间格式转换的时候用到了
to_char(),to_date();方法就是典型的单行函数,只对一行数据进行操作,并返回单一结果。
下面列举一下常见的单行函数:
字符操作:
- to_char(date,’yyyy–mm-dd’):将时间转换成字符串;
- to_date(”,’yyyyy-mm-dd’):将字符串转换成时间;
- LOWER(‘ABC’) :将字符串转换成小写;
- UPPER(‘abc’);将字符串转换成大写;
- INITCAP(‘ABC DEF’)=Abc Def;保留首字符大写;
- CONCAT(‘hello’,’world’) = ‘helloworld’ :字符串的拼接;
- substr(‘abcdefghi’,3,4) =’cdef’;字符串的截取,表示从第三个字符截取后面四个字符;
- length(‘abdcde’) = 6;返回当前字符串的长度;
- instr(‘helloworld’,’w’) = 6;返回第一次出现某个字符的位置,空格会算进去,且区分大小写
- lpad(salary,10,’*’) *****24200,将数字补充到10位,用指定符号补充,从左边开始补充;
- rpad(salary,10,’‘) 24200****,将数字补充到10位,用指定符号补充,从右边补充;
- trim(‘h’ from ‘hhellowHdd’) = ‘ellowHdd’,去除指定字符串中的指定字符,区别大小写;
- replace(‘reddle’,’d’,’m’) = ‘remmle’:将指定字符串进行替换;

数字操作:
round(42.9833,2) = 42.98 :四舍五入,2表示小数点保留两位,如果为-2,则保留到小数点前面两位;
trunc(34.226,2) = 34.22:直接截取,2表示保留小数点后2位;不写则为零,不保留小数;
mod(16,3) = 1 :取余数;

日期操作:
1.将日期加上一个数字或者减去一个数字仍然为日期
2.两个日期相减返回的是两个日期之间差的天数,相加无意义;
3.常见日期函数:
MONTHS_BETWEEN:两个日期相差的天数;MONTHS_BETWEEN (‘01-SEP-95’,’11-JAN-94’)
ADD_MONTHS:向指定日期中加上若干月;ADD_MONTHS (‘11-JAN-94’,6)
NEXT_DAY:指定日期的一下星期几对应的日期;NEXT_DAY (‘01-SEP-95’,’FRIDAY’)
LAST_DAY:本月的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值