数据记录的操作(insert,select,update,delete)函数和分组查询(group by),表连接(join on),嵌套查询(in)

本文详细介绍了SQL中用于插入、查找、更新和删除数据的基本命令,并覆盖了排序、分组查询、子查询等高级特性。同时,文章还介绍了如何进行模糊查询、满足多条件查询及使用聚合函数进行统计分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入:insert intotable1(field1,field2) values(value1,value2) 

查找:
         指定显示某一字段

         selectxing_ming from xue_sheng;

         模糊查询

         select* from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 

         满足多条件查询

                  select * from xue_sheng where xing_minglike '李%' and xing_bie='女';

进行排序查询

         order by 字段名 desc(降序) 或者 asc(默认升序)

         select * fromxue_sheng order by fen_shu desc;

        

更新:update table1 setfield1=value1 where 范围 

         指定id等于3的记录进行更新

         update xue_sheng setxing_bie='男' where id=3;

         如果没有 where 指定条件,则全部进行更新

         update xue_sheng setxing_bie='女';

 

删除:delete from table1 where范围 

         不过我们一般加入 where 条件进行删除, 否则将会把表的内容全部清空。


总数:select count * astotalcount from table1 
求和:select sum(field1) as sumvalue from table1 
平均:select avg(field1) as avgvalue from table1 
最大:select max(field1) as maxvalue from table1 
最小:select min(field1) as minvalue from table1 

分组查询:

         selectxing_bie,sum(fen_shu) from xue_sheng group by xing_bie;

join on 表连接

         selectxing_ming,ban_ming from xue_sheng x join ban_ji b on x.bj_id=b.id;

子查询,又叫嵌套查询 in() 或者 not in()

select * from xue_sheng where bj_id in( 1 ,2,3);


<think>我们需要支持SELECT,INSERT,UPDATE,DELETE四种SQL语句的字段提取。由于不同语句结构差异大,我们需要分别处理。这里提供两种方法:方法1:使用sqlparse(轻量级,但需要较多自定义逻辑)方法2:使用sqlglot(更强大,直接解析为语法树)考虑到复杂性全面性,我们使用sqlglot,因为它能更好地处理多种语句类型复杂结构。注意:sqlglot支持多种SQL方言(如MySQL,PostgreSQL,Spark等),这里以标准SQL为例。步骤:1.解析SQL语句2.遍历语法树,提取字段名3.对于不同的语句类型,提取的重点不同:-SELECT:提取FROM后的,以及SELECT后的字段,还有JOIN、WHERE、GROUPBY等子句中的字段-INSERT:提取INSERTINTO字段列(如果有),以及SELECT子句(如果使用INSERT...SELECT)-UPDATE:提取UPDATE后的名,SET后的字段,WHERE中的字段-DELETE:提取DELETEFROM后的名,WHERE中的字段由于sqlglot将不同类型的语句解析为不同的达式节点,我们可以根据节点类型进行提取。代码实现:</think> 要支持解析多种 SQL 语句类型(SELECTINSERTUPDATEDELETE)的字段提取,我会推荐使用 `sqlglot` 库来处理这种复杂场景。它提供了完整的 SQL 语法树解析能力: ```python import sqlglot from sqlglot import expressions as exp def extract_sql_metadata(sql): """提取所有类型 SQL 语句的字段""" try: parsed = sqlglot.parse_one(sql, read="mysql") # 可改为其他方言如 'postgres' except Exception: return {}, [] # 解析失败时返回空结果 tables = set() columns = set() # 遍历语法树提取元素 for node in parsed.walk(): # 提取(包括普通子查询中的) if isinstance(node, exp.Table): tables.add(node.name) # 提取字段(SELECT列、WHERE条件、SET值等) elif isinstance(node, exp.Column): columns.add(node.name) # 处理INSERT语句的特殊情况 elif isinstance(node, exp.Insert): if node.this: # INSERT INTO table tables.add(node.this.name) # 处理UPDATE语句的特殊情况 elif isinstance(node, exp.Update): tables.add(node.this.name) return sorted(tables), sorted(columns) # 测试不同SQL语句类型 queries = [ # SELECT语句 "SELECT name, age FROM users WHERE id = 1", # INSERT语句 "INSERT INTO orders (product_id, quantity) VALUES (101, 5)", # UPDATE语句 "UPDATE products SET price = price * 0.9 WHERE stock > 100", # DELETE语句 "DELETE FROM logs WHERE created_at < '2023-01-01'", # 复杂JOIN示例 "SELECT u.name, o.total FROM users u JOIN orders o ON u.id = o.user_id" ] for sql in queries: tables, columns = extract_sql_metadata(sql) print(f"\nSQL: {sql[:50]}...") print(f"Tables: {tables}") print(f"Columns: {columns}") ``` ### 原理解释 1. **SQL 语句类型处理**: - `SELECT`:通过 `FROM` 子句获取,通过列达式获取字段 - `INSERT`:从 `INSERT INTO` 目标获取名,从列列获取字段 - `UPDATE`:从 `UPDATE` 目标获取名,从 `SET` 子句获取字段 - `DELETE`:从 `DELETE FROM` 获取名,从 `WHERE` 子句获取字段 2. **语法树解析优势**: - 正确处理别名(如 `users u`) - 处理子查询:递归遍历嵌套的查询结构 - 识别各种达式(列引用、函数调用、运算符等) - 支持不同 SQL 方言(通过 `read` 参数指定) 3. **处理边界情况**: - CTE(公共达式):需要额外处理 `WITH` 子句 - 函数中的字段:如 `COUNT(user_id)` 会被识别为 `user_id` - 复杂达式:如 `price * 0.9` 中识别 `price` 字段 4. **局限性解决**: - 使用 `sqlglot.dialects.Dialects` 切换方言解决兼容性问题 - 处理存储过程/事务:单独处理非 DML 语句 - 区分字段来源:可通过节点父元素判断字段所属上下文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值