oracle时间条件多表查询,oracle学习第二天,多表查询,函数

查询所有员工的信息,要求显示所在部门的名称(而不是编号)

1selectempno,ename,job,(selectd.dnamefromdeptdwhered.deptno=e.deptno)as所在部门

2*fromempe

3/

EMPNOENAMEJOB所在部门

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

7369SMITHCLERKRESEARCH

7499ALLENSALESMANSALES

7521WARDSALESMANSALES

7566JONESMANAGERRESEARCH

7654MARTINSALESMANSALES

7698BLAKEMANAGERSALES

7782CLARKMANAGERACCOUNTING

7788SCOTTANALYSTRESEARCH

7839KINGPRESIDENTACCOUNTING

7844TURNERSALESMANSALES

7876ADAMSCLERKRESEARCH

7900JAMESCLERKSALES

7902FORDANALYSTRESEARCH

7934MILLERCLERKACCOUNTING

已选择14行。

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

格式中有其他字符时要使用双引号引起来:

SQL>selectto_char(sysdate,'yyyy"年"mm"月"dd"日"hh"时"mi"分"ss"秒"')fromdual;

TO_CHAR(SYSDATE,'YYYY"年"MM

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

2013年11月02日06时33分01秒

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

1*select*fromempwherehiredate>to_date('19810601','yyyymmdd')

SQL>/

EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO

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

7654MARTINSALESMAN769828-9月-811250140030

7782CLARKMANAGER783909-6月-81245010

7788SCOTTANALYST756619-4月-87300020

7839KINGPRESIDENT17-11月-81500010

7844TURNERSALESMAN769808-9月-811500030

7876ADAMSCLERK778823-5月-87110020

7900JAMESCLERK769803-12月-8195030

7902FORDANALYST756603-12月-81300020

7934MILLERCLERK778223-1月-82130010

已选择9行。

===================字符函数==============================

字符函数:

lower全部转为小写

upper全部转为大写

initcap首字母转为大写

-------

concat连接两个字符串

substr在字符串str中从第m个位置开始取n个字符(位置从1开始)

length求长度

instr从字符串strA中找出str所在的位置(返回第找到的1个,位置从1开始)

lpad把字符串str补齐到n个长度,不足就在左边加指定字符c;

如果str.length>n就取str的前n个字符

rpad把字符串str补齐到n个长度,不足就在右边加指定字符c;

如果str.length>n就取str的前n个字符(也是从前面取)

trim从str的两端去掉字符,要是指定的字符时才去掉,使用方式特殊:

例:trim('a'from'aaITCASTaa')结果为'ITCAST'

trim('C'from'aaITCASTaa')结果为'aaITCASTaa'

注意:前面只能指定一个字符。

replace例:replace('aaITCASTaa','a','=')结果为'==ITCAST=='

转换成小写

SQL>selectlower('ABCddd')fromdual;

LOWER(

------

abcddd

已选择1行。

转换成小写

SQL>selectupper('aac')

2fromdual;

UPP

---

AAC

已选择1行。

连接串

SQL>selectconcat(concat('aa','bb'),'cc')fromdual;

CONCAT

------

aabbcc

已选择1行。

SQL>

SQL>

substr(str,startPosition,count)

从第几个开始,需要截取几个字符,第1个位置是1。

如果第3个参数不指定(即不指定截取几个字符),就表示到最后。

SQL>selectinstr('HelloWorld!','llo')fromdual;

INSTR('HELLOWORLD!','LLO')

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

3

lpad与rpad函数

SQL>selectlpad('ith',5,'**')fromdual;

LPAD(

-----

**ith

SQL>selectlpad('smith',3,'*')fromdual;

LPA

---

smi

SQL>selectrpad('smith',3,'*')fromdual;

RPA

---

smi

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

SQL>selecttrim(''from'ITCAST')fromdual;

TRIM('

------

ITCAST

SQL>selecttrim('a'from'aaaITCASTaa')fromdual;

TRIM('A'FR

----------

ITCAST

1select

2trim(''fromtrim('a'from'aaaITCASTaa'))

3*fromdual

SQL>/

TRIM('

------

ITCAST

SQL>selectreplace('hellwordworld!','o','X')fromdual;

REPLACE('HELLWO

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

hellwXrdwXrld!

===============数字函数=======================

数字函数:

round四舍五入,例round('45.923',2)表示保存两位小数,保留的位数可以指定正、零、负数。

trunc截断,舍掉后面的数,保留的位数可以指定正、零、负数。

mod求余,如mod(12,5)结果为2

12%5=2

SQL>selectmod(12,5)fromdual;

MOD(12,5)

----------

2

SQL>selectmod(15,5)fromdual;

MOD(15,5)

----------

0

====================日期函数============================

日期函数:

日期可以相减,但不能相加,因为没有意义。

selectsysdate-1昨天,sysdate今天,sysdate+1明天fromdual;

selectename,(sysdate-hiredate)天,(sysdate-hiredate)/7星期,(sysdate-hiredate)/30月,(sysdate-hiredate)/365年

add_months

next_day从某个日期算起,下一个出现该星期几的日期是哪天:selectnext_day(sysdate,'星期三')fromdual;

last_day当月的最后一天

round四舍五入

trunc抹去尾部

SQL>selectround(32.392,2)fromdual;

ROUND(32.392,2)

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

32.39

SQL>selectround(32.92,0)fromdual;

ROUND(32.92,0)

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

33

SQL>selectround(10532.92,-1)fromdual;

ROUND(10532.92,-1)

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

10530

SQL>selectround(10532.92,-2)fromdual;

ROUND(10532.92,-2)

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

10500

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

SQL>selecttrunc(32.392,1)fromdual;

TRUNC(32.392,1)

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

32.3

SQL>selecttrunc(10532.92,0)fromdual;

TRUNC(10532.92,0)

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

10532

SQL>selecttrunc(10532.92,-1)fromdual;

TRUNC(10532.92,-1)

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

10530

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

日期的数学运算

SQL>selectsysdate-1昨天,sysdate今天,sysdate+1明天fromdual;

昨天今天明天

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

01-11月-1302-11月-1303-11月-13

已选择1行。

利用日期函数计算工龄

SQL>selectempno,ename,sal,hiredate,round(sysdate-hiredate)||'天'as工龄fromemp

2/

EMPNOENAMESALHIREDATE工龄

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

7369SMITH80017-12月-8012009天

7499ALLEN160020-2月-8111944天

7521WARD125022-2月-8111942天

7566JONES297502-4月-8111903天

7654MARTIN125028-9月-8111724天

7698BLAKE285001-5月-8111874天

7782CLARK245009-6月-8111835天

7788SCOTT300019-4月-879695天

7839KING500017-11月-8111674天

7844TURNER150008-9月-8111744天

7876ADAMS110023-5月-879661天

7900JAMES95003-12月-8111658天

7902FORD300003-12月-8111658天

7934MILLER130023-1月-8211607天

已选择14行。

可以用数字除24来向日期中加上或减去小时

格化式显示日期

SQL>selectto_char(sysdate-1,'yyyy-mm-ddhh:mi:ss')fromdual;

TO_CHAR(SYSDATE-1,'

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

2013-11-0106:46:17

当前日期减一个小时

SQL>selectto_char(sysdate-1/24,'yyyy-mm-ddhh:mi:ss')fromdual;

TO_CHAR(SYSDATE-1/2

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

2013-11-0205:46:55

当前日期减一分钟

SQL>selectto_char(sysdate-1/24/60,'yyyy-mm-ddhh:mi:ss')fromdual;

TO_CHAR(SYSDATE-1/2

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

2013-11-0206:46:41

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

日期函数:

找某月最后一天。

SQL>selectlast_day(sysdate)fromdual;

LAST_DAY(SYSDA

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

30-11月-13

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

在指定日期上加上n个月时间:

SQL>selectadd_months(sysdate,1)fromdual;

ADD_MONTHS(SYS

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

02-12月-13

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

计算两个日期相差的月数

SQL>selectmonths_between(sysdate,'12-8月-2013')fromdual;

MONTHS_BETWEEN(SYSDATE,'12-8月-2013')

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

2.70274492

SQL>selectmonths_between(sysdate,'2-12月-2013')fromdual;

MONTHS_BETWEEN(SYSDATE,'2-12月-2013')

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

-1

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

日期的四舍五入与截断

round四舍五入

当前日期进行四舍五入

SQL>selectround(sysdate,'month')fromdual;

ROUND(SYSDATE,

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

01-11月-13

当前日期加20天再进入四舍五入

SQL>selectround(sysdate+20,'month')fromdual;

ROUND(SYSDATE+

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

01-12月-13

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

找某月第一天(就是m月1日)。

方式一:通过求前一个月的最后一天再加上1

SQL>selectlast_day(add_months(sysdate,-1))+1fromdual;

LAST_DAY(ADD_M

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

01-11月-13

方式二:通过截断函数

SQL>selecttrunc(sysdate,'month')fromdual;

TRUNC(SYSDATE,

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

01-11月-13

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

next_day(),从指定日期开始,第一次出现指定星期几的日期是多少。

下一个星期四是什么时候:今天11月2日,下一个星期四为11月7日

SQL>selectnext_day(sysdate,'星期四')fromdual;

NEXT_DAY(SYSDA

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

07-11月-13

下一个星期一是什么时候:今天11月2日,下一个星期一为11月4日

SQL>selectnext_day(sysdate,'星期一')fromdual;

NEXT_DAY(SYSDA

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

04-11月-13

=================格化式数字===========================

显示工资为本地货币¥RBM人民币

SQL>selectempno,lower(ename),to_char(sal,'L999999')fromemp;

EMPNOLOWER(ENAMTO_CHAR(SAL,'L999

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

7369smith¥800

7499allen¥1600

7521ward¥1250

显示工资为本地货币$美元

SQL>selectempno,lower(ename),to_char(sal,'$999999')fromemp;

EMPNOLOWER(ENAMTO_CHAR(

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

7369smith$800

7499allen$1600

7521ward$1250

自动配置宽度,不足前面补0,并以$美元形式显示

SQL>selectempno,lower(ename),to_char(sal,'$00000')fromemp;

EMPNOLOWER(ENAMTO_CHAR

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

7369smith$00800

7499allen$01600

7521ward$01250

SQL>selectempno,lower(ename),to_char(sal,'$999,999.99')fromemp;

EMPNOLOWER(ENAMTO_CHAR(SAL,

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

7369smith$800.00

7499allen$1,600.00

7521ward$1,250.00

================转换函数================================

转换函数:

隐式数据类型转换与显式数据类型转换

to_char(date,format)

to_date(string[,format])

to_char(number,format)

to_number(string[,format])如:to_number('22')或to_number('$22','$99')

隐式转换

SQL>select'3'-2fromdual;

'3'-2

----------

1

隐式转换出现错误

SQL>select'$3'-2fromdual;

select'$3'-2fromdual

*

第1行出现错误:

ORA-01722:无效数字

显式转换,即强制转换

SQL>selectto_number('$3','$999')-2fromdual;

TO_NUMBER('$3','$999')-2

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

1

===============空值处理函数======================

空值处理函数:

NVL(expr1,expr2)

可以使用的数据类型有日期、字符、数字

NVL2(expr1,expr2,expr3)

expr1不为NULL,返回expr2;为NULL,就返回expr3(expr1!=null?expr2:expr3)

SQL>selectnvl(null,5)fromdual;

NVL(NULL,5)

-----------

5

SQL>selectnvl2(null,5,10)fromdual;

NVL2(NULL,5,10)

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

10

SQL>selectnvl2('',5,10)fromdual;

NVL2('',5,10)

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

5

===================条件表达式====================

条件表达式:

用于实现IF-THEN-ELSE逻辑。

CASE表达式:SQL99的语法,比较繁琐。

DECODE函数:Oracle自己的语法,类似Java,比较简洁。

例:

根据员工的职位涨工资:总裁1000经理800其他400

PRESIDENT

MANAGER

CASE的使用方式一:

SQL>select

2empno,

3lower(ename),

4job,

5sal原来的工资,

6(CASEjobWHEN'PRESIDENT'THENsal+1000WHEN'MANAGER'THENsal+800ELSEsal+400END)涨后的工资

7from

8emp;

EMPNOLOWER(ENAMJOB原来的工资涨后的工资

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

7369smithCLERK8001200

7499allenSALESMAN16002000

7521wardSALESMAN12501650

7566jonesMANAGER29753775

7654martinSALESMAN12501650

7698blakeMANAGER28503650

7782clarkMANAGER24503250

7788scottANALYST30003400

7839kingPRESIDENT50006000

7844turnerSALESMAN15001900

7876adamsCLERK11001500

7900jamesCLERK9501350

7902fordANALYST30003400

7934millerCLERK13001700

已选择14行。

CASE的使用方式二:

SQL>select

2empno,

3lower(ename),

4job,

5sal原来的工资,

6(CASEWHENjob='PRESIDENT'THENsal+1000WHENjob='MANAGER'THENsal+800ELSEsal+400END)涨后的工资

7from

8emp;

EMPNOLOWER(ENAMJOB原来的工资涨后的工资

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

7369smithCLERK8001200

7499allenSALESMAN16002000

7521wardSALESMAN12501650

7566jonesMANAGER29753775

7654martinSALESMAN12501650

7698blakeMANAGER28503650

7782clarkMANAGER24503250

7788scottANALYST30003400

7839kingPRESIDENT50006000

7844turnerSALESMAN15001900

7876adamsCLERK11001500

7900jamesCLERK9501350

7902fordANALYST30003400

7934millerCLERK13001700

已选择14行。

使用DECODE函数:

decode(变量,值1,则a,值2,则b,...default)

^^^^^^^^^^^^^^^^^^^^^^^

有默认值(default)

SQL>select

2empno,

3lower(ename),

4job,

5sal原来的工资,

6(DECODE(job,'PRESIDENT',sal+1000,

7'MANAGER',sal+800,

8sal+400)

9)涨后的工资

10from

11emp;

EMPNOLOWER(ENAMJOB原来的工资涨后的工资

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

7369smithCLERK8001200

7499allenSALESMAN16002000

7521wardSALESMAN12501650

7566jonesMANAGER29753775

7654martinSALESMAN12501650

7698blakeMANAGER28503650

7782clarkMANAGER24503250

7788scottANALYST30003400

7839kingPRESIDENT50006000

7844turnerSALESMAN15001900

7876adamsCLERK11001500

7900jamesCLERK9501350

7902fordANALYST30003400

7934millerCLERK13001700

已选择14行。

不使用默认值:

1select

2empno,

3lower(ename),

4job,

5sal原来的工资,

6(DECODE(job,'PRESIDENT',sal+1000,

7'MANAGER',sal+800

8)

9)涨后的工资

10from

11*emp

SQL>/

EMPNOLOWER(ENAMJOB原来的工资涨后的工资

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

7369smithCLERK800

7499allenSALESMAN1600

7521wardSALESMAN1250

7566jonesMANAGER29753775

7654martinSALESMAN1250

7698blakeMANAGER28503650

7782clarkMANAGER24503250

7788scottANALYST3000

7839kingPRESIDENT50006000

7844turnerSALESMAN1500

7876adamsCLERK1100

7900jamesCLERK950

7902fordANALYST3000

7934millerCLERK1300

已选择14行。

=================集合运算==================

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

集合运算

查询属于部门10与部门20的所有员工信息,还可以这样查

select*fromempwheredeptno=10

加上(这里写集合运算符)

select*fromempwheredeptno=20;

这就是集合运算。

并集:

UNION集合a+b的结果,没有重复记录。

UNIONALL集合a+b的结果,保留所有重复的记录。(用的比较少)

例:查询属于部门10与部门20的所有员工信息。

例:查询工资在500~1500或在1000~2000范围的员工信息(这是两个工资级别)。

交集

Intersect既属于集合a又属于集合b的记录。

例:查询工资在500~1500又在1000~2000范围的员工信息(这是两个工资级别)。

差集

Minus集合a-b的结果,即从a中去除所有属于集合b的元素,注意a-b与b-a的结果是不一样的。

例:查询属于500~1500但不属于1000~2000范围的员工信息。

集合

unio交集,不包括重复行

1selectempno,ename,salfromempwheresalbetween500and1500

2union

3selectempno,ename,salfromempwheresalbetween1000and2000

4*orderbyempno

QL>/

EMPNOENAMESAL

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

7369SMITH800

7499ALLEN1600

7521WARD1250

7654MARTIN1250

7844TURNER1500

7876ADAMS1100

7900JAMES950

7934MILLER1300

已选择8行。

unionall:交集,包含重复行

1selectempno,ename,salfromempwheresalbetween500and1500

2unionall

3selectempno,ename,salfromempwheresalbetween1000and2000

4*orderbyempno

SQL>/

EMPNOENAMESAL

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

7369SMITH800

7499ALLEN1600

7521WARD1250

7521WARD1250

7654MARTIN1250

7654MARTIN1250

7844TURNER1500

7844TURNER1500

7876ADAMS1100

7876ADAMS1100

7900JAMES950

7934MILLER1300

7934MILLER1300

已选择13行。

交集:intersect两个集合中相同的部分

1selectempno,ename,salfromempwheresalbetween500and1500

2intersect

3selectempno,ename,salfromempwheresalbetween1000and2000

4*orderbyempno

SQL>/

EMPNOENAMESAL

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

7521WARD1250

7654MARTIN1250

7844TURNER1500

7876ADAMS1100

7934MILLER1300

差集

1selectempno,ename,salfromempwheresalbetween500and1500

2minus

3selectempno,ename,salfromempwheresalbetween1000and2000

4*orderbyempno

SQL>/

EMPNOENAMESAL

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

7369SMITH800

7900JAMES950

注意:

1,Select语句中参数类型和个数要一致

如果不一致,需要想办法补齐。

例如要补个字符串,不能写个'a'、'b'等,要不影响结果,应补一个null,还要指定类型。

如果是字符串,可以写to_char(null);

如果要补数字类型,则写to_number(null)

2,结果集采用第一个select的表头作为表头。

在第一个select上起别名才有用。

在后面的select上起别名就没有用。

3,如果有orderby子句

必须放到最后一句查询语句后。

======================多表查询============================================

多表查询

类型:

1.等值连接

2.不等值连接

3.外连接

4.自连接

等值连接:d.deptno=e.deptno

例:查询所有员工的信息,要求显示所在部门的名称(而不是部门编号)

SQL>select

2empno,

3ename,

4sal,

5(selectdnamefromdeptdwhered.deptno=e.deptno)as所在的部门

6from

7empe

8/

EMPNOENAMESAL所在的部门

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

7369SMITH800RESEARCH

7499ALLEN1600SALES

7521WARD1250SALES

7566JONES2975RESEARCH

7654MARTIN1250SALES

7698BLAKE2850SALES

7782CLARK2450ACCOUNTING

7788SCOTT3000RESEARCH

7839KING5000ACCOUNTING

7844TURNER1500SALES

7876ADAMS1100RESEARCH

7900JAMES950SALES

7902FORD3000RESEARCH

7934MILLER1300ACCOUNTING

已选择14行。

不等值连接:e.salbetweens.losalands.hisal

例:查询员工的工资级别:编号姓名月薪和级别

SQL>selecte.empno,e.ename,e.sal,s.grade

2fromempe,salgrades

3wheree.salbetweens.losalands.hisal;

EMPNOENAMESALGRADE

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

7369SMITH8001

7900JAMES9501

7876ADAMS11001

7521WARD12502

7654MARTIN12502

7934MILLER13002

7844TURNER15003

7499ALLEN16003

7782CLARK24504

7698BLAKE28504

7566JONES29754

7788SCOTT30004

7902FORD30004

7839KING50005

已选择14行。

过渡用的例子:

按照部门统计员工的人数,要求显示:部门号,部门名称,员工人数

SQL>selectd.deptno,d.dname,count(e.empno)

2fromempe,deptd

3wheree.deptno=d.deptno

4groupbyd.deptno,d.dname;

DEPTNODNAMECOUNT(E.EMPNO)

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

10ACCOUNTING3

20RESEARCH5

30SALES6

SQL>select*fromdept;

DEPTNODNAMELOC

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

10ACCOUNTINGNEWYORK

20RESEARCHDALLAS

30SALESCHICAGO

40OPERATIONSBOSTON

============================连接查询=======================================

期望效果:当连接条件不成立时,仍然希望在结果中包含某些不成立的记录。这就要用到外连接。

外连接:

左外连接:wheree.deptno=d.deptno当连接条件不成立时,等号左边所代表的表的信息仍然显示

右外连接:wheree.deptno=d.deptno当连接条件不成立时,等号右边所代表的表的信息仍然显示

左外连接的写法:wheree.deptno=d.deptno(+)

右外连接的写法:wheree.deptno(+)=d.deptno

利用左外连接实现:按照部门统计员工的人数,要求显示:部门号,部门名称,员工人数

SQL>selectd.deptno,d.dname,count(e.empno)

2fromempe,deptd

3wheree.deptno(+)=d.deptno

4groupbyd.deptno,d.dname

5orderby1;

DEPTNODNAMECOUNT(E.EMPNO)

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

10ACCOUNTING3

20RESEARCH5

30SALES6

40OPERATIONS0

1selecte.ename||'的老板是'||m.ename

2fromempe,empm

3*wheree.mgr=m.empno

自连接:利用表的别名,将同一张表视为多张表

例:查询员工信息:xxx的老板是yyy

SQL>selecte.ename||'的老板是'||b.ename

2fromempe,empb

3wheree.mgr=b.empno;

E.ENAME||'的老板是'||B.ENAME

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

SMITH的老板是FORD

ALLEN的老板是BLAKE

WARD的老板是BLAKE

JONES的老板是KING

MARTIN的老板是BLAKE

BLAKE的老板是KING

CLARK的老板是KING

SCOTT的老板是JONES

TURNER的老板是BLAKE

ADAMS的老板是SCOTT

JAMES的老板是BLAKE

FORD的老板是JONES

MILLER的老板是CLARK

已选择13行。

查询员信息与所在的部门名称:

方式一:

SQL>selecte.ename,e.sal,d.dname

2fromempe,deptd

3wheree.deptno=d.deptno

4;

ENAMESALDNAME

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

SMITH800RESEARCH

ALLEN1600SALES

WARD1250SALES

JONES2975RESEARCH

MARTIN1250SALES

BLAKE2850SALES

CLARK2450ACCOUNTING

SCOTT3000RESEARCH

KING5000ACCOUNTING

TURNER1500SALES

ADAMS1100RESEARCH

JAMES950SALES

FORD3000RESEARCH

MILLER1300ACCOUNTING

已选择14行。

方式二:内连接

只返回满足连接条件的数据(两边都有的才显示)。也可以省略inner关键字。

SQL>selecte.ename,e.sal,d.dname

2fromempe

3innerjoindeptd

4one.deptno=d.deptno;

ENAMESALDNAME

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

SMITH800RESEARCH

ALLEN1600SALES

WARD1250SALES

JONES2975RESEARCH

MARTIN1250SALES

BLAKE2850SALES

CLARK2450ACCOUNTING

SCOTT3000RESEARCH

KING5000ACCOUNTING

TURNER1500SALES

ADAMS1100RESEARCH

JAMES950SALES

FORD3000RESEARCH

MILLER1300ACCOUNTING

右外连接:右边边有值才显示。可以省略outer关键字

SQL>selecte.ename,e.sal,d.dname

2fromempe

3rightouterjoindeptd

4one.deptno=d.deptno;

ENAMESALDNAME

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

CLARK2450ACCOUNTING

KING5000ACCOUNTING

MILLER1300ACCOUNTING

JONES2975RESEARCH

FORD3000RESEARCH

ADAMS1100RESEARCH

SMITH800RESEARCH

SCOTT3000RESEARCH

WARD1250SALES

TURNER1500SALES

ALLEN1600SALES

JAMES950SALES

BLAKE2850SALES

MARTIN1250SALES

OPERATIONS

左外连接,左边有值的才显示,只需将上面sql的right改成left

已选择15行。

操作同一张表的情况:

SQL>selecte.ename,e.sal,m.ename,m.sal

2fromempe

3joinempm

4one.mgr=m.empno;

ENAMESALENAMESAL

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

SMITH800FORD3000

ALLEN1600BLAKE2850

WARD1250BLAKE2850

JONES2975KING5000

MARTIN1250BLAKE2850

BLAKE2850KING5000

CLARK2450KING5000

SCOTT3000JONES2975

TURNER1500BLAKE2850

ADAMS1100SCOTT3000

JAMES950BLAKE2850

FORD3000JONES2975

MILLER1300CLARK2450

已选择13行。

满外联接:任一边有值就会显示。outer可以省略

SQL>selecte.ename,e.sal,d.deptno,d.dname

2fromempe

3fullouterjoindeptd

4one.deptno=d.deptno;

ENAMESALDEPTNODNAME

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

SMITH80020RESEARCH

ALLEN160030SALES

WARD125030SALES

JONES297520RESEARCH

MARTIN125030SALES

BLAKE285030SALES

CLARK245010ACCOUNTING

SCOTT300020RESEARCH

KING500010ACCOUNTING

TURNER150030SALES

ADAMS110020RESEARCH

JAMES95030SALES

FORD300020RESEARCH

MILLER130010ACCOUNTING

40OPERATIONS

交叉连接:叉集,就是笛卡尔积

--没有连接条件,有许多的重复行

SQL>selecte.*,d.*

2fromempe

3crossjoindeptd;

EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNODEPTNODNAMELOC

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

7369SMITHCLERK790217-12月-808002010ACCOUNTINGNEWYOR

7499ALLENSALESMAN769820-2月-8116003003010ACCOUNTINGNEWYOR

7521WARDSALESMAN769822-2月-8112505003010ACCOUNTINGNEWYOR

7566JONESMANAGER783902-4月-8129752010ACCOUNTINGNEWYOR

7654MARTINSALESMAN769828-9月-81125014003010ACCOUNTINGNEWYOR

7698BLAKEMANAGER783901-5月-8128503010ACCOUNTINGNEWYOR

7782CLARKMANAGER783909-6月-8124501010ACCOUNTINGNEWYOR

7788SCOTTANALYST756619-4月-8730002010ACCOUNTINGNEWYOR

7839KINGPRESIDENT17-11月-8150001010ACCOUNTINGNEWYOR

7844TURNERSALESMAN769808-9月-81150003010ACCOUNTINGNEWYOR

7876ADAMSCLERK778823-5月-8711002010ACCOUNTINGNEWYOR

7900JAMESCLERK769803-12月-819503010ACCOUNTINGNEWYOR

7902FORDANALYST756603-12月-8130002010ACCOUNTINGNEWYOR

7934MILLERCLERK778223-1月-8213001010ACCOUNTINGNEWYOR

7369SMITHCLERK790217-12月-808002020RESEARCHDALLAS

7499ALLENSALESMAN769820-2月-8116003003020RESEARCHDALLAS

7521WARDSALESMAN769822-2月-8112505003020RESEARCHDALLAS

7566JONESMANAGER783902-4月-8129752020RESEARCHDALLAS

7654MARTINSALESMAN769828-9月-81125014003020RESEARCHDALLAS

7698BLAKEMANAGER783901-5月-8128503020RESEARCHDALLAS

7782CLARKMANAGER783909-6月-8124501020RESEARCHDALLAS

7788SCOTTANALYST756619-4月-8730002020RESEARCHDALLAS

7839KINGPRESIDENT17-11月-8150001020RESEARCHDALLAS

7844TURNERSALESMAN769808-9月-81150003020RESEARCHDALLAS

7876ADAMSCLERK778823-5月-8711002020RESEARCHDALLAS

7900JAMESCLERK769803-12月-819503020RESEARCHDALLAS

7902FORDANALYST756603-12月-8130002020RESEARCHDALLAS

7934MILLERCLERK778223-1月-8213001020RESEARCHDALLAS

7369SMITHCLERK790217-12月-808002030SALESCHICAGO

7499ALLENSALESMAN769820-2月-8116003003030SALESCHICAGO

7521WARDSALESMAN769822-2月-8112505003030SALESCHICAGO

7566JONESMANAGER783902-4月-8129752030SALESCHICAGO

7654MARTINSALESMAN769828-9月-81125014003030SALESCHICAGO

7698BLAKEMANAGER783901-5月-8128503030SALESCHICAGO

7782CLARKMANAGER783909-6月-8124501030SALESCHICAGO

7788SCOTTANALYST756619-4月-8730002030SALESCHICAGO

7839KINGPRESIDENT17-11月-8150001030SALESCHICAGO

7844TURNERSALESMAN769808-9月-81150003030SALESCHICAGO

7876ADAMSCLERK778823-5月-8711002030SALESCHICAGO

7900JAMESCLERK769803-12月-819503030SALESCHICAGO

7902FORDANALYST756603-12月-8130002030SALESCHICAGO

7934MILLERCLERK778223-1月-8213001030SALESCHICAGO

7369SMITHCLERK790217-12月-808002040OPERATIONSBOSTON

7499ALLENSALESMAN769820-2月-8116003003040OPERATIONSBOSTON

7521WARDSALESMAN769822-2月-8112505003040OPERATIONSBOSTON

7566JONESMANAGER783902-4月-8129752040OPERATIONSBOSTON

7654MARTINSALESMAN769828-9月-81125014003040OPERATIONSBOSTON

7698BLAKEMANAGER783901-5月-8128503040OPERATIONSBOSTON

7782CLARKMANAGER783909-6月-8124501040OPERATIONSBOSTON

7788SCOTTANALYST756619-4月-8730002040OPERATIONSBOSTON

7839KINGPRESIDENT17-11月-8150001040OPERATIONSBOSTON

7844TURNERSALESMAN769808-9月-81150003040OPERATIONSBOSTON

7876ADAMSCLERK778823-5月-8711002040OPERATIONSBOSTON

7900JAMESCLERK769803-12月-819503040OPERATIONSBOSTON

7902FORDANALYST756603-12月-8130002040OPERATIONSBOSTON

7934MILLERCLERK778223-1月-8213001040OPERATIONSBOSTON

已选择56行。

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

执行外部的sql脚本文件:

SQL>@c:/testdelete.sql

处理数据(DML,增删改)

DML,DataManipulationLanguage,数据操作语言

插入数据(Insertinto):

插入全部列

插入部分列

插入空值

使用&变量(创建脚本)

例:

SQL>insertintoemp(empno,ename,sal)values(&empno,&ename,&sal)

SQL>insertintoemp(empno,ename,sal)values(&empno,'&ename',&sal)

SQL>updateempsetename='&new_name'whereempno=&empno

SQL>selectempno,ename,&colfromemp;

可以在命令行sqlplus或是iSQL*Plus中演示。

从其它表中拷贝数据

insertintomytable

selectmycolumsfrom...

更新数据(Update)

删除数据(Delete)

删除所有的记录:

Delete

Truncate

事务:oracle中sql需要使用事务才会生产,例如delete....commit(提交事务)

事务是由完成若干项工作的DML语句组成的

保存点

设置事务隔离级别:

SQL99标准是有4个隔离级别,但Oracle只支持2个:

SETTRANSACTIONISOLATIONLEVELREADCOMMITTED;

SETTRANSACTIONISOLATIONLEVELSERIALIZABLE;

不显示命令执行的反馈信息

setfeedbackoff不显示

setfeedbackon显示

SQL>settimingon统计

SP2-0158:未知的SET选项"统计"

SQL>setfeedbackoff

SQL>showfeedback

feedbackOFF

SQL>setfeedbackon

SQL>showfeedback

用于1或更多行的FEEDBACKON

统计sql执行所使用时间

settimingon统计

settimingoff不统计

SQL>settimingon

SQL>showtiming

timingON

SQL>settimingoff

SQL>showtiming

timingOFF

SQL>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值