SQL标准培训教程.ppt
功能强大的SQL语句,利用SQL语句,可以查询、插入、更新、删除数据库中的数据。,3.1 select 语句解析与简单SQL语句(P63),从某种意义上说,select语句是数据库结构化查询语言SQL的真正核心。使用select语句可以以多种不同的方式查找数据库中的数据,并且可以显示通过现有数据推导、计算出的数据信息。,3.1.1 select 语句解析(P64),在数据库引擎查询文档中输入64页的代码 use 企业销售管理系统 select 仓库号,城市,面积,创建时间from 仓库where 面积800执行该SQL语句,就可以从数据库表“仓库”中挑选出面积大于800的仓库号、城市、面积、创建时间信息。,Select语言句的基本格式,Select语言句的基本格式是:select all distinct select_list from table_list/view_list where conditions group by group_list having conditions order by order_list,3.1.2 选择所有的列(P65),Select 语句的第一个子句,即select关键字开头的子句,用于选择进行显示的列,并且可以指定是否显示重复的记录。在数据库引擎输入如下代码:use 企业销售管理系统 select 职工ID,职工号,仓库号,姓名,性别,工资 from 职工,3.1.3 投影查询(P66),有时并不需要将所有的列都显示出来,投影查询就是允许用户显示所需要的列。如:use 企业销售管理系统 select 职工号,姓名,工资 from 职工,3.1.4 条件查询(P66),Where子句是在使用select语句进行查询时最重要的子句,在where子句中指出了检索的条件,系统进行检索时将按照这些指定的条件对记录进行检索,找出符合条件的记录。在SQL中提供了各种运算符和关键字来实现搜索条件,其中运算符分为比较运算符与逻辑运算符,关键字有in、like、betweenand、is null、is not null等。,3.1.4.1 比较运算符(P67),比较运算符在where字句中使用非常普遍,几乎所有的条件查询都要用到比较运算符。如67页表3-1所列出的比较运算符。,数字的比较,显示订单金额大于10000元的订单信息,执行下面的代码:use 企业销售管理系统 select*from 订购单 where 金额10000,字符串比较,纯英文字符串的比较按照字典顺序进行,先比较第一个字母在字典顺序中的位置,位置在前的字符小于位置在后面的字符,若第一个字符相同则继续比较第二个字符,直到得出比较结果。执行下面的代码:use 企业销售管理系统select*from 订购单where 订购单号or3,日期时间的比较,比较方法按照年、月、日、小时、分钟、秒进行比较。执行下面的代码:use 企业销售管理系统select*from 订购单where 订购日期2004-09-01,3.1.4.2 逻辑运算符(P69),SQL中的逻辑运算符共有3种:and(与)or(或)not(非),and(与),and运算符可以连接两个或两个以上的条件,只有当and连接的条件都为真时,and的结果才为真。执行代码如下:use 企业销售管理系统 select*from 职工where 工资1510 and 仓库号!=wh2,or(或),当or连接的条件中有一个为真,or的结果就为真。执行代码如下:use 企业销售管理系统 select*from 职工where 工资2000 or 仓库号=wh1,not(非),表示将原条件取反,如果原条件为真,则加上not后就是假。执行代码如下:use 企业销售管理系统 select*from 职工where not 工资1500,3.1.4.3 运算符的优先级(P70),SQL语句各运算符的优先级如71页图31-2所示执行代码如下:use 企业销售管理系统 select*from 职工where(仓库号=wh1 or 仓库号=wh2)and not 性别=女 and 工资1300 and 工资2100,3.1.5 谓词in查询(P71),使用多个or运算符将使where子句过长,这时使用in就非常方便。使用or运算 select*from 订购单 where 职工号=zg1 or 职工号=zg11 or 职工号=zg15 使用谓词in select*from 订购单where 职工号in(zg1,zg11,zg15),3.1.6 模糊like查询(P72),有时我们不清楚所要查询的确切信息,如不能确定职工的姓名,只知道姓王,该如何查找。SQL提供了like关键字。执行以下代码:use 企业销售管理系统select*from 职工where 姓名like 王%select*from 职工where 姓名not like 王%select*from 职工where 姓名not like 王_,3.1.7 空值null查询(P74),很多情况下表中记录某一列的值是空值。空值null不能使用比较运算符,null代表的是未知,null不代表任何值。执行以下代码:use 企业销售管理系统select*from 职工 where 性别 is nullselect*from 职工 where 性别 is not null,3.1.8 限制范围betweenand查询(P75),限制范围可以使用大于等于号、小于等于号和and运算符三者来完成范围的限制,但使用betweenand结构会使SQL更清楚。use 企业销售管理系统select*from 职工 where 工资=1300 and 工资=1900使用限制范围select*from 职工 where 工资 between 1300 and 1900,3.1.9 消除重复字段数据distinct 查询(P75),使用关键字distinct可以从结果中除去重复的行 use 企业销售管理系统select 工资 from 职工select distinct 工资 from 职工,3.1.10 实例剖析-企业销售管理系统(P76),use 企业销售管理系统 select*from 供应商where 供应商名like%厂%select*from 订购单where 供应商号in(s1,s2,s5)and 金额between 8000 and 1600 and 订购日期=2004-09-02select 仓库号,城市 from 仓库 where 城市 is not null and 面积!=900,3.2 嵌套查询(P77),嵌套查询就是在一个select 查询语句中嵌套了另一个select子查询语句,即一个select查询结果作为另一个查询的一部分。,3.2.1 单表嵌套查询(P77),单表嵌套查询就是在一个select 查询语句中嵌套了另一个select 子查询语句首先利用select语句求出wh1仓库的面积,然后再显示面积大于该值的仓库信息。use 企业销售管理系统select*from 仓库where 面积(select 面积from 仓库where 仓库号=wh1)嵌套查询中也可以带有逻辑运算符、谓词in、like、betweenand等。,3.2.2 多表嵌套查询(P78),多表查询语句就是外层select 语句与内层select语句来源于不同的表use 企业销售管理系统select*from 职工where 仓库号in(select 仓库号from 仓库where 城市=北京)select*from 订购单where 职工号in(select 职工号from 职工where 仓库号in(select 仓库号from 仓库where 城市=北京),3.2.3 实例剖析-企业销售管理系统.实例4(P79),没有职工的仓库信息,就是该仓库中没有职工,哪个仓库号没有在职工表中出现。use 企业销售管理系统select*from 仓库where 仓库号not in(select 仓库号from 职工),实例剖析-企业销售管理系统.实例5(P80),显示供应商名中含有“青岛”两个字的供应商的订购单信息,并且不显示zg15和zg9职工的订单信息。use 企业销售管理系统select*from 订购单where 供应商号in(select 供应商号from 供应商where 供应商名like%青岛%)and 职工号not in(zg15,zg9),实例剖析-企业销售管理系统.实例6(P80),显示至少经手一次订单的职工信息use 企业销售管理系统select*from 职工where 职工号in(select 职工号from 订购单),实例剖析-企业销售管理系统.实例7(P80),显示城市不为空,工资在1200到2100之间,销售金额不在8000到1200之间的职工信息use 企业销售管理系统select*from 职工where 仓库号in(select 仓库号from 仓库where 城市is not null)and 工资between 1300 and 2100 and 职工号in(select 职工号from 订购单where 金额not between 8000 and 12000),实例剖析-企业销售管理系统.实例8(P81),显示工资在职工zg1到zg15工资之间的,职工所在城市为“北京”的职工信息use 企业销售管理系统select*from 职工where 工资between(select 工资from 职工where 职工号=zg1)and(select 工资from 职工where 职工号=zg15)and 仓库号in(select 仓库号from 仓库where 城市=北京),3.3 排顺查询(P81),查询显示结果一般按照数据被添加到表时的顺序显示,可是在实际运用中往往要求按指定的字段进行排序显示。,3.3.1 单级排序(P82),排序的关键字是order by,默认升序,升序关键字asc,降序排列关键字desc。use 企业销售管理系统select*from 职工 order by 工资 desc,3.3.2 多级排序(P82),先按工资降序,再按职工ID升序:use 企业销售管理系统select*from 职工 order by 工资 desc,职工ID asc,3.4 统计函数与别名查询(P83),实际应用中经常需要得到某项值的总和、平均值、最大值等,常用的函数有5个:count()统计个数sum()计算总和avg()计算平均值max()确定最大值min()确定最小值,3.4.1 与列名一起使用的统计函数(P84),use 企业销售管理系统select max(工资),min(工资),sum(工资),avg(工资),count(*)from 职工以上查询结果中统计值没有列名,用下面的代码可显示列名:select max(工资)as 最大工资,min(工资)as 最小工资,sum(工资)as 工资总和,avg(工资)as 平均工资,count(*)as 职工人数from 职工,3.4.2 带有统计函数的嵌套查询(P85),use 企业销售管理系统select*from 职工where 工资(select avg(工资)from 职工)select*from 职工where 工资(select avg(工资)from 职工where 仓库号=wh1 or 仓库号=wh2)and 姓名not like%亮%,3.4.3 统计函数字段中添加运算字段(P86),use 企业销售管理系统select*,(select avg(工资)from 职工)as 平均工资from 职工select 职工.*,(select avg(工资)from 职工)as 平均工资from 职工select 职工.*,(select avg(工资)from 职工)as 平均工资,工资-(select avg(工资)from 职工)as 与平均工资的差from 职工,3.5 分组查询(P86),分组查询的关键字是group by 在分组查询中要注意条件的运用,分组之前的条件要用where,分组之后的条件要用having,3.5.1 group by分组查询(P86),use 企业销售管理系统select max(工资)as 最大工资,min(工资)as 最小工资,sum(工资)as 工资总和,avg(工资)as 平均工资,count(*)as 职工人数from 职工group by 仓库号,分组查询中带有逻辑运算符,分组查询中带有逻辑运算符、谓词in、like、betweenend等首先用select求出职工zg1的工资,然后再分组显示统计信息。use 企业销售管理系统select max(工资)as 最大工资,min(工资)as 最小工资,sum(工资)as 工资总和,avg(工资)as 平均工资,count(*)as 职工人数from 职工where 工资(select 工资from 职工where 职工号=zg1)group by 仓库号,3.5.2 带有 having 的分组查询(P87),分组之前的条件要用where关键字,而分组之后的条件要用having关键字use 企业销售管理系统select max(工资)as 最大工资,min(工资)as 最小工资,sum(工资)as 工资总和,avg(工资)as 平均工资,count(*)as 职工人数from 职工group by 仓库号 having avg(工资)1760,在分组查询的having条件中带有逻辑运算符,在分组查询的having条件中带有逻辑运算符、谓词in、like、betweenanduse 企业销售管理系统select 仓库号,max(工资)as 最大工资,min(工资)as 最小工资,sum(工资)as 工资总和,avg(工资)as 平均工资,count(*)as 职工人数from 职工group by 仓库号having avg(工资)1760 and max(工资)-min(工资)between 380 and 800,3.5.3 带有分组的嵌套查询(P88),use 企业销售管理系统select*from 仓库where 仓库号in(select 仓库号from 职工group by 仓库号having max(工资)-min(工资)between 380 and 800),3.5.4 内外层嵌套实现分组功能(P88),显示不同职工经手订单金额最大的订单信息use 企业销售管理系统select a.*from 订购单 a where 金额=(select max(金额)from 订购单where 职工号=a.职工号),3.5.5 在分组查询字段中添加运算字段(P89),在职工表中添加职工所在仓库的平均工资值字段,就可以利用平均字段进行运算,大大提高编程速度。use 企业销售管理系统select a.*,(select avg(工资)from 职工where 仓库号=a.仓库号)as 所在仓库的平均工资 from 职工 a,在分组查询字段中添加运算字段,在select 查询中,还可以计算出每名职工的工资与职工所在仓库的平均工资之差use 企业销售管理系统select a.*,(select avg(工资)from 职工where 仓库号=a.仓库号)as 所在仓库的平均工资,工资-(select avg(工资)from 职工where 仓库号=a.仓库号)as 与所在仓库平均工资之差from 职工a,3.6 谓词与量词查询(P90),谓词in与not in,exists与not exists这两个谓词实现的功能相同,只是写法不同。常用量词有any、all、some,any 和some是同义词,3.6.1 exits 谓词查询(P90),用exists谓词实现use 企业销售管理系统select*from 仓库where not exists(select*from 职工where 仓库号=仓库.仓库号)用in谓词实现select*from 仓库where 仓库号not in(select 仓库号from 职工)查询结果相同,3.6.2 any 量词查询(P91),用any量词实现use 企业销售管理系统select*from 职工where 工资=any(select 工资from 职工where 仓库号=wh2)用统计函数实现select*from 职工where 工资=(select min(工资)from 职工where 仓库号=wh2)查询结果相同,3.6.3 all 量词查询(P92),all量词查询要求查询中所有行都使结果为真时结果才为真用all量词实现use 企业销售管理系统select*from 职工where 工资=all(select 工资from 职工where 仓库号=wh1)用统计函数实现select*from 职工where 工资=(select MAX(工资)from 职工where 仓库号=wh1)结果相同,3.7显示部分记录的top查询(P94),在编程中,有时只需要显示满足条件的几条记录,这时可以使用top关键字。可以直接使用top数字显示指定条数记录,也可以使用top数字percent显示满足条件记录的前百分之几条记录。use 企业销售管理系统select top 3*from 职工order by 工资desc,实例10,显示订单金额最低的前40%条订单信息use 企业销售管理系统select top 40 percent*from 订购单 order by 金额 asc,3.8 保存查询(P95),利用into语句可以把查询结果保存成一张新表。use 企业销售管理系统select*into 职工备份from 职工生成一张新表,表名是“职工备份”。,3.9 集合的并运算(P95),SQL支持集合的并运算(union),即可以将两个select语句的查询结果通过并运算合并成一个查询结果。为了进行并运算,要求这样的两个查询具有相同的字段个数,对应的字段值要出自同一个值域,即具有相同的数据类型和取值范围。use 企业销售管理系统select*from 仓库where 城市=北京 union select*from 仓库where 城市=上海,3.10 集合的交运算(P96),SQL支持集合的交运算(intersect),可以将两个select语句的查询结果通过交运算合并成一个查询结果。为了进行并运算,要求这样的两个查询具有相同的字段个数,对应的字段值要出自同一个值域,即具有相同的数据类型和取值范围。use 企业销售管理系统select 仓库号 from 仓库 intersect 仓库号 from 职工,3.11 连接查询(P96),连接就是将多个表中的数据结合到一起的查询,即可以在一个select 语句中完成从多个表中查找和处理的数据。使用连接的列必须具有相同的数据类型和相同的意义,3.11.1 笛卡尔积(P97),从原理上说,连接首先形成表的笛卡儿集,即形成用于连接的表中所有行的组合。use 企业销售管理系统select*from 职工,仓库,3.11.2 多表连接(P97),在进行多表连接时,一定要注意连接条件。use 企业销售管理系统select*from 职工,仓库where 职工.仓库号=仓库.仓库号,3.12 超连接查询(P98),超连接查询必须有两张或两张以上的表。超连接查询包括4种:内连接查询、左连接查询、右连接查询、全连接查询。可以把不满足条件的记录以null来显示。,3.12.1 内连接(P98),只有满足连接条件的记录才出现在查询结果中超连接select 仓库.仓库号,职工号,城市,面积,工资from 仓库inner join 职工on 职工.仓库号=仓库.仓库号and 面积600普通连接select 仓库.仓库号,职工号,城市,面积,工资from 职工,仓库where 职工.仓库号=仓库.仓库号and 面积600,3.12.2 左连接(P99),除满足连接条件的记录外,第一张表中不满足条件的记录也出现在查询结果集中。use 企业销售管理系统select 仓库.仓库号,职工号,城市,面积,工资 from 仓库 left join 职工 on 职工.仓库号=仓库.仓库号 and 面积600,3.12.3 右连接(P100),除满足连接条件的记录外,第二张表中不满足条件的记录也出现在查询结果集中。use 企业销售管理系统select 仓库.仓库号,职工号,城市,面积,工资 from 仓库 right join 职工 on 职工.仓库号=仓库.仓库号 and 面积600,3.12.4 全连接(P100),除满足连接条件的记录外,两张表中不满足连接条件的记录也出现在查询结果集中。use 企业销售管理系统select 仓库.仓库号,职工号,城市,面积,工资from 仓库full join 职工on 职工.仓库号=仓库.仓库号and 面积600,3.12.5 多表超连接(P101),要显示的字段来源于三张表,仓库表、职工表、订购单use 企业销售管理系统select 仓库.仓库号,职工.职工号,城市,面积,工资,金额from 仓库left join 职工on 职工.仓库号=仓库.仓库号right join 订购单on 职工.职工号=订购单.职工号and 面积600,3.1.3 SQL操作功能(P101),SQL操作功能主要包括对数据的插入、删除、更新三个方面的内容。,3.13.1 插入语句(P102),向数据表中插入数据,语法格式如下:insert into Tablename(column1,column2.)values(value1,value2)方括号为可选,指表的列名(字段名)。若列出了表的列名,在values中列出的添加的数据,其顺序必须与列出的列名的排列位置相对应。若没有列出表的列名,在values中列出的添加数据的顺序必须与表中列的顺序相对应,尤其要注意数据类型的一致。,3.13.1.1 指定所有列(P102),列出字段名 use 企业销售管理系统 insert into 仓库(仓库号,城市,面积,创建时间)values(wh6,郑州,800,2005-12-01)不列出字段名 insert into 仓库values(wh7,郑州,800,2005-12-01),3.13.1.2 指定部分列(P103),use 企业销售管理系统insert into 仓库(仓库号,面积)values(wh8,800),3.13.1.3 带有子查询的插入语句(P104),创建一张与仓库结构相同的空表use 企业销售管理系统select*into 仓库blank from 仓库where 面积600显示(7 行受影响),表示有7行已经插入到仓库 blank中,3.13.2 更新语句(P105),更新数据的语法:Update Tablename set columnname1=value1,columnname2=value2where condition关键字set之后是列和列的新值。关键字where可以有也可没有,如果不加条件,则修改了整个表的所有记录。,3.13.2.1 修改所有记录(P105),use 企业销售管理系统update 仓库set 面积=面积+100(8 行受影响)成功修改了表中的所有记录,3.13.2.2 指定条件的更新语句(P106),use 企业销售管理系统update 仓库set 面积=面积+100 where 城市=上海 or 城市=北京,3.13.3 删除语句(P106),删除数据的语法格式如下:delete from Tablename where conditiondelete语句不会删除表。delete语句不能删除单个列的值,而是删除整条记录。如果不加条件,则删除整张表中的所有记录。,3.13.3.1 指定条件的删除语句,use 企业销售管理系统delete from 仓库blank where 面积900,3.13.3.2 删除表中所有记录,用delete删除use 企业销售管理系统delete from 仓库blank用truncate删除use 企业销售管理系统truncate table 仓库blank,