• MySQL多表查询


    MySQL之多表查询

    创建表

    # 创建表
    create table department(id int,name varchar(20));
    
    create table employee1(
    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 employee1(name,sex,age,dep_id) values('egon','male',18,200),('alex','female',48,201),('tom','male',38,201),('yuanhao','female',28,202),('lidawei','male',18,200),('jinkezhou','female',18,204);
    
    # 查看表
    mysql> select * from employee1;
    +----+-----------+--------+------+--------+
    | id | name      | sex    | age  | dep_id |
    +----+-----------+--------+------+--------+
    |  1 | egon      | male   |   18 |    200 |
    |  2 | alex      | female |   48 |    201 |
    |  3 | tom       | male   |   38 |    201 |
    |  4 | yuanhao   | female |   28 |    202 |
    |  5 | lidawei   | male   |   18 |    200 |
    |  6 | jinkezhou | female |   18 |    204 |
    +----+-----------+--------+------+--------+
    6 rows in set (0.00 sec)
    
    mysql> select * from department;
    +------+--------------+
    | id   | name         |
    +------+--------------+
    |  200 | 技术       |
    |  201 | 人力资源   |
    |  202 | 销售       |
    |  203 | 运营       |
    +------+--------------+
    4 rows in set (0.00 sec)

    多表连接查询

    交叉连接

    交叉连接:不适用任何匹配条件。生成笛卡尔积

    mysql> select * from employee1 ,department;

    内连接

    内连接:找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。(只连接匹配的行)

    # 找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
    #department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来
    mysql> select * from employee1,department where employee1.dep_id=department.id;
    
    #上面用where表示的可以用下面的内连接表示,建议使用下面的那种方法
    mysql> select * from employee1 inner join department on employee1.dep_id=department.id;
    
    # 也可以这样表示哈
    mysql> select employee1.id,employee1.name,employee1.age,employee1.sex,department.name from employee1,department where employee1.dep_id=department.id;

    左连接left

    优先显示左表全部记录。

    #左链接:在按照on的条件取到两张表共同部分的基础上,保留左表的记录
    mysql> select * from employee1 left join department on department.id=employee1.dep_id;
    
    mysql> select * from department left join  employee1 on department.id=employee1.dep_id;

    右连接right

    优先显示右表全部记录。

    #右链接:在按照on的条件取到两张表共同部分的基础上,保留右表的记录
    mysql> select * from employee1 right join department on department.id=employee1.dep_id;
    
    mysql> select * from department right join employee1 on department.id=employee1.dep_id;

    全部连接join

    mysql> select * from department full join employee1;

    符合条件多表查询

    示例1:以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25,
    即找出公司所有部门中年龄大于25岁的员工

    mysql> select * from employee1 inner join department on employee1.dep_id=department.id and age>25;

    示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示

    mysql> select * from employee1 inner join department on employee1.dep_id=department.id and age>25 and age>25 order by age asc;

    子查询

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

     示例:

    # 查询平均年龄在25岁以上的部门名
    mysql> select name from department where id in ( select dep_id from employee1 group by dep_id having avg(age) > 25 );
    
    # 查看技术部员工姓名
    mysql> select name from employee1 where dep_id = (select id from department where name='技术');
    
    # 查看小于2人的部门名
    mysql> select name from department where id in (select dep_id from employee1 group by dep_id having count(id) < 2) union select name from department where id not in (select distinct dep_id from employee1);
    
    # 提取空部门                              #有人的部门
    mysql> select * from department where id not in (select distinct dep_id from employee1);
  • 相关阅读:
    [HDOJ4788]Hard Disk Drive(水题)
    [HDOJ4782]Beautiful Soup(模拟)
    [HDOJ3652]B-Number(数位dp)
    [CF55D]Beautiful numbers(数位dp,状态压缩)
    [HDOJ3555]Bomb(数位DP)
    [HDOJ2089]不要62(数位DP)
    [HDOJ5881] Tea(找规律)
    [HDOJ5900]QSC and Master(区间dp)
    [HDOJ5878]I Count Two Three(暴力枚举,二分)
    [HDOJ5879]Cure(求极限,打表)
  • 原文地址:https://www.cnblogs.com/yanjieli/p/9799347.html
Copyright © 2020-2023  润新知