MySQL第三章——单表查询
数据查询
数据查询是数据库的核心操作,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)查询指定列——通过在SELECT字句的<目标列表达式>中指定要查询的属性列。
<目标列表达式>中各个列的先后顺序可以与表中的顺序不一样。
(2)查询全部列——将表中的所有属性列都选出来有两种方法,一种是在SELECT 关键字后列出所有列名;如果列的显示顺序与其在表中的顺序相同,也可以简单将<目标表达式>指定为*。
(3)查询经过计算的值—— SELECT字句的<目标列表达式>不仅可以是表中的属性列,也可以是表达式。还可以是字符串常量、函数等。 用户可以通过指定别名来改变查询结果的列标题。
2. 选择表中的若干元祖
(1)消除取值重复的行——两个本来并不完全相同的元组 在投影到指定的某些列上后,可能会变成相同的行。可用 DISTINCT 消除它们。(在 SELECT 后面加上 DISTINCT <列名>)。如果没有指定 DISTINCT 则默认为ALL ,即保留结果表中取值重复的行。
(2)查询满足条件的元组——通过WHERE 字句来实现。
注意:
BETWEEN 后面跟数据小的那一个(低值/范围的下限) AND后面跟的是数据较大的那一个(高值/范围的上限)
谓词IN可以用来查找属性值属于指定集合的元组。
谓词 LIKE 用来进行字符串的匹配——[NOT] LIKE '<匹配串>' [ESCAP '<换码字符>']——含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符,也可以是含有通配符%和_。(%:代表任意长度的字符串,字符串可以为0,例如a%b是以a开头并且以b结尾的任意长度的字符串;_:代表任意单个字符,例如a_b表示以a开头并且以b结尾的长度为3的任意字符串。),如果 LIKE 后面的匹配串中不含通配符,则可以用=符号取代 LIKE 谓词;用!=或<>(不等于)取代 NOT LIKE 谓词。
如果查询的字符串本身含有通配字符%或_,这时需要使用ESCAPE '<换码字符>' 短语对通配符进行转义:ESCAPE'\' 表示“\”为换码字符。这样匹配串中紧跟在“\”后面的字符“_”不再具有通配符的含义,转为普通的“_”字符。
多重条件查询——逻辑运算 AND 和 OR 可用来连接多个查询条件。AND 的优先级高于OR ,但用户可以用括号改变优先级。
3. ORDER BY 字句
用户可以用 PRDER BY 字句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值是升序。对于空值,排序时显示的次序由具体的系统实现来决定。(按升序,含空值的元组最后显示;按降序,空值的元组最先显示)
4. 聚集函数——为了增强检索功能,SQL提供了许多聚集函数。
当聚集函数遇到空值时,出来 COUNT(*) 外,都跳过空值而只处理非空值。COUNT(*) 是对元组进行计数,某个元组的一个或部分列取空值不影响 COUNT 的统计结果。
WHERE 字句是不能用聚集函数作为条件表达式的,聚集函数只能用于 SELECT 字句和 GROUP BY 字句中的 HAVING 字句。
5. GROUP BY 字句
将查询结果按某一列或多列的值分组,值相等的位一组。对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果,分组后聚集函数将作用于每一个组,即每一组都有一个函数值。
(WHERE 字句与 HAVING 短语的区别在于作用对象不同。WHERE 字句作用于基本表或者视图,从中选择满足条件的元组。HAVING 短语作用于组,从中选择满足条件的组)。