1、本章内容本章内容l 6.1 SQL基本概念。l 6.2 Oracle的主要数据类型。l 6.3 使用CREATE TABLE语句建表。l 6.4 使用ALTER TABLE语句修改表结构。l 6.5 使用INSERT语句插入数据。l 6.6 使用UPDATE语句更新数据。l 6.7 使用DELETE语句删除数据。l 6.8 使用TRUNCATE语句删除数据。l 6.9 删除表。本章内容本章内容l7.1 查询语句概述。l7.2 单表查询。l7.3 多表连接查询。l7.4 子查询。l7.5 集合运算本章内容本章内容l 10.1 字符类函数。l 10.2 数值类函数。l 10.3 日期类函数。l 1
2、0.4 空值处理函数。l 10.5 转换类函数。l 10.6 其他常用函数。6.1 SQL6.1 SQL基本概念基本概念l6.1.1 SQL的历史。l6.1.2 SQL的组成元素。l6.1.3 空值。l6.1.4 注释。l6.1.5 SQL语句的分类。6.1.1 SQL6.1.1 SQL的历史的历史l最早由IBM开发。lOracle将其商业化。lANSI和ISO提出了ANSI/ISO SQL的标准。l所有的数据库管理系统都支持SQL,并在SQL标准的基础上添加了自己的私有扩展。6.1.2 SQL6.1.2 SQL的组成元素的组成元素(1)标识符(Identifier):标识符是指SQL语句中所
3、使用的符号名称,用于说明用户或数据库对象的名称,如表名、列名、过程名等。(2)关键字(Keyword):关键字是Oracle数据库预先定义的标识符,供用户执行SQL语句和完成其他功能时使用。SELECT、UPDATE、FROM 等都是关键字。(3)常量(Constant):常量是指在SQL语句中可以直接使用的字符、数字、日期等形式表示的值,来作为条件值、表达式的一部分或内置函数的参数等等。6.1.2 SQL6.1.2 SQL的组成元素的组成元素(4)语句(Statement):语句是指一条完整的SQL命令,其中还可以包含一些特殊字符,比如用分号(;)表示语句的结束。例如,SELECT*FROM
4、 teacher;就是一条语句。(5)子句(Clause):子句是SQL语句的一部分,通常是由关键字加上其他语法元素构成。例如,SELECT*是一条子句,FROM teacher也是一条子句。(6)表达式(Expression):表达式是由字符、数字、运算符等组成的有意义的运算式。6.1.2 SQL6.1.2 SQL的组成元素的组成元素(7)谓词(Predicate):谓词用于指定SQL语句执行的条件,从而使数据库只处理满足条件的数据。(8)内置函数:数据库自带的具有特定功能的函数,可以在SQL语句中直接使用,以增强SQL语句的功能。OracleOracle下下ScottScott用户的表用户
5、的表 OracleOracle下下ScottScott用户的表用户的表 OracleOracle下下ScottScott用户的表用户的表 OracleOracle下下ScottScott用户的表用户的表 OracleOracle下下ScottScott用户的表用户的表 OracleOracle下下ScottScott用户的数据用户的数据 SQLSQL练习与基础(练习与基础(1 1)l 查询所有雇员信息,将查询结果按“编号是:7369的雇员,姓名是:SMITH,工作是:CLERK”显示l 求出每个雇员的姓名和年薪 l 查询出工资大于1500的所有雇员信息 l 查询每月可以得到奖金的雇员信息 l
6、查询没有奖金的所有雇员 l 查询出工资大于1500,同时可以领到奖金的所有雇员信息l 查询出工资大于1500,或者可以领到奖金的所有雇员信息 SQLSQL练习与基础(练习与基础(2 2)l 查询出工资不大于1500,同时不可以领到奖金的所有雇员信息 l 查询出工资大于1500,但是小于3000的所有雇员信息l 查询出在1981年雇佣的所有雇员信息l 查询出姓名是smith的雇员信息l 要求查询出雇员编号是7369,7499,7521的雇员信息l 要求查询出所有雇员姓名中第二个字母包含”M”的雇员信息l 要求查询出所有雇员姓名中包含”M”的雇员信息 要求查询出在1981雇佣的雇员信息 要求查询出
7、编号不是7369的雇员信息 排序 查询出所有雇员信息,并按工资由低到高排序 查询出部门10的所有雇员信息,并按工资由高到低排序,工资相同则按雇佣日期由早到晚排序 SQLSQL练习与基础(练习与基础(3 3)单行函数 单行函数分类:字符函数:接受字符输入并且返回字符或数值 数值函数:接受数值输入并返回数值 四舍五入ROUND(),截断小数位TRUNC(),取余(取模)MOD 日期函数:对日期型数据进行操作 转换函数:从一种数据类型转换为另一种数据类型 通用函数:NAL函数,DECODE函数。SQLSQL练习与基础(练习与基础(4 4)将小写字母变成大写字母 将大写字母变成小写字母 将单词首字母大
8、写 字符串连接,可以使用|,还可以使用CONCAT()函数进行 字符串截取substr(),求出字符串的长度length(),进行指定内容的替换replace()要求显示所有雇员的姓名及姓名的后三个字符 执行四舍五入操作 保留两位小数 SQLSQL练习与基础(练习与基础(5 5)直接对整数进行四舍五入的进位操作 TRUNC()的操作中不会保留任何小数,也不会执行四舍五入,而是直接将小数部分去掉 通过TRUNC保留两位小数 使用负数表示位数 使用MOD()函数可进行取余操作 显示部门10雇员进入公司的星期数,在ORACLE中当前日期使用SYSDATE 验证MONTHS_BETWEEN(),求出给
9、定日期范围的月数。验证ADD_MONTHS(),在指定日期上加上指定的月数,求出之后的日期。NEXT_DAY(),下一个的今天是那一个日期。LAST_DAY(),求出给定日期的最后一天日期 SQLSQL练习与基础(练习与基础(6 6)转换函数,主要的转换函数有:TO_CHAR(),转换成字符串。TO_NUMBER()转换成数字。TO_DATE()转换成日期通过TRUNC保留两位小数 要求求出每个雇员的年薪 验证DECODE()SQLSQL练习与基础(练习与基础(7 7)选择部门30中的所有员工 列出所有办事员(CLERK)的姓名,编号和部门编号 找出佣金高于薪金的员工 找出佣金高于薪金的20%
10、的员工 找出部门10中所有经理(MANAGER)和部门20所有办事员(CLERK)的详细资料 找出部门10中所有经理(MANAGER)和部门20所有办事员(CLERK),既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料 找出收取佣金的员工的不同工作 找出不收到佣金或收到的佣金低于100的员工 SQLSQL练习与基础(练习与基础(8 8)找出各月倒数第3天受雇的员工 找出早于26年前受雇的员工 以首字母大写的方式显示所有员工的姓名 显示正好为5个字符的员工的姓名 显示不带有”R”的员工的姓名 显示所有员工姓名的前三个字符 显示所有员工的姓名,用“a”替换所有的“A”显示满26
11、年服务年限的员工的姓名和受雇日期 显示员工的详细资料,按姓名排序 显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面 SQLSQL练习与基础(练习与基础(9 9)显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同则按薪金排序 显示所有员工的姓名,加入公司的年份和月份,按受雇日期所有月排序,若月份相同,则将最早年份的员工排在最前面 显示在一个月为30天的情况所有员工的日薪金,忽略余数 找出在(任何年份的)2月受雇的所有员工 对于每个员工,显示其加入公司的天数 显示姓名字段的任何位置包含“A”的所有员工的姓名 以年月日方式显示所有员工的服务年限 SQLSQL练习与基础(练习
12、与基础(1010)1、多表查询:一张以上的表进行查询,称为多表查询,多表查询的时候可以为表指定别名的方式以简化查询列的编写,在多表查询中,会产生笛卡尔积,就是两张表的总数相乘得到的结果,如果想要消除笛卡尔积需要通过关联条件。2、分组统计和统计函数:统计函数:COUNT()、AVG()、SUM()、MAX()、MIN()统计函数必须出现在分组统计中,所谓的分组就是指列中存在重复的内容,使用GROUP BY的方式进行分组统计。如果要加入分组条件,则编写HAVING子句,所有的统计函数作为条件的话,只能在HAVING中出现,不能在WHERE中出现。在使用分组的时候,一定要注意,查询的时候只能出现分组
13、函数或是分组条件。分组函数允许嵌套,但是嵌套之后就不能查询其他的字段,包括分组字段。SQLSQL应用应用3、子查询:在一个查询中继续另外一个查询,称为子查询。子查询可以出现在任意位置,SELECT、FROM、WHERE。子查询可以结合分组统计、多表关联完成复杂的查询功能。4、数据库的更新操作。复制表:CREATE TABLE 表名称号AS(子查询),此语法只能在Oracle中起作用。数据增加:INSERT INTO 表名称(字段,.)VALUES(值);所有的字符串要加上“”,所有的数字可不加。如果在插入日期时,要么按固定的日期格式编写,要么使用TO_DATE函数进行转换,按照指定的格式yyy
14、y-mm-dd如果要为表中的每一列中的内容增加,则在使用INSERT语句时,可免去要定的字段。数据修改:UPDATE 表名称 SET 字段=值,.WHERE 条件在数据修改时,一般要加上条件,如果不加条件,表示更新全部元组数据删除:DELETE FROM 表名称 WHERE 删除条件。SQLSQL应用应用1、多表查询及SQL标准表示例1、同时查询EMP表和DEPT表,例2、要求查询出雇员的编号,姓名、部门编号,部门名称及部门的位置,例3、要求查询出每个雇员的姓名、工作、雇员的直接上级领导的姓名,例4、要求查询出每个雇员的姓名、工作、雇员的直接上级领导的姓名及部门名称,例5、要求查询出每个雇员的
15、姓名、工资、部门名称、工资等级、雇员的直接上级领导的姓名及工资等级,例6、要求查询出每个雇员的姓名、工作、部门编号、部门名称及部门位置,例7、要求查询出每个雇员的姓名、工作、雇员的直接上级领导的姓名及部门名称,SQLSQL练习多表查询(练习多表查询(1 1)从结果中,我们只发现三个部门,如果想要全部显示四个部门的信息,则需要使用外连接。(+)在左边则是右连接,(+)在右边则是左连接。进一步要求,将工资等级转换为文字表示。2、SQL标准中关于多表查询的各子句的用法例8、交叉连接(CROSS JOIN):产生笛卡尔积自然连接(NATURAL JOIN)自然连接USING子句:直接关联的操作列ON子
16、句:用户自己编写连接条件外连接3、组函数及分组统计组函数:COUNT():求出全部的记录数;MAX():求出一组中的最大值;MIN():求出最小值;AVG():求出平均值;SUM():求出和。例1、求出EMP表中记录的个数例2、求出最大、最小值,此两个函数主要针对数字列上进行应用例3、求出平均工资和工资总额例4、求出每个部门的雇员数量(应该按照部门编号分组并进行统计)例5、求出每个部门的平均工资 SQLSQL练习多表查询(练习多表查询(2 2)注意点:在进行分组统计中,SELECT后面只能出现1)如果程序中使用了分组函数,则有两种可以使用的情况:程序中存在了GROUP BY,并指定了分组条件,
17、这样可以将分组条件一起查询出来。如果不使用分组的话,则只能单独的使用分组函数。2)在使用分组函数时,不能出现分组函数和分组条件之处的字段。例6、按部门分组,并显示部门的名称,及每个部门的员工数。例7、要求显示出平均工资大于2000的部门编号和平均工资。WHERE子句中不能使用分组函数。例8、显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要求满足从事同一工作的雇员的月工资合计大于5000,输出结果按月工资的合计升序排列。(分步写出程序)例9、求出平均工资最高的部门工资 SQLSQL练习多表查询(练习多表查询(3 3)4、子查询例1、要求查询出比7654工资要高的全部雇员的信息子查
18、询有三种类型1)单列子查询:返回的结果是一列的一个内容2)单行子查询:返回的多个列,可能是一条完整的记录3)多行子查询:返回多条记录例2、要求查出工资比7654高,同时与7788从事相同的工作的全部雇员信息。例3、要求查出工资最低的雇员姓名、工作、工资例4、要求查询出,部门名称、部门的员工数,部门的平均工资,部门的最低收入雇员的姓名。例5、查询出每个部门的最高工资的雇员信息。例6、对子查询中,可以进行多列查询 SQLSQL练习子查询(练习子查询(1 1)5、更新语句INSERT,UPDATE,DELETE首先备份EMP表到MYEMP表中CREATE table myemp as select*
19、from emp;insert into myemp values(7899,张三,分析员,7369,14-2月-2012,8000,300,40);insert into myemp values(7999,李四,分析员,7369,to_date(2012-12-11,yyyy-mm-dd),8000,300,40);Update set =,=where 例7、将myemp表中的所有雇员的佣金修改为1000Update myemp set comm.=1000;例8、将myemp表中的7899雇员的工资改为5000Update myemp set sal=5000 where empno=
20、7899;DELETE FROM 表名 WHERE 条件例9、在myemp表中删除7899雇员的信息Delete From myemp where empno=7899;SQLSQL练习更新(练习更新(1 1)例1、求出所有部门的员工数量。列出部门人数大于3的所有部门信息。例2、列出薪金比SMITH多的所有员工。例3、列出所有员工的姓名及其直接上级的姓名。例4、列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。例5、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。例6、列出所有“CLERK”办事员的姓名及其部门名称,部门人数。例7、列出最低薪金大于1500的各种工作及其从
21、事此工作的全部雇员人数。SQLSQL练习(练习(1 1)例8、列出列出在部门“SALES”销售部工作的员工的姓名,假定不知道销售部的部门编号。例9、列出薪金高于平均薪金的所有员工,所有部门,上级领导,雇员的工资等级。例10、列出与SCOTT从事相同工作的所有员工及部门名称。例11、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。例12、列出薪金高于在部门30工作的所有员工的薪金的员工的姓名和薪金及部门名称。例13、列出在每个部门工作的员工数量、平均工资和平均服务期限。例14、列出所有员工的姓名、部门名称和工资。SQLSQL练习(练习(2 2)例15、列出所有部门的详细信息和部门人数。例
22、16、列出各种工作的最低工资及从事此工作的雇员姓名 例17、列出各个部门的MANAGER(经理)的最低薪金。例18、列出所有员工的年工资,按年薪从低到高排序。例19、查出某个部门的上级主管,并求出这些主管中薪水超过3000的。例20、求出部门名称中带S字符的部门员工、工资合计和部门人数。例21、给任职日期超过27年的从加薪10%。SQLSQL练习(练习(3 3)基本数据类型基本数据类型数据类型数据类型描述描述1VARCHAR、VARCHAR2表示的是一个字符串,有长度限制表示的是一个字符串,有长度限制2NUMBERNUMBER(n):表示一个整数,数字长度是:表示一个整数,数字长度是n,可以使
23、用,可以使用INTNUMBER(m,n):表示一个小数,数字小数长度为:表示一个小数,数字小数长度为n,整,整数长度为数长度为m-n,可以使用,可以使用FLOATT3DATE表示日期的类型,日期要按照标准的日期格式进行存放表示日期的类型,日期要按照标准的日期格式进行存放4CLOB大对象,表示大文本数据,一般可以存放处大对象,表示大文本数据,一般可以存放处4G的文本的文本5BLOB大对象,表示二进制数据,最大可以存放大对象,表示二进制数据,最大可以存放4G,例如,存,例如,存放电影,歌曲,图片放电影,歌曲,图片 表的创建 表的复制 表的删除 表的修改 表的重新命名 表的截断表的操作表的操作 在数
24、据库中,约束是必不可少的支持,使用约束可以更好的保证数据库中数据的完整性 约束的分类:主键约束:主键表示是一个唯一的标识,本身不能为空。primary key 唯一约束:在一个表中只允许建立一个主键约束,其他列如果不希望出现重复值的话,则就可以使用唯一约束。unique 检查约束:检查一个列的内容是否合法。check 非空约束:姓名这样的字段里,每条记录应该都有,则可用非空约束。not null 外键约束:在两张表之间进行约束操作约束的操作约束的操作主键约束一般都是在id上使用,而且本身已经默认了内容不能为空。主键约束可以在建立表时指定:例:建立person 表,在pid上增加主键约束 dro
25、p table person;create table person(pid varchar2(18)primary key,name varchar2(50),age number(3),birthday date,sex varchar2(2)default 男,);如果插入新的数据中,主键重复,或主键为空,插入会报错约束的操作约束的操作-PRIMARY KEYdrop table person;create table person(pid varchar2(18)primary key,name varchar2(50)not null,age number(3)not null ch
26、eck(age between 0 and 150),birthday date,sex varchar2(2)default 男 check(sex in(男,女,中),-约束放在列定义中,报错时,错误是自动编号constraint person_name_uk unique(name)约束与列定义并列,报错时,错误是自定义的。);约束的操作约束的操作-PRIMARY KEY drop table book;create table book(bid number primary key,bname varchar2(50)not null,bprice number(5,2),pid va
27、rchar2(18)CONSTRAINT person_book_pid_fk FOREIGN key(pid)REFERENCES person(pid);使用主外键关联时要注意以下内容 在子表中设置的外键在父表中必须是主键 删除时应该先删除子表,再删除父表 想先删除父表,则可采用在外键定义中增加ON DELETE CASCADE进行级联删除约束的操作约束的操作-主外键 修改约束 alter table 表名 add constraint 约束名 约束类型(约束字段);关于约束类型的命名,最好统一 PRIMARY KEY:主键字段_PK UNIQUE:字段_UK CHECK:字段_CK FO
28、REIGN KEY:父字段_子字段_FK约束的操作约束的操作-修改 ROWNUM:表示行号 实际上此列是一个伪列 此列可在每张表中出现 select rownum,empno,ename,job,sal,hiredate from emp;从运行中可看到,ROWNUM本身采用自动编号的形式出现。伪列ROWNUM 要求查询EMP表中前5条记录 select rownum,empno,ename,job,sal,hiredate from emp where rownum=5;能否查出中间5条记录,只能采用子查询,不能用 rownum between 5 and 10。select a.*from
29、(select rownum rn,empno,ename,job,sal,hiredate from emp where rownum5;伪列ROWNUM 在Oracle中提供了三种类型的集合操作 并、交、差,union,intersect,minus UNION将多个查询的结果组合到一个查询结果中,没有重复内容 UNION ALL 也是将多个查询结果组合到一个查询结果中,但是包含重复值 INTERSECT 返回多个查询结果中相同的部分 MINUS:返回两个查询结果的差集集合操作 6.1.3 6.1.3 空值空值l 空值不是一个确定的值,它代表未定义的、未知的或未确定的值。l 将一个值与空值
30、进行等于或不等于判断是没有意义的,其结果都为false。只能使用IS NULL或IS NOT NULL来判断某个值是不是空值。l 任何一种数据类型的列值都可以支持空值,但是构成主键约束的列和定义了NOT NULL约束的列中不允许插入空值。6.1.3 6.1.3 空值空值l 空值的特殊性(1)包含空值的任何算术表达式都等于空,对空值进行加减乘除等操作的结果也是未知的,所以也是空值。(2)包含空值的连接表达式(|)等于与空字符串连接,即得到的结果仍然是原来的字符串。(3)空值在升序排列方式下将会排在结果的最后面,在降序排列方式下将会排在结果的最前面。(4)对空值进行=、!=、=、SELECT指定列
31、SELECT*,这是因为不用查询Oracle数据库的数据字典表,因此速度比较快。7.2.1 SELECT7.2.1 SELECT子句子句6.使用列别名 为列起别名的方法有2种:(1)列名 列别名SELECT t_id 教师编号,t_name 教师姓名,t_research 研究方向 FROM teacher;(2)列名 AS 列别名SELECT t_id AS 教师编号,t_name AS 教师姓名,t_research AS 研究方向FROM teacher;7.2.1 SELECT7.2.1 SELECT子句子句l 通常情况下,不需要用双引号()将列别名括起来,但是以下三种情况,列别名需要
32、使用双引号引起来:列别名中含有空格时。想让别名原样显示时(不用双引号则英文字符全部大写)。列别名中含有特殊字符时。7.2.2 FROM7.2.2 FROM子句子句l FROM子句的功能比较简单,作用就是指定查询语句的源表,可以指定多个源表,表名之间用逗号隔开。l 可以在FROM子句中为表定义别名,但是在Oracle数据库中不支持使用AS关键字命名表别名的方法。l 为表列起别名的方法是:表名 表别名 7.2.3 WHERE7.2.3 WHERE子句子句l WHERE子句的作用是限定返回的记录,即返回的记录必须满足WHERE子句所指定的条件。l WHERE子句需要使用运算符来完成的查询条件的指定,
33、下表列出了WHERE子句中可以使用的运算符及其含义。类别运算符含义比较运算符=等于大于=大于等于小于=小于等于、!=不等于范围运算符BEWTEEN AND在某个范围内NOT BEWTEEN AND不在某个范围内包含运算符IN在某个集合中NOT IN不在某个集合中字符匹配运算符LIKE与某个文本匹配NOT LIKE与某个文本不匹配空值判断运算符IS NULL是空值NOT IS NULL不是空值逻辑运算符AND逻辑与OR逻辑或NOT逻辑非 7.2.3 WHERE7.2.3 WHERE子句子句1.比较运算符比较运算符可以对两侧的表达式进行比较。使用比较运算符需要注意以下几点:字符型及日期时间型的数据
34、需要使用单引号引起来。日期时间型的数据要求符合格式要求,可以通过查看NLS参数来获取默认的格式信息。在Oracle数据库中,WHERE子句中的条件值是大小写敏感的。7.2.3 WHERE7.2.3 WHERE子句子句2.BEWTEEN AND和NOT BEWTEEN AND BEWTEEN AND用于判断指定的条件项是否位于某个范围之内,BEWTEEN之后的表达式指定范围的最小值,AND之后的表达式指定范围的最大值。必须把最小值放在前面,否则查询不到正确的结果。比较的数据类型可以是字符型、数值型和日期时间型。BEWTEEN AND前后都是闭区间,即BEWTEEN A AND B结构包括A和B在
35、内。7.2.3 WHERE7.2.3 WHERE子句子句3.IN和NOT IN 用来指定条件的集合,当WHERE子句中的列值等于条件集合中的某个值时,才返回相应的记录。NOT IN表示当WHERE子句中的列值不等于条件集合中的任何一个值时,才返回相应的记录。可以将条件集合中的数据看做是枚举类型的数据,因为这些数据都是离散的,它们可以是字符型、数值型和日期时间型数据,但是集合中所有数据的数据类型必须相同。7.2.3 WHERE7.2.3 WHERE子句子句4.LIKE和NOT LIKE LIKE运算符用于字符类型的查询条件的模糊匹配,以实现模糊查询的功能,LIKE运算符中可以使用的通配符如下表所
36、示。通配符含义%(百分号)用于代替任意数目(可以为0)的任意字符_(下划线)用于代替一个任意字符 7.2.3 WHERE7.2.3 WHERE子句子句l SQL中提供了对字符进行转义的功能,方法是使用ESCAPE关键字,后接代表转义的字符,语法格式:NOT LIKE 模糊查询条件 ESCAPE 转义字符l 除了LIKE运算符中需要使用ESCAPE关键字定义转义字符之外,在某些情况下也需要使用转义字符来对特殊字符进行处理。7.2.3 WHERE7.2.3 WHERE子句子句5.空值判断运算符IS NULL和NOT IS NULL 因为空值不等于任何值,所以不能使用“=NULL”来判断一个列上的值
37、是否等于空值,而只能使用IS NULL或IS NOT NULL来判断一个列上的值是否为空值。7.2.3 WHERE7.2.3 WHERE子句子句6.逻辑运算符 逻辑运算符包括AND、OR和NOT,其中AND运算符和OR运算符用于连接多个布尔表达式,NOT运算符用于连接单个布尔表达式。AND运算符的运算规则是:参与运算的多个布尔表达式如果全为真则结果为真,有一个为假则结果为假;空值和TRUE进行与运算,返回空值,空值和FALSE进行与运算,返回FALSE。7.2.3 WHERE7.2.3 WHERE子句子句l OR运算符的运算规则是:参与运算的多个布尔表达式如果全为假则结果为假,有一个为真则结果
38、为真;空值和TRUE进行或运算,返回TRUE,空值和FALSE进行或运算,返回空值。l NOT运算符的运算规则是:如果布尔表达式为真则结果为假,如果布尔表达式为假则结果为真。7.2.3 WHERE7.2.3 WHERE子句子句7.运算符优先级优先级排序运算符类型运算符举例1一元运算符+(正号),-(负号)2算数运算符*,+,-3比较运算符=,=4其他比较运算符IS NOT NULL,LIKE,NOT BETWEEN,NOT IN5逻辑非NOT6逻辑与AND7逻辑或OR8赋值运算符=7.2.4 DISTINCT7.2.4 DISTINCT关键字关键字l DISTINCT关键字的作用是在列上筛选出
39、不同的值,即取消重复的行记录。l 对于空值,DISTINCT关键字后面指定的列中所有的空值都会被视为是一个值,也就是会将所有的空值压缩成一个值。7.2.5 GROUP BY7.2.5 GROUP BY子句与聚合子句与聚合函数函数l GROUP BY子句的功能是通过在子句的后面指定的表达式将表中的记录划分成若干个组,然后使用聚合函数对每个组的记录进行数据处理。l 聚合函数能够对一组记录中的某个列上的值执行计算,并返回单个值。常用的聚合函数有5个,它们分别是:7.2.5 GROUP BY7.2.5 GROUP BY子句与聚合子句与聚合函数函数(1)COUNT函数:用于统计某个列中的记录数。语法格式
40、如下:COUNT(*):用于计算数据表的所有记录数。COUNT(ALL|DISTINCT 列名或表达式):用于计算某个列或表达式的记录数,但是不包括含有空值的行。(2)AVG函数:用于计算某个列或表达式的数值的平均数。语法格式如下:AVG(ALL|DISTINCT 列名或表达式):其参数表达式应该为数字类型或者能够转化为数字类型的字符类型的数据。7.2.5 GROUP BY7.2.5 GROUP BY子句与聚合子句与聚合函数函数(3)SUM函数:用于计算某个列或表达式的数值的总和。语法格式如下:SUM(ALL|DISTINCT 列名或表达式):其参数表达式应该为数字类型或者能够转化为数字类型的
41、字符类型的数据。(4)MAX函数:用于查找某个列或表达式的数值的最大值。语法格式如下:MAX(列名或表达式):其参数表达式可以是数字类型、字符类型或日期类型的数据。7.2.5 GROUP BY7.2.5 GROUP BY子句与聚合子句与聚合函数函数(5)MIN函数:用于查找某个列或表达式的数值的最小值。语法格式如下:MIN(列名或表达式):其参数表达式可以是数字类型、字符类型或日期类型的数据。7.2.6 HAVING7.2.6 HAVING子句子句l 在使用GROUP BY子句分组之后,如果想对已分的组进行有条件的选择,可以使用HAVING子句,其功能就是选择和排除分组,因此HAVING子句又
42、被称为分组筛选语句。当使用HAVING子句时,Oracle数据库按照以下步骤执行:(1)对记录分组。(2)在分组的基础上使用聚合函数。(3)输出与HAVING子句匹配的结果。7.2.6 HAVING7.2.6 HAVING子句子句l HAVING子句与WHERE子句都可以起到过滤数据的作用,但是它们之间有一些区别:(1)功能不同。这两个子句都具有筛选数据的功能,但是WHERE子句是对所有的数据进行筛选,HAVING子句则是对分组后的数据进行筛选,因此HAVING子句必须与GROUP BY子句才有意义。(2)使用场合不同。HAVING子句只能用于查询语句中,而WHERE子句则可以用于SELECT
43、、UPDATE、DELETE和INSERT.INTO等语句中。7.2.6 HAVING7.2.6 HAVING子句子句(3)执行顺序不同。WHERE子句的执行顺序先于HAVING子句,即在对查询结果进行分组前就将不符合WHERE子句条件的记录筛选掉了,然后才会执行GROUP BY子句,再根据HAVING子句的条件筛选分组数据。(4)条件表达式的要求不同。HAVING子句中的条件表达式要么是GROUP BY子句中指定的分组条件,要么是聚合函数或常量,而WHERE子句中的条件则不受此限制,但是WHERE子句中不能使用聚合函数(实际上还是与执行顺序有关)。(5)有些时候,HAVING子句可以与WHE
44、RE子句互换使用,但是效率有所不同。7.2.7 ORDER BY7.2.7 ORDER BY子句子句l ORDER BY子句的作用就是对查询的结果集进行排序,以便可以按照用户的需求显示数据。l ORDER BY子句的后面可以是表的列名、列的别名、列的序号和表达式。ASC关键字表示结果按照升序排列,DESC关键字表示结果按照降序排列,默认按照升序对记录进行排序。如果使用了ORDER BY子句,则ORDER BY子句必须是查询语句的最后一个子句。7.2.7 ORDER BY7.2.7 ORDER BY子句子句l 不同数据类型的排序规则(以升序为例)(1)数值类型的数据按照数字大小的顺序由小到大排列
45、。(2)日期类型的数据规则是较早的日期在前,较晚的日期在后。例如:“01-1月-11”排在“01-1月-12”之前。(3)英文字符排列按照字母由小到大的顺序排列,且大写字母排在小写字母的前面,即按照A-Za-z的顺序排列。7.2.7 ORDER BY7.2.7 ORDER BY子句子句(4)中文的排序规则。数据库服务器或客户端使用的字符集决定了使用何种语言,而在Oracle数据库中不同的语言的排序方式各不相同。如果采用的字符集是ZHS16GBK,那么ORDER BY子句默认的是按照汉字的拼音顺序进行排序的;如果采用的是其他字符集(如UTF8),那么汉字的排序是按照BINARY(二进制编码)排序
46、的,即按照编码的大小来排序。7.2.8 7.2.8 查询语句的执行顺序查询语句的执行顺序l 第一步:执行FROM子句。将FROM子句中的表的记录全部取出来。l 第二步:执行WHERE子句。从第一步产生的记录中筛选出满足WHERE子句条件的所有记录。l 第三步:执行GROUP BY子句。按照GROUP BY 子句中的分组原则对第二步产生的记录进行分组。l 第四步:执行HAVING子句。按照HAVING子句中的分组筛选条件从第三步产生的记录中筛选出满足条件的所有分组。的排序规则排序。7.2.8 7.2.8 查询语句的执行顺序查询语句的执行顺序l 第五步:执行SELECT子句。从第四步产生的记录中将
47、SELECT子句中指定的列或表达式全部取出来。l 第六步:执行DISTINCT操作。将重复的记录从第五步产生的记录中删除。l 第七步:执行ORDER BY子句。将第六步产生的记录按照ORDER BY子句指定的排序规则排序。7.3 7.3 多表连接查询多表连接查询l7.3.1 内连接。l7.3.2 外连接。l7.3.3 自然连接。l7.3.4 笛卡尔积和交叉连接。l7.3.5 自连接。7.3.1 7.3.1 内连接内连接l 内连接(INNER JOIN)又称为相等连接或简单连接,就是当两个或多个表之间存在意义相同列的时候,把这些意义相同的列用“=”运算符连接起来进行比较,只有连接列上值相等的记录
48、才会被作为查询结果返回。其语法格式如下:SELECT select_listSELECT select_listFROM table1 alias,table2 alias.FROM table1 alias,table2 alias.WHERE table1.column=table2.columnWHERE table1.column=table2.column GROUP BY expr,expr.GROUP BY expr,expr.HAVING condition HAVING condition ORDER BY expression ASC|DESC ORDER BY expre
49、ssion ASC|DESC 7.3.1 7.3.1 内连接内连接l ANSI为内连接定义了标准的SQL语法,语法格式如下:SELECT select_listSELECT select_listFROM table1 FROM table1 INNER JOIN table2INNER JOIN table2ON table1.column=table2.columnON table1.column=table2.columnWHERE conditionsWHERE conditions 7.3.1 7.3.1 内连接内连接l 内连接连接三个数据表的语法格式如下:SELECT select
50、_listSELECT select_listFROM(table1FROM(table1INNER JOIN table2INNER JOIN table2ON table1.column=table2.column)ON table1.column=table2.column)INNER JOIN table3INNER JOIN table3ON table2.column=table3.column)ON table2.column=table3.column)WHERE conditionsWHERE conditions 7.3.1 7.3.1 内连接内连接l 内连接连接四个数据表