来源:Node.js

子查询

子查询

子查询(Subquery),又称嵌套查询(Nested Query),指在一个查询语句中嵌套使用另一个完整的查询语句

子查询通常出现在主查询的WHERE子句、FROM子句、HAVING子句或SELECT子句中,可以被视为一个查询的结果集,作为外层查询的一部分,用于进一步筛选、计算或操作数据

1
2
3
# 查询出yajue的用户id,再以用户id查询对应用户的照片
# 需要用小括号包裹子查询语句
SELECT * FROM `photo` WHERE `user_id` = (SELECT id FROM `user` WHERE name = 'yajue')

连表

连表查询可以将不同表的数据融合关联进同一个查询结果

MySQL具有三种连表形式:内连接、外连接、交叉连接

  • 对于内连接的两个表,驱动表中的记录在被驱动表中找不到匹配的记录,该记录不会加入到最后的结果集
  • 对于外连接的两个表,驱动表中的记录即使在被驱动表中没有匹配的记录,也仍然需要加入到结果集
  • 交叉连接是指在两张或多张表之间没有任何连接条件的连接,可以用于查询所有可能的组合

内连接

1
2
3
4
# user是驱动表、table是被驱动表
# 查询user数据的同时,根据user.id = photo.user_id条件在每行追加photo表的数据
# 但如果user表中的某条数据没有和photo表中的数据关联,则它不会进入最后的结果集
SELECT * FROM `user`, `photo` WHERE `user`.`id` = `photo`.`user_id`

外连接

以驱动表为基准连接被驱动表,驱动表的数据会全部查出,被驱动表若没有值则补充null

左连接

1
LEFT JOIN [连接的表] ON [连接的条件]
1
2
# user是驱动表、table是被驱动表
SELECT * FROM `user` LEFT JOIN `table` ON `user`.`id` = `table`.`user_id`

右连接

1
RIGHT JOIN [连接的表] ON [连接的条件]
1
2
# table是驱动表、user是被驱动表
SELECT * FROM `user` RIGHT JOIN `table` ON `user`.`id` = `table`.`user_id`