含义: 又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

比如下面两张表:

查询每个每个类型下的社团信息,这里面的数据来源于两个表,就用到了多表查询。

语法:

-- 查询社团名称和社团分类名称
select klasifiko_name,name from club,club_klasifiko;

查询出的数据只是club与club_klasifiko进行无条件匹配。

笛卡尔积现象:表1有m行,表2有n行,结果=m*n行

发生原因:没有有效的连接条件

如何避免:添加有效的连接条件

select klasifiko_name,name from club_klasifiko,club where club_klasifiko.id=club.klasifiko_id;
连接查询分类:

按功能分类:

  1. 内连接

    1. 等值连接
    2. 非等值连接
    3. 自连接
  2. 外连接
    1. 左外连接
    2. 右外连接
    3. 全外连接(MySQL不支持)
  3. 交叉连接
1. 等值连接:

在连接条件中使用等于号(=)运算符比较被连接列的列值

例如:查询出每个社团类型下对应的社团名称

select klasifiko_name,name from club_klasifiko,club where club_klasifiko.id = club.klasifiko_id;
  • 为表起别名:

    • 优点:提高语句的简洁度,区分多个重名的字段
    • 注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
  • 当查询语句中设计多张表或者表名比较复杂时,我们可以为其起别名

select c1.klasifiko_name,c2.name from club_klasifiko as c1,club as c2 where c1.id=c2.klasifiko_id;
  • 当从多张表查询数据时,表的顺序可以任意调换
select c1.klasifiko_name,c2.name from club as c2,club_klasifiko as c1 where c1.id=c2.klasifiko_id;
  • 加筛选条件
-- 查询出每个文化体育类型下对应的社团名称
select c1.klasifiko_name,c2.name from club_klasifiko c1,club c2 where c1.id=c2.klasifiko_id and c1.klasifiko_name='文化体育';
2. 非等值连接:

连接条件不为’=’

例如:查询员工的工资和工资级别,如下图所示:

select salary,grade_level from job_grades,employees where salary between lowest_sal and highest_sal;

3. 自连接:

顾名思义:自己连接自己

自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名。

例如:查询出比大学生画坊入会费还高的社团的信息

select c2.* from club c1,club c2 where c1.name = '大学生花坊' and c2.cost > c1.cost;
4. 外连接:
4.1 左外连接:left join

关键字: left join on 或 left outer join on


语句:select * from table1 t1 left join table2 t2 on t1.t_id=t2.t_id;

说明:left join 是left outer join的简写,它的全称是左外连接,是外连接的一种。左外连接,左表(table1)的记录将会全部表示出来,而右表(table2)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

比如:查询出不同类型下的所有社团信息

select * from club_klasifiko c1 left join club1 c2 on c1.id=c2.klasifiko_id;
4.2 右外连接:rigth join

关键字:rigth join on 或 right outer join on

语句:select * from table1 t1 right join table2 t2 on t1.t_id=t2.t_id;

右连接与左连接的效果恰恰相反。右表的记录会全部显示出来,左表只会显示符合搜索条件的记录。

比如:查询出不同社团对应的社团类型

 select * from club_klasifiko c1 right join club1 c2 on c1.id=c2.klasifiko_id;
4.3 交叉连接:cross join

交叉连接的结果就如同笛卡尔积的结果一样

例如:

select * from club_klasifiko cross join club1;
4.4 内连接:inner join

关键字:inner join on

语句:select * from table1 t1 inner join table2 t2 on t1.t_id=t2.t_id;

说明:组合两个表中的记录,返回关联字段相符的记录,也就是两个表的交集部分。

例如:查询出社团类型表和社团信息表的交集

select * from club_klasifiko c1 inner join club1 c2 on c1.id=c2.klasifiko_id;
5. 子查询:

含义:出现在其他语句中的select语句,成为子查询或者内查询

内部嵌套其他查询语句的查询,成为主查询或外查询

例如:

select c1.klasifiko_name from club_klasifiko c1 where c1.id in (select c2.klasifiko_id from club c2 where c2.cost=10);
分类:

按子查询出现的位置:

  • select后面:

    • 仅仅支持标量子查询
  • from后面
    • 支持表子查询
  • where或having后面(重点)
    • 标量子查询
    • 列子查询
    • 行子查询
  • exists后面(相关子查询)
    • 表子查询

按结果集的行列数不同:

  • 标量子查询(结果集只有一行一列)
  • 列子查询(结果集只有一列多行)
  • 行子查询(结果集可以有一行多列)
  • 表子查询(结果集一般为多行多列)
where或having后面:

特点:

  1. 子查询放在小括号内
  2. 子查询一般放在条件的右侧
  3. 标量子查询,一般搭配着单行操作符使用(> < >= <= = !=)
  4. 列子查询,一般搭配着多行操作符使用(in、any/some、all)
  5. 子查询的执行优先于主查询

标量子查询:

例如:哪个社团的收费比’大学生画坊的收费高’。

1.查询出大学生画坊社团的收费

select cost from club where name='大学生画坊';

2.查询社团的信息,满足cost>上一步的结果

select c.name from club c where c.cost > (select cost from club where name='大学生画坊');

例如:查询收费与大学生画坊相同的社团的信息

1.查询出大学生画坊社团的收费

select cost from club where name='大学生画坊';

2.查询社团的信息,满足cost>上一步的结果

select c.name,c.cost from club c having c.cost=(select cost from club where name='大学生画坊') and c.name != '大学生画坊';

列子查询:

例如:查询出文化体育或创新创业类型下的所有社团信息

1.查询出文化体育和创新创业的id

select id from club_klasifiko where klasifiko_name='文化体育' or klasifiko_name='创业创新';

2.查询社团信息,满足klasifiko_id in上一步的结果

select name from club where klasifiko_id in(select id from club_klasifiko where klasifiko_name='文化体育' or klasifiko_name='创业创新');

行子查询

例如:查询出社团编号最小且收费最高的社团信息(可能没有数据)

select * from club where (id,cost)=(select min(id),max(cost) from club);
select后面:

例如:查询出每个类型下对应的社团个数

select *,(select count(*) from club c2 where c2.klasifiko_id= c1.id) as 个数 from club_klasifiko c1;
from后面:

将子查询的结果重当一张表,要求必须起别名

例如:查询不同类型下社团的平均收费

select c1.klasifiko_name,c2.* from (select avg(cost),klasifiko_id from club group by klasifiko_id) c2 inner join club_klasifiko c1 on c1.id=c2.klasifiko_id;
exists后面(相关子查询):

EXISTS用于检查子查询是否至少返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False

语法:exists(完整的查询语句)

例如:

select exists(select icon from club_klasifiko);
+---------------------------------+
| exists(select icon from club_klasifiko) |
+---------------------------------+
|                               1 |
+---------------------------------+
1 row in set (0.05 sec)
select exists(select * from club_klasifiko where is_delete=1);
+---------------------------------------------+
| exists(select * from club_klasifiko where is_delete=1) |
+---------------------------------------------+
|                                           0 |
+---------------------------------------------+
1 row in set (0.02 sec)

例如:查询有社团的类型名称

select c1.klasifiko_name from club_klasifiko c1 where exists(select * from club c2 where c1.id=c2.klasifiko_id);
分页查询:

应用场景:当要显示的数据,一页显示不全,需要分页一脚sql请求

语法:select 查询列表 from 表 【条件】limit offset,size;

offset 要显示条目的其实索引(起始索引从0开始)

size 要显示的条目个数

例如:查询前五条学生信息

select * from std_message limit 0,5;

例如:查询第11条到第25条学生信息

 select * from std_message limit 10,15;
联合查询:union

union:联合 合并:将多条查询语句的结果合并成一个结果

语法:查询语句1 union 查询语句2 union …

例如:查询出收费大于10或社团名称中包含’会’的社团信息

select name,cost from club where cost > 10 union select name,cost from club where name like '%会%';

MySQL——连接查询相关推荐

  1. MySQL外键关联(一对多)MySQL连接查询

    MySQL外键关联(一对多) 外键说明 什么是外键? 1)表A中有字段(如身份证号)做了主键,表B中也有这个字段(身份证号),这里的身份证号一定来自表A同样字段里的内容,但再B表中身份证号对应id可以 ...

  2. 二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)

    MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解) 6:多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现 解决办法:添加上连接条件 连接查询的分类: 1.按年代分类:1)sql ...

  3. mysql连接查询on_MySql 连接查询中 on 和 where 的区别

    MySql 连接查询时,on 后面跟的是连接条件,再跟 and 关键就可以继续加过滤条件,这样看来是不是可以免用 where 增加过滤条件了呢?开始我也是这样以为的(老师是这么教的,且使用 on 的情 ...

  4. Mysql连接查询主要分为三种:内连接、外连接、交叉连接

    Mysql 连接查询主要分为三种:内连接.外连接.交叉连接 内连接 使用比较运算符(包括=.>.<.<>.>=.<=.!>和!<)进行表间的比较操作,查 ...

  5. Mysql连接查询详解

    前言 记得刚工作几年的时候,就写了一篇关于Mysql连接查询的博客文章,里面简单的认为先对关联表的记录进行笛卡尔积,然后再根据where条件过滤,现在看来有点贻笑大方了.正好最近看了<mysql ...

  6. MySQL连接查询(内连接,外连接,全连接)

    对比分析MySQL连接查询(内连接,外连接,全连接) 内连接 等值连接 非等值连接 ==自连接== 外连接 左外连接 右外连接 全外连接 交叉连接 首先建三个数据表 sql文件下载 https://w ...

  7. MySQL连接查询 内连接和外连接的区别

    MySQL 连接查询 @ sunRainAmazing 1.使用连接查询的场景 将多张表进行记录的连接查询(按照某个字段指定的条件进行数据的拼接):进行数据的拼接(两张表的内容显示在一个结果表中 使用 ...

  8. MySQL连接查询——MySQL 基础查询你会了吗?

    前言: 由于大一学习数据库不扎实,学到后面有点吃力,所以回过头来认真学习一边,写一些学习总结,提醒自己.也要告诫读者,把基础打扎实.读者觉得有用的话可以收藏点赞哦! 上一篇:MySQL函数查询--My ...

  9. MySql 连接查询中 on 和 where 的区别

    大家可以先看MySQL:left join 避坑指南 看过之后再接着看下面 在多表查询时,ON和where都表示筛选条件,on先执行,where后执行. on 后跟连接条件,然后再加的筛选条件只针对关 ...

  10. MySQL连接查询-笛卡尔乘积

    MySQL连接查询 前言 一.笛卡尔积 二.SQL92(支持内连接) 三.SQL99(内.外.交叉) 1.内连接 2.外连接 2.1.左右外连接 2.2.全外连接 3.交叉连接(MySQL支持) 总结 ...

最新文章

  1. Android Activity的launchMode四种启动模式备忘
  2. iOS 9应用开发教程之ios9的视图
  3. U盘中的autorun.inf
  4. php 自动创建文件,php:自动创建多级文件夹
  5. python3.6入门到高阶(全栈) day02 while循环 运算符 格式化输出 编码
  6. SSM之一(使用idea创建一个Spring+SpringMVC的项目)
  7. php 类中调用另类,PHP return语句另类用法不止是在函数中,return语句_PHP教程
  8. AC日记——阶乘和 openjudge 1.6 15
  9. Windows xp+Ubuntu 11.10 硬盘安装
  10. 记一次成功的sql注入入侵检测附带sql性能优化
  11. 使用.NET Mobile API即51Degrees.mobi检测User-Agent
  12. 【雕爷学编程】Arduino动手做(84)---DS1307时钟模块
  13. 【存储】什么是纠删码(与纠错码的区别)|纠删码与副本对比|LDPC码
  14. 最强大脑-星际迷航-JQuery 版本
  15. 小猫爬山题解(暴力解题)
  16. golang之jsonb类型的支持
  17. Microsoft Store无法显示错误,真正解决!
  18. jquery事件委托_jQuery事件委托
  19. 基于java实现下载excel
  20. 旧金山大学的算法可视化学习教程 赞的教程,将抽象的算法可视化,易于理解

热门文章

  1. Go语言学习之net包(The way to go)
  2. PHP7新特性-简述
  3. Set集合的基本使用
  4. 【人工智能】对贝叶斯网络进行吉布斯采样
  5. Preference的用法
  6. css【详解】grid布局—— 网格布局(栅格布局)
  7. linux下常用拷贝命令
  8. zookeeper介绍
  9. 从网络访问此计算机guest密码,Windows XP网络共享访问总是弹出输入Guest密码对话框的解决...
  10. CSS选择器的优先级是怎么定义的?