oracle学习笔记(二)

1、where子句(选择操作)

where子句使用在 select ... from ... 后面,用来选择所需(符合条件的)的记录

例:查询George的工资
select first_name,salary from s_emp where first_name='George';


where后面跟的是表达式 也就是 XXX=XXX, XXX between X and X ,XXX in(X,X,X)
like '...' 通配查询

between ... and ... ,表示结果在这之间,between and是一个闭区间,也就相当于... <= ... and ... >= ... 。

!=,<>,^=,这三个都标识不等于,<=,>=,=,这些运算符都可以使用。

... in (va1,val2,...) 判断结果是否在这个集合中存在,等于其中随变一个就行了,可以说in=any
in中集合的数据是有顺序的,概率高的数据放在前面可提高效率

not in<>all 没有顺序
空值会对not in造成影响,也就是不等于任何值,但是空值例外。

like '...' 字符串通配查询,'%'表示0或任意多个字符,'_',表示任意一个字符。
注意:转义的用法:like ‘S\_%’ escape ‘\’

例:找出表名是以s_开头的表
select table_name from user_tables where table_name like 'S\_%' escape '\'; 把\定义为转义字符

... is null 使用来判断值是否为空。is not null 判断值不为空
例:查看哪些人没有提成
select first_name from s_emp where commission_pct is null;

... and ... 表示只有两个条件同时满足
... or ... 表示条件只要满足其中只一就可以
all ... 是要求都满足条件。

注意:Oracle中的字符串是严格区分大小写的。

(1)注意数据类型,数字类型直接写,字符用'......' ,缺省格式的Date可以用'......',只有别名才用" "包含。
(2)选择合适的运算符

2、单行函数(一个输入,一个输出)
多行函数又叫组函数(多个输入,一个输出)例平均值

1.字符函数

字符是大小写敏感的
转小写 lower(字段名) --- 其中的参数可以是一个字符串常量或是一个字段名
转大写 upper(字段名)
首字母大写 initcap(字段名)
字符串拼接 concat(字段1, 字段2)
截取子串 substr(字段名, 起始位置,取字符个数)
返回字符串长度length(字符串)

dual表,是专门用于函数测试和运算的,他只有一条记录

可以使用"-"表示从右向左取,取的时候可以从左往右取。
例:select substr(first_name,-2,2) sub from s_emp;(取后两个)
select substr(first_name,2,2) sub from s_emp;(取前两个)

nvl是一般函数,支持任何数据类型

2.数值函数

四舍五入 round(数据,保留小数点后几位)
可以用负数表示小数点前,0,表示小数点后第一位,也就是保留个位,-1表示个位(保留到十位)。
例:select round(15.36,1) from dual;

截取数字函数 trunc(数据,保留的位数(小数点后位数)) 截取个位之后补0
例:select trunc(123.456,1) from dual;

3.日期函数

日期格式,
全日期格式 世纪信息,年月日,时分秒。
缺省日期格式,日-月-年 dd-mon-rr
修改当前会话的日期格式,会按照指定的格式输出日期
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';

返回当前日期 sysdate
例:select sysdate from dual;
select sysdate+1 from dual; 获得明天的日期,加1,单位是天

例: 10分钟以后的时间 select sysdate,sysdate+1/144 from dual;

日期是格式敏感的
求两个日期间相隔了多少个月 months_between(date1,date2)
加减指定数量的月份 add_months(date,月数),月数可以为负,负值就是减去相应的月数。
从date日期开始的第一个星期五 next_day(date,FriDay)
返回月末的日期 last_day(date)
round 不能使用缺省的日期格式
例:select round(to_date('02-JAN-07','DD-MM-RR'),'MONTH') from dual;

截取日期 trunc(date,'年或月或日或时分秒')
例:select next_day(sysdate,2) from dual;
例:select trunc(add_months(sysdate,1),'month') from dual;

练习:
返回下个月的第一天的日期
select round(last_day(sysdate),'MONTH') from dual;
select add_months(trunc(sysdate,'MONTH'),1) from dual;
select trunc(add_months(sysdate,1),'MONTH') from dual;

4.不同数据类型间转换函数

将日期转成字符 tochar(date,'日期格式')
日期格式要用有效格式,格式大小写敏感 'yyyy mm dd hh24:mi:ss'(完整的日期可格式)
year'(全拼的年),'mm'(2位数字表示的月) 'month'(全拼的月),'dy'(3位字母表示的星期) ,'day'(星期的全拼),'ddspth' (日期的序数词)

例:显示完整的系统日期
select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from dual;

查询3号入职的员工
select first_name,start_date from s_emp where to_char(start_date,'dd')='03';
select first_name,start_date from s_emp where to_char(start_date,'fmdd')='3'; 'fm'是去掉前导0

向表中插入日期(test是表名)
insert into test values('01-JAN-07');
insert into test values(to_date('2007 01 01 10:10:10','yyyy mm dd hh24:mi:ss'));

将字符转换成数字 to_number('...') ,缺省是按十进制来算,字符串只能是0---9的数字
select to_number('ab','xx') from dual; 把ab转成十六进制

将数字转字符to_char(number,'fmt') fmt是数字格式
select to_char(salary,'$99,999.99') from s_emp;
select to_char(salary,'$00,000.00') from s_emp; ##########表示越界,大于显示宽度
select to_char(salary,'L00,000.00') from s_emp;

将字符串转成日期 to_date('...','日期格式')
例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual;

3、多表查询

表连接(关联查寻)

如果多表查询时不加where子句,也就是过滤条件或者是使用了无效的条件,就会产生两表之间记录的相互逐条匹配(组合),产生很多无效的结果(笛卡尔积)。

注意:在使用表连接时,要注意查询的表间的关系信息,表之间的字段所表示的信息的关系

1、等值连接

select [表别名1.字段名1],[表别名2.字段名2],...
from 表1 表别名1 ,表2 表别名2
where 表别名1.字段名3=表别名2.字段名4;
表连接时,当表与表之间有同名字段时,可以加上表名或表的别名,加以区分,使用时要用
表名.字段名或表别名.字段名(列名)。当表的字段名是唯一时,可以不用加上表名或表的别名。

注意:当为表起了别名,就不能再使用表名.字段名。

例:列出所有Sales部门的员工
select e.first_name,d.name
from s_emp e,s_dept d
where e.dept_id=d.id and d.name='Sales';

列出每个员工的名称,他所在的部门名称,及地区名称
select e.first_name,d.name,r.name
from s_emp e,s_dept d,s_region r
where e.dept_id=d.id and d.region_id=r.id;

执行脚本
cd $ORACLE_HOME
cd sqlplus
cd demo
sqlplus sd0703/sd0703 @demobld.sql

2、非等值连接

select [表别名1.字段名1],[表别名2.字段名2],...
from 表1 表别名1 ,表2 表别名2
where 表别名1.字段名3 ..... 表别名2.字段名4

....可以使比较运算符,也可以使其他的除了'='的运算符

例:列出每个员工的工资和他的工资级别
select e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal;

3、自连接

用别名把一张表中的数据分成两部分,然后在使用条件过滤。
select [表别名1.字段名1],[表别名2.字段名2],...
from 表1 表别名1 ,表1 表别名2
where 表别名1.字段名3=表别名2.字段名4;

例:列出每个员工的经理名
select a.first_name ename,b.first_name cname
from s_emp a,s_emp b
where a.manager_id=b.id;

以上所提到的表连接,都叫做内连接,严格匹配两表的记录。

4、外连接(先做连接再做过滤)

会使用一方表中的所有记录去和另一格表中的记录按条件匹配,空值也会匹配,这个表中的所有记录都会显示,数据库会模拟出记录去和那些不匹配的记录匹配。

例:select a.first_name enamei,a.id,b.first_name cname,b.id
from s_emp a,s_emp b
where a.manager_id=b.id(+);
即用a表中的数据去匹配b表的,若b表中有null,系统模拟纪录与其匹配

注意:要把那一方的记录全部都显示出来,还有注意条件(+)跟在要全部选出的对端。

外连接的应用:

员工都分布在哪些部门
select distinct deptno from emp;

列出哪个部门没有员工
select e.deptno,d.deptno
from emp e,dept d
where e.deptno(+)=d.deptno
and e.deptno is null;

你可能感兴趣的:(oracle,sql,脚本)