美文网首页
sql 内连接

sql 内连接

作者: Vergil_wj | 来源:发表于2021-06-23 08:34 被阅读0次

连接查询

将两个或两个以上的表以一定的连接条件连接起来,从中检索出满足条件的数据。

分类

  • 内连接
  • 外连接
  • 完全连接
  • 交叉连接
  • 自连接
  • 联合

内连接

inner join 其中 inner 可省略。

  1. select ... from A,B 的用法
  2. select ... from A,B where ... 的用法
  3. select ... from A join B on ... 的用法
  4. select ... from A,B where ... 与 select ... from A join B on ...比较
  5. select、from、where、join、on、group、order、top、having 的混合使用

练习:

  1. 求出每个员工的姓名、部门编号、薪水和薪水等级。
  2. 查找每个部门的编号、该部门所有员工平均工资、平均工资等级。
  3. 求出 emp 表中所有领导的信息。
  4. 求出平均薪水最高的部门编号和部门平均工资。
  5. 去掉工资最低的,把剩下的工资最低前3人的姓名、工资、部门编号、部门名称、工资等级输出

emp 员工表:

emp 全部列:

emp.png

emp 全部行:


emp.png

dept 部门表:

dept.png

salGrade 工资等级表:

salGrade.png

1、select ... from A,B

emp 表 14 行 8列,dept 表 5 行 3 列:

select * from emp,dept

输出结果 70 行 11 列,行数是两个表行数的乘积,列是两个表的列数相加之和。

将 emp 表中的每一条记录和 dept 表中每一条记录连接起来,同理 dept 中的每一条记录和 emp 表中的每一条记录连接起来。即 emp 表中第一条记录和 dept 表中的 5 条记录连接,依次第2条...第14条记录和 dept 表中的 5 条记录连接,形成 14 * 5 = 70 行。

2、select ... from A,B where ... 的用法

select * from emp,dept wher empno = 7369;
  • 输出 5 行
  • select ... from A,B 产生的结果进行过滤。

3、select ... from A join B on ... 的用法

输出 70 行 2 列

select "E".ename "员工姓名",“D”.dname
    from emp "E"
    join dept "D" --join 是连接
    on 1=1 -- on 连接条件,有 join 就必须有 on

deptno 字段在两个表中都有:

-- 下面错误写法:
select deptno  --error,不清楚 deptno 在哪个表中
    from emp "E"
    join dept "D"
    on 1=1

-- 下面正确写法:
select "E".deptno
    from emp "E"
    join dept "D"
    on 1=1

输出 14 行 2列:

select "E".ename "员工姓名",“D”.dname "部门名称"
    from emp "E"
    join dept "D"
    on "E".deptno = "D".deptno 

4、select ... from A,B where ...select ... from A join B on ... 区别

select * 
    from emp,dept
    where emp.deptno = dept.deptno

等价于

select *
    from emp
    join dept
    on emp.deptno = dept.deptno

  • select ... from A,B where ...:sql92 标准
  • select ... from A join B on ...:sql99 标准

输出结果是一样的,推荐使用第二种 join on。

例1:把工资大于 2000 的员工的姓名和部门的名称输出。

sql92 的实现方式:

select E.ename "员工姓名","D".dname "部门名称"
    from emp "E",dept "D"
    where "E".sal > 2000 and "E".deptno = "D".deptno

这种方式将表的链接和工资过滤放到了一起。

sql99 的实现方式:

select E.ename "员工姓名","D".dname "部门名称"
    from emp "E"
    join dept "D"
    on "E".deptno = "D".deptno
    where "E".sal > 2000 

第二种方式逻辑更清晰,先链接表,在过滤。

例2:把工资大于 2000 的员工的姓名、部门的名称和工资等级输出。

sql99 标准:

select "E".ename "员工姓名","D".dname "部门名称","S".grade "工资等级"
    from emp "E"
    join dept "D"
    on "E".deptno = "D".deptno,
    join salgrade "S"
    on "E".sal >= "S".losal and "E".sal <= "S".hisal
    where "E".sal > 2000

sql92 标准:

select "E".ename "员工姓名","D".dname "部门名称","S".grade "工资等级"
    from emp "E",dept "D",salgrade "S"
    where  "E".deptno = "D".deptno and ("E".sal >= "S".losal and "E".sal <= "S".hisal ) and "E".sal > 2000

例三:

select * 
    from emp,dept
    where dept.deptno = 10    -- 过滤条件

等价于

select *
    from emp
    join dept
    on 1=1    -- 链接条件
    where dept.deptno = 10    -- 过滤条件

5、select、from、where、join、on、group、order、top、having 的混合使用

  1. 输出工资最高的前三名每个员工的姓名,工资,工资等级,部门名称:
select top 3 "E".ename,"E".sal "工资","S".grade "工资等级","D".dname "部门名称"
    from emp "E"
    join dept "D"
    on "E".deptno = "D".deptno
    join salgrade "S"
    on "E".sal between "S".losal and "S".hisal
    order by "E".sal desc
  1. 输出姓名不包含A的员工工资最高的前三名每个员工的姓名,工资,工资等级,部门名称:
select top 3 "E".ename,"E".sal "工资","S".grade "工资等级","D".dname "部门名称"
    from emp "E"
    join dept "D"
    on "E".deptno = "D".deptno
    join salgrade "S"
    on "E".sal between "S".losal and "S".hisal
    where "E".ename not like '%A%'
    order by "E".sal desc

练习

1、求出每个员工的姓名、部门编号、薪水和薪水等级。

select "E".ename "员工姓名","E".deptno "部门编号","E".sal "薪水","S".grade "薪水等级"
    from emp "E"
    join salgrade "S"
    on "E".sal between "S".losal and "S".hisal

2、查找每个部门的编号、该部门所有员工平均工资、平均工资等级。

select "T".deptno "部门编号","T".avg_sal as "平均工资","S".grade "工资等级"
    from(
        select deptno,avg(sal) as "avg_sal"
            from emp 
            group by deptno
    ) as "T"
    join salgrade "S"
    on "T".avg_sal between "S".losal and "S".hisal

3、求出 emp 表中所有领导的信息

select * from emp
    where empno in (select mgr from emp)  -- 过滤出员工编号在领导集合编号中即可。

4、求出平均薪水最高的部门编号和部门平均工资。

select top 1 detpno,avg(sal) "avg_sal"
    from emp
    group by deptno
    order by avg(sal) desc

5、去掉工资最低的,把剩下的工资最低前3人的姓名、工资、部门编号、部门名称、工资等级输出。

select top 3 "E".ename "姓名","E".sal "工资","E".deptno "部门编号","D".name "部门名称","S".grade "工资等级"
    from (
        select * 
            from emp 
            where sal > (select min(sal) from emp)   -- 去掉最低工资的员工
    ) "E"
    join dept "D"
    on "E".deptno = "D".deptno
    join salgrade "S"
    on "E".sal between "S".losal and "S".hisal
    order by "E".sal asc

相关文章

  • EF Core 备忘

    模糊查询sql linq 内连接查询sql linq 左连接查询sql linq 左连接查询(连接内带条件)sql...

  • SQL常见面试题

    1、SQL的表连接方式有哪些?SQL中连接按结果集分为:内连接,外连接,交叉连接内连接:inner join on...

  • 2020-04-01

    连接两表 SOLUTION 输入 输出 解题思路SQL 连接类型SQL 中有多种不同的连接: 内连接(INNER ...

  • sql 内连接

    连接查询 将两个或两个以上的表以一定的连接条件连接起来,从中检索出满足条件的数据。 分类 内连接 外连接 完全连接...

  • SQL 联表查询

    SQL——左连接(Left join)右连接(Right join)内连接(Inner join)[https:/...

  • SQL inner join和left join on

    SQL中的查询连接有 inner join(内连接),left join(左连接),right join(右连接)...

  • left join,right join,inner join,

    sql中的连接查询有inner join(内连接)、left join(左连接)、right join(右连接)、...

  • Mysql增删改查、内连接、左连接、右连接

    一、sql增删改查、内连接、左连接、右连接 1、增: INSERT INTO students(sid, snam...

  • 数据库七种连接方式总结

    一、join图 二、sql语句准备 部门表数据 三、七种连接方式详解 1、内连接 inner join 内连接in...

  • Chapter 10.SQL99 语法

    阅读原文 Chapter 10.sql99语法 /* 语法: 分类: 内连接(★):inner 外连接左外(★):...

网友评论

      本文标题:sql 内连接

      本文链接:https://www.haomeiwen.com/subject/cjnkyltx.html