初级SQL开发指南.docx

上传人:b****5 文档编号:6696645 上传时间:2023-01-09 格式:DOCX 页数:55 大小:38.72KB
下载 相关 举报
初级SQL开发指南.docx_第1页
第1页 / 共55页
初级SQL开发指南.docx_第2页
第2页 / 共55页
初级SQL开发指南.docx_第3页
第3页 / 共55页
初级SQL开发指南.docx_第4页
第4页 / 共55页
初级SQL开发指南.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

初级SQL开发指南.docx

《初级SQL开发指南.docx》由会员分享,可在线阅读,更多相关《初级SQL开发指南.docx(55页珍藏版)》请在冰豆网上搜索。

初级SQL开发指南.docx

初级SQL开发指南

邮箱地址zht114001@作者:

zhtbs

 

初级SQL开发指南

Select语句概要

数据库中数据的提取(查询)使用select语法,主要有以下几点作用

●提取的数据(搜索)

●提取的数据进行排序(排序)

●执行计算或汇总

Select文表达方法

Select列名1,列名2←查询要显示的列结果

From表名←数据库中表名

Where查询条件←条件表达式

SQL文处理Select语句顺序步骤

我们将说明数据库在处理查询的时候,不同阶段都会产生中间结果表.这些产生出来的中间结果表都是在数据库后台运行的我们无法观察到.我们最终看到的数据就是最后的中间结果表.从句from从数据库中检索出来第一个中间结果表开始,到select从句结束.分为以下几步

From指定查询的表

1通过from关键字将要查询的表中的所有数据读

取到中间结果表。

(包括表中所有数据行与列,行

数不变,列数不变)

Where选择满足条件的行

2在where关键字后面加上要读取数据的条件,生

成一个新的中间结果表。

Groupby分组

3如果业务需要分组,可以通过Groupby将视图进

行分组,在次生成一个新的中间结果表。

having分组条件

4使用having关键字为分组后的逻辑视图进行条件

筛选,来生成一个中间结果表。

select选择列

5通过select语句在最终的中间结果表中选择列。

查询数据时,数据库后台中间结果表变化过程

我们将从数据库在执行SQL查询计划的时候,数据库内部的变化与运行的原理来理解SQL语句执行过程.(数据库中分为2种视图,1为物理视图通过createview语句创建,2为逻辑视图,就是我们提到的中间结果表)

(人员信息表)

编号

名称

部门

职务

年龄

性别

电话

122

李晶晶

人力

职员

26

2234555

123

张金

人力

职员

29

3322123

124

王力

机材

经理

35

2245553

125

李心

机材

职员

21

3332233

例:

给出所有职务为职员的用户名称,部门,电话.

步骤一执行from表名称(人员信息表),数据库会在(人员信息表)表中进行一个全表扫描,将所有表信息放入一个逻辑视图中,逻辑视图包括表中的全部的行于列的数据.

步骤一产生的中间结果表

122

李晶晶

人力

职员

26

2234555

123

张金

人力

职员

29

3322123

124

王力

机材

经理

35

2245553

125

李心

机材

职员

21

3332233

步骤二通过where职务=职员的判断条件将步骤一中产生的逻辑视图的数据进行过滤,将满足条件的行产成一个新的逻辑视图.

步骤二产生的中间结果表

122

李晶晶

人力

职员

26

2234555

123

张金

人力

职员

29

3322123

125

李心

机材

职员

21

3332233

步骤三通过select名称,部门,电话语句把步骤二的逻辑视图中,名称,部门,电话列的数据取出生成一个新视图.select语句指定那些列必须出现在最终逻辑视图中.

步骤三产生的中间结果表

李晶晶

人力

2234555

张金

人力

3322123

李心

机材

3332233

步骤四将产生的逻辑视图发送到客户端.完成本次SQL查询计划.

SQL编写顺序与逻辑视图生成过程.

Select名称,部门,电话←步骤三生成最终逻辑视图

From员工信息表←步骤一生成全表逻辑视图

Where职务=职员←步骤二生成符合条件的逻辑视图

 

多表信息查询表达方法

Select表1.列名,表2.列名←选择要表示的列

From表1,表2←要合并查询的表

Where表1.ID1=表2.ID1←多表连接条件

 

当多个表进行联合查询的时候,会发生一张表(A)中的数据行乘以别一张表(B)中的数据行,也就是A*B=所有查询数据.该结果产生的合并表数据被我们称为笛卡儿积.通常笛卡儿积会产生很多重复行的数据,我们要使用连接条件也就是A表和B表中指定的连接列来过滤掉重复和多余的笛卡儿积.

SELECT选择列

生成最终结果

1通过from关键字后的表名称,到数据库中将

表A和表B两个表中所有表数据取出到两个对应

的中间结果表中.

 

2数据库会将两个中间结果表合成一个中间结果表,

而生成的这个中间结果表就是我们说的笛卡儿积.它

的数据内容就是A表的中间结果*B表的中间结果.为

A*B的数学关系

 

3在笛卡儿积中间结果表中通过where关键字选择符

合列连接条件或者满足条件的行,将符合条件的行再

生成一个中间结果表.

 

4在中间结果表中通过select关键字选择列,生成最终

中间结果表,把它传给客户端.

 

多表合并查询时数据库后台中间结果表变化过程

(人员信息表)

编号

名称

部门ID

年龄

性别

电话

122

李晶晶

1

26

2234555

123

张金

1

29

3322123

124

王力

2

35

2245553

125

李心

3

21

3332233

(部门信息表)

部门ID

部门名称

部门简称

1

人力资源部

人力

2

运行维护部

运维

3

财务部

财务

例:

查询部门简称为财务的人员信息,信息包括人员名称,部门简称,部门名称,性别,电话

步骤一执行from人员信息表,部门信息表.数据库对(人员信息表),(部门信息表)2张表进行一个全表扫描.然后将2个表的数据生成一个笛卡儿积的逻辑视图.执行这个(select*from人员信息表,部门信息表)SQL不加连接列条件我们就可以看到一个笛卡儿积数据.

 

步骤一产生的中间结果表的笛卡儿积

编号

名称

部门ID

年龄

性别

电话

部门ID

部门名称

部门简称

122

李晶晶

1

26

2234555

1

人力资源部

人力

122

李晶晶

1

26

2234555

2

运行维护部

运维

122

李晶晶

1

26

2234555

3

财务部

财务

123

张金

1

29

3322123

1

人力资源部

人力

123

张金

1

29

3322123

2

运行维护部

运维

123

张金

1

29

3322123

3

财务部

财务

124

王力

2

35

2245553

1

人力资源部

人力

124

王力

2

35

2245553

2

运行维护部

运维

124

王力

2

35

2245553

3

财务部

财务

125

李心

3

21

3332233

1

人力资源部

人力

125

李心

3

21

3332233

2

运行维护部

运维

125

李心

3

21

3332233

3

财务部

财务

步骤二通过连接列条件取出步骤一逻辑视图中符合条件的行,生成一个新的逻辑视图.连接列条件为where人员信息表.部门ID=部门信息表.部门ID

 

步骤二产生的中间结果表

编号

名称

部门ID

年龄

性别

电话

部门ID

部门名称

部门简称

122

李晶晶

1

26

2234555

1

人力资源部

人力

123

张金

1

29

3322123

1

人力资源部

人力

124

王力

2

35

2245553

2

运行维护部

运维

125

李心

3

21

3332233

3

财务部

财务

步骤三通过判断条件and部门信息表.部门简称=财务取出上一个逻辑视图中符合条件的行.生成一个新的逻辑视图

步骤三产生的中间结果表

编号

名称

部门ID

年龄

性别

电话

部门ID

部门名称

部门简称

125

李心

3

21

3332233

3

财务部

财务

步骤四通过select人员信息表.人员名称,部门信息表.部门简称,人员信息表.部门信息表.部门名称,人员信息表.性别,人员信息表.电话选择要列,生成一个最终逻辑视图.

步骤四最终中间结果表

名称

部门名称

部门简称

性别

电话

李心

财务部

财务

3332233

步骤五将产生的逻辑视图发送到客户端.完成本次SQL查询计划.

SQL编写顺序与逻辑视图生成过程.

Select人员信息表.人员名称,←步骤四选择列

部门信息表.部门简称,

人员信息表.部门名称,

人员信息表.性别,人员信息表.电话

From人员信息表,部门信息表←步骤一合并表数据

Where人员信息表.部门ID=部门信息表.部门ID←步骤二选择部门ID相等行

And部门信息表.部门简称=财务←步骤三选择部门名称为财务的行

 

总结

通过上面的介绍,我们知道了数据库在执行查询SQL计划时逻辑视图变化过程.我们在编写查询计划的时候,需要按照逻辑视图变化过程来编写,先写from再写where最后select这个顺序.在多表的时候,需要where来指定表的接合条件来过滤笛卡儿积.

 

多表合并查询时候的内连接与外连接

在上面我们使用多表查询的时候,对笛卡儿积的处理是使用where加列连接条件.这种方法也被称为隐性连接.在SQL标准语句中有一种from从句的扩展方法可以直接完成上面的功能.这种从句的扩展方法也被成为显性内连接.关键字为innerjoinon后边指定连接条件。

Innerjoin表达方法

Select表1.列名,表2.列名←要选择的列

From表1innerjoin表2on表1.ID1=表2.ID1

Where行选择条件

 

数据库中有以下2张表

(人员信息表)

编号

名称

部门ID

年龄

性别

电话

122

李晶晶

1

26

2234555

123

张金

1

29

3322123

124

王力

2

35

2245553

125

李心

3

21

3332233

 

(部门信息表)

部门ID

部门名称

部门简称

1

人力资源部

人力

2

运行维护部

运维

3

财务部

财务

运行以下SQL文

SELECT*

FROM人员信息表innerjoin部门信息表on人员信息表.部门ID=部门信息表.部门ID

 

-获得结果-

编号

名称

部门ID

年龄

性别

电话

部门ID

部门名称

部门简称

122

李晶晶

1

26

2234555

1

人力资源部

人力

123

张金

1

29

3322123

1

人力资源部

人力

124

王力

2

35

2245553

2

运行维护部

运维

125

李心

3

21

3332233

3

财务部

财务

From可以通过内连接直接获得到要得到的数据结果,而不产生笛卡儿积现象.

SELECT*

FROM人员信息表,部门信息表

WHERE人员信息表.部门ID=部门信息表.部门ID

 

我们也可以通过上面WHERE列连接条件的方法得到一个与内连接(innerjoinon)相同的数据结构.可以说WHERE列连接条件和(innerjoinon)都是内连接.Where是隐性连接,(innerjoinon)为显性连接,大家可以根据个人习惯来选择那种方式来进行多表连接.

内连接分为2种连接方法

1显性连接,FROMINNERJOINON

2隐性连接,where列的关联条件。

在低版本数据库中,显性连接和隐性连接执行效率上会有差别,在现在的数据库中基本没有区别了。

完全根据个人习惯或者项目要求来选择使用哪种连接方式。

外连接

虽然我们学会使用了内连接,但是还有很多复杂情况内连接无法解决.SQL还给我们提供了一种连接方法叫外连接.在外连接的表合并过程中,我们要定义一个驱动表,以驱动表为基础与其他表进行多表合并的过程叫外连接.外连接分为左连接和右连接,

显性连接from(LEFTJOINON列连接条件,RIGHTJOINON列连接条件)

隐性连接where列连接条件(+)=列连接条件,列连接条件=列连接条件(+)表示.

SQL表达方式

显性连接

SELECT*

FROM表1(leftorright)join表2on表1.ID1=表2.ID1

WHERE选择行条件

 

隐性连接

SELECT*

FROM表1,表2

WHERE表1.ID1=表2.ID1(+)and选择行条件

或者表1.ID1(+)=表2.ID1and选择行条件

 

如果你想以表1为驱动表就在where表1=表2(+)为左表连接

如果你想以表2为驱动表就在where表1(+)=表2为右表连接

数据库有以下3张表

(人员信息表)

编号

名称

部门ID

年龄

职务ID

性别

电话

122

李晶晶

1

26

1

2234555

123

张金

1

29

null

3322123

124

王力

2

35

1

2245553

125

李心

3

21

2

3332233

126

鲁兰

null

232

null

3486443

(职务信息表)

职务ID

职务名称

1

职员

2

经理

(部门信息表)

部门ID

部门名称

1

人力资源部

2

运行维护部

3

财务部

执行以下SQL时

SELECT*

FROM人员信息表leftjoin职务信息表on人员信息表.职务ID=职务信息表.职务ID

或者

SELECT*

FROM人员信息表,职务信息表

WHERE人员信息表.职务ID=职务信息表.职务ID(+)

 

-获得结果-

编号

名称

部门ID

年龄

职务ID

性别

电话

职务ID

职务名称

122

李晶晶

1

26

1

2234555

1

职员

123

张金

1

29

null

3322123

null

null

124

王力

2

35

1

2245553

1

职员

125

李心

3

21

2

3332233

2

经理

126

鲁兰

null

232

null

3486443

null

null

我们以人员信息表为驱动表进行多表合并查询.驱动表所有信息全部显示,和职务表没有关联条件人员信息也将被查询出来.如果我们使用内连接,和职务表没有关联的那条信息将无法被查询出来。

上面的结果粉色部分数据在内连接的时候不能被查询出来。

只有我们以人员信息表为驱动表进行外连接才可以得到上面的数据。

例:

查询出部门名称不能为空的所有女性的员工名称,部门名称,职务名称信息.

SQL执行过程如下图所示

部门信息表

职务信息表

人员信息表

 

部门ID为内连接条件

 

人员信息表与

部门信息表内连接中间结果表

 

职务ID为外连接条件

 

人员与部门的中间结果表和职务信息表外联合并中间结果表

 

在中间结果表中选择所有性别为女性的行,生成新的中间结果表

 

在中间结果表中选择列

 

隐性连接SQL文

SELECT人员信息表.名称,部门信息表.部门名称,职务表.职务名称

FROM人员信息表,部门信息表,职务表

WHERE人员信息表.部门ID=部门信息表.部门ID人员表与部门表进行内连接

AND人员信息表.职务ID=职务表.职务ID(+)与职务表进行外连接

AND人员信息表.性别=女

 

显性连接SQL文

SELECT人员信息表.名称,部门信息表.部门名称,职务表.职务名称

FROM人员信息表innerjoin部门信息表

on人员信息表.部门ID=部门信息表.部门ID

leftjoin职务表on职务表.职务ID=人员信息表.职务ID

WHERE人员信息表.性别=女

 

步骤一在(人员信息表)与(部门信息表)表中执行一个内连接,内连接会将人员表中部门ID为空的人员信息从中间结果表中过滤掉.

步骤一产生的中间结果表

编号

名称

部门ID

年龄

职务ID

性别

电话

部门ID

部门名称

122

李晶晶

1

26

1

2234555

1

人力资源部

123

张金

1

29

3322123

运行维护部

124

王力

2

35

1

2245553

1

运行维护部

125

李心

3

21

2

3332233

2

财务部

步骤二中间结果表于(职务信息表)执行一个外连接,中间结果表为驱动表.驱动表中即使职务id为空,新生成的中间结果表也会这条信息保存下来.

步骤二产生的中间结果表

编号

名称

部门id

年龄

职务id

性别

电话

部门id

部门名称

职务id

职务名称

122

李晶晶

1

26

1

2234555

1

人力资源部

1

职员

123

张金

1

29

3322123

运行维护部

124

王力

2

35

1

2245553

1

运行维护部

1

职员

125

李心

3

21

2

3332233

2

财务部

2

经理

步骤三选择性别为女的所有行生成中间结果表.虽然职务有空值出现,但是通过外联它还是可以不被过滤掉.

步骤三产生的中间结果表

122

李晶晶

1

26

1

2234555

1

人力资源部

1

职员

123

张金

1

29

3322123

运行维护部

125

李心

3

21

2

3332233

2

财务部

2

经理

步骤四选择要显示的列,生成最终中间结果表,将显示给客户端.

步骤四产生的中间结果表

名称

部门名称

职务名称

李晶晶

人力资源部

职员

张金

运行维护部

李心

财务部

经理

Select表达式

select表达式也是一种常量,它会对应某种数据类型.如数字,字符串,日期,时间等.这些有自己属性类型的表达式,也叫标量表达式.除了标量表达式之外,还有行表达式和表表达式.行表达式是由一组标量表达式组成的,每个行表达式都有一个或多个标量表达式.有多个或者一个行表达式组成的表达式为表表达式也叫表值.

表达式的分类

●标量表达式

●行表达式

●表表达式

(人员工资表)

人员名称

基本工资

奖金

罚款

补助

张淋淋

1200

750

50

120

马越

800

200

10

120

李洋

900

350

40

120

SELECT人员名称(标量表达式),基本工资(标量表达式),奖金(标量表达式),补助(标量表达式)

FROM人员工资表

Select关键字选择的列部分就是一个标量表达式.你可以将中间结果表每个列单元格看成为一个标量表达式.

每个行中的列单元就是一个标量表达式

-获得结果-

人员名称

基本工资

奖金

补助

张淋淋

1200

750

120

马越

800

200

120

李洋

900

350

120

 

由多个标量表达式组成的一行数组,为行表达式

张淋淋

1200

750

120

 

这4个标量表达式组成了一个行表达式

由一个或多个行表达式构成了表表达式

张淋淋

1200

750

多个行表达式组成

120

马越

800

200

120

李洋

900

350

120

我们对行表达式和表表达式也可以叫做复合行表达式.

标量表达式操作

标量表达式就是select关键字后面的列要表达的信息部分.如果2个标量表达式类型相同可以进行运算,合并或者拼接成字符串.如果标量表达式类型不一样,也可以将它们拼接成字符串.注意select后面的列不可以出现复合行(行表达式,表表达式)

例给出所有人员名称和他们当月工资总合.

SQL文

SELECT人员名称,(基本工作+奖金+补助)三个标量表达式相加计算生成一个新的标量表达式

FROM人员工资表

 

步骤一from关键字将人员工资表中的信息,取到一个中间结果表中.

步骤一产生的中间结果表

人员名称

基本工资

奖金

罚款

补助

张淋淋

1200

750

50

120

马越

800

200

10

120

李洋

900

350

40

120

步骤二SELECT关键字表示了我们要生成一个有人员名称和基本工资列+奖金列+补助列总和为一列的最终结果表.首先数据库会把中间结果表中的每个行表达式中基本工资列上的数据,奖金列上的数据,补助列上的数据进行相加.把相加的结果放在一个新列中.生成一个新的中间结果表。

步骤二产生的中间结果表

人员名称

基本工资

奖金

补助

产生的新列

张淋淋

1200

750

120

2070

马越

800

200

120

1120

李洋

900

350

120

1370

3个列相加的和等于新列的值

步骤三在新的中间结果表中抽取人员名称列和新产生的列为最终结果表。

发送给客户端。

-获得结果-

人员名称

(基本工资+奖金+补助)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1