SQL 基础查询

发布于 2020-07-20 18:16:14   阅读量 56  点赞 0  

一、基本查询

SELECT是所有 SQL 查询的基础。

1. 基本的 SELECT 查询

SELECT <字段1>,<字段2>, ...
FROM <表名>;

查询结果中列的顺序与SELECT子句中顺序相同

 也可以使用通配符*输出所有的列信息:

SELECT * FROM <表名>;



2. AS 设置查询结果

 使用AS子句能够设置查询结果:

1. SELECT子句中设置列的别名

SELECT <字段1> AS <别名1>,
       <字段2> AS <别名2>,
          ...
FROM <表名>;

其中别名中有中文字符时,必须使用" "作为引号;而数据中的中文字符则无需使用双引号。


2. FROM子句中设置表的别名

SELECT ...
FROM <表名> AS <别名>;

为表起别名大都是为了在 SQL 语句中能简短地访问表名,如:

SELECT S.name,S.school,S.score
FROM StudentTable AS S
WHERE S.score = 85;

顺带一提,不使用别名也能够用<表名>.<字段>访问表的字段:

SELECT StudentTable.name
FROM StudentTable
WHERE StudentTable.score = 85;


3. SELECT子句中设置查询结果的值:

SELECT <value1> AS <字段1>,
       <value2> AS <字段2>,
          ...
FROM <表名>;

其中可以将值设置为常数数字常数字符串常数日期常数),也可以为计算式。



3. DISTINCT 删除结果中的重复行

 在SELECT语句中使用关键字DISTINCT可以删除重复行。

SELECT DISTINCT <字段1>,<字段2>,...
FROM <表名>;

DISTINCT关键字只能出现一次,能够作用于多个列名;但只能出现在第一个列名之前。

DISTINCT后面跟着多个列名,则只有这多个字段的值都重复的数据才会在最终结果中被删除。

在使用DISTINCT时,NULL被视为一类数据,若多条数据的值都为NULL,则会被视为值是重复的。



4. WHERE 条件查询

 在SELECT查询的时候可以使用WHERE子句指定查询条件。

SELECT <字段1> ...
FROM <表名>
WHERE <条件表达式>;

 数据库首先通过WHERE子句查询出符合条件的记录,然后再选取出SELECT语句指定的列。

WHERE子句中不能使用聚合函数;只有SELECTHAVINGORDER BY子句中能使用



二、聚合查询

1. 聚合函数

 用于汇总的函数称为聚合函数。所谓聚合,就是统计查询到的记录,输入多行输出一行。

函数 作用
COUNT 计算表中的记录数
SUM 计算某一数值列中的合计值
AVG 计算某一数值列中的平均值
MAX 计算某一列中数据的最大值
MIN 计算某一列中数据的最小值

 聚合函数的使用需搭配SELECT语句,传入一个字段名(但不能传入多个字段)。如:

SELECT count(id)
FROM test_table;


函数COUNT()的参数可为*,但只有COUNT()函数能用*作为参数。且COUNT(<列名>)将会得到非NULL的记录数;COUNT(*)会得到包含NULL的记录数(对于表中只有一列且都为NULL的情况也是如此)。

对于所有的聚合函数,若以列名为参数,则在计算之前会把NULL数据排除在外。(故SUM函数结果不会为NULL

SUM/AVG函数只能用于数值型数据,而MAX/MIN函数能用于任何类型的列。

聚合函数可在参数中使用关键字DISTINCT来删除对重复值的计算

SELECT COUNT(DISTINCT <字段名>)
FROM <表名>;



2. GROUP BY 分组

 可以使用GROUP BY子句将表分成几组,然后再汇总处理,分组的结果相当于将表划分为几个子表。在GROUP BY中指定的列称为聚合键分组列

SELECT <字段>/<聚合函数调用> ...
FROM <表名>
GROUP BY <字段1>,<字段2> ... ;

GROUP BY子句的书写位置有严格要求:

SELECT → FROM → WHERE → GROUP BY


① SELECT 中只能出现聚合键

 实际上,SELECT子句中只能出现以下三种元素:

  1. 常数

  2. 聚合函数

  3. GROUP BY子句中指定的列(即聚合键)

 即在使用GROUP BY子句时,不能将聚合键之外的列名书写在SELECT子句之中

 通俗地理解,通过GROUP BY后的结果都是基于聚合键的汇总处理,而不属于聚合键的列与聚合键之间并不一定有一对一关系。



② GROUP BY 子句中不能写列的别名

SELECT子句中能够通过AS关键字来指定别名,但在GROUP BY子句中不能使用列的别名。

 这个限制是由于DBMS在执行 SQL 时的顺序导致的,DBMS会先执行GROUP BY子句对表进行切割,所以在执行GROUP BY时并不知道列的别名。



3. HAVING 为聚合结果指定条件

 使用WHERE子句能够指定记录(行)的条件;而在使用GROUP BY时要为分组指定条件,则需要使用HAVING子句。

SELECT <字段1>,<字段2>, ...
FROM <表名>,
WHERE <筛选记录的条件>
GROUP BY <字段1>,...
HAVING <分组结果对应的条件>;

HAVING子句必须写在GROUP BY之后(HAVING只有在使用GROUP BY时才能使用),其在DBMS内部的执行顺序也排在GROUP BY子句之后。

 在HAVING子句中书写一个关于聚合函数的条件判断,以对分组进行筛选,不满足这个条件的分组不计入统计。如:

SELECT score,count(*)
FROM students
GROUP BY score,
HAVING sum(score)>1000;

 以上语句查询出分数总和超过1000的各分数总人数。



① HAVING 子句的构成要素

HAVING子句与包含GROUP BY子句的SELECT语句一样,对于能够使用的元素有一定限制。限制内容同样为:

  1. 常数

  2. 聚合函数

  3. GROUP BY子句中指定的列(即聚合键)

即要能提现组别间的特征。



② 聚合键对应的条件更适合写在 WHERE 中

 有些条件即能够写在HAVING子句中,又可以写在WHERE子句中,称这样的条件为聚合键所对应的条件。即聚合键上的条件,既可以写在HAVING子句中,又可以写在WHERE子句中。

 通常情况下,聚合键对应的条件应该写在WHERE子句中,原因有二:

  1. 能够使 SQL 语句的目的更加明确;

  2. 将条件写在WHERE子句中要比写在HAVING子句中的处理速度更快,返回结果所需时间更短。



三、ORDER BY 对查询结果排序

SELECT语句的查询结果的排列顺序默认是随机的,若要指定顺序,可以使用ORDER BY子句对查询结果进行排序。:

SELECT <字段1>,<字段2>,<字段3>, ...
FROM <表名>
ORDER BY <排序基准列1>,<排序基准列2>, ...

ORDER BY子句需要写在SELECT语句的末尾,这是因为对查询结果的排序是在结果即将返回时执行。

 在ORDER BY子句中书写的列名称为排序键。



1. 指定升序或降序

 指定顺序或降序需要在排序键后面添加关键字

  1. ASC:升序

  2. DESC:降序

例:

SELECT product_id,product_name,sale_price
FROM product
ORDER BY sale_price DESC;

未指定OREDER BY子句中的排列顺序时,回默认使用升序进行排序。

由于ASCDESC是以列为单位指定的,因此可以同时指定一个列为升序,指定其他列为降序。



2. 指定多个排序键

 当在ORDER BY中指定了多个排序键时,优先使用左侧的键,若该字段存在相同值的话,再接着参考右侧的键。



3. NULL 的顺序

 当使用含有NULL的键作为排序键时,NULL会在结果的开头或末尾汇总显示。而至于究竟是在开头还是结尾显示,并没有特殊规定。



4. 在排序键中使用别名

 在GROUP BY语句中不能使用SELECT子句中定义的别名,但在ORDER BY子句中却允许使用别名。这是由于SELECT子句的执行顺序在GROUP BY子句之后,在ORDER BY子句之前

所有子句中只有ORDER BY子句能够使用别名。



5. GROUP BY 子句中可以使用的列

 在ORDER BY子句中可以使用SELECT子句中未使用的列与聚合函数。



6. 不要使用列编号

列编号是指SELECT子句中列按照顺序从左到右排序时的序号。在ORDER BY子句中,还可以使用列编号指定排序键。

 虽然列编号使得语句编写起来方便,但不推荐在ORDER BY子句中使用列编号:

  1. 代码阅读起来困难

  2. 在新版的标准已明确指出将会删除列编号排序功能。



四、语句顺序

 语句的顺序分为书写顺序执行顺序。书写顺序为在 SQL 语句中各子句的编写顺序;执行顺序为各子句的执行顺序,理解执行顺序能够理解 SQL 与DBMS的各种特性。

  1. 书写顺序:
    SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
    

  2. 执行顺序:
    FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
    


Last Modified : 2020-07-26 02:13:15