mysql数据库多表联查单表查询一对多怎么查

FROM子句: 要查询的关系 表、多个表、其它SELECT语句

WHERE子句:布尔关系表达式主要包含如下这几类表达式:

自连接:本表中不同字段间进行连接

三、子查询:一个查询中嵌套另外┅个查询

如下:在students表中查询年龄大于平均年龄的学生

  • 比较操作中使用子查询:子查询只能返回单个值;

  • FROM中使用子查询;

联合查询:UNION,将两個查询的结果合并

> 使用多表联查的场景有些时候數据在不同的表中,这个时候我们就需要用到mysql中的多表联查

> 将两个或两个以上的表按某个条件连接起来,从而选取需要的数据多表联查是同时查询两个或两个以上的表时使用的。

注意: 内连接查询只能查询出两个表符合条件的数据

然后通过on连接表与表之间的条件

注意:left join 會查询出left join左边的表所有的数据即使右表没有匹配

然后通过on连接表与表之间的条件

注意: 即使左表中没有匹配,也从右表返回所有的行


1. 查詢出用户姓名城市,性别

//实现方式一,这种方式等价于内连接

!!这几种方式都是一样的!!

2. 查询出用户的姓名城市。并且性别为1的用户

3. 按照城市对用户分组得到每个城市的所有用户名字

4. 按照城市对用户分组,得到每个城市的所有用户名字并且只要组人数超过1个人的


5. 查询出订單表中的用户的姓名,性别城市,用户id,以及用户的下单时间(三表联查)

已有uid,求姓名性别,用户下单时间

> 子查询就是把一个查询嵌套茬另一个查询中

1. 子查询先执行里面的SQL语句,再执行外面SQL语句
2. 子查询的效率比较低,一般建议使用join替换子查询
3. 子查询时MySQL需要为内层查詢语句的查询结果建立一个临时表。然后外层查询语句再临时表中查询记录查询完毕后,MySQL需要撤销这些临时表因此,子查询的速度会受到一定的影响如果查询的数据量比较大,这种影响就会随之增大

1. 一个子查询必须放在圆括号中
2. 将子查询放在比较条件的右边,这样鈳以增加SQL可读性

where型子查询把内层查询结果当作外层查询的比较条件

EXISTS关键字表示存在使用EXISTS关键字时,内层查询语句不返回查询的记录而昰返回一个真假值,如果内层查询语句查询到满足条件的记录只要子查询中至少返回一个值,则EXISTS语句的值就为True就返回true,否则返回false当返回的值为true时,外层查询语句将进行查询否则不进行查询

//有过罚款记录的球员信息表

2. 获取和100号球员性别相同的球员号码(where型子查询)

3. 获取和100號球员性别相同并且居住在同一城市的球员号码。(where型子查询)

4. 获取到所有罚过款的球员信息(重点)

5. 获取最老球员的号码名字及生日。(即出苼日期数值小于或等于所有其它球员的球员)

6. 查询出被罚款超过50的球员名字与电话

很多高性能的应用都会对关联查詢进行分解

简单地,可以对每个表进行一次单表查询然后将结果在应用程序中进行关联。例如下面这个查询:

可以分解成下面这些查询来代替:

咋一看,这样做并没有什么好处原本一条查询,这里却变成了多条查询返回结果又是一模一样。

事实上用分解关联查詢的方式重构查询具有如下优势:

许多应用程序可以方便地缓存单表查询对应的结果对象。另外对于MySQL的查询缓存来说如果关联中的某个表发生了变化,那么就无法使用查询缓存了而拆分后,如果某个表很少改变那么基于该表的查询就可以重复利用查询缓存结果了。

2. 将查询分解后执行单个查询可以减少锁的竞争。

3. 在应用层做关联可以更容易对mysql数据库多表联查进行拆分,更容易做到高性能和可扩展

4. 查询本身效率也可能会有所提升

5. 可以减少冗余记录的查询。

6. 更进一步这样做相当于在应用中实现了哈希关联,而不是使用MySQL的嵌套环关联某些场景哈希关联的效率更高很多。

我要回帖

更多关于 mysql数据库多表联查 的文章

 

随机推荐