多张表联合起来查询即为连接查询,可分为:

  • 内连接:等值连接、非等值连接、自连接
  • 外连接:右外连接、左外连接

也就是先把多张表通过某种指定条件用join...on...语法连接起来,然后再进行where... group by... having等条件查询。

内连接中的等值连接

// 从emp表中查询ename,从dept表中查询员工所在的部门名称,即dname

mysql> select e.ename as employee,d.dname as department
-> from emp e
-> inner join dept d
-> on e.deptno=d.deptno;

其中inner可以省略

内连接中的非等值连接

// 从emp表中查询ename,从salgrade表中查询员工薪资等级

mysql> select e.ename employee,s.grade
-> from emp e
-> join salgrade s
-> on e.sal between s.losal and s.hisal;

内连接中的自连接,也就是自己相当于多张表

// 从emp表中查询ename和员工的领导的名字

mysql> select e.ename employee,l.ename leader
-> from emp e
-> join emp l
-> on e.mgr=l.empno;

在该查询结果中,不包括没有领导的员工

外连接中表有主次之分,而内连接中表没有主次之分。主表就是查询其中的全部数据,关联查询此表中的数据。右外连接表示join右侧的表是主表,左外连接则join左侧的是主表

// 从emp表中查询ename和员工领导的名字,没有领导的员工也要包括

mysql> select e.ename employee,l.ename leader
-> from emp e
-> left outer join emp l
-> on e.mgr=l.empno;

可以查询到emp表中的全部员工,没有领导的则leader字段显示NULL,上述语句可以改写为右连接,其中的outer可以省略。

mysql> select e.ename employee,l.ename leader
-> from emp l
-> right join emp e
-> on e.mgr=l.empno;

可见,外连接查询的结果的数量>=内连接的查询结果的数量。一条SQL语句中内连接和外连接可以同时存在。

// 从emp表中查询全部员工名字、领导名字,所在部门名字、薪资等级

mysql> select e.ename as employee,l.ename as leader,d.dname as dept,s.grade
-> from emp e
-> join dept d
-> on e.deptno=d.deptno
-> join salgrade s
-> on e.sal between s.losal and s.hisal
-> left join emp l
-> on e.mgr=l.empno;

上述join...on..语句的顺序不重要,也就是说

mysql> select e.ename as employee, l.ename as leader,d.dname as dept,s.grade
-> from emp e
-> left join emp l
-> on e.mgr=l.empno
-> join dept d
-> on e.deptno=d.deptno
-> join salgrade s
-> on e.sal between s.losal and s.hisal;

查询出来的结果一样,只是顺序不一样。

子查询即查询语句中嵌套查询语句

where子句中嵌套select:

// 从emp表中查询薪资大于平均薪资的员工姓名和其薪资

mysql> select ename as name,sal as salary
-> from emp
-> where sal>(select avg(sal) from emp);

from子句中嵌套select,可以把子查询的结果当作一张临时表

// 从emp和salgrade表中查询不同岗位的平均薪资和薪资等级

mysql> select t.job,t.avgsal,s.grade
-> from (select job,avg(sal) as avgsal from emp group by job) as t
-> join salgrade s
-> on t.avgsal between s.losal and s.hisal;

注意,这里最好给子查询的临时表的查询字段都取个别名。

此外,union用于合并查询结果集

mysql> select ename,job from emp where job='MANAGER'
-> union
-> select ename,job from emp where job='SALESMAN';

mysql> select ename,job from emp where job='MANAGER' or job='SALESMAN';

查询结果一样,但是使用union的效率更高。

limit用于分页查询,即依照条件取出部分查询结果

mysql> select ename,sal from emp order by sal desc limit 2,3;

其中2是起始位置,0时可以省略,3是取出的结果数量。

mysql> select ename,sal from emp order by sal desc limit 5;

limit (pageNo-1)*pageSize, pageSize;

MySQL常用查询命令(连接查询&子查询)的更多相关文章

  1. mysql的联合,连接,子查询

  2. MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  3. MySQL多表查询之外键、表连接、子查询、索引

    MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...

  4. MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  5. mysql学习笔记-- 多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  6. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  7. MySQL 子查询(四)子查询的优化、将子查询重写为连接

    MySQL 5.7 ref ——13.2.10.10优化子查询 十.子查询的优化 开发正在进行中,因此从长远来看,没有什么优化建议是可靠的.以下列表提供了一些您可能想要使用的有趣技巧.See also ...

  8. MS sql server 基础知识回顾(二)-表连接和子查询

    五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...

  9. mysql加强(6)~子查询简单介绍、子查询分类

    一.子查询简单介绍 1.什么是子查询? 一个查询之中嵌套了其他的若干查询. 在使用select 语句查询时,有时候where的查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果. 子 ...

  10. ylb:SQL 表的高级查询-多表连接和子查询

    ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...

随机推荐

  1. 字符串自实现(一)(mystrcpy,mystrcat,mystrcmp)

    char* mystrcpy(char* str_one,const char* str_two) { char* tmp = str_one; while (*str_one++ = *str_tw ...

  2. 简述BIO/NIO/AIO前世今生

    如下程序是简单实现了一个极其简单的WEB服务器,用来监听某个端口,接受客户端输入输出信息. 但这个程序有一个致命的问题就是连接会长时间阻塞 于是BIO版本出现了,改成了  一个连接 一个线程来处理请求 ...

  3. UncLutter

    在 Mac 上「速记」的正确姿势:Unclutter 现代人的大脑,每天都会被大量有用,或无用的东西充斥着,过多「思想垃圾」的沉重负担就容易导致失忆.也就是说,你很可能会记得一个无关紧要,但给你留下深 ...

  4. 【webpack4.0】---dev.config.js基本配置(六)

    一.开发环境配置准备 1.创建dev.config.js文件 用来配置开发环境的代码 2.安装webpack-merge cnpm install webpack-merge -D 用来合并webpa ...

  5. Postman 支持 gRPC 了!继续领先 ~

    最近国产API管理工具比较热,几款产品在API管理层面做得也都还不错,但主要还是对HTTP相关的API管理,毕竟这类API的应用目前还是最为广泛的.但显然,还有不少其他应用场景目前没有覆盖到,DD在之 ...

  6. Atcoder ARC-061

    ARC061(2020.7.10) A 暴力 \(dfs\) 即可. B 考虑统计以每个点为矩阵中心的答案,显然一个黑点只会影响周围九个黑点,使用 \(map\) 来记录这个值,每次修改修改一下答案数 ...

  7. JS 中的GB2312转UTF8和UTF8转GB2312

    转载请注明来源:https://www.cnblogs.com/hookjc/ JS:encodeURI encodeURI(URIString)必选的 URIString 参数代表一个已编码的 UR ...

  8. 使用UrlConnection请求一个url地址获取内容

    访问网络需要加Internet权限:android.permission.INTERNET 使用UrlConnection请求一个url地址获取内容:             //1.创建一个Url对 ...

  9. SqlServer数据库表生成C# Model实体类SQL语句——补充

    在sql语句最前边加上  use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html   --[SQL骚操作]SqlServer数据库表生成C ...

  10. java中的静态变量,静态方法与静态代码块详解

    java中的类的生命周期分为装载,连接,初始化,使用,和卸载五个过程. 而静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...