1:
窗口函数语法:在 SQL 中,窗口函数用于对查询结果集中的行进行计算,而无需对数据进行分组。OVER关键字是窗口函数的标志,其语法结构通常为OVER (PARTITION BY <分区字段> ORDER BY <排序字段>) 。
PARTITION BY :用于将查询结果集划分为不同的分区,在每个分区内分别进行后续的计算。在本题中,按shirt_type分区,意味着会对每种衬衫类型单独进行处理。
ORDER BY :用于确定在每个分区内进行计算时的排序顺序。本题按shirt_price从低到高排序,以实现按价格对每个衬衫类型内的衬衫进行排名。
排名函数RANK():RANK()函数是窗口函数中的排名函数之一。当使用RANK()函数时,它会按照指定的排序字段(这里是shirt_price)为每个分区内的行生成一个排名。如果有相同价格的行,它们会共享相同的排名,并且下一个排名会跳过相应的数量,产生排名空位。例如,若有两个价格相同的衬衫,它们的排名可能都是 2,下一个价格不同的衬衫排名就是 4 。
2:
prepare:在 MySQL 里,prepare语句的作用是准备一个 SQL 语句,使其能被后续执行。其语法是PREPARE statement_name FROM sql_text;,这里的statement_name是你给预处理语句起的名字,sql_text是具体的 SQL 语句。
execute:execute语句的用途是执行之前用prepare准备好的预处理语句。其语法为EXECUTE statement_name [USING variable [, variable] ...]; ,其中statement_name是之前prepare语句定义的名称,若预处理语句包含参数,可使用USING子句来传递变量。
deallocate:deallocate语句的功能是释放之前用prepare创建的预处理语句,释放后该语句就不能再执行了。其语法是DEALLOCATE PREPARE statement_name; 。所以deallocate并非用于执行预处理语句,而是用于释放它。
using:using并非独立的执行预处理语句的命令,它是在execute语句中使用的子句,用于给预处理语句传递参数。
3:
CONV函数的功能
在 MySQL 里,CONV函数的作用是进行数字的进制转换。其语法为CONV(N,from_base,to_base),具体含义如下:
N:这是需要进行转换的数字,可以是整数或者字符串形式。当为字符串时,要符合相应进制的格式。
from_base:代表数字N当前的进制,取值范围是 2 到 36 。
to_base:表示要转换到的目标进制,取值范围同样是 2 到 36 。
5F 是一个十六进制数,其十进制值为 5×161+15×160=80+15=955×161+15×160=80+15=95
转化为三进制:
- 95÷3=31 余数 2
- 31÷3=1031÷3=10 余数 1
- 10÷3=310÷3=3 余数 1
- 3÷3=13÷3=1 余数 0
- 1÷3=01÷3=0 余数 1
10112
4:
select min(col1) from t1:当col1列中的所有值都为NULL时,min(col1)的结果会返回NULL 。因为没有有效的数据来确定最小值。
select max(col1) from t1:同理,若col1列中的所有值均为NULL,max(col1)也会返回NULL,无法从全是NULL的数据中找到最大值。
select count(col1) from t1:count(col1)用于统计col1列中不为NULL的行数。即便col1列中的所有值都是NULL,此时没有符合统计条件的数据行,count(col1)也会返回0,而不是NULL 。这是count函数的特性,专门用于准确统计数据行的数量,遇到NULL值会跳过不计。
select concat('max=', max(col1)) from t1:concat函数用于将多个字符串拼接成一个字符串。如果max(col1)的结果为NULL(比如col1列全是NULL时),根据concat函数的规则,只要其中有一个参数为NULL,整个拼接结果就为NULL。 答案选 “select count (col1) from t1”。下面为你详细分析每个选项:
5:
字段取别名的三种方法:
1. 字段 AS 别名
2. 字段 别名: AS可省
3. 字段 = 别名 仅限 SQL Server
6:
having 子句即可包含聚合函数作用的字段也可包括普通的标量字段:该选项正确。在 HAVING 子句中,可以使用聚合函数(如 SUM、COUNT、AVG、MAX、MIN 等)对分组数据进行筛选,例如 HAVING COUNT(column_name) > 10;同时,也可以包含普通标量字段进行条件判断,前提是该字段在 GROUP BY 子句中出现过或者该查询没有使用 GROUP BY 子句(此时整张表视为一组)。例如,假设有表 orders 包含 order_id、customer_id、order_amount 字段,SELECT customer_id, SUM(order_amount) AS total_amount FROM orders GROUP BY customer_id HAVING customer_id > 100 AND total_amount > 1000; 这里 customer_id 是普通标量字段,total_amount 是聚合函数作用的字段 。
使用 having 的同时不能使用 where 子句:该选项错误。WHERE 子句用于在分组前对单个记录进行筛选,HAVING 子句用于在分组后对分组结果进行筛选,两者可以同时使用。例如:SELECT category, AVG(price) AS avg_price FROM products WHERE stock > 0 GROUP BY category HAVING AVG(price) > 50; 先通过 WHERE 子句筛选出库存大于 0 的产品记录,再按产品类别分组,最后通过 HAVING 子句筛选出平均价格大于 50 的类别分组。
having 子句必须于 group by 子句同时使用,不能单独使用:该选项错误。在一些数据库系统(如 MySQL)中,HAVING 子句可以单独使用。当单独使用时,数据库会隐式地将整个结果集视为一个分组 ,即相当于添加了 GROUP BY NULL。例如:SELECT * FROM employees HAVING salary > 5000; 这条语句会筛选出薪资大于 5000 的员工记录。不过从标准 SQL 规范的角度,HAVING 子句通常是与 GROUP BY 子句配合使用来对分组结果进行筛选。
使用 having 子句的作用是限定分组条件:该选项错误。限定分组条件的是 GROUP BY 子句,它决定了数据按照哪些字段进行分组。而 HAVING 子句的作用是对分组后的结果进行筛选,只有满足 HAVING 子句中条件的分组才会出现在最终结果中。
Having 子句和 where 子句是等同的:该选项错误。WHERE 子句用于在数据分组前对单个记录进行过滤,不能使用聚合函数;HAVING 子句用于在数据分组后对分组结果进行过滤,可以使用聚合函数。它们的执行时机和使用场景不同,不是等同的。例如,SELECT category, COUNT(*) FROM products WHERE category = 'electronics' GROUP BY category HAVING COUNT(*) > 10; 中,WHERE 先筛选出类别为 “electronics” 的产品记录,HAVING 再筛选出产品数量大于 10 的类别分组。
如果 select 语句中没有聚合函数的使用,就不能使用 having 子句:该选项错误。即使 SELECT 语句中没有聚合函数,也可以使用 HAVING 子句。当没有 GROUP BY 子句时,整个结果集被视为一个分组,HAVING 子句的作用类似于 WHERE 子句对整个结果集进行筛选;当有 GROUP BY 子句时,HAVING 子句可对分组结果基于普通字段进行筛选(前提是该字段在 GROUP BY 子句中)。例如:SELECT product_name FROM products GROUP BY product_name HAVING product_name LIKE 'A%'; 这里没有使用聚合函数,但使用 HAVING 子句对分组后的产品名称进行了筛选。