zoukankan      html  css  js  c++  java
  • Mysql查询---连接查询

    一、含义
    当查询中涉及到了多个表的字段,需要使用多表连接
    select 字段1,字段2
    from 表1,表2,...;

    笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
    如何解决:添加有效的连接条件
    二、分类

    按年代分类:
        sql92:
            等值
            非等值
            自连接

            也支持一部分外连接(用于oracle、sqlserver,mysql不支持)
        sql99【推荐使用】
            内连接
                等值
                非等值
                自连接
            外连接
                左外
                右外
                全外(mysql不支持)
            交叉连接
                
    三、SQL92语法
    1、等值连接
    语法:
        select 查询列表
        from 表1 别名,表2 别名
        where 表1.key=表2.key
        【and 筛选条件】
        【group by 分组字段】
        【having 分组后的筛选】
        【order by 排序字段】

    特点:
        ① 一般为表起别名
        ②多表的顺序可以调换
        ③n表连接至少需要n-1个连接条件
        ④等值连接的结果是多表的交集部分
    2、非等值连接
    语法:
        select 查询列表
        from 表1 别名,表2 别名
        where 非等值的连接条件
        【and 筛选条件】
        【group by 分组字段】
        【having 分组后的筛选】
        【order by 排序字段】
    3、自连接
    语法:
        select 查询列表
        from 表 别名1,表 别名2
        where 等值的连接条件
        【and 筛选条件】
        【group by 分组字段】
        【having 分组后的筛选】
        【order by 排序字段】

    四、SQL99语法
    1、内连接
    语法:
    select 查询列表
    from 表1 别名
    【inner】 join 表2 别名 on 连接条件
    where 筛选条件
    group by 分组列表
    having 分组后的筛选
    order by 排序列表
    limit 子句;

    特点:
    ①表的顺序可以调换
    ②内连接的结果=多表的交集
    ③n表连接至少需要n-1个连接条件
    分类:
    等值连接
    非等值连接
    自连接
    2、外连接
    语法:
    select 查询列表
    from 表1 别名
    left|right|full【outer】 join 表2 别名 on 连接条件
    where 筛选条件
    group by 分组列表
    having 分组后的筛选
    order by 排序列表
    limit 子句;
    特点:
    ①查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
    ②left join 左边的就是主表,right join 右边的就是主表
      full join 两边都是主表
    ③一般用于查询除了交集部分的剩余的不匹配的行

    3、交叉连接

    语法:
    select 查询列表
    from 表1 别名
    cross join 表2 别名;

    特点:
    类似于笛卡尔乘积

    4.图解

     

    案列:

    #1.显示所有员工的姓名,部门号和部门名称。
    USE myemployees;

    SELECT last_name,d.department_id,department_name
    FROM employees e,departments d
    WHERE e.`department_id` = d.`department_id`;


    #2.查询90号部门员工的job_id和90号部门的location_id

    SELECT job_id,location_id
    FROM employees e,departments d
    WHERE e.`department_id`=d.`department_id`
    AND e.`department_id`=90;

    #3.    选择所有有奖金的员工的
    last_name , department_name , location_id , city

    SELECT last_name , department_name , l.location_id , city
    FROM employees e,departments d,locations l
    WHERE e.department_id = d.department_id
    AND d.location_id=l.location_id
    AND e.commission_pct IS NOT NULL;


    #4.选择city在Toronto工作的员工的
    last_name , job_id , department_id , department_name 

    SELECT last_name , job_id , d.department_id , department_name 
    FROM employees e,departments d ,locations l
    WHERE e.department_id = d.department_id
    AND d.location_id=l.location_id
    AND city = 'Toronto';

    #5.查询每个工种、每个部门的部门名、工种名和最低工资

    SELECT department_name,job_title,MIN(salary) 最低工资
    FROM employees e,departments d,jobs j
    WHERE e.`department_id`=d.`department_id`
    AND e.`job_id`=j.`job_id`
    GROUP BY department_name,job_title;

    #6.查询每个国家下的部门个数大于2的国家编号

    SELECT country_id,COUNT(*) 部门个数
    FROM departments d,locations l
    WHERE d.`location_id`=l.`location_id`
    GROUP BY country_id
    HAVING 部门个数>2;

    #7、选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式
    employees    Emp#    manager    Mgr#
    kochhar        101    king    100

    SELECT e.last_name employees,e.employee_id "Emp#",m.last_name manager,m.employee_id "Mgr#"
    FROM employees e,employees m
    WHERE e.manager_id = m.employee_id
    AND e.last_name='kochhar';
    不经一番彻骨寒,哪有梅花扑鼻香?
  • 相关阅读:
    常用函数
    PostgreSql那点事(文件读取写入、命令执行的办法)
    如何检测Windows中的横向渗透攻击
    小米笔记本pro版bios经常找不到硬盘
    grunt教程
    nodejs廖雪峰大神教程
    ClickOnce是什么?如何使用?
    asp.net中的ORA-12154: TNS: 无法解析指定的连接标识符
    未能加载文件或程序集 ICSharpCode.SharpZipLib
    PL/SQL 循环
  • 原文地址:https://www.cnblogs.com/zongyao/p/13831103.html
Copyright © 2011-2022 走看看