SQL语言的数据查询之单表查询

数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:

SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>]...

FROM<表名或视图名> [,<表名或视图名>...] | (<SELECT语句>)[AS]<别名>

[WHERE<条件表达式>]

[GROUP BY<列名1>[HAVING<条件表达式>]]

[ORDER BY<列名2>[ASC | DESC]];

整个SELECT语句的含义是:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标表达式,选出元组中的属性值形成结果表。

如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚合函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。如果有ORDER BY子句,则结果表还要按<列名2>的值得升序(ASC)或降序(DESC)排序。

SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。

1. 单表查询

单表查询是指仅涉及一个表的查询。

(1) 选择表中的若干列

选择表中的全部或部分列即关系代数的投影运算。

a . 查询指定列

在很多情况下,用户只对表中的一部分属性列感兴趣,这时可以通过在SELECT子句的<目标列表达式>中指定要查询的属性列。

<目标列表达式>中各个列的选后顺序可以与表中的顺序不一致。用户可以根据应用的需要改变列的显示顺序。

b . 查询全部列

将表中的所有属性列都选出来有两种方法,一种方法就是在SELECT关键字后列出所有列名;如果列的显示顺序与其在基表中华的顺序相同,也可以简单地将<目标列表达式>指定为*。

c . 查询经过计算的值

SELECT子句的<目标列表达式>不仅可以是表中的属性列,也可以是表达式(还可以是字符串常量,函数等)。

(2) 选择表中的若干元组

a . 消除取值重复的行

两个本来并不完全相同的元组在投影到指定的某些列上后,可能会变成相同的行。可以使用DISTINCT消除它们。

如果没有指定DISTINCT关键词,则默认为ALL,即保留结果表中取值重复的行。

b . 查询满足条件的元组

查询满足指定条件的元组可以通过WHERE子句实现。WHERE子句常用查询条件如下表所示:

  •  比较大小

用于进行比较的运算符一般包括:=(等于),>(大于),<(小于),>=(大于等于),<=(小于等于),!=或<>(不等于),!>(不大于),!<(不小于)。

  • 确定谓词范围

谓词BETWEEN...AND...和NOT BETWEEN...AND...可以用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。

  • 确定集合

谓词IN可以用来查找属性值属于指定集合的元组;与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。

  • 字符匹配

谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:

[NOT]LIKE<匹配串>[ESCAPE ' < 换字符串 > ' ]

其含义是查找指定的属性列值与<匹配串>相匹配的元组。<元组串>可以是一个完整的字符串,也可以含有通配符%和_。其中:%(百分号)代表任意长度(长度可以为0)的字符串。(下横线)代表任意单个字符取代NOTLIKE谓词。

如果用户查询的字符串本身就含有通配符%或_,这时要使用ESCAPE‘<换码字符>’短语,对通配符进行转义了。

  • 涉及空值的查询

WHERE <列名> IS NULL

注意这里的“IS”不能用等于号(=)代替。

  • 多重条件的查询

逻辑运算符AND和OR可用连接多个查询条件。AND的优先级高于OR,但用户可以用括号改变优先级。

(3) ORDER BY子句

用户可以用户ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排序,默认值是升序。

对于空值,排序时显示的次序由具体系统实现来决定。例如按升序排,含空值的元组最后显示;按降序排,空值的元组则最先显示。各个系统的实现可以不同,只要保持一致就行。

(4) 聚集函数

为了进一步的方便用户,增加检索功能,SQL提供了许多聚集函数,主要有:

COUNT(*) 统计元组个数

COUNT([DISTINCTIALL]<列名>) 统计列中值得个数

SUM([DISTINCT JALL]<列名>)计算一列值得总和(此列必须是数值型)

AVG(LDISTINCTIALL<列名>)计算一列值得平均值(此列必须是数值型)

MAX([DISTINCT|ALL]<列名>)求一列值中的最大值

MIN([DISTINCT|ALL]<列名>)求一列值中的最小值

如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为默认值),则表示不取消重复值。

当聚集函数遇到值时,除了COUNT(*)外,都跳过空值而只处理非空值。COUNT(*)是对外元组进行记数,某个元组的一个或部分列取空值不影响COUNT的统计结果。WHERE子句是不能用聚集函数作为条件表达式的。聚集函数只能用SELECT子句和GROUP BY中的HAVING子句。

(5) GROUP BY子句

GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。

对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。

如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语进行筛选条件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xclincer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值