数据库学习--数据查询

数据查询是数据库的核心操作。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>的值的升序和降序排序。

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

1.选择表中的若干列        (选择表中的全部或部分列即关系代数的投影运算)

(1)查询指定列

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

(2)查询全部列

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

(3)查询经过计算的值

SELECT子句的<目标列表达式>不仅可以是表中的属性列,也可以是表达式。(<目标列表达式>不仅可以是算术表达式,还可以是字符串常量、函数等,用户可以通过指定别名来改变查询结果的列标题,这对于含有算术表达式、常量、函数名的目标列表达式尤为有用)

2.选择表中的若干元组

(1)消除取值重复的行

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

(2)查询满足条件的元组

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

【1】比较大小

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

【2】确定范围

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

【3】确定集合

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

【4】字符匹配

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

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

其含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。

其中:%(百分号)代表任意长度(长度可以为0)的字符串。_(下划线)代表任意单个字符。

如果LIKE后面的匹配串中不含有通配符,则可以用=(等于)运算符取代LIKE谓词,用!=或<>(不等于)运算符取代NOT LIKE谓词。

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

如WHERE Cname LIKE 'DB\_Design'  ESCAPE'\'

ESCAPE'\'表示"\"为换码字符。这样匹配串中紧跟在"\"后面的字符“_”不再具有通配符的含义,转义为普通的“_”字符。

【5】涉及空值的查询

如 SELECT Sno,Cno

FROM SC

WHRER Grade IS NULL;(IS NOT NULL)

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

【6】多重条件查询

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

(3)ORDER BY子句

用户可以用ORDER BY子句对查询结果按照一个或者多个属性列的升序(ASC)或降序(DESC)排序,默认值为升序。(对于空值,排序时显示的次序由具体系统实现来决定。各个系统的实现可以不同,只要保持一致就行。例如:按升序排,含有空值的元组最后显示;按降序排,空值的元组则最先显示)

4、聚集函数

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

COUNT(*)                统计元组个数

COUNT([DISTINCT|ALL]<列名>)         统计一列中值的个数

SUM([DISTINCT|ALL]<列表>)           计算一列值的总和(此列必须是数值型)

AVG([DISTINCT|ALL]<列表>)         计算一列值的平均值(此列必须是数值型)

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

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

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

当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。

注意:WHERE子句中是不能用聚集函数作为条件表达式的,聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句

5.GROUP BY子句

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

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

WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值