写点什么

MySQL 查询——连接查询

发布于: 2021 年 01 月 14 日
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 系列后续讲解!欢迎关注我的原创技术公众号~


发布于: 2021 年 01 月 14 日阅读数: 18
用户头像

程序员的路,会越来越精彩! 2020.04.30 加入

公众号:程序员的时光 记录学习编程的一路时光,从小白到现在也能稳操胜券; 主要从事Java后台开发,数据结构与算法,设计模式等等; 欢迎一起交流,分享经验,学习进步!

评论

发布
暂无评论
MySQL查询——连接查询