Oracle10g数据库基础教程第13章SQL语言基础Oracle10g数据库基础教程本章内容SQL语句分类数据查询(SELECT)数据操纵(INSERT、UPDATE、DELETE)事务控制SQL函数Oracle10g数据库基础教程本章要求掌握数据查询的各种应用掌握数据操纵的各种应用掌握事务处理了解SQL函数应用Oracle10g数据库基础教程13.1SQL语言概述SQL语言介绍SQL语言的分类SQL语言的特点Oracle10g数据库基础教程13.1.1SQL语言介绍SQL(StructuredQueryLanguage)语言是1974年由Boyce和Chamberlin提出的。SQL语言是关系数据库操作的基础语言,将数据查询、数据操纵、数据定义、事务控制、系统控制等功能集于一体,从而使得数据库应用开发人员、数据库管理员等都可以通过SQL语言实现对数据库的访问和操作。Oracle10g数据库基础教程13.1.2SQL语言的分类据定义语言(DataDefinitionLanguage,DDL):用于定义、修改、删除数据库对象,包括CREATE,ALTER,DROP,GRANT,REVOKE,AUDIT和NOAUDIT等。数据操纵语言(DataManipulationLanguage,DML):用于改变数据库中的数据,包括数据插入(INSERT)、数据修改(UPDATE)和数据删除(DELETE)。数据查询语言(DataQueryLanguage,DQL):用于数据检索,包括SELECT。事务控制(TransactionControl):用于将一组DML操作组合起来,形成一个事务并进行事务控制。包括事务提交(COMMIT)、事务回滚(ROLLBACK)、设置保存点(SAVEPOINT)和设置事务状态(SETTRANSACTION)。系统控制(SystemControl):用于设置数据库系统参数,包括ALTERSYSTEM。会话控制(SessionControl):用于设置用户会话相关参数,包括ALTERSESSION。Oracle10g数据库基础教程13.1.3SQL语言的特点功能一体化:几乎涵盖了对数据库的所有操作,语言风格统一。高度的非过程化:在使用SQL语言操作数据库时,用户只需要说明“做什么”,而不需要说明“怎样做”。用户任务的实现对用户而言是透明的,由系统自动完成。这大大减轻了用户的负担,同时降低了对用户的技术要求。面向集合的操作方式:SQL语言采用集合操作方式,不仅查询结果可以是多条记录的集合,而且一次插入、删除、修改操作的对象也可以是多条记录的集合。面向集合的操作方式极大地提高了对数据操作效率。多种使用方式:SQL语句既是自含式语言,又是嵌入式语言。SQL语言可以直接以命令方式与数据库进行交互,也可以嵌入到其他的高级语言中使用。简洁、易学:SQL语言命令数量有限,语法简单,接近于自然语言(英语),因此容易学习和掌握。Oracle10g数据库基础教程13.2数据查询数据查询基础基本查询分组查询连接查询子查询合并查询Oracle10g数据库基础教程13.2.1数据查询基础基本语法:SELECT[ALL|DISTINCT]column_name[,expression…]FROMtable1_name[,table2_name,view_name,…][WHEREcondition][GROUPBYcolumn_name1[,column_name2,…][HAVINGgroup_condition]][ORDERBYcolumn_name2[ASC|DESC][,column_name2,…]];Oracle10g数据库基础教程13.2.2基本查询无条件查询有条件查询查询排序查询统计Oracle10g数据库基础教程(1)无条件查询查询所有列SELECT*FROMemp;查询指定列SELECTdeptno,dnameFROMdept;使用算术表达式SELECTempno,sal*0.8FROMemp;使用字符常量SELECTempno,'Nameis:',enameFROMemp;使用函数SELECTempno,UPPER(ename)FROMemp;Oracle10g数据库基础教程改变列标题SELECTenameemployeename,salsalaryFROMemp;使用连接字符串SELECT'员工号:'||empno||'员工名'||enameFROMemp;消除重复行SELECTALLdeptnoFROMemp;SELECTDISTINCTdeptnoFROMemp;Oracle10g数据库基础教程(2)有条件查询查询满足条件的元组可以通过WHERE子句实现。WHERE条件中常用的运算符号运算符号谓词比较大小=,,,=,=,,!=确定范围BETWEENAND,NOTBETWEENAND确定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL多重条件AND,OROracle10g数据库基础教程关系运算SELECTempno,ename,salFROMempWHEREdeptno!=10;SELECTempno,ename,salFROMempWHEREsal1500确定范围谓词BETWEENAND与NOTBETWEENAND。SELECT*FROMempWHEREdeptnoBETWEEN10AND20;SELECT*FROMempWHEREsalNOTBETWEEN1000AND2000;Oracle10g数据库基础教程确定集合谓词IN可以用来查找属性值属于指定集合的元组。SELECTempno,ename,salFROMempWHEREdeptnoIN(10,30);字符匹配%(百分号)代表任意长(长度为0)字符串。_(下划线)代表任意单个字符。ESCAPE:转义字符SELECT*FROMempWHEREenameLIKE‘%S%’;SELECT*FROMempWHEREenameLIKE'_A%';SELECT*FROMempWHEREenameLIKE'%x_%'ESCAPE'x';Oracle10g数据库基础教程空值操作涉及空值查询时使用ISNULL或ISNOTNULL,这里的IS不能用=替代。SELECT*FROMempWHEREdeptnoISNULL;SELECT*FROMempWHEREcommISNOTNULL;Oracle10g数据库基础教程逻辑操作用逻辑运算符NOT、AND和OR来联结多个查询条件。优先级:NOT、AND、OR(用户可以用括号改变优先级)。IN谓词实际上是多个OR运算的缩写。SELECT*FROMempWHEREdeptno=10ANDsal1500;SELECT*FROMempWHERE(deptno=10ORdeptno=20)ANDsal1500;Oracle10g数据库基础教程注意:使用BETWEEN…AND,NOTBETWEEN…AND,IN,NOTIN运算符的查询条件都可以转换为NOT,AND,OR的逻辑运算。例如,下面两个语句是等价的:SELECT*FROMempWHEREsal1000ANDsal2000;SELECT*FROMempWHEREsalBETWEEN1000AND2000;Oracle10g数据库基础教程升序、降序排序ASC:升序(缺省);DESC:降序SELECTempno,ename,salFROMempORDERBYsal;SELECTempno,ename,salFROMempORDERBYsalDESC;多列排序首先按照第一个列或表达式进行排序;当第一个列或表达式的数据相同时,以第二个列或表达式进行排序,以此类推。SELECT*FROMempORDERBYdeptno,salDESC;(3)查询排序Oracle10g数据库基础教程按表达式排序可以按特定的表达式进行排序。SELECTempno,ename,salFROMempORDERBYsal*12;使用别名排序可以使用目标列或表达式的别名进行排序。SELECTempno,sal*12salaryFROMempORDERBYsalary;使用列位置编号排序如果列名或表达式名称很长,那么使用位置排序可以缩短排序语句的长度。SELECTempno,sal*12salaryFROMempORDERBY2;Oracle10g数据库基础教程(4)查询统计函数格式功能AVGAVG([DISTINCT|ALL]列名)计算一列值的平均值(要求数值列)COUNTCOUNT([DISTINCT|ALL]*)统计元组个数COUNTCOUNT([DISTINCT|ALL]列名)统计一列中非空值的个数MAXMAX([DISTINCT|ALL]列名)求一列值中的最大值MINMIN([DISTINCT|ALL]列名)求一列值中的最小值SUMSUM([DISTINCT|ALL]列名)计算一列值的总和(要求数值列)STDDEVSTDDEV(列名)..计算一列值的标准差VARIANCEVARIANCE(列名)计算一列值的方差Oracle10g数据库基础教程注意除了COUNT(*)函数外,其他的统计函数都不考虑返回值或表达式为NULL的情况。聚集函数只能出现在目标列表达式、ORDERBY子句、HAVING子句中,不能出现在WHERE子句和GROUPBY子句中。默认对所有的返回行进行统计,包括重复的行;如果要统计不重复的行信息,则可以使用DISTINCT选项。如果对查询结果进行了分组,则聚集函数的作用范围为各个组,否则聚集函数作用于整个查询结果。Oracle10g数据库基础教程SELECTcount(*),avg(sal),max(sal),min(sal)FROMempWHEREdeptno=10;SELECTavg(comm),sum(comm)FROMemp;SELECTcount(DISTINCTdeptno)FROMemp;SELECTvariance(sal),stddev(sal)FROMemp;Oracle10g数据库基础教程13.2.3分组查询基本语法单列分组查询多列分组查询使用HAVING子句限制返回组使用ROLLUP和CUBE合并分组查询Oracle10g数据库基础教程SELECTcolumn,group_function,…FROMtable[WHEREcondition][GROUP[BYROOLUP|CUBE|GROUPINGSETS]group_by_expression][HAVINGgroup_condition][ORDERBYcolumn[ASC|DESC]];(1)基本语法Oracle10g数据库基础教程注意:GROUPBY子句用于指定分组列或分组表达式。集合函数用于对分组进行统计。如果未对查询分组,则集合函数将作用于整个查询结果;如果对查询结果分组,则集合函数将作用于每一个组,即每一个分组都有一个集合函数。HAVING子句用于限制分组的返回结果。WHERE子句对表中的记录进行过滤,而HAVING子句对分组后形成的组进行过滤。在分组查询中,SELECT子句后面的所有目标列或目标表达式要么是分组列,要么是分组表达式,要么是集合函数。Oracle10g数据库基础教程单列分组查询将查询出来的记录按照某一个指定的列进行分组SELECTdeptno,count(*),avg(sal)FROMempGROUPBYdeptno;多列分组查询在GROUPBY子句中指定了两个或多个分组列SELECTdeptno,jo