MySQL 数据库语法快速学习5

94 阅读4分钟

大家好我是程序员_蓝天, 本文是为了方便初学者能够快速学习MySQL,写的可能不是很好,希望大家多多包涵。 每个赞都是我前进的动力

多表查询

错误方法:

select * from emp,dept;   

--笛卡尔积 :a 和 b 两个集合,去 a,b 所有的组合情况

--消除无效数据

select * from emp,dept where dep_id=dept.did;  --隐式内连接 
  1. 连接查询

    • 内连接:相当于查询 a, b 交集的数据

      语法

      --隐式内连接
      SELECT 字段列表 FROM 表1,表2… WHERE 条件;
      
      --显示内连接
      SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
      

      案例:隐式内连接

      select emp.name,emp.gender,dept.dname from emp,dept where dep_id=dept.did; 
      
      select t1.name,t1.gender,t2.dname from emp t1,dept t2 where dep_id=dept.did; 
      

      显示内连接

      select * from emp inner join dept on emp.dep_id=dept.did
      select * from emp join dept on emp.dep_id=dept.did
      
    • 外连接:

      左外连接:相当于查询 a 表所有数据和交集部门的数据

      --左外连接,一般用
      SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON条件
      

      案例:查询 emp 所有数据和对应部门信息

      select * from emp left join dept on emp.dep_id=dept.did
      

      右外连接:相当于查询 b 表所有数据和交集部门的数据

      --右外连接
      SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON条件
      

      案例:查询 dept 表所有的数据和对应员工信息

      select * from emp left join dept on emp.dep_id=dept.did
      
      select * from dept left join emp on emp.dep_id=dept.did
      
  2. 子查询

    • 概念:查询中嵌套查询,称嵌套查询为子查询

image-20241025022752304.png

*   子查询根据查询结果不同,作用不同:

    *   单行单列:作为条件值,使用 = != > < 等进行条件判断

        ```mysql
        SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);
        ```

    *   多行单列:作为条件值,使用 in 等关键字进行条件判断

        ```mysql
        SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询);
        ```

        案例:查询财务部所有员工信息

        ```mysql
        select did from dept where dname='财务部';
        select * from emp where dep_id=(select did from dept where dname='财务部');
        ```

        查询财务部和市场部所有员工信息

        ```mysql
        select did from dept where dname='财务部' or dname='市场部';
        select * from emp where dep_id=(select did from dept where dname='财务部' or dname='市场部');
        select * from emp where dep_id in(2,3)
        select * from emp where dep_id in(select did from dept where dname='财务部' or dname='市场部')
        ```

    *   多行多列:作为虚拟表

        ```mysql
        SELECT 字段列表 FROM (子查询) WHERE 条件;
        ```

        案例:查询入职日期时'2011-11-11'之后的员工信息和部门信息

        ```mysql
        select * from emp where join_date>'2011-11-11';
        select * from emp,dept where emp.dep_id=dept.did;
        select * from (select * from emp where join_date>'2011-11-11') t1,dept where t1.dep_id=dept.did;
        ```

多表查询案例:

image.png

1.查询所有员工信息。编号,姓名,工资,职位名称,职位描述

分析:

1.员工编号,姓名,工资在 emp 员工表中

​ 2.职位名称,职位描述在 job 职位表中

​ 3.job 职务表合 emp 员工表是一对多的关系 emp.job = job.id

隐式内连接

select * from emp,job where emp.job_=job.id;
select emp.id,emp.name,emp.salary,job.jname,job.descriptio from emp,job where emp.job_=job.id;

显示内连接

select emp.id,emp.name,emp.salary,job.jname,job.descriptio from emp inner join job on emp.job_=job.id;

2.查寻员工编号,姓名,工资,职务名称,职务描述,部门名称,部门位置

分析:1.员工编号,姓名,工资在 emp 员工表中

​ 2.职位名称,职位描述在 job 职位表中

​ 3.job 职务表合 emp 员工表是一对多的关系 emp.job = job.id

​ 4.部门名称,部门位置来自于部门表 dept

​ 5.dept 和 emp 一对多关系,dept.id = emp.dept_id

隐式内
select emp.id,emp.name,emp.salary,job.jname,job.descriptio,dept.dname,dept.loc from emp,job ,dept where emp.job_=job.id and dept.id=emp.dept_id;
显示内
select emp.id,emp.name,emp.salary,job.jname,job.descriptio,,dept.dname,dept.loc from emp inner join job on emp.job_=job.id inner join job on dept.id=emp.dept_id;

3.查询员工姓名,工资,工资等级

分析:1.员工编号,姓名,工资在 emp 员工表中

​ 2.工资等级信息 salarygrdae 职位表中

​ 3.emp.salary >= salarygrdae.losalary and emp.salary <= salarygrdae.hisalary

select emp.ename emp.salary,t2.grade from emp,salarygrade t2 where emp.salary>= t2.losalary and emp.salary<=t2.hisalary

4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级

分析:1.员工编号,姓名,工资在 emp 员工表中

​ 2.职务名称,职务描述在 job

​ 3.job 和 emp 是一对多关系 emp.job_id = job.id

​ 4.部门名称,部门位置, 来自 dept

​ 5.工资等级信息 salarygrdae 职位表中

​ 6.emp.salary >= salarygrdae.losalary and emp.salary <= salarygrdae.hisalary

select emp.id,emp.name,emp.salary,job.jname,job.descriptio,,dept.dname,dept.loc,t2.grade from emp inner join job on emp.job_=job.id inner join job on dept.id=emp.dept_id inner join salarygrade t2 on emp.salary between t2.losalary and t2.hisalary;

5.查询出部门编号、名称、位置、人数

分析:1.部门编号、名称、位置,在 dept

​ 2.部门人数:在 emp 按照 dept.id 进行分组,然后 count(*)统计数量

​ 3.使用子查询,让部门表和分组后的表进行内连接

select * from dept;
select dept_id,count(*) from empt group by dept.id;
select * from dept,(select dept_id,count(*) from empt group by dept.id) t1 where dept.id=t1.sept_id;
select dept.id,dept.dname,dept.loc,t1.count from dept,(select dept_id,count(*) count from empt group by dept.id) t1 where dept.id=t1.sept_id;

原创-程序员_蓝天