SQLPLUS 教程(二)

12数据操纵语言

数据操纵语言(DMLData Manipulation Language)给用户或应用程序提供访问数据库系统的接口。

121数据库的基本查询

SQL语言中最主要、最核心的部分是它的查询功能。所谓查询就是从数据库中提取满足用户需要的数据,查询是由SELECT命令实现的。在SQL语言中,许多操作都涉及到SELECT命令。例如,半SELECT命令查询到的数据插入到另外一张基表中;使用SELECT命令用满足条件的数据创建一个视图等等。因此SELECT命令也是SQL语言中最灵活、最复杂的命令。我们将从简单的SELECT命令开始,逐步深入讨论。

通常,一个SELECT命令可以分解成三个部分:查找什么数据,从哪里查找,查找条件是什么。因此,SELECT命令可以分成以下几个子句:SELECT子句和FROM子句(这两个子句是每条SELECT命令必须有的),WHERE子句(是可选的),另外带可以选择GROUP BY 子句、HAVING子句和ORDER BY子句等。它的基本语法是

SELECT <查询内容>

FORM<表名>

WHERE <条件>

GROUP BY<分组内容>

HAVING <组内条件>

ORDER BY<排序内容>

 

1SELECT子句

SELECT子句的<查询内容>指出要查找的数据,FROM子句的<表名>指出查找过程中涉及到的基表,这两个子句必不可少。

1、查找整个基表的内容。

SQL>SELECT * FROM EMP

EMPNO

ENAME

JOB

MGR

HIREDATE

SAL

COMM

DEPTNO

7369

SMITH

CLERK

7902

17-Dec-94

800

 

20

7499

ALLEN

SALESMAN

7698

20-Feb-95

1600

300

30

7521

WARD

SALESMAN

7698

22-Feb-95

1250

500

30

7566

JONES

MANAGER

7839

02-Apr-95

2975

 

20

7654

MARTIN

SALESMAN

7698

28-Sep-95

1250

1400

30

7698

BLAKE

MANAGER

7839

01-May-95

2850

 

30

7782

CLARK

MANAGER

7839

09-Jun-95

2450

 

10

7788

SCOTT

ANALYST

766

09-Nov-95

3000

 

20

7839

KING

PRESIDENT

 

17-Nov-95

5000

 

10

7844

TURNER

SALESMAN

7698

08-Sep-95

1500

0

30

7876

ADAMS

CLERK 7788

 

23-Sep-95

1100

 

20

7900

JAMES

CLERK 7698

 

03-Dec-95

950

 

30

7902

FORD

ANALYST

7566

03-Dec-94

3000

 

20

7934

MILLER

CLERK

7782

23-Jan-94

1300

 

10

14 rows selected.

 

 

 

 

 

 

*”号意味着查找表中所有列。

SELECT子句中选择一个列名,则将得到这一列的所有数据。

2、查看雇员名字。

SQL>SELECT ENAME FROM EMP

ENAME

SMITH

ALLEN

WARD

JONES

MARTIN

BLAKE

CLARK

SCOTT

KING

TURNER

ADAMS

JAMES

FORD

MILLER

14rows selected.

若查找多列数据,则用逗号将各个列名分隔开。

3、查看雇员编号、名字和工种。

SQL>SELECT EMPNOENAMEJOB

     FROM EMP

EMPNO

ENAME

JOB

 

7369

SMITH

CLERK

7499

ALLEN

SALESMAN

7521

WARD

SALESMAN

7566

JONES

MANAGER

7654

MARTIN

SALESMAN

7698

BLAKE

MANAGER

7782

CLARK

MANAGER

7788

SCOTT

ANALYST

7839

KING

PRESIDENT

7844

TURNER

SALESMAN

7876

ADAMS

CLERK 7788

7900

JAMES

CLERK 7698

7902

FORD

ANALYST

7934

MILLER

CLERK

14 rows selected.

 

系统在显示查询结果时,各列的显示顺序由它们在SELECT 子句中出现的顺序决定。如例3中希望显示顺序是JOBENAMEEMPNO,则可以输入

SQL>SELECT JOBENAME EMPNO

     FROM EMP

JOB

ENAME

EMPNO

CLERK

SMITH

7369

SALESMAN

ALLEN

7499

SALESMAN

WARD

7521

………………

14 rows selected.

 

在显示查询结果时,各列的标题就是基表中的列名,如果希望显示的列标题不同于列名,可在SELECT子句中定义列名的别名,方法是在列名后加一个空格,然后写上它的别名。

4SQL>SELECT ENAME EMPLOYEE

     FROM EMP

EMPLOYEE

SMITH

ALLEN

WARD

…………

14 rows selected.

如果SELECT子句中有表达式,则这个表达式就是显示信息时的标题,当然,也可以为表达式定义一个别名,便于明确表达式的意义。

5、计算奖金占工资的比率。

SQL>SELECT ENAMESALCOMMCOMM/SALC/S RATIO

     FROM EMP

ENAME

SAL

COMM

C/S RATIO

MARTIN

1250

1400

1.12

WARD

1250

500

0.4

ALLEN

1600

300

0.1875

……

……

……

 

14 rows selected.

 

 

当别名中有诸如空格或斜线(/)这样的字符时,必须用双引号括起来。注意:别名只能用在SELECT子句中,其他子句不能使用,并且别名仅在使用它的SELECT命令中有效,而不影响其他查询语句的结果。

 

2WHERE子句

前面讨论的都是无条件查询,即选中基表中的所有行,我们还可以通过SELECT命令中的WHERE子句来选择指定的行。

6、查找在10号部门工作的雇员。

SQL>SELECT ENAME

     FROM EMP

     WHERE DEPTNO=10

ENAME

 

CLARK

 

KING

 

IMILLER

 

3 rows selected.

其中“DEPTNO=10”就是查询条件。系统在执行这种条件查询时,逐行地对表中的数据进行比较,检查它们是否满足条件,如果满足条件,则取出该行的有关信息,如不满足,则不取该行的信息。使用WHERE子句时,应注意列值的表示方法,若该列为字符型,需使用单引号(‘’)将字符串括起来,如:WHERE ENAME=SMITH’,而且应注意单引号内的字符串要区分大小写形式。若该列为数字型,则不必使用引号,如WHERE DEPTNO=20。此外列值还可以取其他列(或其他基表的列)的值,如:WHERE EMP.DEPTNO=DEPT.DEPTNO,这里列值取另一个基表中的列,这实际上是一种连接形式。关于联接将在1.6.1小节中具体论述。

HWERE子句的条件中可以使用下列比较运算符:

运算符

 

含义

 

 

 

 

=

 

相等

 

 

 

 

=< >

 

不等于

 

 

 

 

 

大于

 

 

 

 

>=

 

大于等于

 

 

 

 

 

小于

 

 

 

 

<=

 

小于等于

 

 

 

 

IN(列表)

 

等于列表中的任意值

 

 

 

BETWEEN 1 AND 2

大于等于值1并且小于等于值2(即在值1和值2之间)

 

LIKE%_

 

模式匹配。“%”匹配0个或任意多个字符。“_”匹配一个字符

IS NULL

 

空值

 

 

 

 

IS NOT NULL

 

非空值

 

 

 

 

1IN

在查找中,经常会遇到要求表的列是某几个值中的一个。

7、要求查找有哪些职员和分析员。这里就要在EMP表中检查JOB列是否为‘CLERK’或‘ANALYST’,即JOB列的值为‘CLERK’和‘ANALYST’中的一个即可。对于这样的查询,一般可以用或(OR)操作来完成:

SQL>SELECT ENAMEJOB

     FROM EMP

     WHERE JOB=CLERK OR JOB=ANALYST’;

如果JOB列还可以取多个值,则还需要多个OR操作,如果使用IN,就可以用一个简单的WHERE子句表示这种要求:

SQL>SELECT ENAMEJOB

     FROM EMP

     WHERE JOB IN (‘CLERK’,‘ANALYST’);

ENAME

JOB

SMITH

CLERK

SCOTT

ANALYST

ADAMS

CLERK

JAMES

CLERK

IFORD

ANALYST

MILLER

CLERK

6 rows selected.

 

谓词IN的作用就是检查列值是否等于它后面括弧内的一组值中的某一个,如果等于其中某一个值,则被查询出来。

我们还可以使用NOT IN来表示与IN完全相反的含义,即选择那些不在列表中的行。

8、查找不是职员和分析员的雇员姓名。

SQL>SELECT ENAMEJOB

     FROM EMP

     WHERE JOB NOT IN (‘CLERK’,‘ANALYST’);

2BETWEENAND

在查找中,如果要求某列的数值在某个区间范围内,则可以使用BETWEENAND

9、查找哪些雇员的工资在$2000$3000之间,可以写成

SQL>SELECT ENAMEJOBSAL

     FROM EMP

            WHERE  SAL BETWEEN 2000 AND 3000

ENAME

JOB

SAL

JONES

MANAGER

2975

BLAKE

MANAGER

2850

CLARK

MANAGER

2450

SCOTT

ANALYST

3000

FORD

ANALYST

3000

5 rows selected.

 

 

与此相反,NOT BETWEEN……AND则选择列值不在该范围内的信息。

10SQL>SELECT ENAMEJOBSAL

     FROM EMP

             WHERE  SAL NOT BETWEEN 2000 AND 3000

3LIKE(模式匹配)

在查找中,有时需要对字符串进行比较。在比较中,有的要求两个字符串完全相同,有的要求部分字符相同,而其余的字符可以任意。LIKE就可以用来搜索所有的数据,来查找与你描述的模式相匹配的行。

LIKE提供两种字符串匹配方式:

一种用下划线(_)表示,称为定位标志;另一种用百分号(%)表示,称为通配符。

在检测一个字符串时,如果有一个字符可以任意,则在该字符串位置上用下划线表示。

11、选择名字以W开头,后面仅有三个字母的雇员信息。

显然,在查找中,要求名字的第一个字母是W,后面仅有三个字母,可以是任意字母,因此后面三位可以用三个下划线来表示:

SQL>SELECT ENAMEDEPTNO

     FROM EMP

     WHERE ENAME LIKEW_ _ _’;

ENAME

DEPTNO

WARD

30

1 row selected.

若在查找时只需包含某个字符串,其他字符任意的情况下,可用通配符%来表示。

12SQL>SELECT ENAMEDEPTNO

     FROM EMP

     WHERE ENAME LIKES%’;

ENAME

DEPTNO

SMITH

20

SCOTT

20

2 rows selected.

通配符%还可以与下划线一起使用。

13、查找名字以字母M开头,以R结尾,并且第三个字母为L的雇员名字、工种和所在部门号。

那么,在查找中,名字的第一个字母是M,第三个字母是L,第二个字母可以是任意的,该位置可用一个下划线表示。最后一个字母是R,而第三个字母和最后一个字母之间可以是任意长度的字符串,所以在字母LR之间使用通配符%,其命令语句如下:

SQL>SELECT ENAMEJOB

     FROM EMP

     WHERE ENAME LIKEM_L%R’;

ENAME

DEPTNO

MILLER

CLERK

1 row selected.

总之,我们可以使用通配符%匹配任意长度的字符串,使用‘_‘匹配一个任意字符。此外我们还可以使用NOT LIKE选择列值不匹配的行。

14、查找哪些雇员的工种名不以SALES开头。

SQL>SELECT ENAMEJOB

     FROM EMP

     WHERE JOB NOT IN LIKESALES%’;

4IS NULLIS NOT NULL

我们使用的数据库一般是反映实际的具体情况,但有时某些数据在实际情况中还不存在,例如:新来的雇员还未分配到部门工作,那么他的DEPTNO就不存在,他的DEPTNO值既不等于0也不等于其他值,而是一个未知的值,我们称它的DEPTNO值为空值。空值实际是指一种未知的、不存在的或不可应用的数据,通常用NULL表示。NULL仅仅是一个符号,它不等同于零,所以它不能象零那样进行算术运算。NULL不能与等号之类的运算符连用,而应该使用关键字IS

15、选择没有奖金的雇员信息(即奖金为空值的雇员信息)

SQL>SELECT ENAMEJOB

     FROM EMP

     WHERE COMM IS NULL

ENAME

JOB

SMITH

CLERK

JONES

MANAGER

BLAKE

MANAGER

CLARK

MANAGER

SCOTT

ANALYST

KING

PRESIDENT

ADAMS

CLERK

JAMES

CLERK

FORD

ANALYST

MILLER

CLERK

10 rows selected.

若查找列值为非空的信息,则使用IS NOT NULL

16、选择有奖金的雇员。

SQL>SELECT ENAMEJOB

     FROM EMP

     WHERE COMM IS NOT NULL

5)逻辑运算符NOTANDOR

WHERE子句中,也可以通过逻辑运算符连接多个条件,构成一个更复杂的条件进行查询。在WHERE子句中可以使用三种逻辑运算符:

运算符

名称含义

 

 

NOT

逻辑非选择不满足条件的行

 

AND

逻辑与选择列值同时满足多个条件的行

OR

逻辑或选择列值满足任一条件的行

WHERE子句中,关系比较符的优先级高于逻辑运算符。在逻辑运算符中,逻辑非(NOT)的优先级最高,逻辑与(AND)次之,逻辑或(OR)优先级最低。

17、查找20号部门里不是职员的雇员信息。

SQL>SELECT ENAMEJOB

     FROM EMP

     WHERE DEPTNO=20

     AND JOB=LERK’;

ENAME

JOB

JONES

MANAGER

SCOTT

ANALYST

FORD

ANALYST

3 records selected.

 

18、查找在20号部门工作或不是职员的雇员信息。

SQL>SELECT ENAMEJOBDEPTNO

     FROM EMP

     WHERE DEPTNO=20

     OR JOB=CLERK’;

ENAME

JOB

EPNTO

SMITH

CLERK

20

ALLEN

SALESMAN

30

WARD

SALESMAN

30

JONES

MANAGER

20

MARTIN

SALESMAN

30

BLAKE

MANAGER

30

CLARK

MANAGER

10

SCOTT

ANALYST

20

KING

PRESIDENT

10

TURNER

SALESMAN

30

ADAMS

CLERK

20

FORD

ANALYST

20

13 rows selected.

 

综合上所述,在WHERE子句中,可以使用关系运算符、逻辑运算符以及特殊的运算符LIKE等构成条件,当条件满足时,则取有关的数据。这些运算符的优先顺序如下:

=,!=<>>>=<<=

 [NOT] BETWEENAND[NOT]IN[NOT]LIKEIS [NOT]NULL

NOT

AND

OR

括弧()可以改变上述运算符执行的顺序。

 

3ORDER BY子句

通常使用SELECT命令查找数据时,查询结果按各行在表中的顺序显示,当需要按照某种特定的顺序显示时,可以通过ORDER BY子句来改变查询结果的显示顺序。ORDER BY子句的格式是:

SELECT ……

FROM……

[WHERE……]

ORDER BY<列名>[ASC/DESC][<列名>[ASC/DESC]]……;

ORDER BY子句中,<列名>指出查询结果数据按该列排序,选项[ASC/DESC]表示按升序还是降序排列,选择ASC为升序显示,选择DESC为降序显示,该项缺省为升序形式。

19、按字母顺序显示雇员的名字。

SQL>SELECT ENAME

     FROM EMP

     ORDER BY ENAME

ENAME

 

ADAMS

 

ALLEN

 

BLAKE

 

CLARK

 

FORD

 

JAMES

 

JONES

 

KING

 

MARTIN

 

MILLER

 

SCOTT

 

SMITH

 

TURNER

 

WARD

 

14 rows selected.

如果按降序排列,必须加上关键字“DESC”。

20、按部门号降序显示。

SQL>SELECT *

     FROM EMP

     ORDER BY DEPTNO DESC

DEPTNO

DNAME

LOC

40

OPERATIONS

BOSTON

30

SALSE

CHICAGO

20

RESEARCH

DALLAS

10

ACCOUNTING

NEW YORK

4 rows selected.

 

如果按多列进行排序时,应分别指出它们相应的列名及有关的递增或递减方式。选择按多列排序,首先由第一个列名确定顺序,若第一排序列值相同,再按第二个列名排序,第二排序列值相同,再按第三列排序,依此类推。

21、查找工资高于$2000的雇员信息,按部门号和雇员名字排序。

SQL>SELECT ENAMESALDEPTNO

     FROM EMP

     WHERE SAL>2000

     ORDER BY DEPTNOENAME

ENAME

SAL

DEPTNO

CLARK

12450

 

SCOTT

3000

 

KING

5000

10

FORK

3000

20

JONES

2975

20

BLAKE

2850

30

6 rows selected.

 

注意:如果排序列含有空值(如上述的DEPTNO),则含有空值的行首先显示,而不管选择升序还是降序形式。

GROUP BY子句和HAVING子句将放到1.5.2节“聚组函数”具体论述。

 

4、表达式

SQL命令中还可以使用加(+)、减(—)、乘(*)、除(/)运算符构成的表达式,其中乘、除运算的优先级高于加、减运算。算术表达式的处理顺序从左到右,括弧可以改变处理的顺序。例如,12*SAL+COMM)!=12*SAL+COMM。这些运算符可以用于SQL命令的SELECT子句、WHERE子句、ORDER BY子句以及后面还要讲述的GROUP BY子句及HAVING子句中,但不能在FROM子句中使用运算符。

22、选择奖金高于其工资的5%的雇员。

SQL>SELECT ENAMESALCOMMCOMM/SAL

     FROM EMP

     WHERE COMM>0.05*SAL

     ORDER BY COMM/SAL DESC

ENAME

SAL

COMM

COMM/SAL

MARTIN

1250

1400

1.12

WARD

1250

500

0.4

ALLEN

1600

300

0.1875

3 rows selected.

 

 

 

122数据更新:插入、修改和删除

在数据库应用中,经常要对存放的数据进行更新操作,以满足不断变化的需求,因此对数据进行插入、修改和删除就成为必不可少的一项工作。

 

1、数据的插入

当需要为一个基表增加新的数据时,就要向基表中插入数据,这是由INSERT命令来实现的。

INSERT命令有两种用法:一种是将指定的具体数值插入表中,通过关键字VALUES来实现;另一种是将其他表中满足条件的数据插入到一个表中,这是通过SELECT子句实现的。

在插入数据时,应首先确认基表已经创建,然后确定基表的结构,基表的各列顺序、类型以及是否为非空(NOT NULL),可以通过DESCRIBE命令来查看,以保证插入数据的类型与基表列的类型匹配。若插入字符型和日期型数据,要用单引号括起来。

1)用VALUES插入。

向基表中插入指定数据的INSERT命令格式是

INSERT INTO <表名>[(列名表)]

VALUES<值表>);

其中:<表名>指出要插入数据的基表名;<列名表>指出在新插入行中的哪些列要插入数据,这是可选项,如果选择,则表示相应的列要插入数据,如果不选择,则默认表中所有的列均要插入数据;<值表>指出要插入列的具体值。

1、为DEPT表插入一行新数据。

SQL>INSERT INTO DEPT

     VALUES 10,‘ACCOUNTING’,‘NEW YORK’);

DEPT Table

DEPTNO

DNAME

LOC

10

ACCOUNTING

NEW YORK

注意:当不选择<列名表>时,<值表>中的值应与基表的各列一一对应。如果在INSERT命令中给出列名,则要求<值表>中的值与<列名表>中的列名一一对应。

2

SQL>INSERT INTO DEPTDNAMEDEPTNO

     VALUES (‘ACCOUNTING’,10);

 DEPT Table

DEPTNO

DNAME

LOC

10

ACCOUNTING

 

插入时,表名中的列如果未在INSERT<列名表>中出现,那么这些列则为空值,如上例中的LOC列为空值。也可以为某列插入“NULL”,将该列置为空。插入空值的列,必须保证该列在建立时没有被定义成NOT UNLL属性,否则系统拒绝插入。

2)用SELECT命令插入。

INSERT命令可以使用SELECT语句从其他基表中选择数据,插入基表中。其命令格式是

INSERT INTO<表名>[(列名表)]

SELECT 语句;

3

SQL>INSERT INTO EMPEMPNOENAMEDEPTNO

     SELECT IDNAMEDEPARTMENT

     FROM OLD_EMP

     WHERE DEPARTMENT IN 10203040);

同使用VALUES类似,在使用SELECT命令时,应保证INSERT<列名表>中的各列与SELECT子句中选中的各列一一对应,类型匹配。

3INSERT命令中使用参数。

INSERT命令中还可以使用参数来接收用户输入的数据,每个参数以&为前缀,后接参数名(可以取列名)。

4

SQL>INSERT INTO DEPT

     VALUES &DEPTNO&DNAME&LOC);

在执行该命令时,SQL*PLUS将提示用户输入每个参数。重复执行该命令可以接收不同的数据,快速地向表中插入多条记录。

若参数对应的是日期型或字符型数据时,可以在参数上加引号,这样用户输入数据时就不用再输入引号了。

5

SQL>INSERT INTO DEPT

     VALUES &DEPTNO,‘&DNAME’,‘&LOC’);

4)插入日期型数据。

在插入日期型数据时,日期必须带单引号且以缺省的ORACLE的日期格式出现,即‘DD-MON-YY’格式。

6、加入一名雇员。

SQL>INSERT INTO EMP

     (EMPNOENAMEHIREDATE

     VALUES 7963,‘STONE’,‘07-APR-95);

如果想输入当前的系统时间,可以使用SYSDATE。如果要插入一个非缺省格式的日期,可以使用TO-DATE函数进行转换。关于TO-DATE函数将在1.5函数一节中详细论述。

 

2、数据的修改

ORACLE中,对数据的修改是使用UPDATE命令来实现的。UPDATE命令的格式如下:

UPDATE<列表名>

SET<列名1>=<表达式1><列名2>=<表达式2>……

[WHERE <条件>]

UPDATE命令对由<表名>指定的基表进行修改。修改时,对表中满足条件的行将用<表达式>的值替换相应列的值。

7、将Martin提升为经理。

SQL>UPDATE EMP

     SET JOB=MANAGER

     WHERE ENAME=MARTIN’;

如果例7中不使用WHERE子句,则EMP表中的每一行都将被置为SET子句中的数值。UPDATE命令不但可以修改一行的某一列数据,还可以修改若干行的几列数据。

8、将所有销售人员的工资增加20%,并转入部门40

SQL>UPDATE EMP

     SET DEPTNO=40SAL=SAL*1+0.02

     WHERE JOB=SALESMAN’;

1)在UPDATE中使用SELECT命令。

UPDATE命令中可以嵌入SELECT语句设置修改值。

9

SQL>UPDATE EMP

     SET SALCOMM=

      (SELECT SALARYCOMM

       FROM OLD_EMP

       WHERE DEPARTMENT=10

       WHERE DEPTNO=10

需要修改的列必须出现在括号内,并以逗号隔开。被设置的值通过括号内的SELECT语句获得,注意:应保证SET<列名>SELECT子句中选择的各列一一对应,并且SELECT语句最多返回一行结果,若未返回任何行,则被修改的各行的有关列被置成NULL

2)用NULL进行修改。

修改数据时,也可以将基表中的某列设置为NULL,这里使用空值是用等号而不是“IS”。

10

SQL>UPDATE EMP

     SET COMM=NULL

     WHERE JOB=SALESMAN’;

 

3、数据的删除

对表中数据进行删除是使用DELETE命令实现的,DELETE命令格式如下:

DELETE FROM<表名>

      [WHERE <条件>]

DELETE命令是从由<表名>指定的表中删除满足<条件>的行。WHERE <条件>是可选项,若只删除指定的几行,则必须使用WHERE子句,如果WHERE子句缺省,则删除表中的全部数据。

11Martin离开公司,应从公司中除名。

SQL>DELETE FROM EMP

       WHERE ENAME=MARTIN’;

注意:不能删除一行的部分信息,只能把该列改为空值。

总之,我们可以使用INSERTUPDATEDELETE命令对数据库进行更新,但要注意:这些命令常带有WHERE子句,它仅影响你所选中的各行数据。这三个命令扩展ORACLE的功能,使它不仅能够查询,还允许直接对数据进行操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值