zoukankan      html  css  js  c++  java
  • mysql 多表连接查询

    select 字段列表 from 表1 inner | left |right join 表2
    on 条件
    View Code

    一、多表连接查询

      按照如下命令创建department,employee两个表格:

    #创建表
    create table department(
    id int,
    name varchar(20) 
    );
    
    create table employee(
    id int primary key auto_increment,
    name varchar(20),
    sex enum('male','female') not null default 'male',
    age int,
    dep_id int
    );
    
    #插入数据
    insert into department values
    (200,'技术'),
    (201,'人力资源'),
    (202,'销售'),
    (203,'运营');
    
    insert into employee(name,sex,age,dep_id) values
    ('egon','male',18,200),
    ('alex','female',48,201),
    ('wupeiqi','male',38,201),
    ('yuanhao','female',28,202),
    ('liwenzhou','male',18,200),
    ('jingliyang','female',18,204)
    ;
    View Code
    #重点:外链接语法
    
    SELECT 字段列表
        FROM 表1 INNER|LEFT|RIGHT JOIN 表2
        ON 表1.字段 = 表2.字段;
    重点

    1、交叉连接:不使用任何匹配条件,生成笛卡尔积

      通过命令select * from employee,department;可以得到的结果如下,结果成为笛卡尔的积。

    2、内连接:使用匹配条件,显示匹配的数据行

      实际上笛卡尔的积是没有意义的,先生成笛卡尔积,然后按照约束条件进行筛选才是我们需要的:

     

     上述这种利用筛选条件,从笛卡尔的积中选出两表共有的部分,也可以通过如下方式进行实现,称为内连接。(有专门干连接的活)

    3、左连接:在内连接的基础上增加左边表有右边没有的内容(优先显示左表全部内容记录)

      结果如下所示,即使department表没有204这个部门,左表的204部门的员工信息也会显示:

    4、右连接:在内连接的基础上增加右边表有左边没有的内容(优先显示右表全部内容记录)

      结果如下所示,即使employee表没有员工属于203部门,右表的203部门的信息也会显示:

    5、全连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果

      在mysql中实际是不支持full join全连接的,但是可以通过union将左、右连接进行连接后去重得到结果,如下:

    二、符合条件的连接查询

     1、找出年龄大于25岁的员工以及员工所在的部门

    #示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示
    select emp1.id,emp1.name,emp1.age,dep1.name from emp1,dep1
        where emp1.dep_id = dep1t.id
        and age > 25
        order by age asc;

    三、子查询

    #1:子查询是将一个查询语句嵌套在另一个查询语句中。
    #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
    #3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
    #4:还可以包含比较运算符:= 、 !=、> 、<等

    1、带关键字in的查询

    #查询emp1表,但dep_id必须在dep1表中出现过
    select * from emp1
        where dep_id in
            (select id from dep1);

    2、带比较运算符的子运算.

    #比较运算符:=、!=、>、>=、<、<=、<>
    #查询平均年龄在25岁以上的部门名
    select id,name from dep1
        where id in 
            (select dep_id from emp1 group by dep_id having avg(age) > 25);
    
    #查看技术部员工姓名
    select name from emp1
        where dep_id in 
            (select id from dep1 where name='技术');
    
    #查看不足1人的部门名
    select name from dep1 where id not in 
      (select dep_id from emp1 group by dep_id having count(id) >= 1);

    3 带EXISTS关键字的子查询

    EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
    而是返回一个真假值。True或False
    当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询

    #department表中存在dept_id=203,Ture
    mysql> select * from employee
        ->     where exists
        ->         (select id from department where id=200);
    +----+------------+--------+------+--------+
    | id | name       | sex    | age  | dep_id |
    +----+------------+--------+------+--------+
    |  1 | egon       | male   |   18 |    200 |
    |  2 | alex       | female |   48 |    201 |
    |  3 | wupeiqi    | male   |   38 |    201 |
    |  4 | yuanhao    | female |   28 |    202 |
    |  5 | liwenzhou  | male   |   18 |    200 |
    |  6 | jingliyang | female |   18 |    204 |
    +----+------------+--------+------+--------+
    
    #department表中存在dept_id=205,False
    mysql> select * from employee
        ->     where exists
        ->         (select id from department where id=204);
    Empty set (0.00 sec)
    View Code
  • 相关阅读:
    git使用命令行方式提交代码到github或gitlab上
    如何创建AnjularJS项目
    基于react-native android的新闻app的开发
    Windows下搭建React Native Android开发环境
    python打怪之路【第一篇】:99乘法表
    python成长之路【第四篇】:装饰器
    python成长之路【第三篇】:函数
    python成长之路【第二篇】:列表和元组
    python成长之路【第一篇】:python简介和入门
    JavaScript进阶--慕课网学习笔记
  • 原文地址:https://www.cnblogs.com/jassin-du/p/8044732.html
Copyright © 2011-2022 走看看