4.1 SQL语言概述

4.1.1 SQL语言的特点

1、集合性

2、统一性

3、易于移植性

4.1.2 SQL语言的分类

1、数据查询语言(DQL)- select语句,查询数据

2、数据操纵语言(DML)- insert、update和delete语句,改变数据

3、事务控制语言(TCL)- commit、rollback和savepoint语句,维护数据一致性

4、数据定义语言(DDL)- create、alter和drop语句,改变数据库对象

5、数据控制语言(DCL)- grant和revoke语句,权限授予和回收

4.1.3 SQL语言的编写规则

1、关键字不区分大小写

2、字符值区分大小写

3、以分号作为结束符

4、2 用户模式

4.2.1 模式与模式对象

模式是一个数据库对象的集合

模式为一个数据库用户所有,并且具有与该用户相同的名称。

模式对象是由用户创建的逻辑结构,用以存储或引用数据。比如段,约束,视图,同义词,过程,程序包等。

不属于某个用户所拥有的数据库对象就不能称之为模式对象,比如角色,表空间,目录等。

4.2.2 实例模式SCOTT

SQL> conn scott/tiger

Connected.

SQL> select table_name from user_tables;

TABLE_NAME

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

DEPT

EMP

BONUS

SALGRADE

SQL> select table_name from dba_tables where owner='SCOTT';

TABLE_NAME

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

DEPT

EMP

BONUS

SALGRADE

4.3 检索数据

语法格式:

select {[distinct|all]column|*}

[into table_name]

from {tables|views|other select}

[where conditions]

[group by columns]

[having conditions]

[order by columns]

4.3.1 简单查询

1、检索所有的(*)

SQL> select * from scott.dept;

DEPTNO DNAME          LOC

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

10 ACCOUNTING     NEW YORK

20 RESEARCH       DALLAS

30 SALES          CHICAGO

40 OPERATIONS     BOSTON

SQL> select * from scott.dept,scott.salgrade;

DEPTNO DNAME          LOC                GRADE      LOSAL      HISAL

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

10 ACCOUNTING     NEW YORK               1        700       1200

10 ACCOUNTING     NEW YORK               2       1201       1400

10 ACCOUNTING     NEW YORK               3       1401       2000

10 ACCOUNTING     NEW YORK               4       2001       3000

10 ACCOUNTING     NEW YORK               5       3001       9999

20 RESEARCH       DALLAS                 1        700       1200

20 RESEARCH       DALLAS                 2       1201       1400

20 RESEARCH       DALLAS                 3       1401       2000

20 RESEARCH       DALLAS                 4       2001       3000

20 RESEARCH       DALLAS                 5       3001       9999

30 SALES          CHICAGO                1        700       1200

DEPTNO DNAME          LOC                GRADE      LOSAL      HISAL

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

30 SALES          CHICAGO                2       1201       1400

30 SALES          CHICAGO                3       1401       2000

30 SALES          CHICAGO                4       2001       3000

30 SALES          CHICAGO                5       3001       9999

40 OPERATIONS     BOSTON                 1        700       1200

40 OPERATIONS     BOSTON                 2       1201       1400

40 OPERATIONS     BOSTON                 3       1401       2000

40 OPERATIONS     BOSTON                 4       2001       3000

40 OPERATIONS     BOSTON                 5       3001       9999

20 rows selected.

2、检索指定的列

SQL> select job,ename,empno from emp;

JOB       ENAME           EMPNO

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

CLERK     SMITH            7369

SALESMAN  ALLEN            7499

SALESMAN  WARD             7521

MANAGER   JONES            7566

SALESMAN  MARTIN           7654

MANAGER   BLAKE            7698

MANAGER   CLARK            7782

ANALYST   SCOTT            7788

PRESIDENT KING             7839

SALESMAN  TURNER           7844

CLERK     ADAMS            7876

JOB       ENAME           EMPNO

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

CLERK     JAMES            7900

ANALYST   FORD             7902

CLERK     MILLER           7934

14 rows selected.

SQL> select rowid,job,ename from emp;

ROWID              JOB       ENAME

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

AAAR3xAAEAAAACXAAA CLERK     SMITH

AAAR3xAAEAAAACXAAB SALESMAN  ALLEN

AAAR3xAAEAAAACXAAC SALESMAN  WARD

AAAR3xAAEAAAACXAAD MANAGER   JONES

AAAR3xAAEAAAACXAAE SALESMAN  MARTIN

AAAR3xAAEAAAACXAAF MANAGER   BLAKE

AAAR3xAAEAAAACXAAG MANAGER   CLARK

AAAR3xAAEAAAACXAAH ANALYST   SCOTT

AAAR3xAAEAAAACXAAI PRESIDENT KING

AAAR3xAAEAAAACXAAJ SALESMAN  TURNER

AAAR3xAAEAAAACXAAK CLERK     ADAMS

ROWID              JOB       ENAME

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

AAAR3xAAEAAAACXAAL CLERK     JAMES

AAAR3xAAEAAAACXAAM ANALYST   FORD

AAAR3xAAEAAAACXAAN CLERK     MILLER

14 rows selected.

3、带有表达式的select子句

SQL> select sal*(1+0.1),sal from emp;

SAL*(1+0.1)        SAL

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

880        800

1760       1600

1375       1250

3272.5       2975

1375       1250

3135       2850

2695       2450

3300       3000

5500       5000

1650       1500

1210       1100

SAL*(1+0.1)        SAL

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

1045        950

3300       3000

1430       1300

14 rows selected.

4、为列指定别名

可以使用as关键字,也可以直接指定

SQL> select empno as "员工编号" from emp;

员工编号

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

7369

7499

7521

7566

7654

7698

7782

7788

7839

7844

7876

员工编号

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

7900

7902

7934

14 rows selected.

SQL> select empno "员工编号" from emp;

员工编号

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

7369

7499

7521

7566

7654

7698

7782

7788

7839

7844

7876

员工编号

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

7900

7902

7934

14 rows selected.

5、显示不重复记录

使用distinct关键字去除重复记录

SQL> select distinct job from emp;

JOB

---------

CLERK

SALESMAN

PRESIDENT

MANAGER

ANALYST

4.3.2 筛选查询

语法格式:

select columns_list

from table_name

where conditional_expression

1、比较筛选

基本比较筛选有以下6种情况:A=B

A!B或A<>B

A>B

A>=B

A

A<=B

SQL> select empno,ename,sal from emp where sal>1500;

EMPNO ENAME             SAL

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

7499 ALLEN            1600

7566 JONES            2975

7698 BLAKE            2850

7782 CLARK            2450

7788 SCOTT            3000

7839 KING             5000

7902 FORD             3000

7 rows selected.

特殊比较筛选有以下两种情况:

A{operator}ANY(B):A与B中任何一个元素进行operator运算符的比较,只要有一个比较值为true,就返回数据行

A{operator}ALL(B):A与B中所有元素进行operator运算符的比较,只有所有元素比较值为true,才返回数据行

SQL> select empno,ename,sal from emp where sal<>all(3000,950,800);

EMPNO ENAME             SAL

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

7499 ALLEN            1600

7521 WARD             1250

7566 JONES            2975

7654 MARTIN           1250

7698 BLAKE            2850

7782 CLARK            2450

7839 KING             5000

7844 TURNER           1500

7876 ADAMS            1100

7934 MILLER           1300

10 rows selected.

2、使用特殊关键字筛选

(1)like关键字:字符串匹配

常用通配符:

_:代表任意一个字符

%:代表任意数量字符

SQL> select empno,ename,job from emp where ename like 'S%';

EMPNO ENAME      JOB

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

7369 SMITH      CLERK

7788 SCOTT      ANALYST

SQL> select empno,ename,job from emp where ename not like 'S%';

EMPNO ENAME      JOB

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

7499 ALLEN      SALESMAN

7521 WARD       SALESMAN

7566 JONES      MANAGER

7654 MARTIN     SALESMAN

7698 BLAKE      MANAGER

7782 CLARK      MANAGER

7839 KING       PRESIDENT

7844 TURNER     SALESMAN

7876 ADAMS      CLERK

7900 JAMES      CLERK

7902 FORD       ANALYST

EMPNO ENAME      JOB

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

7934 MILLER     CLERK

12 rows selected.

(2)in关键字:测试一个数据值是否匹配一组目标值中的一个

SQL> select empno,ename,job from emp where job in('PRESIDENT','MANAGER','ANALYST');

EMPNO ENAME      JOB

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

7566 JONES      MANAGER

7698 BLAKE      MANAGER

7782 CLARK      MANAGER

7788 SCOTT      ANALYST

7839 KING       PRESIDENT

7902 FORD       ANALYST

6 rows selected.

SQL> select empno,ename,job from emp where job not in('PRESIDENT','MANAGER','ANALYST');

EMPNO ENAME      JOB

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

7369 SMITH      CLERK

7499 ALLEN      SALESMAN

7521 WARD       SALESMAN

7654 MARTIN     SALESMAN

7844 TURNER     SALESMAN

7876 ADAMS      CLERK

7900 JAMES      CLERK

7934 MILLER     CLERK

8 rows selected.

(3)between关键字:返回某一个数据值是否位于两个给的的值之间

SQL> select empno,ename,sal from emp where sal between 2000 and 3000;

EMPNO ENAME             SAL

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

7566 JONES            2975

7698 BLAKE            2850

7782 CLARK            2450

7788 SCOTT            3000

7902 FORD             3000

SQL> select empno,ename sal from emp where sal not between 2000 and 3000;

EMPNO SAL

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

7369 SMITH

7499 ALLEN

7521 WARD

7654 MARTIN

7839 KING

7844 TURNER

7876 ADAMS

7900 JAMES

7934 MILLER

9 rows selected.

(4)is null 关键字:检测是否为空

SQL> select empno,ename,comm from emp where comm is null;

EMPNO ENAME            COMM

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

7369 SMITH

7566 JONES

7698 BLAKE

7782 CLARK

7788 SCOTT

7839 KING

7876 ADAMS

7900 JAMES

7902 FORD

7934 MILLER

10 rows selected.

3、逻辑筛选:AND,OR,NOT

SQL> select empno,ename,sal from emp where sal>=2000 and sal<=3000;

EMPNO ENAME             SAL

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

7566 JONES            2975

7698 BLAKE            2850

7782 CLARK            2450

7788 SCOTT            3000

7902 FORD             3000

SQL> select empno,ename,sal from emp where sal<2000 or sal>3000;

EMPNO ENAME             SAL

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

7369 SMITH             800

7499 ALLEN            1600

7521 WARD             1250

7654 MARTIN           1250

7839 KING             5000

7844 TURNER           1500

7876 ADAMS            1100

7900 JAMES             950

7934 MILLER           1300

9 rows selected.

4.3.3 分组查询

语法格式:

select columns_list

from table_name

[where conditional_expression]

group by columns_list

SQL> select deptno,job from emp group by deptno,job order by deptno;

DEPTNO JOB

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

10 CLERK

10 MANAGER

10 PRESIDENT

20 ANALYST

20 CLERK

20 MANAGER

30 CLERK

30 MANAGER

30 SALESMAN

9 rows selected.

SQL> select deptno as 部门编号,avg(sal) as 平均工资 from emp group by deptno;

部门编号 平均工资

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

30   1566.66667

20         2175

10   2916.66667

group by列表需要包括非聚集表达式内的所有列或者与选择列表表达式完全匹配

SQL> select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;

DEPTNO   AVG(SAL)

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

30 1566.66667

4.3.4 排序查询

语法格式:

select columns_list

from table_name

[where conditional_expression]

[group by columns_list]

order by {order_by_expression[asc|desc]}[,...n]

SQL> select deptno,empno,ename from emp order by deptno,empno;

DEPTNO      EMPNO ENAME

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

10       7782 CLARK

10       7839 KING

10       7934 MILLER

20       7369 SMITH

20       7566 JONES

20       7788 SCOTT

20       7876 ADAMS

20       7902 FORD

30       7499 ALLEN

30       7521 WARD

30       7654 MARTIN

DEPTNO      EMPNO ENAME

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

30       7698 BLAKE

30       7844 TURNER

30       7900 JAMES

14 rows selected.

4.3.5 多表关联查询

1、表别名

SQL> select e.empno as  员工编号,e.ename as 员工名称,d.dname as 部门

2  from emp e,dept d

3  where e.deptno=d.deptno

4  and e.job='MANAGER';

员工编号 员工名 部门

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

7782 CLARK      ACCOUNTING

7566 JONES      RESEARCH

7698 BLAKE      SALES

2、内连接

语法格式:

select columns_list

from table_name1 [inner] join table_name2

on join_condition;

SQL> select e.empno,e.ename,d.dname

2  from emp e inner join dept d

3  on e.deptno=d.deptno;

EMPNO ENAME      DNAME

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

7782 CLARK      ACCOUNTING

7839 KING       ACCOUNTING

7934 MILLER     ACCOUNTING

7566 JONES      RESEARCH

7902 FORD       RESEARCH

7876 ADAMS      RESEARCH

7369 SMITH      RESEARCH

7788 SCOTT      RESEARCH

7521 WARD       SALES

7844 TURNER     SALES

7499 ALLEN      SALES

EMPNO ENAME      DNAME

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

7900 JAMES      SALES

7698 BLAKE      SALES

7654 MARTIN     SALES

14 rows selected.

3、外连接

分类:

左外连接:关键字为left outer join或left join,会包含左表中不满足连接条件的数据行

右外连接:关键字为right outer join或right join,会包含右表中不满足连接条件的数据行

完全外连接:关键字为full outer join或full join

SQL> insert into emp(empno,ename,job) values(9527,'EAST','SALESMAN');

1 row created.

SQL> select e.empno,e.ename,e.job,d.deptno,d.dname

2  from emp e left join dept d

3  on e.deptno=d.deptno

4  ;

EMPNO ENAME      JOB           DEPTNO DNAME

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

7934 MILLER     CLERK             10 ACCOUNTING

7839 KING       PRESIDENT         10 ACCOUNTING

7782 CLARK      MANAGER           10 ACCOUNTING

7902 FORD       ANALYST           20 RESEARCH

7876 ADAMS      CLERK             20 RESEARCH

7788 SCOTT      ANALYST           20 RESEARCH

7566 JONES      MANAGER           20 RESEARCH

7369 SMITH      CLERK             20 RESEARCH

7900 JAMES      CLERK             30 SALES

7844 TURNER     SALESMAN          30 SALES

7698 BLAKE      MANAGER           30 SALES

EMPNO ENAME      JOB           DEPTNO DNAME

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

7654 MARTIN     SALESMAN          30 SALES

7521 WARD       SALESMAN          30 SALES

7499 ALLEN      SALESMAN          30 SALES

9527 EAST       SALESMAN

15 rows selected.

SQL> select e.empno,e.ename,e.job,d.deptno,d.dname

2  from emp e right join dept d

3  on e.deptno=d.deptno;

EMPNO ENAME      JOB           DEPTNO DNAME

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

7782 CLARK      MANAGER           10 ACCOUNTING

7934 MILLER     CLERK             10 ACCOUNTING

7839 KING       PRESIDENT         10 ACCOUNTING

7566 JONES      MANAGER           20 RESEARCH

7369 SMITH      CLERK             20 RESEARCH

7788 SCOTT      ANALYST           20 RESEARCH

7902 FORD       ANALYST           20 RESEARCH

7876 ADAMS      CLERK             20 RESEARCH

7521 WARD       SALESMAN          30 SALES

7844 TURNER     SALESMAN          30 SALES

7499 ALLEN      SALESMAN          30 SALES

EMPNO ENAME      JOB           DEPTNO DNAME

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

7900 JAMES      CLERK             30 SALES

7654 MARTIN     SALESMAN          30 SALES

7698 BLAKE      MANAGER           30 SALES

40 OPERATIONS

15 rows selected.

SQL> select e.empno,e.ename,e.job,d.deptno,d.dname

2  from emp e full join dept d

3  on e.deptno=d.deptno;

EMPNO ENAME      JOB           DEPTNO DNAME

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

7369 SMITH      CLERK             20 RESEARCH

7499 ALLEN      SALESMAN          30 SALES

7521 WARD       SALESMAN          30 SALES

7566 JONES      MANAGER           20 RESEARCH

7654 MARTIN     SALESMAN          30 SALES

7698 BLAKE      MANAGER           30 SALES

7782 CLARK      MANAGER           10 ACCOUNTING

7788 SCOTT      ANALYST           20 RESEARCH

7839 KING       PRESIDENT         10 ACCOUNTING

7844 TURNER     SALESMAN          30 SALES

7876 ADAMS      CLERK             20 RESEARCH

EMPNO ENAME      JOB           DEPTNO DNAME

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

7900 JAMES      CLERK             30 SALES

7902 FORD       ANALYST           20 RESEARCH

7934 MILLER     CLERK             10 ACCOUNTING

9527 EAST       SALESMAN

40 OPERATIONS

16 rows selected.

4、自然连接

使用natural join关键字,很少使用,不能为列指定限定词(即表名或者表的别名)

SQL> select empno,ename,job,dname

2  from emp natural join dept

3  where sal > 2000;

EMPNO ENAME      JOB       DNAME

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

7782 CLARK      MANAGER   ACCOUNTING

7839 KING       PRESIDENT ACCOUNTING

7902 FORD       ANALYST   RESEARCH

7788 SCOTT      ANALYST   RESEARCH

7566 JONES      MANAGER   RESEARCH

7698 BLAKE      MANAGER   SALES

6 rows selected.

5、自连接

SQL> select em2.ename manager,em1.ename employee

2  from emp em1 left join emp em2

3  on em1.mgr=em2.empno

4  order by em1.mgr;

MANAGER    EMPLOYEE

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

JONES      FORD

JONES      SCOTT

BLAKE      JAMES

BLAKE      TURNER

BLAKE      MARTIN

BLAKE      WARD

BLAKE      ALLEN

CLARK      MILLER

SCOTT      ADAMS

KING       CLARK

KING       BLAKE

MANAGER    EMPLOYEE

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

KING       JONES

FORD       SMITH

EAST

KING

15 rows selected.

6、交叉连接

不需要任何连接条件的连接,关键字cross join,执行结果是一个笛卡尔积。

语法格式:

select columns_list

from table_name1 cross join table_name2

SQL> select count(*)

2  from dept cross join emp;

COUNT(*)

----------

60

4.4 Oracle常用系统函数

4.4.1 字符类函数

1、ascii(c)函数和chr(i)函数

字符与ascii码的转换

SQL> select ascii('Z')Z,ascii('H')H,ascii('D')D,ascii(' ')space from dual;

Z          H          D      SPACE

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

90         72         68         32

SQL> select chr(90),chr(72),chr(68),chr(32)S from dual;

C C C S

- - - -

Z H D

2、concat(s1,s2)函数

将字符串s2连接到字符串s1后面

SQL> select concat('hello ','world') information from dual;

INFORMATION

-----------

hello world

3、initcap(s)函数

将字符数s的每个单词的第一个字母大写,其他字母小写。

SQL> select initcap('oh my god!') information from dual;

INFORMATIO

----------

Oh My God!

4、instr(s1,s2[,i][,j])函数

返回字符s2在字符串s1中第j次出现时的位置,搜索从字符串s1的第i个字符开始,当没有发现要查找的字符时,返回0。其中s1和s2均为字符串,i和j均为整数,默认为1。

SQL> select instr('oracle 11g','1',3,2) abc from dual;

ABC

----------

9

5、length(s)函数

返回字符串s的长度

SQL> select e.empno,e.ename,d.dname

2  from emp e inner join dept d

3  on e.deptno=d.deptno

4  where length(e.ename)>5;

EMPNO ENAME      DNAME

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

7654 MARTIN     SALES

7844 TURNER     SALES

7934 MILLER     ACCOUNTING

6、lower(s)函数和upper(s)函数

分别返回字符串s的小写形式和大写形式,这两个函数经常出现在where子句中。

SQL> select empno,ename,job from emp where lower(job) like 's%';

EMPNO ENAME      JOB

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

7499 ALLEN      SALESMAN

7521 WARD       SALESMAN

7654 MARTIN     SALESMAN

7844 TURNER     SALESMAN

9527 EAST       SALESMAN

7、ltrim(s1,s2)函数,rtrim(s1,s2)函数和trim(s1,s2)函数

分别用来删除字符串s1左边的字符串s2,删除字符串s1右边的字符串s2,删除字符串s1左右两端字符串s2,如果不指定字符串s2,则删除相应方位的空格。

SQL> select ltrim('###east###','#') ltrim from dual;

LTRIM

-------

east###

SQL> select rtrim('###east###','#') rtrim from dual;

RTRIM

-------

###east

SQL> select trim('#' from '###east###') from dual;

TRIM

----

east

8、replace(s1,s2[,s3])函数

使用s3字符串替换出现在s1字符串中的所有s2字符串,并返回替换后的新字符串,其中,s3字符串默认为空字符串。

SQL> select replace('bad luck bad girl','bad','good') from dual;

REPLACE('BADLUCKBAD

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

good luck good girl

9、substr(s,i,[j])函数

从字符串s的第i个位置开始截取长度为j的子字符串。如果省略参数j,则直接截取到尾部。

SQL> select substr('messagebox',8,3) from dual;

SUB

---

box

4.4.2 数字类函数

1、ceil(n)函数

大于或等于数值n的最小整数,天花板函数

SQL> select ceil(7.3),ceil(7),ceil(-7.3) from dual;

CEIL(7.3)    CEIL(7) CEIL(-7.3)

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

8          7         -7

2、round(n1,n2)函数

返回舍入小数点右边n2位的n1的值,n2默认为0

SQL> select round(3.1415926,2) from dual;

ROUND(3.1415926,2)

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

3.14

3、power(n1,n2)函数

返回n1的n2次方

SQL> select power(2,3) from dual;

POWER(2,3)

----------

8

4.4.3 日期和时间类函数

1、sysdate()函数

返回系统当前的日期

SQL> select sysdate from dual;

SYSDATE

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

01-DEC-13

2、add_months(d,i)函数

返回日期d加上i个月之后的结果

SQL> select add_months(sysdate,6) from dual;

ADD_MONTHS(S

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

01-JUN-14

4.4.4 转换类函数

1、to_char(x[,format])函数

将表达式转换成字符串,format表示字符串格式

SQL> select sysdate,to_char(sysdate,'YYYY-MM-DD') from dual;

SYSDATE      TO_CHAR(SY

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

01-DEC-13    2013-12-01

2、to_number(s[,format[lan]])函数

返回字符串s代表的数字

SQL> select to_number('18','xxx') from dual;

TO_NUMBER('18','XXX')

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

24

4.4.5 集合类函数

SQL> select count(empno) as sum,round(avg(sal),2) as avg from emp;

SUM        AVG

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

14    2073.21

4.5 子查询的用法

4.5.1 子查询

SQL> select empno,ename,job from emp

2  where deptno=(select deptno from dept where dname='RESEARCH');

EMPNO ENAME      JOB

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

7369 SMITH      CLERK

7566 JONES      MANAGER

7788 SCOTT      ANALYST

7876 ADAMS      CLERK

7902 FORD       ANALYST

SQL> select empno,ename,job

2  from emp join dept

3  on emp.deptno=dept.deptno

4  where dept.dname='RESEARCH';

EMPNO ENAME      JOB

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

7566 JONES      MANAGER

7902 FORD       ANALYST

7876 ADAMS      CLERK

7369 SMITH      CLERK

7788 SCOTT      ANALYST

子查询相对对表关联查询要慢一些。

使用子查询时,应注意一下规则:

子查询必须用括号()括起来

子查询中不能包括order by子句

子查询允许嵌套多层,但不能超过255层

子查询分为单行子查询,多行子查询和关联子查询

4.5.2 单行子查询

返回一行数据的子查询语句。当在where子句中引用单行子查询时,可以使用单行比较运算符(=,>,=和<>)。

SQL> select empno,ename,sal from emp

2  where sal>(select min(sal) from emp) and sal

EMPNO ENAME             SAL

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

7499 ALLEN            1600

7521 WARD             1250

7566 JONES            2975

7654 MARTIN           1250

7698 BLAKE            2850

7782 CLARK            2450

7788 SCOTT            3000

7844 TURNER           1500

7876 ADAMS            1100

7900 JAMES             950

7902 FORD             3000

EMPNO ENAME             SAL

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

7934 MILLER           1300

12 rows selected.

4.5.3 多行子查询

返回多行数据的子查询语句。当在where子句中使用多行子查询时,必须使用多行运算符(in,any,all)

1、使用in运算符

使用in运算符时,外查询会尝试与子查询结果中的任何一个结果进行匹配,只要有一个匹配成功,则外查询返回当前检索的记录。

SQL> select empno,ename,job from emp

2  where deptno in (select deptno from dept where dname<>'SALES');

EMPNO ENAME      JOB

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

7782 CLARK      MANAGER

7839 KING       PRESIDENT

7934 MILLER     CLERK

7566 JONES      MANAGER

7902 FORD       ANALYST

7876 ADAMS      CLERK

7369 SMITH      CLERK

7788 SCOTT      ANALYST

8 rows selected.

2、使用any运算符

any运算符必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可。

SQL> select empno,ename,sal from emp

2  where sal > any(select sal from emp where deptno=10) and deptno<>10;

EMPNO ENAME             SAL

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

7788 SCOTT            3000

7902 FORD             3000

7566 JONES            2975

7698 BLAKE            2850

7499 ALLEN            1600

7844 TURNER           1500

6 rows selected.

3、使用all运算符

all运算符必须与单行运算符结合使用,并且返回行必须匹配所有子查询结果。

SQL> select deptno,ename,sal from emp

2  where sal > all(select sal from emp where deptno=30);

DEPTNO ENAME             SAL

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

20 JONES            2975

20 SCOTT            3000

20 FORD             3000

10 KING             5000

4.5.4 关联子查询

内查询和外查询相互关联

SQL> select empno,ename,sal

2  from emp f

3  where sal>(select avg(sal) from emp where job=f.job)

4  order by job;

EMPNO ENAME             SAL

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

7876 ADAMS            1100

7934 MILLER           1300

7566 JONES            2975

7698 BLAKE            2850

7499 ALLEN            1600

7844 TURNER           1500

6 rows selected.

4.6 操作数据库

4.6.1 插入数据(insert语句)

1、单条插入数据

语法格式:

insert into table_name(column_name1[,column_name2]...)]

value(express1[,express2]...)

SQL> insert into dept(deptno,dname,loc)

2  values(88,'design','beijing');

1 row created.

SQL> insert into jobs

2  values('PRO','程序员',5000,10000);

1 row created.

2、批量插入数据

语法格式:

insert into table_name [(column_name1[,column_name2]...)] select subquery

SQL> create table jobs_temp(

2  job_id varchar2(10) primary key,

3  job_title varchar2(35) not null,

4  min_salary number(6),

5  max_salary number(6));

Table created.

SQL> desc jobs_temp;

Name                                      Null?    Type

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

JOB_ID                                    NOT NULL VARCHAR2(10)

JOB_TITLE                                 NOT NULL VARCHAR2(35)

MIN_SALARY                                         NUMBER(6)

MAX_SALARY                                         NUMBER(6)

SQL> insert into jobs_temp

2  select * from jobs

3  where jobs.max_salary>10000;

9 rows created.

4.6.2 更新数据(update语句)

语法格式:

update table_name

set {column_name1=express1[,column_name2=express2...]

|(column_name1[,column_name2...])=(selectsubquery)}

[where condition]

SQL> update emp

2  set sal=sal*1.2

3  where job='SALESMAN';

4 rows updated.

SQL> update emp

2  set sal=(select avg(sal) from emp where job='MANAGER')

3  where sal<2000;

8 rows updated.

4.6.3 删除数据(delete语句和truncate语句)

1、delete语句

删除数据库中的所有记录和指定范围的记录

语法格式:

delete from table_name

[where condition]

SQL> delete from jobs

2  where job_id='PRO';

1 row deleted.

2、truncate语句

删除表中的所有记录,比delete快,不产生回滚记录,无法使用rollback语句撤销。

SQL> truncate table jobs_temp;

Table truncated.

oracle中值集限定词为灰色,《Oracle从入门到精通》读书笔记第四章 SQL语言基础之一...相关推荐

  1. 《Oracle从入门到精通》读书笔记第四章 SQL语言基础之二

    4.7 事务处理 4.7.1 事务概述 事务的4种属性:acid (1)原子性(atomic):事务是一个整体的工作单元,要么全部执行,要么全部取消. (2)一致性(consistency):所有的数 ...

  2. MT4/MQL4入门到精通EA教程第四课-MQL语言常用函数(四)-K线取值常用函数

    MQL中有一组"函数",他们长得跟其他函数不一样,是不一样的函数,就是下面这几个功能强大的"函数" Open[].Close[].High[].Low[].Ti ...

  3. servlet 从oracle中结果集,用servlet对oracle进行增删改查

    小支 2016-03-31 19:46 已采纳 加载驱动2创建连接 public static Connection getConn() throws SQLException, ClassNotFo ...

  4. oracle 9i从入门到精通读书笔记2

    第二章:PL/SQL基础  2.1 PL/SQL程序结构 2.1.1 PL/SQL块的类型 所有的PL/SQL程序都是以块作为基本单位,以及都是由块组成的. 这些块可以是按顺序出现的,也可以是嵌套的 ...

  5. 三.数据库基础-Oracle入门到精通学习笔记

    第一章 Oracle 11g概述 1.1 Oracle翻译为"甲骨文",由Oracle公司推出. 1.2 关系型数据库 1.2.1 数据库管理技术发展经历了 人工管理.文件系统.数 ...

  6. 资源放送丨《Oracle中为什么没有Double Write?Oracle支持原子写吗?》PPT视频

    点击上方"蓝字" 关注我们,享更多干货! 前段时间,墨天轮邀请数据库资深专家 李真旭(Roger) 老师分享了<Oracle中为什么没有Double Write?Oracle ...

  7. oracle中exist什么意思,oracle中not exists 是什么意思 , oracle数据库中exists的作用

    导航:网站首页 > oracle中not exists 是什么意思 , oracle数据库中exists的作用 oracle中not exists 是什么意思 , oracle数据库中exist ...

  8. Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据

    Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...

  9. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

    Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...

最新文章

  1. java的知识点17——java.util.Arrays类、多维数组
  2. SpringMVC组件说明以及配置代码
  3. 8_18 比赛总结 [暑假集训]
  4. class checklist
  5. matlab 怎么使用function,Matlab怎么调用函数 自定义函数使用方法
  6. 【Luogu2393】yyy loves Maths II(浮点输入输出)
  7. java 子类 同名参数_Java -- 父类和子类拥有同名变量
  8. python-整理--连接MSSQL
  9. 归并排序算法(二路)——C/C++
  10. 微信小程序怎么字体鼠标放上去变颜色?_【干货】CDR快捷键常识小技巧大全,记得收藏!...
  11. 最新版CAD都有些啥功能(下)
  12. 10电脑睡眠后自动关机怎么回事 win_win10睡眠变自动关机怎么办
  13. jenkins 下载插件失败处理办法
  14. 温暖守护客户财富与健康,平安人寿推出“盛世金越尊享”终身寿险
  15. 麦穗理论,又名“秘书问题”(1/e处为最优分割点)
  16. C语言 | 栈区空间初探
  17. 003问题:约瑟夫问题(筛法解决)
  18. SpringBoot学习-支持JPA
  19. 用友文件服务器恢复,用友U8账套数据恢复及备份.doc
  20. 你的计算机无法访问网络设置,局域网无法访问其他计算机怎么办

热门文章

  1. object detection之Win10配置
  2. 21.Merge Two Sorted Lists 、23. Merge k Sorted Lists
  3. (4.12)全面解析-SQL事务+隔离级别+阻塞+死锁
  4. VMware仅主机模式访问外网
  5. BCGControlBar入门使用手册
  6. HTTP知识普及系列:HTTP首部
  7. IAR7.51提示秘钥无效IAR 以及 CCDebug驱动(包含win7 64bit)
  8. 关于浏览器前进键和后退键样样式表冲突的问题
  9. Oracle推出支援.NET 3.5与Visual Studio 2008的开发工具
  10. 想成领袖?先瞄准老板身边的位置