-
1. 数据定义语言 (DDL)用于定义和管理数据库结构。CREATE:创建数据库对象(如表、视图、索引等)。CREATE TABLE students ( id INT PRIMARY KEY, name VARCHAR(50), age INT ); ALTER:修改现有数据库对象。ALTER TABLE students ADD COLUMN email VARCHAR(100); DROP:删除数据库对象。DROP TABLE students; TRUNCATE:快速删除表中的所有数据(保留表结构)。TRUNCATE TABLE students; RENAME(某些数据库支持):重命名表或列。ALTER TABLE students RENAME TO pupils; 2. 数据操作语言 (DML)用于操作数据(增删改查)。INSERT:向表中插入数据。INSERT INTO students (id, name, age) VALUES (1, 'Alice', 20); UPDATE:更新表中的数据。UPDATE students SET age = 21 WHERE id = 1; DELETE:删除表中的数据。DELETE FROM students WHERE id = 1; MERGE(某些数据库支持):根据条件插入或更新数据(如SQL Server、Oracle)。MERGE INTO students AS target USING (VALUES (1, 'Bob', 22)) AS source (id, name, age) ON target.id = source.id WHEN MATCHED THEN UPDATE SET name = source.name, age = source.age WHEN NOT MATCHED THEN INSERT (id, name, age) VALUES (source.id, source.name, source.age); 3. 数据查询语言 (DQL)用于查询数据。SELECT:从表中检索数据。SELECT name, age FROM students WHERE age > 18; FROM:指定查询的数据源。WHERE:指定查询条件。GROUP BY:按一个或多个列分组数据。SELECT age, COUNT(*) FROM students GROUP BY age; HAVING:对分组后的数据进行过滤。SELECT age, COUNT(*) FROM students GROUP BY age HAVING COUNT(*) > 1; ORDER BY:对结果集排序。SELECT name, age FROM students ORDER BY age DESC; JOIN:连接多个表。SELECT students.name, courses.course_name FROM students JOIN enrollments ON students.id = enrollments.student_id JOIN courses ON enrollments.course_id = courses.id; UNION:合并两个或多个SELECT语句的结果集。SELECT name FROM students UNION SELECT teacher_name FROM teachers; 4. 数据控制语言 (DCL)用于控制数据库访问权限。GRANT:授予用户权限。GRANT SELECT, INSERT ON students TO user1; REVOKE:撤销用户权限。REVOKE INSERT ON students FROM user1; 5. 事务控制语言 (TCL)用于管理事务。COMMIT:提交事务,保存更改。COMMIT; ROLLBACK:回滚事务,撤销更改。ROLLBACK; SAVEPOINT:设置事务保存点。SAVEPOINT sp1; SET TRANSACTION:设置事务属性(如隔离级别)。SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 6. 其他常用关键字INDEX:创建或删除索引。CREATE INDEX idx_name ON students (name); VIEW:创建或删除视图。CREATE VIEW student_view AS SELECT name, age FROM students; EXISTS:检查子查询是否返回结果。SELECT name FROM students WHERE EXISTS (SELECT * FROM courses WHERE courses.teacher_id = 1); CASE:条件表达式。SELECT name, CASE WHEN age < 18 THEN 'Minor' ELSE 'Adult' END AS age_group FROM students; NULL:表示空值。DISTINCT:去除重复值。SELECT DISTINCT age FROM students; LIMIT/OFFSET(某些数据库支持):限制结果集大小。SELECT * FROM students LIMIT 10 OFFSET 5; AS:为列或表设置别名。SELECT name AS student_name FROM students; 7. 高级关键字WITH(公用表表达式,CTE):定义临时结果集。WITH student_counts AS ( SELECT teacher_id, COUNT(*) AS student_count FROM enrollments GROUP BY teacher_id ) SELECT teachers.name, student_counts.student_count FROM teachers JOIN student_counts ON teachers.id = student_counts.teacher_id; PIVOT/UNPIVOT(某些数据库支持):旋转数据。OVER:窗口函数,用于计算排名、累计和等。SELECT name, age, RANK() OVER (ORDER BY age DESC) AS rank FROM students; 总结SQL关键字非常丰富,涵盖了数据库的各个方面。除了SELECT、UPDATE和DELETE之外,还有许多其他关键字用于定义表结构、管理权限、控制事务、执行复杂查询等。掌握这些关键字可以帮助你更高效地操作数据库。如果你对某个关键字或功能有更具体的需求,可以进一步深入学习!
-
以下是使用 SQLAlchemy 向 MySQL 数据库插入数据的详细步骤:1. 安装依赖pip install sqlalchemy pymysql2. 基础配置from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import declarative_base, sessionmaker # 创建引擎(替换为你的数据库信息) engine = create_engine('mysql+pymysql://user:password@localhost/dbname', echo=True) # 创建基类 Base = declarative_base() # 创建会话类 Session = sessionmaker(bind=engine) session = Session() 3. 定义数据模型class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) email = Column(String(100)) def __repr__(self): return f"<User(name='{self.name}', email='{self.email}')>" 4. 插入数据方式方式一:使用 ORM 模型插入# 创建实例 new_user = User(name='Alice', email='alice@example.com') # 添加到会话 session.add(new_user) # 提交事务 session.commit() 方式二:使用 Core 直接插入from sqlalchemy import insert # 创建插入语句 stmt = insert(User).values(name='Bob', email='bob@example.com') # 执行插入 with engine.connect() as conn: conn.execute(stmt) 5. 批量插入优化# 生成批量数据 users_data = [ {'name': 'Charlie', 'email': 'charlie@example.com'}, {'name': 'David', 'email': 'david@example.com'}, # 更多数据... ] # 使用 add_all 批量添加 session.add_all([User(**data) for data in users_data]) session.commit() # 或者使用 core 的批量插入 stmt = insert(User) with engine.connect() as conn: conn.execute(stmt, users_data) 6. 完整示例# 初始化表结构(如果不存在) Base.metadata.create_all(engine) # 插入单条数据 new_user = User(name='Eve', email='eve@example.com') session.add(new_user) session.commit() # 查询验证 users = session.query(User).all() print(users) # 输出:[<User(name='Eve', email='eve@example.com')>, ...] # 关闭会话 session.close() 注意事项:事务管理:使用 ORM 时,确保在修改数据后调用 commit(),发生异常时调用 rollback()连接池:生产环境建议使用连接池配置:engine = create_engine( 'mysql+pymysql://user:pass@host/db', pool_size=10, max_overflow=20 ) 数据类型映射:确保 Python 类型与 MySQL 类型正确对应(如 String 对应 VARCHAR)批量插入性能:对于大量数据(>1000条),建议分批提交(每批 500-1000 条)建议在实际使用中结合异常处理机制,例如:try: session.add(new_user) session.commit() except Exception as e: session.rollback() print(f"Error: {str(e)}")
-
在Python中使用SQLAlchemy执行 EXPLAIN 语句并输出结果时,如果你想同时输出结果的标题(即列名),可以通过访问结果集的 keys() 方法来实现。以下是一个示例,展示如何执行 EXPLAIN 语句并输出结果及其标题:from sqlalchemy import create_engine, text # 创建数据库引擎 engine = create_engine('mysql+pymysql://user:password@host/dbname') # 创建连接 with engine.connect() as connection: # 执行 EXPLAIN 语句 explain_query = text("explain select * from my_tree, keyword_type where my_tree.type_id = keyword_type.type_id") result = connection.execute(explain_query) # 获取列名(标题) columns = result.keys() col_count = len(columns) # 输出列名 print(f'| {" | ".join(columns)} |') print('|--' * col_count + '|') # 处理结果 for row in result: # 输出每一行的数据 print(f'| {" | ".join([str(row[i]) for i in range(len(columns))])} |') 代码说明:创建数据库引擎:使用 create_engine 创建数据库连接引擎。执行 EXPLAIN 语句:通过 text 函数将SQL语句包装为可执行的SQL表达式,并使用 connection.execute 执行。获取列名:使用 result.keys() 获取结果集的列名。输出列名:使用 join 方法将列名连接成一个字符串并打印。输出结果:遍历结果集,将每一行的数据按照列名顺序输出。注意事项:数据库连接字符串:确保替换 'mysql+pymysql://user:password@host/dbname' 为你的实际数据库连接字符串。SQL语句:替换 "EXPLAIN SELECT * FROM your_table WHERE your_condition" 为你实际需要分析的SQL语句。美化输出:"-" * 50 仅用于在列名和数据之间打印分隔线,可以根据需要调整或移除。依赖库:确保安装了 SQLAlchemy 和 PyMySQL 库,可以通过 pip install sqlalchemy pymysql 安装。通过这种方式,你可以清晰地看到 EXPLAIN 语句的输出结果及其对应的列名,方便分析SQL查询的执行计划。
-
在Java中通过JDBC执行SQL语句时,可以执行如 EXPLAIN、SHOW PROFILE 和 TRACE 这样的SQL语句来分析慢查询,但需要注意以下几点:EXPLAIN:EXPLAIN 用于显示MySQL如何执行一个查询的执行计划。通过JDBC,你可以像执行普通SQL查询一样执行 EXPLAIN 语句。例如:String explainQuery = "EXPLAIN SELECT * FROM your_table WHERE your_condition"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(explainQuery); while (rs.next()) { // 处理结果集,查看执行计划 System.out.println(rs.getString("id") + "\t" + rs.getString("select_type") + "\t" + ... ); } 通过解析 EXPLAIN 的结果,你可以分析查询的执行路径,查看是否使用了索引,以及扫描的行数等。SHOW PROFILE:SHOW PROFILE 用于分析SQL语句的执行时间细节,但它需要MySQL的profiling功能开启。在使用之前,需要确保MySQL的profiling是启用的,并且你的用户有权限执行这些命令。例如:String profileQuery = "SHOW PROFILE FOR QUERY 1"; // 假设之前已经用SET profiling=1;执行过查询 Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(profileQuery); while (rs.next()) { // 处理结果集,查看每个阶段的耗时 System.out.println(rs.getString("Status") + "\t" + rs.getDouble("Duration")); } 注意:SHOW PROFILE 在较新的MySQL版本中可能被弃用或限制,具体支持情况需要参考MySQL文档。TRACE(或其他诊断工具):MySQL本身没有直接的 TRACE SQL命令,但类似的功能可能通过其他工具或日志实现,比如使用慢查询日志、性能模式(Performance Schema)等。如果使用其他数据库(如Oracle或SQL Server),可能有不同的跟踪或诊断工具。注意事项:权限:确保执行这些命令的数据库用户具有足够的权限。性能影响:执行这些分析命令可能会对数据库性能产生影响,尤其是在生产环境中。版本兼容性:不同的MySQL版本可能对某些命令的支持有所不同,使用前请参考具体版本的官方文档。日志和监控:对于长期的性能监控,考虑使用数据库的慢查询日志或性能监控工具,而不是频繁手动执行这些命令。通过这些方法,你可以在Java应用中分析SQL性能,但建议在开发和测试环境中进行,以避免对生产系统造成不必要的负担。
-
什么是数据库的锁升级,InnoDB支持锁升级吗?
-
mysql中如何查看一个sql的执行耗时?
-
mysql用了索引一定会索引失效吗?
-
索引的长度太长有影响吗?为什么更推荐前缀索引?
-
联合索引是越多越好吗?我多建几个索引不是更好吗?
-
为什么MySQL会选错索引,如何解决?它是怎么进行索引选择的?
-
大学一直强调数据库范式,外键约束,但是实际工作中经常是反范式,不做外键约束。是正常的吗?为什么工作中不建议使用外键约束。
-
在进行DDL期间会阻塞DML动作吗?
-
where条件的顺序影响使用索引吗?比如有一个联合索引<a,b>,where a,b或者where b,a有区别吗
-
数据库字段加密后如何做模糊查询?
-
使用存储过程的弊端?
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签