# 1、python插入数据到impala或mysql
优化前:使用insert into一条条插入数据
优化后:insert into ** values(所有数据)
# 2、避免 SELECT *
(1)增加查询分析器解析成本。
(2)无用字段增加网络 消耗,尤其是 text 类型的字段
(3)增减字段容易与 resultMap 配置不一致。
举例:拧螺丝我需要什么工具,我把整个工具箱拿来,其实是一个道理。当我需要拧螺丝钉时,我会挑选好需要的工具,如果工具箱拿来,这玩意比较重,而且也可能拿到很大的扳手,但是我又用不上,你说我带它干嘛。
# 3、CHAR 和VARCHAR 的区别?
1、CHAR 和 VARCHAR 类型在存储和检索方面有所不同
2、CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 ~255 当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。
我们可以看到char类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的,但是数据段之间没有间隔,因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。
但是varchar类型的存放就不同了,在每个数据段开头,都要有一段空间(1~2个字节)存放数据段的长度,在数据段的结尾还有一段空间(1个字节)标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节。所以MySQL在遍历数据的时候,磁针要比char类型的列多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。
CHAR会默认切掉字符串末尾的空格,如果需要保留末尾的空格,记得用varchar类型!
4、NOW()和 CURRENT_DATE()有什么区别?
NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。CURRENT_DATE()仅显示当前年份, 月份和日期。
5、having使用注意事项:
在 MySQL 中,HAVING 子句通常用于筛选分组后的数据,而 WHERE 子句用于筛选未分组的数据。同时,ORDER BY 用于对结果集进行排序。在使用 HAVING 子句时,你需要注意以下几点:
WHERE 子句:WHERE 子句用于在数据分组之前对数据进行过滤。你可以在 WHERE 子句中指定条件来筛选行,然后将符合条件的行分组。WHERE 子句作用于原始数据,而 HAVING 子句作用于分组后的数据。
HAVING 子句:HAVING 子句用于筛选已经分组的数据。一般情况下,你会在分组操作之后使用 HAVING 来筛选分组的结果。你可以使用聚合函数(如 SUM、COUNT、AVG 等)和逻辑运算符(AND、OR 等)在 HAVING 子句中指定筛选条件。
ORDER BY 子句:ORDER BY 子句用于对结果集进行排序。通常,你可以在查询的最后使用 ORDER BY 子句,它会根据指定的列对结果进行排序,但它不会影响分组或筛选。
因此,在查询中,通常的顺序是 WHERE -> GROUP BY -> HAVING -> ORDER BY。你可以先使用 WHERE 子句进行初步筛选,然后使用 GROUP BY 子句将数据分组,接着使用 HAVING 子句对分组后的数据进行筛选,最后使用 ORDER BY 子句对结果进行排序。
要注意的是,在一些情况下,你也可以在 HAVING 子句中使用聚合函数来筛选分组后的数据,而无需使用 WHERE 子句。不过,根据需求和查询的复杂性,可以合理使用这些子句来获取所需的结果。
#逻辑运算:你可以在 HAVING 子句中使用逻辑运算符(AND、OR、NOT)来组合条件,
#以实现更复杂的筛选逻辑。
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) IS NOT NULL
SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department
HAVING MAX(salary) > (SELECT AVG(salary) FROM employees);
6、
group by 的注意事项以及方法
GROUP BY
子句用于将查询结果根据一个或多个列进行分组,并对每个组应用聚合函数,如 SUM
、COUNT
、AVG
等。以下是使用 GROUP BY
子句时的注意事项和方法:
注意事项:
- 聚合函数:通常与
GROUP BY
一起使用的是聚合函数,如SUM
、COUNT
、AVG
。在SELECT
子句中列出的字段应该是聚合函数或GROUP BY
子句中列出的列。 - GROUP BY 列:列出的每个列都是分组依据,确保它们是表中的有效列,并且符合数据类型。通常,这些列包含非重复的值,以便构成不同的组。
- HAVING 子句:
HAVING
子句通常与GROUP BY
一起使用,用于筛选分组后的结果。它类似于WHERE
子句,但作用于分组后的数据。 - 性能考虑:
GROUP BY
子句可以导致查询性能下降,特别是当操作大型数据集时。确保表上有适当的索引以提高查询速度。 - 正确的聚合:选择适当的聚合函数以符合你的需求。例如,如果需要计算总和,使用
SUM
;如果需要计算平均值,使用AVG
。 - 多列分组:可以同时根据多个列进行分组,这样可以更细粒度地控制数据的组织。
使用方法:
- 单列分组:如果只需要按一个列分组,可以简单地在
GROUP BY
子句中列出该列。例如,GROUP BY department
会将结果按部门进行分组。 - 多列分组:要按多个列分组,只需在
GROUP BY
子句中列出这些列,用逗号分隔。例如,GROUP BY department, location
会根据部门和位置进行分组。 - 聚合函数:在
SELECT
子句中,使用聚合函数对每个分组应用需要的计算。例如,SELECT department, AVG(salary) FROM employees GROUP BY department
会计算每个部门的平均工资。 - HAVING 子句:如果需要筛选分组后的结果,可以在
HAVING
子句中指定条件。例如,HAVING AVG(salary) > 50000
会筛选出平均工资高于 50000 的部门。 - 嵌套子查询:
GROUP BY
子句也可以与嵌套子查询一起使用,以构建更复杂的分组逻辑。 - 数据分析:
GROUP BY
可用于执行数据分析,如生成报表、计算统计信息等。
总之,GROUP BY
子句是 SQL 中用于分组数据并执行聚合操作的重要工具。了解如何正确列出分组列、使用聚合函数和 HAVING
子句,以及处理多列分组,有助于你更好地使用 SQL 进行数据分析和报表生成。
7、
ORDER BY
子句的注意事项和使用方法
ORDER BY
子句用于对查询结果集按一个或多个列进行排序,可以以升序(默认)或降序的方式排序。以下是关于 ORDER BY
子句的注意事项和使用方法:
注意事项:
- 正确的列名:确保在
ORDER BY
子句中使用的列名是查询结果集中存在的列名,否则会引发错误。 - 多列排序:可以按多个列进行排序,只需在
ORDER BY
子句中列出这些列,用逗号分隔。首先按第一个列排序,如果存在相同值,则按第二个列排序,以此类推。 - 性能考虑:排序大型数据集可能会对查询性能产生影响,特别是如果没有合适的索引。确保数据库表上有适当的索引以提高排序效率。
- 升序和降序:默认情况下,
ORDER BY
会按升序(从小到大)排序。如果需要降序排序,可以在列名后面添加DESC
关键字。例如,ORDER BY column_name DESC
会按降序排序。
使用方法:
- 单列排序:要按单个列排序,只需在
ORDER BY
子句中列出该列。例如,ORDER BY salary
会按工资升序排序。 - 单列降序排序:要按降序排序,可以在列名后面添加
DESC
。例如,ORDER BY salary DESC
会按工资降序排序。 - 多列排序:按多个列排序时,列出这些列并指定排序方式。例如,
ORDER BY department, salary DESC
会先按部门升序排序,然后在同一部门内按工资降序排序。 - 数字和文本排序:根据数据类型不同,排序行为可能会有所不同。数字通常会按数值大小排序,而文本通常按字母顺序排序。
- NULL 值处理:在排序时,数据库通常将
NULL
值排在最前或最后,具体取决于数据库系统的默认设置。你也可以使用NULLS FIRST
或NULLS LAST
来显式指定NULL
值的位置。 - LIMIT 子句:结合
LIMIT
子句可以限制返回的排序结果的行数。例如,ORDER BY salary DESC LIMIT 10
会返回按工资降序排序的前 10 行。 - 多列排序案例:可以按不同列的组合排序,以满足特定需求。例如,
ORDER BY department, hire_date
可以按部门升序排序,然后在同一部门内按入职日期升序排序。
ORDER BY
子句是 SQL 中用于控制查询结果排序的关键部分。根据需要选择合适的列和排序方式,有助于获得所需的排序效果。