Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQL #15

Open
jsiwa opened this issue Jun 5, 2024 · 3 comments
Open

SQL #15

jsiwa opened this issue Jun 5, 2024 · 3 comments

Comments

@jsiwa
Copy link
Owner

jsiwa commented Jun 5, 2024

image

@jsiwa
Copy link
Owner Author

jsiwa commented Jun 5, 2024

图片展示了一些常见的SQL语句及其功能。下面是每个SQL语句的详细介绍:

  1. SELECT

    • 功能:从数据库中选择数据。
    • 例子:SELECT name FROM employees;
  2. FROM

    • 功能:指定要从中选择数据的表。
    • 例子:SELECT * FROM employees;
  3. WHERE

    • 功能:根据条件过滤行。
    • 例子:SELECT * FROM employees WHERE age > 30;
  4. AS

    • 功能:使用别名重命名列或表。
    • 例子:SELECT name AS employee_name FROM employees;
  5. JOIN

    • 功能:结合两个或多个表中的行。
    • 例子:SELECT employees.name, departments.name FROM employees JOIN departments ON employees.department_id = departments.id;
  6. AND

    • 功能:结合多个条件,所有条件都必须为真。
    • 例子:SELECT * FROM employees WHERE age > 30 AND department = 'HR';
  7. OR

    • 功能:结合多个条件,至少一个条件为真。
    • 例子:SELECT * FROM employees WHERE age > 30 OR department = 'HR';
  8. LIMIT

    • 功能:限制返回的行数。
    • 例子:SELECT * FROM employees LIMIT 10;
  9. IN

    • 功能:在WHERE子句中指定多个值。
    • 例子:SELECT * FROM employees WHERE department IN ('HR', 'Engineering');
  10. CASE

    • 功能:在SQL语句中创建条件逻辑。
    • 例子:SELECT name, CASE WHEN age > 30 THEN 'Senior' ELSE 'Junior' END AS position FROM employees;
  11. IS NULL

    • 功能:检查空值。
    • 例子:SELECT * FROM employees WHERE department IS NULL;
  12. LIKE

    • 功能:在列中搜索指定模式。
    • 例子:SELECT * FROM employees WHERE name LIKE 'J%';
  13. COMMIT

    • 功能:保存事务中所做的更改。
    • 例子:COMMIT;
  14. ROLLBACK

    • 功能:撤销事务中所做的更改。
    • 例子:ROLLBACK;
  15. ALTER TABLE

    • 功能:修改现有表结构。
    • 例子:ALTER TABLE employees ADD COLUMN email VARCHAR(255);
  16. UPDATE

    • 功能:修改表中的现有行。
    • 例子:UPDATE employees SET age = 35 WHERE id = 1;
  17. CREATE

    • 功能:创建新的表、视图或其他数据库对象。
    • 例子:CREATE TABLE employees (id INT PRIMARY KEY, name VARCHAR(100));
  18. DELETE

    • 功能:删除表中的行。
    • 例子:DELETE FROM employees WHERE age < 25;
  19. INSERT INTO

    • 功能:向表中添加新行。
    • 例子:INSERT INTO employees (name, age) VALUES ('John Doe', 30);
  20. DROP

    • 功能:删除表或数据库中的其他对象。
    • 例子:DROP TABLE employees;
  21. GROUP BY

    • 功能:将具有相同值的行分组到汇总行中。
    • 例子:SELECT department, COUNT(*) FROM employees GROUP BY department;
  22. ORDER BY

    • 功能:按指定列对查询结果进行排序。
    • 例子:SELECT * FROM employees ORDER BY age DESC;
  23. HAVING

    • 功能:基于条件过滤分组后的数据(用于GROUP BY后)。
    • 例子:SELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) > 5;
  24. COUNT

    • 功能:返回匹配指定条件的行数。
    • 例子:SELECT COUNT(*) FROM employees;
  25. SUM

    • 功能:计算数值列的总和。
    • 例子:SELECT SUM(salary) FROM employees;
  26. AVG

    • 功能:计算数值列的平均值。
    • 例子:SELECT AVG(salary) FROM employees;
  27. MIN

    • 功能:返回选定列的最小值。
    • 例子:SELECT MIN(salary) FROM employees;
  28. MAX

    • 功能:返回选定列的最大值。
    • 例子:SELECT MAX(salary) FROM employees;

这些是SQL中常用的语句和关键字,它们帮助我们进行数据库操作和数据管理。每个语句和关键字都有其特定的功能和用法,通过组合使用这些语句,我们可以构建复杂的查询来满足各种数据处理需求。

@jsiwa
Copy link
Owner Author

jsiwa commented Jun 13, 2024

修改 SQL 模式(如禁用 ONLY_FULL_GROUP_BY)的操作是针对整个会话或全局的,对整个数据库实例有效,而不是仅针对单个表或特定数据库。

临时禁用 ONLY_FULL_GROUP_BY 模式(当前会话有效)

这种方法只在当前会话中有效。所有在此会话中执行的查询都将受到影响,无论它们涉及哪个表或数据库。

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

永久禁用 ONLY_FULL_GROUP_BY 模式(全局有效)

这种方法在全局范围内永久禁用 ONLY_FULL_GROUP_BY 模式,对所有会话和所有数据库都有效。

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

注意:全局设置修改后,新创建的会话将使用这个设置,但已经存在的会话将继续使用它们原来的设置,直到它们被重启。

配置文件中修改(永久有效)

在 MySQL 配置文件(my.cnfmy.ini)中修改 sql_mode 设置,对整个数据库实例永久有效。

在 Linux 系统上的 my.cnf 文件中修改:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

在 Windows 系统上的 my.ini 文件中修改:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

修改配置文件后,重启 MySQL 服务器以使更改生效:

  • 在 Linux 上:

    sudo systemctl restart mysql
  • 在 Windows 上:

    net stop mysql
    net start mysql

检查当前 SQL 模式

你可以使用以下命令检查当前的 SQL 模式,确认修改是否成功:

SELECT @@SESSION.sql_mode;
SELECT @@GLOBAL.sql_mode;

结论

无论是临时禁用还是永久禁用 ONLY_FULL_GROUP_BY 模式,影响的都是整个数据库实例中的所有表和数据库,而不仅仅是单个表或特定数据库。这意味着所有在该数据库实例上运行的会话和查询都会受到影响。

@jsiwa
Copy link
Owner Author

jsiwa commented Jun 13, 2024

ONLY_FULL_GROUP_BY 是 MySQL 中的一个 SQL 模式选项,它影响 GROUP BY 子句的行为。启用该模式后,MySQL 会强制执行 SQL 标准的 GROUP BY 规则,确保结果集的确定性和一致性。

作用和影响

启用 ONLY_FULL_GROUP_BY 模式时,GROUP BY 子句中的所有列必须满足以下条件之一:

  1. 出现在 GROUP BY 子句中: 所有在 SELECT 语句中的列都必须出现在 GROUP BY 子句中。
  2. 是聚合函数的一部分: 列可以不出现在 GROUP BY 子句中,但必须包含在聚合函数(如 COUNT()SUM()AVG() 等)中。

这样做的目的是确保查询结果的确定性,因为在 GROUP BY 子句中出现的每一列都应该能够唯一地标识一个组。

示例

启用 ONLY_FULL_GROUP_BY

SET SESSION sql_mode='ONLY_FULL_GROUP_BY';

假设有一个表 employees,包含以下数据:

id name department
1 Alice HR
2 Bob IT
3 Carol IT
4 Dave HR

查询示例:

SELECT name, COUNT(*) FROM employees GROUP BY department;

ONLY_FULL_GROUP_BY 模式下,这个查询会产生错误,因为 name 列既不在 GROUP BY 子句中,也不是聚合函数的一部分。

禁用 ONLY_FULL_GROUP_BY

SET SESSION sql_mode='';

在禁用 ONLY_FULL_GROUP_BY 模式后,MySQL 允许这种查询,并返回不确定的结果,因为 name 列不在 GROUP BY 子句中,MySQL 会从每个组中随意选择一个 name 的值。

为什么启用 ONLY_FULL_GROUP_BY

  1. 数据一致性: 确保查询结果的一致性,防止不确定的数据出现在结果集中。
  2. SQL 标准符合性: 使查询符合 SQL 标准,增强可移植性和可维护性。
  3. 明确性: 强制开发者编写明确的、符合逻辑的查询,减少潜在的错误。

关闭 ONLY_FULL_GROUP_BY 的潜在风险

  1. 数据不一致性: 禁用后,可能会得到不确定的结果,尤其是在查询包含未聚合的列时。
  2. 隐含错误: 可能会掩盖一些查询中的逻辑错误,使得结果集不符合预期。

总结

ONLY_FULL_GROUP_BY 模式的主要作用是确保 GROUP BY 子句中的查询符合 SQL 标准,结果集具有确定性。虽然禁用该模式可以允许一些更灵活的查询,但可能导致数据不一致和隐含的错误。因此,建议在需要时慎重考虑是否禁用 ONLY_FULL_GROUP_BY 模式。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant