当前位置: 首页 > news >正文

Mysql--基础篇--SQL(DDL,DML,窗口函数,CET,视图,存储过程,触发器等)

SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的标准语言。它允许用户定义、查询、更新和管理数据库中的数据。SQL是一种声明性语言,用户只需要指定想要执行的操作,而不需要详细说明如何实现这些操作。SQL被广泛应用于各种数据库系统,如MySQL、PostgreSQL、Oracle、SQL Server等。

为了更全面地理解SQL,我们可以将其分为以下几个主要部分:

  • 数据定义语言(DDL)
  • 数据操作语言(DML)
  • 数据查询语言(DQL)
  • 数据控制语言(DCL)
  • 事务控制语言(TCL)

1、数据定义语言(DDL)

DDL用于定义和管理数据库的结构,包括创建、修改和删除数据库对象(如表、索引、视图等)。

常见的 DDL 操作包括:

  • CREATE:创建数据库对象。
  • ALTER:修改现有数据库对象的结构。
  • DROP:删除数据库对象。
  • TRUNCATE:清空表中的所有数据,但保留表结构。
  • RENAME:重命名数据库对象。

使用示例:

  • 创建数据库:
 CREATE DATABASE mydatabase;
  • 创建表:
  CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),age INT,department VARCHAR(50));
  • 修改表结构:
  ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);
  • 删除表:
  DROP TABLE employees;
  • 清空表数据:
  TRUNCATE TABLE employees;
  • 重命名表:
  RENAME TABLE old_table_name TO new_table_name;

2、数据操作语言(DML)

DML用于插入、更新和删除数据库中的数据。

常见的DML操作包括:

  • INSERT:向表中插入新数据。
  • UPDATE:更新表中的现有数据。
  • DELETE:从表中删除数据。

使用示例:

  • 插入数据:
  INSERT INTO employees (id, name, age, department) VALUES (1, 'Alice', 30, 'HR');
  • 批量插入数据:
  INSERT INTO employees (id, name, age, department) VALUES (2, 'Bob', 28, 'Engineering'),(3, 'Charlie', 35, 'Sales');
  • 更新数据:
  UPDATE employees SET salary = 60000 WHERE id = 1;
  • 删除数据:
  DELETE FROM employees WHERE id = 2;
  • 删除所有数据:
  DELETE FROM employees;

3、数据查询语言(DQL)

DQL用于从数据库中检索数据,最常见的DQL语句是SELECT。通过SELECT语句,用户可以查询表中的数据,并使用各种条件、排序、分组等功能来获取所需的结果。

使用示例:

  • 基本查询:
  SELECT * FROM employees;
  • 选择特定列:
  SELECT name, age FROM employees;
  • 带条件的查询:
  SELECT * FROM employees WHERE department = 'HR';
  • 使用AND/OR组合条件:
  SELECT * FROM employees WHERE department = 'HR' AND age > 30;
  • 使用IN进行多值匹配:
  SELECT * FROM employees WHERE department IN ('HR', 'Sales');
  • 使用LIKE进行模糊匹配:
  SELECT * FROM employees WHERE name LIKE 'A%';  -- 匹配以 'A' 开头的名字
  • 使用BETWEEN进行范围查询:
  SELECT * FROM employees WHERE age BETWEEN 25 AND 35;
  • 使用ORDER BY排序:
  SELECT * FROM employees ORDER BY age DESC;  -- 按年龄降序排列
  • 使用LIMIT限制结果数量:
  SELECT * FROM employees LIMIT 5;  -- 只返回前 5 条记录
  • 使用GROUP BY分组:
  SELECT department, COUNT() AS employee_count FROM employees GROUP BY department;
  • 使用HAVING过滤分组结果:
  SELECT department, COUNT() AS employee_count FROM employees GROUP BY department HAVING COUNT() > 2;
  • 使用JOIN连接多个表:
  SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.id;
  • 使用子查询:
  SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);

4、数据控制语言(DCL)

DCL用于控制用户对数据库的访问权限。通过DCL,管理员可以授予或撤销用户的权限,确保数据的安全性和完整性。

常见的DCL操作包括:

  • GRANT:授予用户权限。
  • REVOKE:撤销用户权限。

使用示例:

  • 授予用户权限:(这条语句的作用是授予用户user1在主机localhost上对employees表的 SELECT和INSERT权限。)
  GRANT SELECT, INSERT ON employees TO 'user1'@'localhost';
  • 授予所有权限:(常用用户权限包含SELECT, INSERT, UPDATE, DELETE四个,ALL PRIVILEGES是所有权限,包含更多的操作)
  GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';

说明:
SELECT, INSERT, UPDATE, DELETE和ALL PRIVILEGES区别

  • SELECT:允许用户查询表中的数据。

  • INSERT:允许用户向表中插入新数据。

  • UPDATE:允许用户更新表中的现有数据。

  • DELETE:允许用户从表中删除数据。
    这四个权限是数据库中最常用的权限,通常足以满足大多数用户的日常操作需求。它们只影响数据的操作,而不涉及数据库结构或系统级别的操作。ALL PRIVILEGES是一个更广泛的权限集合,它不仅包括SELECT, INSERT, UPDATE, DELETE,还包括以下权限:

  • CREATE:允许用户创建新的数据库、表、索引等。

  • DROP:允许用户删除数据库、表、索引等。

  • ALTER:允许用户修改表结构(如添加或删除列)。

  • INDEX:允许用户创建和删除索引。

  • GRANT OPTION:允许用户将自己拥有的权限授予其他用户。

  • REFERENCES:允许用户创建外键约束。

  • CREATE VIEW:允许用户创建视图。

  • SHOW VIEW:允许用户查看视图的定义。

  • CREATE ROUTINE:允许用户创建存储过程和函数。

  • ALTER ROUTINE:允许用户修改存储过程和函数。

  • EXECUTE:允许用户执行存储过程和函数。

  • FILE:允许用户读取和写入文件(例如通过LOAD DATA INFILE和SELECT … INTO OUTFILE)。

  • RELOAD:允许用户执行FLUSH操作,刷新服务器缓存。

  • SHUTDOWN:允许用户关闭MySQL服务器。

  • PROCESS:允许用户查看所有线程的状态。

  • SUPER:允许用户执行一些管理操作,如更改全局变量、杀死其他用户的线程、使用CHANGE MASTER TO等。

  • REPLICATION SLAVE:允许用户从主服务器复制数据。

  • REPLICATION CLIENT:允许用户获取主服务器和从服务器的状态信息。

  • 撤销用户权限:

  REVOKE SELECT, INSERT ON employees FROM 'user1'@'localhost';
  • 撤销所有权限:
  REVOKE ALL PRIVILEGES ON *.* FROM 'admin'@'localhost';

附用户相关操作语句

  • 创建用户:
  CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password123';
  • 修改用户密码:
  ALTER USER 'user1'@'localhost' IDENTIFIED BY 'new_password';
  • 删除用户:
  DROP USER 'user1'@'localhost';
  • 重命名用户:
  RENAME USER 'user1'@'localhost' TO 'user2'@'localhost';
  • 查看当前用户:
  SELECT CURRENT_USER();
  • 查看所有用户:
  SELECT User, Host FROM mysql.user;

附:角色管理(Role Management)
从MySQL 8.0开始,MySQL引入了角色(Role)的概念,允许你将一组权限分配给一个角色,然后将该角色分配给多个用户。角色可以简化权限管理,特别是在有大量用户和复杂权限需求的情况下。

  • 创建角色:
  CREATE ROLE 'data_analyst';
  • 为角色分配权限:
 GRANT SELECT, INSERT, UPDATE ON mydatabase.* TO 'data_analyst';
  • 将角色分配给用户:
 GRANT 'data_analyst' TO 'user1'@'localhost';
  • 激活角色(角色授权):
 SET DEFAULT ROLE 'data_analyst' TO 'user1'@'localhost';
  • 查看用户的角色:
 SHOW GRANTS FOR 'user1'@'localhost';
  • 删除角色:
  DROP ROLE 'data_analyst';

5、事务控制语言(TCL)

TCL用于管理事务,确保一组相关的数据库操作要么全部成功,要么全部失败。事务的四个特性(ACID)保证了数据的一致性和可靠性。

常见的TCL操作包括:

  • BEGIN/START TRANSACTION:开始一个事务。
  • COMMIT:提交事务,使所有更改永久生效。
  • ROLLBACK:回滚事务,撤销所有未提交的更改。
  • SAVEPOINT:设置保存点,允许部分回滚。

使用示例:

  • 开始事务:
  START TRANSACTION;
  • 提交事务:
  COMMIT;
  • 回滚事务:
  ROLLBACK;
  • 设置保存点:
  SAVEPOINT my_savepoint;
  • 回滚到保存点:
  ROLLBACK TO SAVEPOINT my_savepoint;
  • 释放保存点:
  RELEASE SAVEPOINT my_savepoint;

6、SQL的高级功能

除了上述基本功能,SQL还提供了许多高级功能,用于处理复杂的数据操作和查询优化。以下是一些常见的高级SQL功能:

1、窗口函数(Window Functions)

窗口函数(Window Functions)是SQL中一种强大的工具,允许你在查询结果集中进行复杂的聚合计算,而不需要使用子查询或自连接。窗口函数可以在每一行数据上应用聚合操作,并且可以基于特定的分组、排序和范围来计算结果。MySQL从8.0版本开始支持窗口函数,极大地增强了其处理复杂查询的能力。

窗口函数的语法结构:

window_function([expression]) OVER ([PARTITION BY partition_expression][ORDER BY sort_expression][frame_clause]
)

说明:

  • window_function:指定要使用的窗口函数,如ROW_NUMBER()、RANK()、SUM()、AVG()等。
  • PARTITION BY:将结果集划分为多个分区(类似于GROUP BY),每个分区独立计算窗口函数的结果。
  • ORDER BY:在每个分区内对行进行排序,影响窗口函数的计算顺序。
  • frame_clause:定义窗口框架,指定窗口函数作用的行范围(可选)。常见的框架类型包括:
    • ROWS BETWEEN … AND …
    • RANGE BETWEEN … AND …

窗口函数示例:
窗口函数常用于在查询结果集中进行复杂的聚合计算,而不需要使用子查询或自连接。

(1)、ROW_NUMBER()

ROW_NUMBER()为每一行分配一个唯一的行号,行号从1开始,按ORDER BY指定的顺序递增。如果使用了PARTITION BY,则每个分区内的行号从1开始重新计数。

示例:为每个部门的员工分配行号

SELECT department, name, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num
FROM employees;

解释:

  • PARTITION BY department:按部门划分分区。
  • ORDER BY salary DESC:在每个部门内按工资降序排列。
  • ROW_NUMBER():为每个部门的员工分配行号,行号从1开始。

输出结果:
在这里插入图片描述

(2)、RANK()

RANK()为每一行分配一个排名,排名从1开始,按ORDER BY指定的顺序递增。如果有并列的行(即相同的排序值),它们会获得相同的排名,后续行的排名会跳过相应的数字。

示例:为每个部门的员工按工资排名
别名不要用关键字rank,否则语法执行错误。

SELECT department, name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank1
FROM employees;

解释:

  • PARTITION BY department:按部门划分分区。
  • ORDER BY salary DESC:在每个部门内按工资降序排列。
  • RANK():为每个部门的员工按工资排名,如果有并列的行,排名会跳过。

输出结果:
在这里插入图片描述

(3)、DENSE_RANK()

DENSE_RANK()类似于RANK(),但它不会跳过排名。即使有并列的行,后续行的排名也不会跳过。在上面的RANK示例中我们看到排名为(1,2,2,4,没有第3名),而DENSE_RANK()则会展示出第3名。

示例:为每个部门的员工按工资排名(不跳过)
别名不要用关键字dense_rank,否则语法执行错误。

SELECT department, name, salary, DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dense_rank1
FROM employees;

解释:

  • PARTITION BY department:按部门划分分区。
  • ORDER BY salary DESC:在每个部门内按工资降序排列。
  • DENSE_RANK():为每个部门的员工按工资排名,即使有并列的行,排名也不会跳过。

输出结果:
在这里插入图片描述

(4)、NTILE(n)

NTILE(n)将结果集划分为n个桶(或分组),并为每一行分配一个桶编号。桶的大小尽可能均匀分布。

示例:将员工按工资分为4个等级

SELECT name, salary, NTILE(4) OVER (ORDER BY salary DESC) AS salary_grade
FROM employees;

解释:

  • ORDER BY salary DESC:按工资降序排列。
  • NTILE(4):将员工按工资分为4个等级,每个等级分配一个桶编号。
    输出结果:
    在这里插入图片描述
(5)、LAG()和LEAD()

LAG()和LEAD()用于访问当前行之前的行或之后的行的数据。LAG()访问前一行,LEAD()访问后一行。你可以指定偏移量(默认为1),并提供默认值(当没有前/后行时返回)。

示例:比较员工与其前一名员工的工资差额

SELECT name, salary, LAG(salary, 1, 0) OVER (ORDER BY salary DESC) AS prev_salary,salary - LAG(salary, 1, 0) OVER (ORDER BY salary DESC) AS salary_diff
FROM employees;

解释:

  • LAG(salary, 1, 0):获取前一行的工资,如果没有前一行则返回0。
  • salary - LAG(salary, 1, 0):计算当前行与前一行的工资差额。
    输出结果:
    在这里插入图片描述
    在这里插入图片描述
(6)、FIRST_VALUE()和LAST_VALUE()

FIRST_VALUE()返回窗口中第一个值,LAST_VALUE()返回窗口中最后一个值。你可以通过ORDER BY控制窗口中的排序顺序。

示例:获取每个部门中最高和最低工资的员工

SELECT department, name, salary, FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS highest_salary,LAST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lowest_salary
FROM employees;

解释:

  • FIRST_VALUE(salary):获取每个部门中工资最高的员工的工资。
  • LAST_VALUE(salary):获取每个部门中工资最低的员工的工资。为了确保LAST_VALUE()返回最后一个值,我们使RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 来定义窗口框架。
    窗口框架常用范围说明:
  • UNBOUNDED PRECEDING:表示从窗口的最开始(第一行)。
  • UNBOUNDED FOLLOWING:表示到窗口的最后(最后一行)。
  • CURRENT ROW:表示当前行。
  • n PRECEDING 或 n FOLLOWING:表示从前/后n行开始或结束。
    输出结果:
    在这里插入图片描述
(7)、SUM()、AVG()、MIN()、MAX()

这些聚合函数也可以作为窗口函数使用,允许你在每个分区或整个结果集中进行聚合计算,而不需要使用GROUP BY。

示例:计算每个部门的累计工资

SELECT department, name, salary, SUM(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS cumulative_salary
FROM employees;

解释:

  • SUM(salary):计算每个部门的累计工资。
  • PARTITION BY department:按部门划分分区。
  • ORDER BY salary DESC:在每个部门内按工资降序排列,确保累计工资按工资从高到低累加。
    输出结果:
    在这里插入图片描述

以上示例展示了聚合函数在窗口函数中的使用。聚合函数也可以不使用窗口函数,直接使用。
示例:求出每个部门的工资总和

SELECTdepartment,SUM(salary)
FROMemployees
GROUP BYdepartment;

运行结果:
在这里插入图片描述

2、窗口框架(Frame Clause)

窗口框架允许你进一步控制窗口函数的作用范围。你可以指定窗口函数作用的行范围。

常用的框架类型包括:

  • ROWS BETWEEN … AND …:基于行数定义窗口框架。
  • RANGE BETWEEN … AND …:基于值的范围定义窗口框架。
(1)、ROWS BETWEEN

ROWS BETWEEN基于行数定义窗口框架。你可以指定窗口函数作用的前几行或后几行。

示例:计算每个员工及其前两行的平均工资

SELECT name, salary, AVG(salary) OVER (ORDER BY salary DESC ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS avg_salary
FROM employees;

解释:

  • ROWS BETWEEN 2 PRECEDING AND CURRENT ROW:窗口框架范围为前2行到当前行。
  • AVG(salary):计算当前行及其前两行的平均工资。
    常用范围说明:
  • UNBOUNDED PRECEDING:表示从窗口的最开始(第一行)。
  • UNBOUNDED FOLLOWING:表示到窗口的最后(最后一行)。
  • CURRENT ROW:表示当前行。
  • n PRECEDING 或 n FOLLOWING:表示从前/后n行开始或结束。
    输出结果:
    在这里插入图片描述
(2)、RANGE BETWEEN

RANGE BETWEEN基于值的范围定义窗口框架。它适用于数值类型的列,窗口框架基于值的差异而不是行数。

示例:计算每个员工及其工资相同或相差不超过5000的其他员工的平均工资

SELECT name, salary, AVG(salary) OVER (ORDER BY salary DESC RANGE BETWEEN 5000 PRECEDING AND 5000 FOLLOWING) AS avg_salary
FROM employees;

解释:

  • RANGE BETWEEN 5000 PRECEDING AND 5000 FOLLOWING:窗口框架包括当前行及其工资相差不超过5000的其他行。
  • AVG(salary):计算当前行及其工资相差不超过5000的其他行的平均工资。
    输出结果:
    在这里插入图片描述
    如果只是和高于自己最高5000的工资一起求平均值,如下:
    在这里插入图片描述

窗口函数总结:
窗口函数是MySQL 8.0及更高版本中非常强大的功能,能够让你在查询结果集中进行复杂的聚合计算,而不需要使用子查询或自连接。
常见的窗口函数包括:

  • ROW_NUMBER():为每一行分配唯一的行号。
  • RANK()和DENSE_RANK():为每一行分配排名。
  • NTILE(n):将结果集划分为n个桶。
  • LAG()和LEAD():访问前一行或后一行的数据。
  • FIRST_VALUE()和LAST_VALUE():获取窗口中的第一个或最后一个值。
  • SUM()、AVG()、MIN()、MAX():在窗口中进行聚合计算。
    此外,窗口框架(ROWS BETWEEN和RANGE BETWEEN)允许你进一步控制窗口函数的作用范围,使你能够更灵活地定义计算的上下文。

3、公用表表达式(CTE)

用于将复杂的查询分解为多个简单的步骤,提高可读性和维护性。CTE可以递归使用,适用于处理层次结构数据(如组织结构图、树形结构等)。

示例:

  WITH RECURSIVE org_tree AS (SELECT id, name, manager_idFROM employeesWHERE manager_id IS NULLUNION ALLSELECT e.id, e.name, e.manager_idFROM employees eINNER JOIN org_tree ot ON e.manager_id = ot.id)SELECT * FROM org_tree;

运行结果:
在这里插入图片描述

4、临时表(Temporary Tables)

用于存储中间结果,避免重复计算。临时表只在当前会话中可见,会话结束后自动删除。

示例:创建一个临时表并使用临时表

CREATE TEMPORARY TABLE temp_employees ASSELECT * FROM employees WHERE department = 'HR';
select * from temp_employees;

运行结果:
在这里插入图片描述

5、索引(Indexes)

用于加速查询操作,特别是在大表上。索引可以显著提高查询性能,但也会影响插入、更新和删除操作的速度。常见的索引类型包括B-tree索引、哈希索引、全文索引等。

创建索引示例:

  CREATE INDEX idx_name ON employees (name);

6、视图(Views)

用于创建虚拟表,封装复杂的查询逻辑。视图可以简化查询,隐藏底层表的复杂性,并提供数据抽象。

示例:

  CREATE VIEW hr_employees ASSELECT * FROM employees WHERE department = 'HR';

7、存储过程(Stored Procedures)

用于封装一组SQL语句,作为可复用的代码块。存储过程可以接受参数、执行复杂的业务逻辑,并返回结果。

示例:创建一个存储过程,指定id查询对应的数据

  DELIMITER //CREATE PROCEDURE get_employee_by_id(IN emp_id INT)BEGINSELECT * FROM employees WHERE id = emp_id;END //DELIMITER ;

解释:

  • DELIMITER //:更改MySQL的语句分隔符为//。默认情况下,MySQL使用分号;作为语句的结束符。然而,在创建存储过程时,存储过程体内部可能包含多个SQL语句,每个语句以分号结束。为了避免MySQL将这些内部的分号误认为是整个存储过程定义的结束,我们需要临时更改分隔符。这样MySQL会将整个存储过程定义视为一个完整的语句,直到遇到//才执行。
  • CREATE PROCEDURE get_employee_by_id(IN emp_id INT):创建一个名称为get_employee_by_id的存储过程。定义了一个输入参数emp_id,类型为INT。IN表示这是一个输入参数,即调用存储过程时需要传递的值。emp_id是你要查询的员工ID。
  • BEGIN和END:用于包裹存储过程的主体部分。在BEGIN和END之间的所有SQL语句都属于该存储过程的逻辑。本例中,存储过程体只包含一条SELECT语句,用于从employees表中查询与emp_id匹配的员工信息。
  • DELIMITER ; :将分隔符恢复为默认的分号;。这一步是为了确保后续的SQL语句使用默认的分隔符。
    运行结果:
    在这里插入图片描述
    调用存储过程示例:
CALL get_employee_by_id(10001);

在这里插入图片描述

8、触发器(Triggers)

用于在特定事件发生时自动执行一组SQL语句。触发器通常用于实现数据完整性约束、审计日志记录等功能。

示例:创建触发器(校验employees表新增的数据,age小于18岁时提示报错)

  CREATE TRIGGER before_insert_employeeBEFORE INSERT ON employeesFOR EACH ROWBEGINIF NEW.age < 18 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Employee must be at least 18 years old';END IF;END;

解释:

  • CREATE TRIGGER before_insert_employee:创建一个名称为before_insert_employee的触发器。
  • BEFORE INSERT ON employees:指定触发器的执行时机。在employees表执行Insert语句之前触发。
  • FOR EACH ROW:指定触发器的执行粒度。FOR EACH ROW表示触发器会为每一行插入操作单独执行一次。也就是说,如果你一次性插入多条记录,触发器会为每一条记录分别检查条件。
  • BEGIN和END:用于包裹触发器的主体部分。在BEGIN和END之间的所有逻辑都属于该触发器的执行内容。在这个例子中,触发器体包含一个IF语句,用于检查新插入的员工年龄是否小于18岁。如果条件成立,则抛出一个错误,阻止插入操作。
  • IF NEW.age < 18 THEN:在触发器中,NEW是一个特殊的关键字,表示即将插入的新记录。它允许你在触发器中访问新记录的各个字段值。如果IF条件成立(即NEW.age < 18),则执行THEN后面的逻辑。
  • SIGNAL SQLSTATE ‘45000’ SET MESSAGE_TEXT = ‘Employee must be at least 18 years old’; : SIGNAL语句可以让你在触发器或存储过程中显式地抛出错误,从而中断当前的操作。45000是MySQL中的一个通用错误代码,表示“未分类的SQL状态”(unclassified SQL state)。你可以使用这个代码来抛出自定义的错误。SET MESSAGE_TEXT = 'Employee must be at least 18 years old’设置错误消息的内容。当触发器抛出错误时,MySQL会返回这条消息给客户端,告知用户具体的错误原因。
  • END IF;:结束IF语句的逻辑块。如果没有抛出错误,触发器将继续执行后续的逻辑(如果有)。
    执行结果:
    在这里插入图片描述
    验证触发器功能:
INSERT INTO employees VALUES ('10009', 'Alice', '16', 'HR', '70000', NULL)

在这里插入图片描述

7、SQL的优化技巧

为了提高SQL查询的性能,以下是几种常见的优化技巧:

  • 使用索引:为经常用于查询条件的列创建索引,以加速查询操作。避免在频繁更新的列上创建索引,因为索引会增加写操作的开销。
  • 避免全表扫描:尽量使用索引覆盖查询,确保查询只访问必要的数据。避免使用 SELECT *,只选择需要的列。
  • 合理使用JOIN:尽量减少JOIN的数量,避免不必要的连接。如果可能,使用子查询代替复杂的JOIN。
  • 使用合适的数据类型:选择合适的数据类型可以减少存储空间并提高查询性能。例如,使用INT代替VARCHAR存储数字,使用DATE代替VARCHAR存储日期。
  • 分页查询:对于大数据集,使用LIMIT和OFFSET进行分页查询,避免一次性加载过多数据。也可以考虑使用键集分页(Keyset Pagination)来提高分页性能。
  • 使用缓存:对于频繁执行的查询,可以使用查询缓存(如MySQL的查询缓存或应用层缓存)来减少数据库的压力。
  • 分析查询计划:使用EXPLAIN语句分析查询的执行计划,找出潜在的性能瓶颈。根据分析结果调整查询语句或索引。
    示例:
 EXPLAIN SELECT * FROM employees WHERE department = 'HR';

8、SQL总结

SQL是一种强大且灵活的查询语言,广泛应用于关系型数据库的管理和操作。通过掌握SQL的各个组成部分(DDL、DML、DQL、DCL 和 TCL),你可以有效地创建、修改、查询和管理数据库中的数据。此外,SQL 还提供了许多高级功能,如窗口函数、CTE、索引、视图等,帮助你处理复杂的业务需求和优化查询性能。

仰天大笑出门去,我辈岂是蓬蒿人!!!

相关文章:

Mysql--基础篇--SQL(DDL,DML,窗口函数,CET,视图,存储过程,触发器等)

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于管理和操作关系型数据库的标准语言。它允许用户定义、查询、更新和管理数据库中的数据。SQL是一种声明性语言&#xff0c;用户只需要指定想要执行的操作&#xff0c;而不需要详细说明如何…...

[Transformer] The Structure of GPT, Generative Pretrained Transformer

The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work...

【教程】Unity 本地化多语种 | Localization 工具组

开发平台&#xff1a;Unity 6.0 编程平台&#xff1a;Visual Studio 2022 编程语言&#xff1a;CSharp 6.0 工具包类&#xff1a;Localization   一、前言 本地化多语言类型是软件面向国际化所必须的功能项。Unity 在 2022 版本后推出 Localization 工具包&#xff0c;以降低…...

模式识别与机器学习

文章目录 考试题型零、简介1.自学内容(1)机器学习(2)机器学习和统计学中常见的流程(3)导数 vs 梯度(4)KL散度(5)凸优化问题 2.基本概念3.典型的机器学习系统4.前沿研究方向举例 一、逻辑回归1.线性回归2.逻辑回归3.随堂练习 二、贝叶斯学习基础1.贝叶斯公式2.贝叶斯决策3.分类器…...

鸿蒙面试 2025-01-10

写了鉴权工具&#xff0c;你在项目中申请了那些权限&#xff1f;&#xff08;常用权限&#xff09; 位置权限 &#xff1a; ohos.permission.LOCATION_IN_BACKGROUND&#xff1a;允许应用在后台访问位置信息。 ohos.permission.LOCATION&#xff1a;允许应用访问精确的位置信息…...

在vscode上

第一步 安装插件 &#xff08;1&#xff09;从菜单处打开vscode&#xff0c;之后点击左侧“拓展”&#xff0c;在搜索栏输入“platform”&#xff0c;安装这个插件。 注&#xff1a;安装过程可能会慢一点&#xff0c;可以尝试连接自己的热点 &#xff08;2&#xff09;安装完…...

用WebGPU实现现代Web3D渲染——突破传统性能瓶颈的解决方案

引言 随着Web技术的不断发展&#xff0c;Web3D应用的需求不断增加。从游戏引擎到可视化工具&#xff0c;3D渲染技术正在被广泛地应用。然而&#xff0c;传统WebGL技术在性能、效率和灵活性上仍存在局限性。而WebGPU作为一种新兴的Web标准&#xff0c;为现代3D渲染提供了强大而…...

HTML5 加载动画(Loading Animation)

加载动画&#xff08;Loading Animation&#xff09;详解 概述 加载动画是指在数据加载过程中&#xff0c;向用户展示的一种视觉效果&#xff0c;旨在提升用户体验&#xff0c;告知用户系统正在处理请求。它可以减少用户的等待焦虑感&#xff0c;提高界面的互动性。 常见的加…...

.NET AI 开发人员库 --AI Dev Gallery简单示例--问答机器人

资源及介绍接上篇 nuget引用以下组件 效果展示&#xff1a; 内存和cpu占有&#xff1a; 代码如下&#xff1a;路径换成自己的模型路径 模型请从上篇文尾下载 internal class Program{private static CancellationTokenSource? cts;private static IChatClient? model;privat…...

Linux 高级路由 —— 筑梦之路

Linux 高级路由详解 本文将基于您提供的 Linux 高级路由极简教程 文章&#xff0c;深入探讨 Linux 高级路由的概念、配置方法以及应用场景。 一、什么是 Linux 高级路由&#xff1f; Linux 高级路由是指利用 Linux 内核提供的强大网络功能&#xff0c;实现超越传统路由表和默…...

实习总结(经历篇)

自从读研后,有可能是看见同龄的财会专业的同学去各种大厂实习:B站,阿里等,身边也有舍友在有过小厂实习,所以一直有个想法就是去实习,这个想法终于在研一的暑假快开始前被我赋予行动。 研一暑假和同门一起在boss等招聘软件投简历,但是当时并没有很好的对简历做修改,投递…...

【ShuQiHere】pandas 与 DataFrame 全面详解

【ShuQiHere】 本文将为您系统介绍 pandas 与 DataFrame 之间的区别&#xff0c;着重讲解 DataFrame 的常用方法以及相关的数据可视化操作&#xff0c;包括 df.hist()、df.plot()、df.boxplot() 等。无论您是数据分析新手还是有经验的专业人士&#xff0c;都可以从本文中快速掌…...

【回眸】发财日记

积累本金&#xff0c;有舍有得。 上学时在线上兼职&#xff0c;基本够开销没攒下钱&#xff0c;上班之后工资还能攒下不少。 对于花销要有舍有得。认同一句话“买东西要买能力范围内最好的”。 所以&#xff0c;每次花钱前都会思考: 是否需要&#xff0c;是否能替代已有产品&…...

文件读写到SQLite数据库的方法

在 SQLite 数据库中&#xff0c;将文件读写到数据库的常见方法主要有以下几种&#xff1a; 1. 将文件以 BLOB 类型存储 BLOB&#xff08;Binary Large Object&#xff09; 是 SQLite 中的二进制数据类型&#xff0c;可以直接用来存储文件内容。 步骤&#xff1a; 创建表 创建一…...

基于SDN的ddos攻击检测与防御

本项目依赖mininet, floodlight, sFlow-RT 1&#xff0c;启动floodlight cd floodlightjava -jar target/floodlight.jar 浏览器访问http://localhost:8080/ui/pages/index.html 或者http://localhost:8080/ui/index.html 2&#xff0c;创建 mininet拓扑 sudo mn --toposingl…...

RocketMQ 和 Kafka 有什么区别?

目录 RocketMQ 是什么? RocketMQ 和 Kafka 的区别 在架构上做减法 简化协调节点 简化分区 Kafka 的底层存储 RocketMQ 的底层存储 简化备份模型 在功能上做加法 消息过滤 支持事务 加入延时队列 加入死信队列 消息回溯 总结 来源:面试官:RocketMQ 和 Kafka 有…...

关于人工智能学习框架

人工智能学习框架&#xff1a;智能时代的强大引擎 在人工智能蓬勃发展的今天&#xff0c;学习框架如同一座座坚实的桥梁&#xff0c;连接着理论与实践&#xff0c;承载着创新与突破&#xff0c;为智能科技的前行提供了强大动力。本文将深入剖析人工智能学习框架的重要意义、核…...

Android14上使用libgpiod[gpioinfo gpioget gpioset ...]

环境 $ cat /etc/os-release NAME="Ubuntu" VERSION="20.04.5 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.5 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="…...

【文件I/O】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用&#xff08;运行中的程序&#xff09;的角度。外部特指文件。 这里的文件是泛指&#xff0c;并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…...

TensorFlow Quantum快速编程(高级篇)

五、实战:量子分类器应用 5.1 数据准备 在实战构建量子分类器时,数据准备是基石环节。选用鸢尾花数据集,这一经典数据集在机器学习领域应用广泛,其涵盖了三种鸢尾花品种的样本,每个样本包含花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征。鉴于本次构建二分类量子分类…...

无人机+无人车:车机协同技术探索详解

无人机与无人车之间的协同技术是一种重要的研究方向&#xff0c;它结合了无人机的高空视野和无人车的地面移动能力&#xff0c;旨在实现更高效、灵活的作业。以下是对无人机与无人车车机协同技术的详细探索&#xff1a; 一、技术基础 1. 通信机制&#xff1a; 无人机与无人车…...

解决WordPress出现Fatal error: Uncaught TypeError: ftp_nlist()致命问题

错误背景 WordPress版本&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本&#xff1a;woocommerce.9.5.1 WordPress在安装了WooCommerce插件后&#xff0c;安装的过程中没有问题&#xff0c;在安装完成后提示&#xff1a; 此站点遇到了致命错误&#xff0c;请查看您站点管理…...

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…...

【数据库】六、数据库设计

文章目录 六、数据库设计1 数据库设计步骤1.1 规划阶段1.2 需求分析1.3 概念设计阶段(重点)1.4 逻辑设计阶段(重点)1.5 物理设计阶段1.6 数据库的实现1.7 数据库运行与维护 2 概念模型设计2.1 ER模型2.1.1 ER模型的基本元素2.1.2 联系的设计2.1.3 采用ER模型的概念设计2.1.4 ER…...

错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中

一、问题 用maven对一个开源项目打包时&#xff0c;遇到了“错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。”&#xff1a; 二、原因 原因是当前java环境是Java 8&#xff08;版本52.0&#xff09;&#xff0c;但…...

不同音频振幅dBFS计算方法

1. 振幅的基本概念 振幅是描述音频信号强度的一个重要参数。它通常表示为信号的幅度值&#xff0c;幅度越大&#xff0c;声音听起来就越响。为了更好地理解和处理音频信号&#xff0c;通常会将振幅转换为分贝&#xff08;dB&#xff09;单位。分贝是一个对数单位&#xff0c;能…...

《探秘开源多模态神经网络模型:AI 新时代的万能钥匙》

《探秘开源多模态神经网络模型&#xff1a;AI 新时代的万能钥匙》 一、多模态模型的崛起之路&#xff08;一&#xff09;从单一到多元&#xff1a;模态的融合演进&#xff08;二&#xff09;关键技术突破&#xff1a;解锁多模态潜能 二、开源多模态模型深度剖析&#xff08;一&…...

计算机网络之---端口与套接字

总括 端口&#xff1a;是计算机上用于标识网络服务的数字标识符&#xff0c;用于区分不同的服务或应用程序。套接字&#xff1a;是操作系统提供的用于进程间网络通信的编程接口&#xff0c;允许程序通过它来进行数据的发送、接收和连接管理。关系&#xff1a;端口号用于标识服…...

el-tabs中tabs过多造成form表单输入的时候卡顿

这里写自定义目录标题 tabs过多造成的输入卡顿解决方案方案一方案二 出现的并发问题解决方案 tabs过多造成的输入卡顿 描述&#xff1a;前端要写一个需求&#xff0c;大概有一百多个tab渲染过来&#xff0c;每个tab中都是一个表单&#xff0c;这个时候数据渲染任务加重&#x…...

vue+vite打包空白问题

在使用vuevite创建项目之后如果我们在部署项目的时候使用的不是主域名 比如www.custom.com 而是使用了www.custom.com/test 为访问域名的时候 如果不小心没有注意到这个变化 在打包上线之后会出现页面空白 js或者css404问题 我们可以在vite.config.ts去配置路径base export de…...

【python翻译软件V1.0】

如果不想使用密钥的形式&#xff0c;且需要一个直接可用的中英文翻译功能&#xff0c;可以使用一些免费的公共 API&#xff0c;如 opencc 或其他无需密钥的库&#xff0c;或直接用 requests 获取翻译结果。 其中&#xff0c;我可以给你一个简单的代码示例&#xff0c;使用 tra…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

实战训练1—求最大公约数 问题描述&#xff1a; 给定两个正整数&#xff0c;求它们的最大公约数。 输入格式&#xff1a; 输入一行&#xff0c;包含两个正整数。 输出格式&#xff1a; 输出一行&#xff0c;包含gcd正整数&#xff0c;即这两个正整数的最大公约数。 输入…...

HTTPS协议的基础与工作原理

什么是HTTPS&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP协议的安全版本&#xff0c;它通过SSL/TLS协议对通信数据进行加密&#xff0c;确保数据的安全传输。与HTTP相比&#xff0c;HTTPS能防止数据被窃取、篡改或伪造&#xff0c;广…...

手游业务该如何选择服务器?

在网络游戏行业当中&#xff0c;对于服务器配置的需求是非常高的&#xff0c;大型的网络游戏需要服务器的高稳定性&#xff0c;来保证用户的游戏体验感&#xff0c;那么对于手游业务来说该如何进行选择服务器呢&#xff1f; 手游业务通常都需要处理大量的用户数据信息和并发请求…...

Python 数据建模完整流程指南

在数据科学和机器学习中&#xff0c;建模是一个至关重要的过程。通过有效的数据建模&#xff0c;我们能够从原始数据中提取有用的洞察&#xff0c;并为预测或分类任务提供支持。在本篇博客中&#xff0c;我们将通过 Python 展示数据建模的完整流程&#xff0c;包括数据准备、建…...

java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

今天在朋友机子上运行代码&#xff0c;在生成token的时候&#xff0c;遇到了这样一个问题&#xff1a; Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.9.1.jar:0.…...

12. C语言 数组与指针(深入理解)

本章目录: 前言1. 什么是数组&#xff1f;2. 数组的声明与初始化声明数组初始化数组 3. 访问数组元素遍历数组 4. 获取数组长度使用 sizeof 获取长度使用宏定义简化 5. 数组与指针数组名与指针的区别使用指针操作数组 6. 多维数组遍历多维数组 7. 数组作为函数参数8. 高级技巧与…...

C#用直线和曲线抗锯齿

使用 GDI 绘制一条线时&#xff0c;要提供线条的起点和终点&#xff0c;但不必提供有关线条上各个像素的任何信息。 GDI 与显示驱动程序软件协同工作&#xff0c;确定将打开哪些像素以在特定显示设备上显示该线条。 效果对比 代码实现 关键代码 e.Graphics.SmoothingMode Sm…...

从SS到CSS:探索网页样式设计的奥秘

一、什么是CSS CSS&#xff0c;全称为层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;是一种用于描述HTML&#xff08;超文本标记语言&#xff09;或XML&#xff08;包括如SVG、MathML等各种XML方言&#xff09;文档样式的样式表语言。 从结构和功能的…...

[Git] git reset --hard / git reset --soft

git reset --hard 功能&#xff1a;重置索引&#xff08;暂存区&#xff09;和工作目录到指定的提交状态。这意味着它会丢弃所有未提交的更改和已暂存的更改。 适用场景&#xff1a;当你想要完全放弃当前工作目录中的所有更改并回退到某个特定提交状态时&#xff0c;可以使用这…...

OIDC IdentityServer4》》授权码模式+刷新令牌

认证服务 new Client {ProtocolType "oidc",ClientName "测试",ClientId "zen",//定义客户端 Id 要唯一ClientSecrets { new Secret("abc123zenabres89jijkomnlj".Sha256()) },//Client用来获取token// 混合模式AllowedGrantTyp…...

Sql 创建用户

Sql server 创建用户 Sql server 创建用户SQL MI 创建用户修改其他用户密码 Sql server 创建用户 在对应的数据库执行&#xff0c;该用户得到该库的所有权限 test.database.chinacloudapi.cn DB–01 DB–02 创建服务器登录用户 CREATE LOGIN test WITH PASSWORD zDgXI7rsafkak…...

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板&#xff0c;输入Go: Install/Update Tools&#xff0c;并单击该命令执行&#xff0c;安装或更新Go语…...

搭建Hadoop分布式集群

软件和操作系统版本 Hadoop框架是采用Java语言编写&#xff0c;需要java环境&#xff08;jvm&#xff09; JDK版本&#xff1a;JDK8版本 &#xff0c;本次使用的是 Java: jdk-8u431-linux-x64.tar.gz Hadoop: hadoop-3.3.6.tar.gz 三台Linux虚拟节点: CentOS-7-x86_64-DVD-2…...

网络安全应急响应技术原理与应用

网络安全应急响应概述 “居安思危&#xff0c;思则有备&#xff0c;有备无患。”网络安全应急响应是针对潜在发生的网络安全事件而采取的网络安全措施。本节主要阐述网络安全响应的概念、网络安全应急响应的发展、网络安全应急响应的相关要求。 17.1.1 网络安全应急响应概念 网…...

01 Oracle自学环境搭建

1 Oracle12C安装 1.1 下载 官网地址&#xff1a;https://www.oracle.com/ 解压安装包 运行安装程序 1.2 安装 配置安全更新 软件更新 安装选项 系统类 Oracle主目录用户选择 使用现有windows用户&#xff1a;如果选择该项&#xff0c;则需要指定没有管理权限的用户。 创建新Wi…...

MYSQL----------MySQL权限管理

1 MySQL权限管理 .1.1 权限系统的工作原理 查看用户权限 -- 查看用户的权限 SHOW GRANTS FOR usernamelocalhost;解释&#xff1a;这条SQL语句用于查看指定用户在本地主机上的权限。其中username是要查看权限的用户。 .1.2 权限表的存取 查询权限表&#xff08;以user表为例&a…...

学习HLS.js

前言 HTTP 实时流&#xff08;也称为HLS&#xff08;.m3u8&#xff09;&#xff09;是一种基于HTTP的自适应比特率流通信协议。HLS.js依靠HTML5视频和MediaSource Extensions进行播放&#xff0c;其特点&#xff1a;视频点播和直播播放列表、碎片化的 MP4 容器、加密媒体扩展 …...

Zustand selector 发生 infinate loops的原因以及解决

Zustand selector 发生 infinate loops 做zustand tutorial project的时候&#xff0c;使用选择器方法引入store&#xff0c;出现Maximum update depth exceeded,也就是组件一直重新渲染&#xff0c;改成直接使用store就没有不会出现这个问题。如下&#xff1a; // const [xIs…...

Unity自定义编辑器:基于枚举类型动态显示属性

1.参考链接 2.应用 target并设置多选编辑 添加[CanEditMultipleObjects] using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;[CustomEditor(typeof(LightsState))] [CanEditMultipleObjects] public class TestInspector :…...