其他章节 :SQL刷题快速入门(一)
承接上一章节,本章主要讲SQL的运算符
、聚合函数
、SQL保留小数的几种方式
三个部分
运算符
SQL 支持多种运算符,用于执行各种操作,如算术运算、比较、赋值、逻辑运算等。以下是一些常见的 SQL 运算符类型及其示例:
算术运算符
+
(加)-
(减)*
(乘)/
(除)%
(取模)
sql
SELECT column1 + column2 AS sum, column1 - column2 AS difference FROM table_name;
比较运算符
=
(等于)<>
或!=
(不等于)>
(大于)<
(小于)>=
(大于等于)<=
(小于等于)BETWEEN ... AND ...
(在...和...之间)LIKE
(模式匹配)IN
(在集合中)IS NULL
(是 NULL)IS NOT NULL
(不是 NULL)
sql
SELECT * FROM table_name WHERE column1 > 100;
逻辑运算符
AND
(逻辑与)OR
(逻辑或)NOT
(逻辑非)- between a and b ,包含左右边界
sql
SELECT * FROM table_name WHERE column1 > 100 AND column2 < 50;
赋值运算符
=
(赋值)
sql
UPDATE table_name SET column1 = value WHERE condition;
位运算符
&
(按位与)|
(按位或)^
(按位异或)~
(按位非)<<
(左移)>>
(右移)
sql
SELECT column1 & column2 AS bitwise_and FROM table_name;
特殊运算符
||
(字符串连接,在某些数据库中,如 PostgreSQL)CONCAT
(字符串连接,在某些数据库中,如 MySQL)
sql
SELECT column1 || ' ' || column2 AS concatenated_string FROM table_name;
请注意,不同的数据库系统可能支持不同的运算符集合,并且可能会有特定的语法差异。在使用特定数据库时,应该参考其官方文档以了解详细信息。
聚合函数
聚合函数(Aggregate Functions)在 SQL 中用于对一组值(通常是表中的多行)进行计算,并返回单个值作为结果。这些函数在处理数据集时非常有用,尤其是在进行数据分析和报告时。以下是一些常见的 SQL 聚合函数及其用途:
COUNT()
- 返回指定列中的行数。
- 示例:
COUNT(*)
返回表中的总行数,COUNT(column_name)
返回非 NULL 值的行数。
SUM()
- 返回指定列值的总和。
- 示例:
SUM(column_name)
返回column_name
列所有值的总和。
AVG()
- 返回指定列值的平均值(算术平均值)。
- 示例:
AVG(column_name)
返回column_name
列所有值的平均值。
MAX()
- 返回指定列中的最大值。
- 示例:
MAX(column_name)
返回column_name
列中的最大值。
MIN()
- 返回指定列中的最小值。
- 示例:
MIN(column_name)
返回column_name
列中的最小值。
FIRST()
- 返回指定列中的第一个值。
- 注意:不是所有数据库系统都支持
FIRST()
函数。
LAST()
- 返回指定列中的最后一个值。
- 注意:不是所有数据库系统都支持
LAST()
函数。
STDDEV()
- 返回指定列值的标准偏差。
- 示例:
STDDEV(column_name)
返回column_name
列值的标准偏差。
VAR()
- 返回指定列值的方差。
- 示例:
VAR(column_name)
返回column_name
列值的方差。
聚合函数通常与 GROUP BY
子句一起使用,此时只能用having,不能用where ,以便对每个分组进行计算。以下是一个使用 GROUP BY
和 SUM()
聚合函数的例子:
sql
SELECT category, SUM(price) AS total_price
FROM products
GROUP BY category;
在这个例子中,SUM(price)
计算每个类别 category
的总价格,并使用 GROUP BY
子句按类别分组结果。
having
where中的属性不能是聚合函数得来的,如果属性是聚合函数得来的新属性,得用having!而having的属性必须出现在group by中
在MySQL中,HAVING
子句通常与GROUP BY
子句搭配使用,用于对分组后的结果进行条件过滤。HAVING
子句的作用与WHERE
子句类似,但是WHERE
子句不能与聚合函数(如SUM()
、COUNT()
、AVG()
等)一起使用,而HAVING
可以。
以下是HAVING
子句的一些关键点:
- 搭配使用 :
HAVING
子句通常与GROUP BY
子句一起使用。 - 作用 :它用于指定分组(由
GROUP BY
创建)必须满足的条件,以使这些分组在最终结果集中出现。 - 聚合函数 :
HAVING
允许您包含聚合函数来过滤分组后的结果。
以下是一个使用HAVING
子句的示例:
HAVING子句的限制:
HAVING所选的属性必须是包含在GROUP BY
子句中的列,或者用于聚合函数。如果university
列没有被包含在GROUP BY
子句中,则不能用。
列与聚合函数:在SELECT
语句中选择非聚合列时,这些列必须出现在GROUP BY
子句中。
要解决这个问题,您需要做以下修改:
- 确保所有在
SELECT
子句中出现的非聚合列都在GROUP BY
子句中列出。 - 如果您想要根据
university
列过滤结果,您应该在WHERE
子句中进行,而不是在HAVING
子句中。
sql
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 10;
在这个例子中:
GROUP BY department
将employees
表中的记录按department
列分组。HAVING COUNT(*) > 10
确保只有那些拥有超过10名员工的部门会被包含在结果集中。
如果没有GROUP BY
子句,HAVING
子句将不会起作用,因为没有分组的概念。此外,如果需要使用WHERE
子句来过滤行,则在GROUP BY
和HAVING
子句之前应用它。例如:
sql
SELECT department, COUNT(*) AS employee_count
FROM employees
WHERE salary > 50000
GROUP BY department
HAVING COUNT(*) > 10;
在这个例子中:
WHERE salary > 50000
首先过滤出薪水超过50000的员工。- 然后按
department
分组。 - 最后,
HAVING COUNT(*) > 10
确保只有那些拥有超过10名高薪员工的部门会被选中。
保留小数
不同数据库的函数可能存在细微差别,这里以 MySQL
为例,可以使用以下函数来处理数值的四舍五入、截断、向上取整和向下取整操作:
1. 四舍五入保留小数
函数 : ROUND(number, decimals)
-
参数:
number
: 要进行四舍五入的数值。decimals
: 要保留的小数位数。如果为正数,表示保留小数点后的位数;如果为负数,表示对整数部分进行四舍五入。
-
举例:
sqlSELECT ROUND(123.4567, 2); -- 结果为 123.46 SELECT ROUND(123.456, 0) AS rounded_value; -- 意思是保留整数,结果是 123 SELECT ROUND(123.4567, -1); -- 结果为 120
2. 截断到指定位
函数 : TRUNCATE(number, decimals)
-
参数:
number
: 要进行截断的数值。decimals
: 要保留的小数位数。如果为正数,表示保留小数点后的位数;如果为负数,表示对整数部分进行截断。
-
举例:
sqlSELECT TRUNCATE(123.4567, 2); -- 结果为 123.45 SELECT TRUNCATE(123.4567, -1); -- 结果为 120
3. 向上取整
函数 : CEILING(number)
或 CEIL(number)
-
参数:
number
: 要进行向上取整的数值。
-
举例:
sqlSELECT CEILING(123.4567); -- 结果为 124 SELECT CEILING(-123.4567); -- 结果为 -123
4. 向下取整
函数 : FLOOR(number)
-
参数:
number
: 要进行向下取整的数值。
-
举例:
sqlSELECT FLOOR(123.4567); -- 结果为 123 SELECT FLOOR(-123.4567); -- 结果为 -124