数据库应用技术教程第三章深入SQL.ppt
《数据库应用技术教程第三章深入SQL.ppt》由会员分享,可在线阅读,更多相关《数据库应用技术教程第三章深入SQL.ppt(81页珍藏版)》请在三一办公上搜索。
1、数据库应用技术第三章 深入SQL,1/81,3.1 SQL概述,SQL的历史1970,Structured English Query Language(SEQUEL),IBM1979,OracleSQL的标准化过程从SQL-86(ANSI)到SQL-2003(ANSI,ISO)SQL的设计初衷是给高级用户提供一种通用的、易于学习和理解的数据库操作方式。演变为给程序员使用的数据库标准接口。,2/81,SQL的特点,面向集合的操作方式,是关系代数的实现;高度非过程化。只需要提出“What”,不需要指出“How”;上下文无关,运行结果取决于数据;语言风格统一,类自然语言,简单易学;既是自含式语言,
2、又是嵌入式语言,3/81,SQL的分类,查询(Data Query Language,DQL)SELECT操纵(Data Manipulate Language,DML)INSERT,DELETE,UPDATE定义(Data Definition Language,DDL)CREATE,DROP,ALTER。控制(Data Control Language,DCL)GRANT,REVOKE,COMMIT,ROLLBACK。,4/81,SQL的基本语法,SQL语句不区分大小写,可以写在多行,各个单词之间使用分隔符(空格,回车,制表符)分隔。SQL语句中的关键字属于保留字,不能用于其他地方。数字常
3、量的写法和通常程序语言一致,字符串使用单引号包含,字符串中的单引号使用两个连续的单引号转义表示,不区分字符和字符串。,5/81,SQL书写规范,为便于书写和阅读,通常采用如下的书写规范:1、关键字大写,其他标识符小写字段名大写?2、每个子句单起一行3、使用制表符缩进,6/81,标准与可移植性,在SQL92标准中定义了四种级别:Entry,Transitional,Intermediate,and Full国际标准与各个厂商之间的不兼容性。事实上的不可移植性字符串连接|与+;专有的查询关键字数据类型与函数特殊语义;可移植性神话,7/81,3.2 简单SELECT语句,8/81,3.2.1 基本语
4、句,语法SELECT DISTINCT|ALL*|查询项列表 FROM 表名;说明查询项:字段|表达式 AS 别名 无条件:查询出表的所有记录。次序不确定、不稳定,依赖于数据库的实现。*:按特定顺序列举所有字段。,9/81,3.2.1 基本语句,当明确要查询哪些字段的时候,将字段名称列在SELECT的后面,这样语句含义清楚,性能也有所提高。AS 别名:别名起到简化作用,通常还作为表达式的标题。特别是很多使用SQL的开发工具直接使用SELECT语句中每个查询表达式的名称作为标识符,这种情况下更需要给出别名。表达式与别名之间的AS是一个冗余的关键字,可以省略,直接以空白符分隔。DISTINCT|A
5、LL:在整个查询内容前加上DISTINCT,返回结果中不重复的内容。不重复针对所有要查询的表达式集合而言。ALL是缺省值,列出包括重复的所有记录。另外,DISTINCT是一个比较费时间的操作,使用时需慎重。,10/81,3.2.1 基本语句,查询的内容可以是字段,也可以是由字段、常数通过运算符、函数构成的复杂表达式。这种计算要对表上的所有行都施加运算。SELECT sid,UPPER(sname),salary+100FROM sales;,11/81,3.2.1 基本语句,在某些情况下,也可能使用SQL计算纯粹常量表达式的值,如检索服务器当前时间。SELECT SYSDATE,1+2FROM
6、 sales;依赖于表中记录的数目,将得到若干行(也可能是0行)同样的结果。而这一般不是我们想要得到的结果。,12/81,3.2.1 基本语句,如果明确地只想得到一行结果在MS-SQL和MySQL中,可以使用不带FROM子句的SELECT语句;SELECT 1+2在Oracle中,不允许没有FROM子句。系统提供了一个名叫dual的表,保证其中只有一条记录,不依赖于表的计算可以使用这个表。SELECT SYSDATE,1+2 FROM dual;,13/81,3.2.2 筛选,可以使用WHERE子句来筛选出满足某些条件的记录。WHERE 逻辑表达式基本比较运算符=,=,它们都具有通常的含义。比
7、较运算符的两端都可以是字段或者表达式。其他相当于比较运算符的结构BETWEEN ANDINLIKENULL的运算逻辑运算符NOT AND OR,14/81,其他where条件,1、BETWEEN AND 如果要限定某个表达式的值在某个区间内,可以使用这个关键字。例:查询出薪水在1000和2000之间的记录的sid和salary值。SELECT sid,salaryFROM salesWHERE salary BETWEEN 1000 AND 2000;这是一个闭区间,等于两端值的记录也会被查出来。另外,一般要求区间前面的值小于后面的值,否则将查不出结果。2、ININ运算符用来检验某个表达式的值
8、是否包含在一个指定的值集合内。例:查询出名字叫Tom、Jack或者Mary的销售员的sid和salary值。SELECT sid,salaryFROM salesWHERE sname IN(Tom,Jack,Mary);,15/81,3、LIKE如果要对字符串进行通配查找时,需要使用LIKE运算符。它允许在表达式中使用专门的通配符,表示符合某种规则的结果。%:表示可以匹配0个或任意多个字符;_:表示通配一个字符。例1:查询出所有名字以S开头的销售员记录,例如Smith、Sa和S等都符合这个条件。SELECT sid,salaryFROM salesWHERE sname LIKE S%;例2
9、:查询出来所有名字中含有第一个是a,第三个是b,中间可以是任意字符的子串的顾客信息。SELECT*FROM customersWHERE cname LIKE%a_b%;,16/81,如果要查询的通配表达式中含有%或者_做为通常的含义出现,那么需要使用转义描述。例3:查询名字以%开头,以_结尾的销售员id和工资。SELECT sid,salaryFROM salesWHERE sname LIKE%_ ESCAPE;在LIKE的后面加上ESCAPE关键字说明通配表达式中使用的转义字符(上例为),则转义字符后面的直接字符不按照通配符对待。4、IS NULL见后,17/81,可以使用逻辑运算符AN
10、D,OR,NOT将多个关系表达式连接在一起,构成复杂的逻辑表达式。它们具有通常的逻辑含义。在不使用括号的时候,AND的优先级高于OR运算。另外,对于一些特别的表达式的否定,可以使用另外的语法。如对IS NULL的否定可以写成IS NOT NULL。,逻辑运算,18/81,空值逻辑,空值NULL用来表示 未知的(Unknown),不适用的(Inapplicable)不能直接和空值进行比较,需要使用IS NULL和IS NOT NULL。例4:查询地址非空的顾客信息。SELECT*FROM customersWHERE address IS NOT NULL;反例:SELECT*FROM sale
11、sWHERE salary 1000 OR salary=1000;将不能查询出所有记录,因为salary为空的不满足任何条件。等价:SELECT*FROM salesWHERE salary IS NOT NULL;,19/81,NVL函数NVL(X,Y)=X,IF X IS NOT NULL Y,IF X IS NULL例5:查询薪水大于1000的销售员信息,薪水为空按照2000计算SELECT*FROM salesWHERE NVL(salary,2000)1000;SELECT*FROM salesWHERE salary 1000 or salary IS NULL;例6:欲发放奖金
12、,为薪水的10%,如果薪水为空,按照1000计算SELECT NVL(salary,1000)*0.1 FROM sales,20/81,3.2.3 聚集函数与分组统计,聚集函数:对于多条记录统计出一个结果的函数。包括:COUNT,MAX,MIN,AVG,SUM聚集函数和NULL的关系COUNT(*):计数符合条件的所有记录,不考虑是否为空。COUNT(字段):此字段为空的行不计数在内。MAX、MIN:NULL不参与比较。AVG、SUM:NULL不参与运算。聚集函数里面可以使用DISTINCT,只对不重复的字段进行统计。缺省为ALL,21/81,聚集函数-cont,数据类型SUM、AVG 只用
13、于数值型。MAN、MIN可用于数值、字符、日期。Count的几种用法SELECT COUNT(*)返回记录数SELECT COUNT(字段)字段为空的记录不参与计数SELECT COUNT(DISTINCT字段)重复字段不参与计数,22/81,分组统计GROUP BY,分组子句GROUP BY按照GROUP BY条件对记录进行分组,然后进行统计。每一个分组得出一个结果。可以使用多个条件,多个条件的次序关系?分组筛选子句HAVING对分组后的每个组按照条件进行筛选;只能在GROUP BY后面出现。一般使用聚集函数对分组后数据的统计值进行筛选直接使用分组字段通常无意义,其他字段非法,23/81,例
14、1:当前有多少订单。SELECT COUNT(*)FROM orders;例2:当前locations内有多少个邮编,不重复数有多少?SELECT COUNT(postcode),COUNT(DISTINCT postcode)FROM locations;例3:在locations中有多少个不重复的城市?SELECT COUNT(DISTINCT city)FROM locations;例4:在一周之前,有多少个顾客购买过产品?SELECT COUNT(DISTINCT cid)FROM ordersWHERE buy_date sysdate-7,24/81,例5:列出最后一次出入库的时间
15、例6:列出共有多少种产品已经被销售过例7:列出每一个顾客ID,总购买额。例8:根据出入库记录,计算库存数,SELECT MAX(date_happen)FROM stock_in_out,SELECT COUNT(DISTINCT PID)FROM ORDERS,SELECT cid,SUM(dollars)FROM ordersGROUP BY cid;(不考虑顾客表中的姓名),SELECT SUM(qty_in_out)FROM stock_in_out,25/81,例9:列出每一个顾客ID,姓名及总购买额。例10:按产品分类,总销售额最高值是多少?,SELECT o.cid,ame,SU
16、M(o.dollars)FROM orders o,customers cWHERE o.cid=c.cidGROUP BY o.cid,ame;,cname虽然冗余,但必须出现在GROUP BY后面,除非使用其他方法。,SELECT MAX(SUM(dollars)FROM ordersGROUP BY pid;,26/81,例11:对于销售数量大于1000的订单,按照产品计算平均销售额。例12:对于平均销售金额大于1000的产品,列出id和总销售额。例13:求至少购买过两次单笔销售额超过1000的顾客及总购买额。,SELECT pid,SUM(dollars)FROM ordersGROU
17、P BY pidHAVING AVG(dollars)1000;,SELECT cid,SUM(dollars)FROM ordersWHERE dollars 1000GROUP BY cidHAVING COUNT(*)1;,SELECT pid,AVG(dollars)FROM ordersWHERE qty 1000GROUP BY pid;,27/81,小结,返回数据无GROUP BY子句,带聚集函数的查询一定只返回一行数据,但是可能是空值。如果表中无数据,或者无满足条件数据,或者所有符合条件数据都是空,COUNT返回0,其他函数则返回空值。带有聚集函数的SQL对查询表达式的要求未使
18、用GROUP BY,但出现了一个聚集函数,其他表达式也必须是聚集函数使用GROUP BY,查询表达式必须是使用聚组函数的表达式分组字段直接参与的表达式其他字段直接出现,为语法错误HAVING子句的要求同查询表达式例9的三种写法,28/81,3.2.4 排序,ORDER BY 排序准则列表排序准则:字段|表达式|别名|序号 ASC|DESCASC:升序,缺省值。DESC:降序。字段名:不一定在SELECT中列出。表达式:有些DBMS不支持。序号:从1开始排。在多个SELECT进行集合运算时,特别适合使用序号方式。按照关系数据库的原理来说,ORDER BY只能是SELECT语句的最后一个子句。在排
19、序结果中,NULL通常被排在一起,放在结果集的前面或后面(依赖于实现或者特别的选项)。,29/81,3.3 复杂的SELECT语句,30/81,3.3.1 连接查询,将多个表的数据进行笛卡尔积,在此基础上进行查询,称为连接查询(Join)。连接条件:在笛卡尔积的基础上,通常要根据多个表之间相关联的某些字段之间的判断条件进行筛选,这种多表之间的筛选条件称为连接条件。根据连接条件,可以分为:等值连接(Equal join)、不等值连接(Non-equal join)、自连接(Self join)和外连接(Outer join)。,31/81,例1:找出所有顾客购买的商品名称和数量。,SELECT
20、products.pname,orders.qtyFROM products,ordersWHERE products.pid=orders.pid;,或简写为:SELECT p.pid,p.pname,o.qtyFROM products p,orders oWHERE p.pid=o.pid;,例2:找出住在Dallas或Duluth的顾客购买过产品的产品号。,SELECT o.pid FROM orders o,customers cWHERE o.cid=c.cid AND(c.city=Dollas OR c.city=Duluth);,32/81,自连接,例3:列出每个销售员及其经
21、理的姓名。(自连接)SELECT s1.sname as 下属,s2.sname as 经理FROM sales s1,sales s2WHERE s1.manager=s2.sid;自连接对于同一个表的两种不同角色的使用并不真正复制数据,必须使用表的别名。,33/81,例4:找出在同一城市居住的顾客对。SELECT c1.cid,c2.cidFROM customers c1,customers c2WHERE c1.city=c2.city;自身配对不列出WHERE c1.city=c2.city AND c1.cid c2.cid;不重复列出(a,b)和(b,a)WHERE c1.cit
22、y=c2.city AND c1.cid c2.cid;,34/81,例5:找出比Smith工资高的销售员。SELECT a2.snameFROM sales a1,sales a2WHERE a1.sname=Smith AND a2.salary a1.salary;当有多个smith时,该问题的答案例6:写出购买过商品的顾客姓名和产品名称。SELECT ame,p.pnameFROM customers c,products p,orders oWHERE o.cid=c.cid AND o.pid=p.pid;一般来说,N个表连接需要N-1个连接条件。,35/81,例7:写出购买过单价
23、超过1元的产品的顾客名单。(多表连接)SELECT ame FROM orders o,customers c,products pWHERE o.cid=c.cid AND o.pid=p.pid AND p.price 1;例8:找出与经理在同一城市的销售员。SELECT s2.snameFROM sales s1,sales s2,locations l1,locations l2WHERE s1.manager=s2.sid AND s1.lid=l1.lid AND s2.lid=l2.lid AND l1.city=l2.city;,36/81,3.3.2 子查询,子查询:出现在另
24、外一个SQL语句中的查询。里面出现的SQL语句也被称为子查询(subquery)或内查询(inner query)外面的查询被称为外查询(outer query)子查询出现的位置一般出现在where子句中按照不同的扩展语法,也可以出现在select、having和from子句中,37/81,使用子查询的方法,在where子句使用子查询,有以下几种方法字段表达式 比较运算符(subquery)字段表达式 IN(subquery)字段表达式 比较运算符 量词(subquery)NOT EXISTS(subquery),38/81,1、直接使用子查询,如果子查询返回一个数据,则可以作为直接数参与普通
25、比较运算。例1:查询与编号为A01的销售员工资相同的其他人。SELECT*FROM sales WHERE salary=(SELECT salaryFROM salesWHERE sid=a01);,39/81,例2:查询比Smith工资高的销售员信息。SELECT*FROM sales WHERE salary(SELECT salary FROM sales WHERE sname=Smith);(需要保证只有一个叫Smith的人),40/81,例3:查询比平均工资高的人员信息。SELECT*FROM salesWHERE salary(SELECT AVG(salary)FROM sa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 应用技术 教程 第三 深入 SQL
链接地址:https://www.31ppt.com/p-5985587.html