1. 两张表连接查询
- 应用场景
- 想要查询总金额超过30块钱的用户信息(姓名、手机号、身份证号等)
- 下单金额在订单表中(只有user_id)存放,用户信息在用户表中存放,此时就需要连接两张表进行查询
1.1 内连接 INNER JOIN
获取两个表中字段匹配关系的行的所有信息(即两个表中共同都有的内容)
//内连接语法
select * from 表名 a INNER JOIN 表名 b ON a.列名=b.列名
//举例
select * from user_info_table a INNER JOIN
order_table b on a.user_id=b.user_id;
//将用户信息表和订单表使用两张表共有的用户ID连接起来
1.2 左连接 LEFT JOIN
获取左表所有行的信息,右表没有匹配部分用null代替(以左表为基准,左表内容全部展示,右表只展示匹配上的,匹配不上的用null填充)
//左连接语法
select * from 表名 a LEFT JOIN 表名 b ON a.列名=b.列名
//举例
select * from user_info_table a LEFT JOIN order_table b on a.user_id=b.user_id;
//使用左连接,用户信息表中内容全部展示,订单表中与用户信息表能够匹配的用户ID全部展示,匹配不上的用null填充
select * from user_info_table a LEFT JOIN order_table b
on a.user_id=b.user_id where b.user_id is null;
//要查找用户存在,但没有下单记录的用户信息
1.3 右连接 RIGHT JOIN
获取右表所有行的信息,左表没有匹配部分用null代替
//右连接语法
select * from 表名a RIGHT JOIN 表名b ON a.列名=b.列名
//举例
select * from user_info_table a RIGHT JOIN order_table b on a.user_id=b.user_id;
select * from user_info_table a LEFT JOIN order_table b
on a.user_id=b.user_id where a.user_id is null;
//查找下过单,但是用户不存在(可能已经注销)的人
select a.user_name,b.price from user_info_table a
right join order_table b on a.user_id=b.user_id
where price>10;
//查找价格大于10的user_name
//(如果列名user_name在两张表中是不重复的,可以不加表名,如果有重复,则需要加上)
- 说明
上述语句可以连接2张表,连接之后可以视为1张表,若是需要连接多张表,可先两两相连,再依次关联
2. 子查询(嵌套查询)
嵌套在其他查询中的查询。
//子查询语法
select 列名1 from 表1 where 列名2 in
(select 列名2 from表2 where 列名3=某某);
//举例
select user_name from user_info_table where user_id in (select user_id from order_table where price>10);
//先执行括号里面的语句
- 注意
一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。因此,在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率。