由于sql语句不区分大小写,为了书写方便,本文所有命令统一使用小写

往期内容

  • day 01 初识Mysql以及DDL数据定义语言 
  • day 02 DML数据操作语言​​​​​​
  • day 03 DQL数据查询语言---初窥门径
  • day 04 DQL数据查询语言---单表查询---略有小成

目录

一、连接查询

1、内连接

2、外连接

3、三张、四张表.......的连接

二、子查询

1、select 之后

2、from之后

3、where之后


一、连接查询

例如,在t_student表中取班级信息,在t_teacher表中取教师信息,像这样跨多张表的查询方式就是连接查询。

连接查询可以分为内连接、外连接、全连接 


连接查询的关键:

  • 连接的条件,如果不写条件就默认查询笛卡尔乘积 之后的结果!!!!
  • 起别名,能够清楚的区分不同的表,特别是在自连接的时候!!!
  • 连接次数越多效率越低,避免多表连接

注!!!!

加条件只是避免笛卡尔乘积现象,只是让他显示我们需要的数据,连接时的匹配次数并没有减少!!!!

#不加任何连接条件的连接查询,查询结果的条数就是两张表条数的乘积# t_student 和 t_grade 表不加条件连接mysql> select t_student.stname,t_student.stmath,t_grade.grade from t_student,t_grade;
+--------+--------+--------+
| stname | stmath | grade  |
+--------+--------+--------+
| 赵钱   |     78 | 良好   || 孙李   |     74 | 良好   |
| 孙李   |     74 | 优秀   |
| 孙李   |     74 | 不及格 |
+--------+--------+--------+
78 rows in set (0.08 sec)


1、内连接

特点:两张表没有主次关系,是平等的。 


  • 等值连接

即连接条件为等量关系

语法

select  表1.字段名,表2.字段名 ....... from 表1 inner join   表2   on  表1表2的连接条件  where   筛选条件

inner可以省略,加上可以快速看出是内连接。。。。

#查询成绩高于80分的学生的班主任姓名mysql> select-> st.stname,st.stclass,st.stmath,te.tename-> from-> t_student st-> inner join-> t_teacher te-> on-> st.stclass=te.teclass-> where st.stmath>80;
+--------+---------+--------+--------+
| stname | stclass | stmath | tename |
+--------+---------+--------+--------+
| 钱七   | 1班     |     93 | 点赞   |
| 左右   | 2班     |     88 | 收藏   |
| 周四   | 2班     |     94 | 收藏   |
| 夏     | 3班     |     82 | 关注   |
| 张三   | 1班     |     87 | 点赞   |
| 甲乙   | 3班     |     88 | 关注   |
| 前后   | 1班     |     93 | 点赞   |
| 周五   | 2班     |     99 | 收藏   |
| 冷烬   | 2班     |    100 | 收藏   |
| 丙丁   | 1班     |     91 | 点赞   |
| 秋     | 3班     |     89 | 关注   |
+--------+---------+--------+--------+
11 rows in set (0.00 sec)


  •  非等值连接

连接条件为非等值关系

语法  同等值连接

#查询3班学生的成绩等级mysql> select-> st.stname,st.stclass,st.stmath,g.grade-> from-> t_student st-> inner join-> t_grade g-> on-> st.stmath<=g.max and st.stmath>=g.min-> where-> st.stclass='3班';
+--------+---------+--------+--------+
| stname | stclass | stmath | grade  |
+--------+---------+--------+--------+
| 周六   | 3班     |     58 | 不及格 |
| 孙李   | 3班     |     74 | 良好   |
| 秋     | 3班     |     89 | 良好   |
| 周二   | 3班     |     78 | 良好   |
| 甲乙   | 3班     |     88 | 良好   |
| 夏     | 3班     |     82 | 良好   |
| 王五   | 3班     |     68 | 良好   |
+--------+---------+--------+--------+
7 rows in set (0.00 sec)


  • 自连接

自己跟自己进行连接查询

语法  同等值连接

技巧:把一张表看作是两张表

#查询自己学号上一位的学生姓名mysql> select-> st.stno,st.stname,s.stname-> from-> t_student as st-> inner join-> t_student as s-> on-> st.stno=s.stno+1;
+------+--------+--------+
| stno | stname | stname |
+------+--------+--------+
| 5102 | 王五   | 赵钱   |
| 5103 | 上下   | 王五   || 5123 | 丙丁   | 周二   |
| 5124 | 周六   | 丙丁   |
| 5125 | 秋     | 周六   |
| 5126 | 孙李   | 秋     |
+------+--------+--------+
25 rows in set (0.00 sec)#25条记录是因为1号前面没有学生


2、外连接

外连接分为左连接右连接,左连接以join左边的表为主表,右连接以join右边的表为主表!!!


  • 左连接

select  表1.字段名,表2.字段名 ....... from 表1 left  outer join join   表2   on  表1表2的连接条件  where   筛选条件

outer也可以省略,加上可读性更强

#查询3班学生的成绩等级mysql> select-> st.stname,st.stclass,st.stmath,g.grade-> from-> t_student st-> left outer join-> t_grade g-> on-> st.stmath<=g.max and st.stmath>=g.min-> where-> st.stclass='3班';
+--------+---------+--------+--------+
| stname | stclass | stmath | grade  |
+--------+---------+--------+--------+
| 王五   | 3班     |     68 | 良好   |
| 夏     | 3班     |     82 | 良好   |
| 甲乙   | 3班     |     88 | 良好   |
| 南北   | 3班     |   NULL | NULL   |
| 周二   | 3班     |     78 | 良好   |
| 周六   | 3班     |     58 | 不及格 |
| 秋     | 3班     |     89 | 良好   |
| 孙李   | 3班     |     74 | 良好   |
+--------+---------+--------+--------+
8 rows in set (0.04 sec)

外连接有主次之分,表1为主表是,在表2没有匹配的数据时,也有返回查询结果,只是结果为null。

例如上面的例子,用左连接和内连接的查询结果的条数不一样。

因此,在连接条件相同时,外连接的查询结果的条数一定是大于等于内连接的查询结果的条数!!!!


  • 右连接

select  表1.字段名,表2.字段名 ....... from 表1 right  outer join join   表2   on  表1表2的连接条件  where   筛选条件

outer也可以省略,加上可读性更强

#查询3班学生的成绩等级mysql> select-> st.stname,st.stclass,st.stmath,g.grade-> from-> t_grade g-> right outer join-> t_student st-> on-> st.stmath<=g.max and st.stmath>=g.min-> where-> st.stclass='3班';
+--------+---------+--------+--------+
| stname | stclass | stmath | grade  |
+--------+---------+--------+--------+
| 王五   | 3班     |     68 | 良好   |
| 夏     | 3班     |     82 | 良好   |
| 甲乙   | 3班     |     88 | 良好   |
| 南北   | 3班     |   NULL | NULL   |
| 周二   | 3班     |     78 | 良好   |
| 周六   | 3班     |     58 | 不及格 |
| 秋     | 3班     |     89 | 良好   |
| 孙李   | 3班     |     74 | 良好   |
+--------+---------+--------+--------+
8 rows in set (0.00 sec)

查询结果跟左连接一样,因此,可以得出:任何一个右连接都有左连接的写法;任何一个左连接都有右连接的写法。


3、三张、四张表.......的连接

select ...... from  表1    join  表2  on  表1和表2的连接条件  join  表3  on  表1和表3的连接条件 ............

左连接和右连接可以混合使用

#查询1和3班学生的班主任以及成绩等级,缺考按0分处理,并按班级升序,成绩降序排列mysql> select-> st.stname as "姓名",st.stclass as '班级',ifnull(st.stmath,0) as '成绩',-> ifnull(g.grade,'缺考') as '成绩等级',-> te.tename as '班主任'-> from-> t_student st-> right outer join-> t_teacher te-> on-> st.stclass=te.teclass-> left outer join-> t_grade g-> on-> st.stmath between g.min and g.max-> where-> st.stclass='1班' or st.stclass='3班'-> order by-> st.stclass ,st.stmath desc;
+------+------+------+----------+--------+
| 姓名 | 班级 | 成绩 | 成绩等级 | 班主任 |
+------+------+------+----------+--------+
| 钱七 | 1班  |   93 | 优秀     | 点赞   |
| 前后 | 1班  |   93 | 优秀     | 点赞   |
| 丙丁 | 1班  |   91 | 优秀     | 点赞   |
| 张三 | 1班  |   87 | 良好     | 点赞   |
| 赵钱 | 1班  |   78 | 良好     | 点赞   |
| 周三 | 1班  |   77 | 良好     | 点赞   |
| 春   | 1班  |   73 | 良好     | 点赞   |
| 冬   | 1班  |   54 | 不及格   | 点赞   |
| 上下 | 1班  |   47 | 不及格   | 点赞   |
| 秋   | 3班  |   89 | 良好     | 关注   |
| 甲乙 | 3班  |   88 | 良好     | 关注   |
| 夏   | 3班  |   82 | 良好     | 关注   |
| 周二 | 3班  |   78 | 良好     | 关注   |
| 孙李 | 3班  |   74 | 良好     | 关注   |
| 王五 | 3班  |   68 | 良好     | 关注   |
| 周六 | 3班  |   58 | 不及格   | 关注   |
| 南北 | 3班  |    0 | 缺考     | 关注   |
+------+------+------+----------+--------+
17 rows in set (0.00 sec)

二、子查询

子查询,顾名思义就是在语句中嵌套select查询语句

可以嵌套的地方:

select 之后

from之后

where 之后


1、select 之后

#查询学生的班主任的姓名mysql> select-> st.stname,st.stclass,-> (select te.tename from t_teacher  te where te.teclass=st.stclass) as teacher-> from-> t_student st;
+--------+---------+---------+
| stname | stclass | teacher |
+--------+---------+---------+
| 赵钱   | 1班     | 点赞    |
| 王五   | 3班     | 关注    |
| 上下   | 1班     | 点赞    |
| 钱七   | 1班     | 点赞    || 秋     | 3班     | 关注    |
| 孙李   | 3班     | 关注    |
+--------+---------+---------+
26 rows in set (0.00 sec)


2、from之后

将form之后的select的查询结果当成一张表,然后进行表的连接查询就可以了

#查询每个班的平均成绩的成绩等级mysql> select-> st.stclass,st.avgmath,g.grade-> from-> (select stclass,avg(stmath) as avgmath from t_student group by stclass) st-> left join-> t_grade g-> on-> st.avgmath between g.min and g.max;
+---------+---------+-------+
| stclass | avgmath | grade |
+---------+---------+-------+
| 1班     | 77.0000 | 良好  |
| 3班     | 76.7143 | 良好  |
| 2班     | 74.5556 | 良好  |
+---------+---------+-------+
3 rows in set (0.04 sec)


3、where之后

间接在where中使用聚合函数

#查询成绩在平均分以上的学生mysql> select-> stname,stmath-> from-> t_student-> where-> stmath>(select avg(stmath) from t_student);
+--------+--------+
| stname | stmath |
+--------+--------+
| 赵钱   |     78 |
| 钱七   |     93 |
| 左右   |     88 |
| 周三   |     77 |
| 周四   |     94 |
| 夏     |     82 |
| 张三   |     87 |
| 甲乙   |     88 |
| 前后   |     93 |
| 周五   |     99 |
| 冷烬   |    100 |
| 周二   |     78 |
| 丙丁   |     91 |
| 秋     |     89 |
+--------+--------+
14 rows in set (0.00 sec)

未完待续。。。。。。。。。。。。。

day 05 DQL数据查询语言---连接查询---登堂入室相关推荐

  1. DQL数据查询语言——连接查询

    --内连接 两种写法 等值连接 select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b. ...

  2. MySQl数据库————DQL数据查询语言

    系列文章目录 文章目录 系列文章目录 前言 一.DQL 一.DQL数据查询语言 二.DQL单表查询 1.基本条件查询 2.多条件查询 3.范围查找 4.集合范围类查找 5.字符串模糊匹配 6.空值查询 ...

  3. Mysql数据库——DQL数据查询语言

    DQL数据查询语言 基本查询 条件查询 聚合函数 分组查询 排序查询 分页查询 执行顺序 实例 基本查询 条件查询 聚合函数 分组查询 排序查询 分页查询 案例练习 小结 DQL,数据查询语言,用来查 ...

  4. 数据库DQL数据查询语言

    文章目录 DQL数据查询语言 1.基础查询:SELECT子句和FROM子句 1.1 语法: 2. WHERE子句 2.1 使用AND"与"和OR"或"来连接多个 ...

  5. DQL -- 数据查询语言

    DQL -- 数据查询语言 查询不会修改数据库表记录! 一. 基本查询 1. 字段(列)控制 1) 查询所有列 SELECT * FROM 表名; SELECT * FROM emp; --> ...

  6. DQL数据查询语言--select的巧妙用法

    DQL数据查询语言–select的巧妙用法 今天是周六,赶着这冬日的太阳,记下生活!记下经验! 巧用SQL的数据查询语句Select可以大大提高查询效率,针对测试开发都非常有用. DQL数据查询语言- ...

  7. MySQL(二)——DQL数据查询语言

    文章目录 1. DQL简述 2. 指定查询字段 3. where 条件子句 4. 联表查询 5. 分页和排序 6. 子查询 7. 分组和过滤 8. Select 小结 1. DQL简述 Data Qu ...

  8. 2022-08-16 DQL数据查询语言

    DQL数据库查询语言 重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构. 构建数据库 创建一张student表: DROP TABLE IF EXIS ...

  9. MySQL基础回顾(六):数据查询语言DQL---select查询语句总结(篇一)

    目录 先建一个数据库和若干张表 完整语法 1.基础查询 2.字段别名 3.去重 4.where子句查询 5.模糊查询 6.联表查询 7.分页和排序 8.子查询和嵌套查询 9.分组查询和having语句 ...

  10. MySQL数据库内连接查询inner join...on

    1. 连接查询介绍 连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成. 连接查询可以分为: 内连接查询 左连接查询 右连接查询 自连接查询 2. 内连接查询 查询两个 ...

最新文章

  1. 【腾讯bugly干货分享】微信Android热补丁实践演进之路
  2. IntelliJ IDEA 快捷键终极大全,速度收藏!
  3. “自由主义教皇” 、​Linux 之父的封神之路
  4. concat mysql sql注入_sql注入-mysql注入基础及常用注入语句
  5. 剑指offer 平衡二叉树
  6. c# 通过字体对话框获取字体名称和字体大小_PS插件神器 :fonTags,超好用的PS字体管理插件(附安装方法)
  7. python学习必会知识点:对文件操作详解
  8. 3种方法来卸载Ubuntu软件
  9. VTK:vtk3DSImporter用法实战
  10. mysql无法初始化数据库引擎_mysql使用模板解决旧数据处理,默认初始化数据的通用方法!...
  11. jquery-幻灯片的移动分析
  12. Python中各种括号的区别、用途及使用方法
  13. ASP.Net Ajax框架 Timer控件 计时器
  14. 安卓逆向 | 某新闻类APP urlSign
  15. [渝粤教育] 武汉大学 马克思主义哲学原理精粹九讲 参考 资料
  16. vue click 跳转外部链接
  17. Unity3D 协程
  18. IOS 如何通过浏览器打开App
  19. Daily record-November
  20. java笔记之基础-outer标签

热门文章

  1. NTFS和FAT32的区别和转换
  2. 在Node.js中了解Hello World
  3. 关于电子计算机的热点,计算机如何成为热点? 8台计算机wifi热点软件推荐
  4. 用一行`CSS`实现10种布局
  5. Pine脚本 | 如何编写移动平均线?(附案例)
  6. c语言字母排列组合的实现,c语言中一种典型的排列组合算法
  7. 安农大计算机专业录取分数线,安徽农业大学+录取分数线
  8. 如何将一个数字转换为字符串并且按照指定格式显示?--TO_CHAR
  9. 建立FTP服务器的免费软件
  10. 【Flink】(03)Apache Flink 漫谈系列 —— Flink 1.11 Unaligned Checkpoint 解析