联表查询_V1

 场景:

用户(user)和好友(userFriend)的关系,用户a关注用户a1,用户b关注用户b1,b2;要求根据用户a,b的id查出他们所关注的用户;

 

  • 建表SQL
--
-- 表的结构 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `uid` int(11) NOT NULL auto_increment,
  `name` varchar(20) NOT NULL,
  `pwd` varchar(32) NOT NULL,
  PRIMARY KEY  (`uid`)
)

--插入数据进行测试:

INSERT INTO `user` (`uid`, `name`, `pwd`) VALUES
(1, 'a', 'a'),
(2, 'a1', 'a1'),
(3, 'b', 'b'),
(4, 'b1', 'b1'),
(5, 'b2', 'b2');
 
--
-- 表的结构 `userFriend`
--

CREATE TABLE IF NOT EXISTS `userFriend` (
  `userFriendId` int(11) NOT NULL auto_increment,
  `uid` int(11) NOT NULL,
  `fid` int(11) NOT NULL,
  PRIMARY KEY  (`userFriendId`)
) 

--
-- 插入数据进行测试
--

INSERT INTO `userFriend` (`userFriendId`, `uid`, `fid`) VALUES
(1, 1, 2),
(2, 3, 4),
(3, 3, 5);

 进行查询:我们想查用户id为3的好友:

select name from user as u,userFriend as uf where uf.fid = u.uid and uf.uid=3
 
### ClickHouse 查询方法 在执行查询时,ClickHouse 提供了多种方式来实现不同类型的连接操作。为了优化性能并确保正确处理空值情况,可以配置`join_use_nulls`参数[^2]。 #### 使用 INNER JOIN 进行查询 INNER JOIN 只返回两个中匹配的数据记录: ```sql SELECT t1.id, t1.name, t2.order_id FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.id = t2.user_id; ``` 此语句会从 `table1` 和 `table2` 中选取所有满足条件 `t1.id = t2.user_id` 的组合,并只展示那些存在对应关系的结果集[^1]。 #### 使用 LEFT OUTER JOIN 处理可能存在的缺失数据 LEFT OUTER JOIN 返回左中的全部记录以及右中存在的相应匹配项;如果不存在,则填充NULL值: ```sql SET join_use_nulls = 1; SELECT t1.id, t1.name, IF(t2.order_id IS NULL,'No Order',toString(t2.order_id)) as order_status FROM table1 AS t1 LEFT OUTER JOIN table2 AS t2 ON t1.id = t2.user_id; ``` 这里通过设置 `join_use_nulls` 参数为 true (即 1),使得当右侧无匹配项时显示 null 值而不是默认行为下的任意值替代。 #### 替代方案:使用 IN 子查询减少复杂度 对于某些特定情况下,IN 操作符能够简化 SQL 查询逻辑而不必依赖于显式的JOIN语法: ```sql SELECT * FROM hits_v1 WHERE pageID IN ( SELECT DISTINCT pageID FROM visits_v1 WHERE where condition); ``` 这种方法特别适用于只需要获取左侧格部分字段而不需要关右边其他列的情况。需要注意的是,在实际应用中应评估两种写法之间的效率差异[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值