SELECT语句基础
- 从表中选取数据
SELECT
子句中列举了希望从表中查询出的列的名称,而FROM子句则指定了选取出数据的表的名称。SELECT <列名>, FROM <表名>;
- 从表中选取符合条件的数据
SELECT
语句通过WHERE
子句来指定查询数据的条件。在WHERE
子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。SELECT <列名>, …… FROM <表名> WHERE <条件表达式>;
说明:
SELECT *
代表选取全部列- 汉语别名需要使用双引号(")括起来
- 可使用
DISTINCT
删除重复行 - 一行注释"–";多行注释"/* */"
算术运算符和比较运算符
- 算术运算符
含义 运算符 加 + 减 - 乘 * 除 / - 比较运算符
含义 运算符 相等 = 不想等 <> 大于等于 >= 大于 > 小于等于 <= 小于 <
说明:
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符
逻辑运算符
- NOT运算符
NOT
运算符可以否定一个条件可以得到相反查询条件的结果 - AND运算符 & OR运算符
AND
相当于**“并且”,类似数学中的取交集;
OR
相当于“或者”**,类似数学中的取并集。
说明:
括号内的运算优先,括号可改变运算顺序
- 真值表
说明:
NULL的真值结果既不为真,也不为假,而是第三种值——不确定(UNKOWN)
对表进行聚合查询
- 聚合函数
SQL中用于汇总的函数叫做聚合函数。以下五个是最常用的聚合函数:COUNT
:计算表中的记录数(行数)SUM
:计算表中数值列中数据的合计值AVG
:计算表中数值列中数据的平均值MAX
:求出表中任意列中数据的最大值MIN
:求出表中任意列中数据的最小值
-- 计算全部数据的行数(包含NULL) SELECT COUNT(*) FROM product; -- 计算NULL以外数据的行数 SELECT COUNT(purchase_price) FROM product; -- 计算销售单价和进货单价的合计值 SELECT SUM(sale_price), SUM(purchase_price) FROM product; -- 计算销售单价和进货单价的平均值 SELECT AVG(sale_price), AVG(purchase_price) FROM product; -- MAX和MIN也可用于非数值型数据 SELECT MAX(regist_date), MIN(regist_date) FROM product;
说明:
COUNT
函数的结果根据参数的不同而不同。COUNT(*)
会得到包含NULL的数据行数,而COUNT(<列名>)
会得到NULL之外的数据行数- 聚合函数会将NULL排除在外。但
COUNT(*)
例外,并不会排除NULL MAX/MIN
函数几乎适用于所有数据类型的列。SUM/AVG
函数只适用于数值类型的列- 在聚合函数的参数中使用
DISTINCT
,可以删除重复数据
对表进行分组
- GROUP BY语句
CROUP BY
可用于对表进行分类汇总SELECT <列名1>,<列名2>, <列名3>, …… FROM <表名> GROUP BY <列名1>, <列名2>, <列名3>, ……;
GROUP BY
子句就像切蛋糕那样将表进行了分组。在 GROUP BY
子句中指定的列称为聚合键或者分组列。
说明:
CROUP BY
的子句书写位置SELECT
→ 2.FROM
→ 3.WHERE
→ 4.GROUP BY
- 常见错误:
- 使用
COUNT
等聚合函数时,SELECT
子句中如果出现列名,只能是GROUP BY
子句中指定的列名(也就是聚合键) SELECT
子句中可以通过AS
来指定别名,但在GROUP BY
中不能使用别名- 在
WHERE
中不能使用聚合函数原因是聚合函数的使用前提是结果集已经确定,而WHERE
还处于确定结果集的过程中,所以相互矛盾会引发错误
- 使用
为聚合结果指定条件
- HAVING分组和特点
HAVING
子句用于对分组进行过滤,可以使用数字、聚合函数和GROUP BY
中指定的列名(聚合键)。-- 数字 SELECT product_type, COUNT(*) FROM product GROUP BY product_type HAVING COUNT(*) = 2; -- 错误形式(因为product_name不包含在GROUP BY聚合键中) SELECT product_type, COUNT(*) FROM product GROUP BY product_type HAVING product_name = '圆珠笔';
对查询结果进行排序
- ORDER BY
SQL中的执行结果是随机排列的,当需要按照特定顺序排序时,可以使用ORDER BY
子句。SELECT <列名1>, <列名2>, <列名3>, …… FROM <表名> ORDER BY <排序基准列1>, <排序基准列2>, ……
- ORDER BY中列名可使用别名
GROUP BY
子句中不能使用SELECT
子句中定义的别名,但是在ORDER BY
子句中却可以使用别名
说明:
使用HAVING
时ORDER BY
和SELECT
在语句中的位置
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
- ORDER BY排序列中存在 NULL 时,指定其出现在首行或者末行的方式
对于两种特殊情况,需要特殊处理:- 将 NULL 值排在末行,同时将所有 非NULL 值按升序排列
- 将 NULL 值排在首行,同时将所有 非NULL 值按倒序排列
特殊处理方式:对于数值或日期类型,可以在排序字段前加负号;对于字符型数字,可以在排序前使用IS NULL/IS NOT NULL比较运算符
说明:
MySQL中,NULL 值被认为比任何 非NULL 值小。因此,当顺序为 ASC(升序)时,NULL 值出现在第一位,而当顺序为 DESC(降序)时,则排序在最后