mysql链表查询sql语句_MySQL查询SQL语句

这篇博客详细介绍了SQL的基础和高级查询操作,包括范围查询、排序、去重、分组及过滤,以及内连接、左连接、右连接等多表查询方法。通过实例演示了如何在数据库中进行数据筛选、排序、合并等复杂操作,是数据库查询学习的重要参考资料。

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

1.基础查询

范围查询

在范围in

select 字段 from 表名 where 字段 in (值,值);

select id from stu where id in (2,3);

b57462914d60818f5545a45a357b3a22.png

不在范围not in

select 字段 from 表名 where 字段 in (值,值);

select id from stu where id not in (2,3);

2b7365b9b139410d586c8435c40a74d9.png

在之间between

select 字段 from 表名 where 字段 between 值 and 值;

select id from stu where id between 1 and 3;

61e0408fd985ec9c0fa936fff26c1f25.png

排序order by asc

select 字段 from 表名 order by 字段;(升序)

select * from stu order by id;

e7a4c49fc4b23c19550d6305c6ecfe1c.png

降序order by desc

select 字段 from 表名 order by 字段 desc;(降序)

select * from stu order by id;

2cc3d87435feeabeb07afb6be9989d4f.png

去重distinct

select distinct(字段) from 表名;

select distinct(id) from stu;

3215a972174ebb0557905789e3b27272.png

限制limit

select 字段 from 表名 limit 数字;

select * from stu limit 2;

53209e7a67e144549b87e361498a613e.png

分组group by

select 查询字段 from 表名 where 查询条件 group by 查询字段;

select id from stu where id >1 group by id;

bc999508cda0efbb1d4133b43821fbaf.png

分组过滤having

select 查询字段 from 表名 group by 查询字段 having 过滤条件;

select id from stu group by id having id > 1;

44779e91d30ac93d6d5233c3f543db26.png

2.高级多表查询

再新建一个表

create table class (id int,user_id int,name char(16));(user_id与stu表中的id值一致)

6a27bb6487f9a38ab7167b4acbe9b6c8.png

内连接inner join on

select 字段 from 左表名 新表名 inner join 右表名 新表名 on 左表名.字段 = 右表名.字段(两个表中字段值一致)

select * from stu u inner join class s on u.id = s.user_id;

eb0f56cacd21a8efc0d916b74e9be00e.png

左连接left join on

select 字段 from 左表名 新表名 inner join 右表名 新表名 on 左表名.字段 = 右表名.字段(两个表中字段值一致)

select * from stu u left join class s on u.id = s.user_id;

4762d2f17d6924db4ba50983caae4c76.png

右连接right join on

select 字段 from 左表名 新表名 right join 右表名 新表名 on 左表名.字段 = 右表名.字段(两个表中字段值一致)

select * from stu u right join class s on u.id = s.user_id;

de0264c57273bc83106fceeeba71fb66.png

嵌套查询select(select)

select 字段 from 表名 where 字段 条件 (select 字段 from 表名 where 字段);(将select中的语句看成一个新表)

select names from stu where id in (select user_id from class where name='一年级');

f95a233b711d154f3137ae6f12b59205.png

合并并去重union

将多个结果合并到一个表,并删除多个重复数据

select 字段 from 表名 union select 字段 from 表名;

select id from stu union select user_id from class;

6b8808ed87ead9d56a36bf5609508380.png

合并不去重union all

将多个结果合并到一个表,并删除多个重复数据

select 字段 from 表名 union all select 字段 from 表名;

select id from stu union all select user_id from class;

ee398b1d54b0c2a034bc1fe07fbc4c2c.png

### 关于 MySQL链表查询的设计与实现 在关系型数据库管理系统(RDBMS),如 MySQL 中,并不存在传统意义上的链表结构。然而,可以通过自定义的方式模拟链表的行为。这通常涉及到通过外键关联来表示节点之间的链接。 #### 表结构设计 为了模仿链表,在表中可以引入两个额外字段用于存储前驱和后继指针: ```sql CREATE TABLE linked_list ( id INT AUTO_INCREMENT PRIMARY KEY, value VARCHAR(255), prev_id INT DEFAULT NULL, -- 前置节点ID next_id INT DEFAULT NULL, -- 后续节点ID FOREIGN KEY (prev_id) REFERENCES linked_list(id), FOREIGN KEY (next_id) REFERENCES linked_list(id) ); ``` 此设置允许每条记录指向其前后相邻的元素[^1]。 #### 插入新节点 当向这种“链表”添加新的成员时,需更新相应位置处现有项目的 `next_id` 或者 `prev_id` 字段以维持链条完整性。 ```sql -- 添加到头部 INSERT INTO linked_list(value,next_id) VALUES('Head Value',(SELECT MIN(id) FROM linked_list)); UPDATE linked_list SET prev_id=(LAST_INSERT_ID()) WHERE id IN(SELECT next_id FROM linked_list WHERE id=LAST_INSERT_ID()); -- 添加至尾部 INSERT INTO linked_list(prev_id,value) VALUES((SELECT MAX(id) FROM linked_list),'Tail Value'); UPDATE linked_list SET next_id=(LAST_INSERT_ID()) WHERE id IN(SELECT prev_id FROM linked_list WHERE id=LAST_INSERT_ID()); ``` 对于中间插入,则要更复杂一些,涉及修改多个地方的关系连接。 #### 查询整个列表 由于 SQL 并不适合处理递归遍历的问题,因此获取完整的链式序列可能不是最直观的任务。一种解决方案是利用循环语句或者应用程序逻辑完成这项工作;另一种则是借助某些版本支持的CTE(Common Table Expressions),即公共表达式来进行迭代访问。 ```sql WITH RECURSIVE chain AS ( SELECT l.* FROM linked_list l WHERE l.prev_id IS NULL UNION ALL SELECT ll.* FROM linked_list ll INNER JOIN chain c ON ll.prev_id = c.id ) SELECT * FROM chain ORDER BY id; ``` 这种方法能够有效地按照顺序检索出所有的节点信息。 #### 性能考虑 值得注意的是,上述方案虽然可以在一定程度上复制链表的功能特性,但在实际应用中可能会遇到性能瓶颈。特别是随着数据量的增长,频繁地维护这些双向链接会带来较高的开销。为此,应当谨慎评估业务需求并权衡利弊后再决定是否采用此类设计方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值