MySQL 查询——连接查询
写在前面:
小伙伴儿们,大家好!上一篇我们讲了 MySql 中的聚合函数查询——
这期让我们继续学习 MySql 中的连接查询和子查询!
思维导图:
连接查询是将两个或者两个以上的表连接起来,从中选取所需要的数据;连接查询是关系数据库中最主要的查询。
一、内连接查询
可以查询两个或两个以上的表
1.查询两个表的所有数据,以笛卡尔积的形式展现出来
SELECT * FROM 表 1,表 2;
例如:查询 t_book 表和 t_booktype 表的内容:
select * from t_book;
有 5 种字段,4 条数据;
select * from t_booktype;
有 2 种字段,3 条数据;
而查看两个结合表的数据,则用:
select * from t_book,t_booktype;
总共有 12 条数据,7 种字段;
2.将两张表的数据合成一张表(字段结合)
例如,之前查询到 t_book 表中的内容是:
如果想要在此表中加上 t_booktype 字段的话,就要用内连接:
select * from t_book,t_booktype where t_book.bookTypeId=t_booktype.id;
去掉 bookTypeId 和 id 字段,则有:
select bookName,price,author,bookTypeName from t_book,t_booktype where t_book.bookTypeId=t_booktype.id;
当然,这样效果不是很好,读者很难区分 bookTypeName 到底是 t_book 表中还是 t_bookType 表中的字段;
这时,可以给两个表取别名,给 t_book 表取别名 tb,给 t_booktype 表取别名 tby,则有:
select tb.bookName,tb.price,tb.author,tby.bookTypeName from t_book tb,t_booktype tby where tb.bookTypeId=tby.id;
结果是一样的,但是可以看出哪个表对应的哪个字段;
二、外连接查询
外连接查询可以查出一张表的所有信息
SELECT * FROM 表名 1 LEFE|RIGHT JOIN 表名 2 ON 表名 1.属性 1=表名 2.属性 2;
1.左连接查询:
可以查出表 1 的所有记录,而表 2 只能查出匹配的记录;
例如:查出表 1 的所有记录,加上表 2 的 bookTypeName 字段:
select * from t_book left join t_bookType on t_book.Id=t_bookTypeId.id;
看到 t_book 表的所有记录都有,且 id 为 4 的记录在 t_bookType 表中并没有与之对应的,因此为 null;
2.右连接查询:
可以查出表 2 的所有记录,而表 1 只能查出匹配的记录;
例如:查出表 2 的所有记录,加上表 1 的字段:
select * from t_book left join t_bookType on t_book.Id=t_bookTypeId.id;
可以看到 t_bookType 表的内容都查出来了,且 bookypeName 为 3 的记录在 t_book 表中没有记录对应,因此为 null;
三、子查询
1.带 IN 关键字的子查询
若要查询 bookTypeId 在 t_booktype 表中的数据:
select * from t_book where bookTypeId in (select id from t_booktype);
可以看出没有 bookTypeId 等于 4 的这条数据,因为 bookTypeId 等于 4 不在 t_booktype 表中;
若要查询 bookTypeId 不在 t_booktype 表中的数据:
select * from t_book where bookTypeId not in (select id from t_booktype);
可以看出查到了 booTypeId 等于 4 的这条不在 t_booktype 表中的数据;
2.带比较运算符的子查询
先查看 t_pricelevel 表内容:select * from t_pricelevel;
查看 price=80 的书籍:
select * from t_book where price >=(select price from t_pricelevel where priceLevel = 1);
3.带 exist 关键字查询
例如:如果 t_booktype 表存在,才需要继续查询 t_book 表;
select * from t_book where exists (select * from t_booktype);
当然,也有 not exists,在前面加上 NOT 即可;
4.带 any 的关键字子查询
例如:查询 t_book 表中 price 任何一个大于 t_pricelevel 表中 price 的数据:
select * from t_book where price > any (select price from t_pricelevel where priceLevel );
可以看出 t_book 表中 price=24 的数据并没有查出来;
5.带 all 的关键字查询
select * from t_book where price> all (select price from t_pricelevel);
t_book 表中只有两条数据大于 t_pricelevel 表中最大的价格 80;
好了,今天就先分享到这里了,下期继续给大家带来 Spring 系列后续讲解!欢迎关注我的原创技术公众号~
版权声明: 本文为 InfoQ 作者【程序员的时光】的原创文章。
原文链接:【http://xie.infoq.cn/article/8a1af51479e65eb1b90ab1ae9】。文章转载请联系作者。
评论