oracle表查询

2014-04-07sql

1.查询每一个员工对应的部门数据库

SQL>conn hr/hr;vim

##查询表服务器

SQL>select object_name from user_objects where object_type='TABLE';oracle

##查看两张表结构函数

SQL>desc employees;spa

SQL>desc departments;排序

##关联查询ci

SQL>select a.first_name || ' ' ||a.last_name name,employee_id,b.department_name  from  employees a join departments b on a.department_id=b.department_id;rem

2.链接

等值链接:inner join

左链接:left join

右链接:right join

自链接:self join

3.查询员工对应的部门和城市

##查询表

SQL>select object_name from user_objects where object_type='TABLE';

##查看三张表结构

SQL>desc employees;

SQL>desc departments;

HR@orcl> desc locations;

##关联查询

HR@orcl> select a.employee_id,a.department_id,c.city from employees a join departments b on a.department_id=b.department_id join locations c on b.location_id=c.location_id;

##将SQL缓冲区内容保存到文件中

HR@orcl> save 1.sql;

HR@orcl> !

##编辑配置文件

[oracle@oracle53 ~]$ vim 1.sql

================================== 

rem query employee_id,employee_name,department_id,city

set linesize 500;

col name for a20;

col city for a30;

select a.employee_id,a.first_name || ' ' ||a.last_name name,a.department_id,c.cii

ty from employees a join departments b on a.department_id=b.department_id join ll

ocations c on b.location_id=c.location_id

/

====================================

[oracle@oracle53 ~]$ exit

4.全部员工对应的部门

//left [outer] join:不只会返回知足链接条件(等值链接)的全部记录,并且还会返回不知足条件的链接操做符左边表的其余行。

HR@orcl 14:04:07-09:57:55> select a.employee_id,a.last_name ||' '||a.first_name name,b.department_name from employees a left join departments b on a.department_id=b.department_id;

##传统用例:把(+)放在行数较少的一端,只能用于左右链接

HR@orcl 14:04:07-10:34:56> select a.employee_id,a.last_name ||' '||a.first_name name,b.department_name from employees a,departments b where a.department_id=b.department_id(+);

5.全部部门对应的员工

//right [outer] join:不只会返回知足链接条件(等值链接)的全部记录,并且还会返回不知足条件的链接操做符右边表的其余行。

select a.employee_id,a.last_name ||' '||a.first_name name,b.department_name from employees a right join departments b on a.department_id=b.department_id;

##传统用例

HR@orcl> select a.employee_id,a.last_name ||' '||a.first_name name,b.department_name from employees a,departments b where a.department_id(+)=b.department_id;

6.查询员工对应的上司

HR@orcl> select a.employee_id,a.last_name ||' '||a.first_name name,b.employee_id,b.last_name||' '||b.first_name mname  from employees a join employees b on a.manager_id=b.employee_id;

7.全链接

HR@orcl> select a.employee_id,a.last_name||' '||a.first_name name,b.department_name from employees a full join departments b on a.department_id=b.department_id;

8.数据分组

组函数又称为多行函数,把多行看成一个总体进行处理。

avg(),sum(),max(),min(),distinct(),group by,having

having:用来限制分组显示结果

group by:对查询结果进行分组统计

9.组函数使用原则:

1)distinct表示值不重复;

2)全部组函数忽略空值,为了用一个值代替空值,用nvl,nvl2,coalesce函数;

----重点强调--------

3)使用group by来分组时,oracle服务器隐式以升序排序结果集

##统计每一个部门的平均工资

HR@orcl> select department_id,round(avg(salary),2) from employees group by department_id;

##统计每一个部门的最小工资,最大工资

HR@orcl> select department_id,min(salary),max(salary) from employees group by department_id;

##统计每一个部门有多少员工

HR@orcl> select department_id,count(employee_id) from employees group by department_id;

##统计每一个部门的绩效 ---先处理空值,再求平均值

HR@orcl 14:04:07-11:28:03> select department_id,avg(nvl(commission_pct,0)) from employees group by department_id;

------having--------

sql>select department_id,avg(nvl(commission_pct,0)) from employees group by department_id having avg(nvl(commission_pct,0))>0.2;

10.子查询

子查询是指嵌入在其余的SQL语句中的SELECT语句,也称为嵌套查询。

//单行子查询结果只返回一行,若是用等于只能用单行子查询

##雇员编号为141工做类型,查询全部从事这个工做类型的雇员

SQL> select last_name|| ' '||first_name employee_name,job_id from employees where job_id= (select job_id from employees where employee_id=141);

//多行子查询

SQL> select last_name|| ' '||first_name employee_name,job_id from employees where job_id in (select job_id from employees in employee_id (141,142));

in:等于列表中的任何成员

any:比较子查询返回的每一个值

all:比较子查询返回的所有值


SQL> select employee_id,last_name,salary from employees where salary < any (select salary from employees where job_id='IT_PROG') and job_id !='IT_PROG';



SQL> select employee_id,last_name,salary from employees where salary < all (select salary from employees where job_id='IT_PROG') and job_id !='IT_PROG';

11.行记录标识

rownum:行记录在表中的逻辑地址

rowid:行记录在表中的物理地址,十个字节

SQL> select employee_id,last_name,salary,rownum,rowid from employees where salary < all (select salary from employees where job_id='IT_PROG') and job_id !='IT_PROG';

EMPLOYEE_ID LAST_NAME  SALARY     ROWNUM ROWID

----------- ------------------------- ---------- ---------- ------------------

185 Bull    4100  1 AAAR5pAAFAAAADPABV

192 Bell    4000  2 AAAR5pAAFAAAADPABc

193 Everett    3900  3 AAAR5pAAFAAAADPABd

12.数据类型

//字符类型:char(),varchar2(),colb,blob,bfile

varcha2()可变,数据库字符集

//数值类型:number()----oracle 9i数据库引擎支持的

binary_integer,binary_float,binary_double

//时间类型:date.timestamp

HR@orcl 14:04:07-03:25:18> create table d(d timestamp);

HR@orcl 14:04:07-03:25:47> insert into d values(sysdate);

HR@orcl 14:04:07-03:26:42> select * from d;

-----------------------------------------------------------

07-APR-14 03.26.42.000000 PM ---默认精度为6位

-----------------------------------------------------------

//扩展:

oracle:移动表空间中的数据文件

alter tablespace tbs_01 offline;       -----脱机表空间

host mv /tmp/datafile1.dbf /tmp/tbs/datafile1.dbf  -----移动数据文件

alter tablespace tbs_01 rename datafile '/tmp/datafile1.dbf' to '/tmp/tbs/datafile1.dbf'    -----对数据文件进行重命名,也就时告知数据库数据文件的位置

select a.ts#,a.name,b.name from v$tablespace a join v$datafile b on a.ts#=b.ts#; -----查询表空间与数据文件的对应

alter tablespace tbs_01 online;    ------从新联机

///

语法:SELECT 语句1 [UNION|UNION ALL|INTERSECT|MINUS] SELECT 语句2


UNION

UNION操做符用于获取两个结果集的并集。当使用该操做符时,会自动出掉结果集中的重复行,而且会以第一列的结果进行排序。


SELECT ENAME,SAL,JOB FROM EMP WHERE SAL > 2500

union 

SELECT ENAME,SAL,JOB FROM EMP WHERE JOB='MANAGER';


UNION ALL

UNION ALL操做符用于获取两个结果集的并集,但与UNION操做符不一样,该操做符不会取消重复值,并且也不会以任何列进行排序。

SELECT ENAME,SAL,JOB FROM EMP WHERE SAL > 2500

UNION ALL

SELECT ENAME,SAL,JOB FROM EMP WHERE JOB='MANAGER';



INTERSECT

INTERSECT操做符用于获取两个结果集的交集,当使用该操做符时,只会显示同时存在于两个结果集中的数据,而且会以第一列进行排序。

SELECT ENAME,SAL,JOB FROM EMP WHERE SAL > 2500

INTERSECT

SELECT ENAME,SAL,JOB FROM EMP WHERE JOB='MANAGER';


MINUS

把集合{x∣x∈A,且x∉B}叫作A与B的差集,记做A-B

MINUS操做符用于获取两个结果集的差集,当使用该操做符时,只会显示在第一个结果集中存在,在第二个结果集中不存在的数据,而且会以第一列进行排序。


SELECT ENAME,SAL,JOB FROM EMP WHERE SAL > 2500

MINUS

SELECT ENAME,SAL,JOB FROM EMP WHERE JOB='MANAGER';

相关文章
相关标签/搜索