SQL常用脚本查询大全,包含优化

发布于:2024-04-18 ⋅ 阅读:(24) ⋅ 点赞:(0)

创建25个具体的优化语句及其说明确实是一个庞大的任务,特别是考虑到不同的数据库和查询场景需要不同的优化策略。
我将继续提供一系列的优化示例和技巧,这将帮助涵盖更多常见的优化场景。

1. 避免使用HAVING来过滤行
    
    -- 使用WHERE过滤条件,而非HAVING,除非是对GROUP BY的结果进行过滤
    SELECT column_name, COUNT(*)
    FROM table_name
    WHERE column_name = 'value'
    GROUP BY column_name;
    

2. 使用INNER JOIN代替CROSS JOIN
    
    -- 当需要连接两个表时,明确条件以避免笛卡尔积
    SELECT a.column1, b.column2
    FROM table_a a
    INNER JOIN table_b b ON a.id = b.a_id;
    

3. 限制JOIN操作中的行数
    
    -- 在JOIN操作前使用derived tables或者subqueries来限制行数
    SELECT a.column1, b.column2
    FROM (SELECT * FROM table_a LIMIT 100) a
    JOIN table_b b ON a.id = b.a_id;
    
    
4. 优化OR条件
    
    -- 将OR条件重写为UNION如果可能,以利用索引
    SELECT * FROM table_name WHERE column1 = 'value1'
    UNION
    SELECT * FROM table_name WHERE column2 = 'value2';
    

5. 减少对外部表的依赖
    
    -- 尽量避免在查询中频繁引用外部表
    SELECT column1 FROM table_a
    WHERE EXISTS (SELECT 1 FROM table_b WHERE table_a.id = table_b.a_id);
    

6. 使用EXISTS代替IN
    
    -- 当子查询返回大量行时,使用EXISTS比IN更高效
    SELECT * FROM table_name a
    WHERE EXISTS (SELECT 1 FROM other_table b WHERE a.id = b.a_id);
    

7. 合理使用索引覆盖
    
    -- 选择只包含索引列的数据,避免读取整行数据
    SELECT indexed_column FROM table_name WHERE indexed_column = 'value';
    

8. 避免更新索引列
    
    -- 避免频繁更新索引列,因为这会导致索引重建
    UPDATE table_name SET non_indexed_column = 'value' WHERE condition;
    

9. 使用临时表存储中间结果
    
    -- 对复杂查询使用临时表来存储中间结果
    CREATE TEMPORARY TABLE temp_result AS
    SELECT * FROM table_name WHERE condition;
    

10. 分区表以提高查询性能
    
    -- 对大型表使用分区可以提高查询和维护速度
    CREATE TABLE partitioned_table (
    column1 INT,
    column2 DATE
    ) PARTITION BY RANGE (column2);
    

11. 利用索引扫描代替全表扫描
    
    -- 确保WHERE子句中的条件可以利用索引,避免全表扫描
    SELECT * FROM table_name WHERE indexed_column = 'value';
    

12. 避免在索引列上使用函数
    
    -- 使用索引列作为直接条件,而不是函数的参数
    SELECT * FROM table_name WHERE indexed_column = 'value';
    -- 而不是
    SELECT * FROM table_name WHERE FUNCTION(indexed_column) = 'value';
    

13. 利用批量插入减少事务成本
    
    -- 使用单个批量插入,而不是多个单独插入
    INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2'), ('value3', 'value4');
    

14. 避免大量数据一次性删除
    
    -- 分批删除大量数据以避免锁定表
    DELETE FROM table_name WHERE condition LIMIT 1000;
    -- 循环直到删除完毕
    

15. 优化LIKE查询
    
    -- 当必须使用LIKE时,避免以通配符开始的模式
    SELECT * FROM table_name WHERE column_name LIKE 'value%';
    

16. 使用固定长度的数据类型
    
    -- 使用CHAR代替VARCHAR对于固定长度的数据
    CREATE TABLE new_table (
      column1 CHAR(10),
      column2 INT
    );
    

17. 避免数据类型转换
    
    -- 避免在查询中进行数据类型转换
    SELECT * FROM table_name WHERE integer_column = 123;
    -- 而不是
    SELECT * FROM table_name WHERE CAST(varchar_column AS INT) = 123;
    

18. 利用并行处理
    
    -- 在支持并行处理的数据库中,确保查询能够并行执行
    SELECT * FROM table_name WHERE column1 = 'value' AND column2 = 'value';
    

19. 减少数据冗余和重复
    
    -- 通过正规化设计减少数据重复
    SELECT DISTINCT column_name FROM table_name;
    

20. 调整数据库缓存设置
    
    -- 根据工作负载调整数据库缓存,以提高读取性能
    -- 注意:具体操作依赖于数据库系统,需查阅相关文档
    

21. 优化统计函数的使用
    
    -- 对需要频繁计算的统计值使用物化视图或计算字段
    SELECT SUM(column_name) FROM table_name;
    

22. 避免非必要的JOIN操作
    
    -- 仅当必要时才进行JOIN,考虑是否可以通过其他方式获取数据
    SELECT a.column1, b.column2 FROM table_a a JOIN table_b b ON a.id = b.a_id;
    

23. 使用数据库特定功能
    
    -- 利用数据库提供的特定功能和扩展,如全文搜索
    SELECT * FROM table_name WHERE MATCH(column_name) AGAINST ('value');
    

24. 减少事务的大小
    
    -- 分批次提交大事务,减少锁定资源的时间
    BEGIN TRANSACTION;
    -- 执行部分更新
    COMMIT;
    

25. 合理安排计划任务和维护操作
    
    -- 避免在高峰时段执行大规模的数据维护操作
    -- 安排在低峰时段进行
    

这些优化技巧涵盖了从查询优化、索引策略到数据库配置等多个方面。实现优化是一个持续的过程,需要根据应用的实际情况不断调整和优化。

常用脚本操作

-- 1、插入数据
INSERT INTO example_table (name, age) VALUES ('Alice', 30);

-- 2、查询表中所有数据
SELECT * FROM example_table;

-- 3、使用 LIMIT 限制结果数量
SELECT * FROM example_table LIMIT 10;

-- 4、按条件筛选数据
SELECT * FROM example_table WHERE age > 25;

-- 5、更新数据
UPDATE example_table SET age = 35 WHERE name = 'Alice';

-- 6、删除数据
DELETE FROM example_table WHERE id = 5;

-- 7、排序结果
SELECT * FROM example_table ORDER BY age DESC;

-- 8、计算行数
SELECT COUNT(*) FROM example_table;

-- 9、求和
SELECT SUM(age) FROM example_table;

-- 10、连接表
SELECT a.id, a.name, b.age
FROM table1 a
JOIN table2 b ON a.id = b.id;

-- 11、使用别名
SELECT name AS full_name FROM example_table;

-- 12、使用通配符进行模糊查询
SELECT * FROM example_table WHERE name LIKE 'A%';

-- 13、使用 GROUP BY 分组数据
SELECT age, COUNT(*) FROM example_table GROUP BY age;

-- 14、使用 HAVING 进一步筛选分组数据
SELECT age, COUNT(*) FROM example_table
GROUP BY age
HAVING COUNT(*) > 1;

-- 15、使用子查询
SELECT * FROM example_table
WHERE age IN 
(SELECT age FROM other_table);

-- 16、使用 CASE 表达式进行条件操作
SELECT name,
CASE WHEN age > 30 
     THEN 'Old' ELSE 'Young' 
END AS age_group
FROM example_table;

-- 17、使用 JOIN 进行不同类型的连接
SELECT a.id, a.name, b.age
FROM table1 a
LEFT JOIN table2 b
ON a.id = b.id;

-- 18、创建索引以加快查询速度
CREATE INDEX idx_name ON example_table(name);

-- 19、优化查询性能
EXPLAIN SELECT * FROM example_table WHERE age > 25;

-- 20、备份数据库
mysqldump -u username -p database_name > backup.sql;

-- 21、使用 DISTINCT 去除重复行
SELECT DISTINCT name FROM example_table;

-- 22、使用 BETWEEN 进行范围查询
SELECT * FROM example_table
WHERE age BETWEEN 20 AND 30;

-- 23、使用 UPDATE 和 JOIN 更新关联表
UPDATE example_table a
JOIN other_table b ON a.id = b.id
SET a.age = b.age;

-- 24、使用 JOIN 和 COUNT 计算关联表中的记录数
SELECT a.id, COUNT(b.id) as count 
FROM table1 a
LEFT JOIN table2 b ON a.id = b.id
GROUP BY a.id;

-- 25、使用 LIMIT 和 OFFSET 实现分页功能
SELECT * FROM example_table
LIMIT 10 OFFSET 20;

-- 26、使用 IFNULL 处理空值
SELECT name, IFNULL(age, 'Unknown') FROM example_table;

-- 27、将查询结果导出为CSV文件
SELECT order_id, product_name, quantity
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM example_table;

-- 28、批量插入数据
INSERT INTO example_table (name, age)
VALUES ('Alice', 30), ('Bob', 25), ('Charlie', 35);

-- 29、使用 TRUNCATE 快速清空表数据
TRUNCATE TABLE example_table;

-- 30、使用 ROLLBACK 撤销未提交的更改
ROLLBACK;

-- 31、使用 UNION 合并多个查询的结果集并去重:
SELECT name FROM table1
UNION
SELECT name FROM table2;

-- 32、使用 CAST 或 CONVERT 转换数据类型:
SELECT CAST(age AS CHAR) FROM example_table;

-- 33、计算每个分组内的行的排名
SELECT name, age,
       RANK() OVER (PARTITION BY age ORDER BY name) as age_rank
FROM example_table;

-- 34、使用 SHOW CREATE TABLE 查看表结构
SHOW CREATE TABLE example_table;

-- 35、删除表中的重复行
DELETE n1
FROM example_table n1, example_table n2
WHERE n1.id > n2.id AND n1.name = n2.name;

-- 36、将查询结果作为表进行使用
SELECT * FROM 
(SELECT name FROM example_table) AS subquery_table;

-- 37、使用 LOAD DATA INFILE 导入数据到表格中:
LOAD DATA INFILE 'data.csv' 
INTO TABLE example_table
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';

-- 38、在查询中使用正则表达式
SELECT * FROM example_table
WHERE name REGEXP '^A.*';

-- 39、使用 EXISTS 进行子查询检查
SELECT * FROM table1
WHERE EXISTS 
(SELECT 1 FROM table2
WHERE table1.id = table2.id);

-- 40、设置自动增量值的起始点
ALTER TABLE example_table AUTO_INCREMENT = 100;

-- 41、使用 CONCAT 合并列数据
SELECT CONCAT(name, ' is ', age, ' years old') AS description
FROM example_table;

-- 42、查找表中的最大值和最小值
SELECT MAX(age) AS max_age,
MIN(age) AS min_age
FROM example_table;

-- 43、在查询结果中使用变量
SET @row_number = 0;
SELECT (@row_number:=@row_number+1) AS row_num,
name 
FROM example_table;

-- 44、显示当前数据库中的所有表
SHOW TABLES;

-- 45、使用SHOW VARIABLES查看 MySQL 的配置变量:
SHOW VARIABLES LIKE 'version%';

-- 46、创建临时表并插入数据
CREATE TEMPORARY TABLE temp_table AS 
SELECT id, name FROM example_table
WHERE age > 30;

-- 47、修改表结构,添加新列
ALTER TABLE example_table
ADD COLUMN email VARCHAR(50);

-- 48、使用 GROUP_CONCAT 将多行值合并为单个字符串
SELECT id, GROUP_CONCAT(name) AS all_names
FROM example_table GROUP BY id;

-- 49、使用 TRIGGER 实现对表的操作触发器
CREATE TRIGGER example_trigger
BEFORE INSERT ON example_table
FOR EACH ROW 
SET NEW.age = NEW.age + 1
;

-- 50、监控数据库性能
SHOW PROCESSLIST;

AIGC ChatGPT 职场案例
AI 绘画 与 短视频制作
PowerBI 商业智能 68集
Mysql 8.0  54集
Oracle 21C 142集
Office 2021实战应用
Python 数据分析实战,
ETL Informatica 数据仓库案例实战 51集
Excel 2021实操 100集,
Excel 2021函数大全 80集
Excel 2021高级图表应用 89集,
Excel 2021大屏可视化制作 56集
Excel 2021实用技巧 300集
PPT 2021 商业汇报实战应用 69集
Tableau  数据分析 80集
FineReport 帆软大屏可视化 50集

送你各类文档模板PPT,表格,大屏可视化 超过5000+模板

以上案例实战获取:  https://edu.csdn.net/combo/detail/2552