• mysql多表查询


    多表查询:一次查询两张以上的表,叫多表查询

    1.交叉连接查询:很少使用,有错误数据(笛卡尔集,笛卡尔积)
    格式:
    select * from 表A,表B;

    一次性的查询出分类表和商品表的所有数据
    SELECT * FROM category,products;

    2.内连接查询:在交叉连接查询的基础上,使用外键约束作为查询条件
    a.隐式内连接:不使用关键字 [inner] join on
    格式:
    select * from 表A,表B where 表A.主键 = 表B.外键;
    b.显示内连接:使用关键字 [inner] join on
    格式:
    select * from 表A [inner] join 表B on 表A.主键 = 表B.外键;

    -- a.隐式内连接
    SELECT * FROM category,products WHERE category.cid = products.category_cid;

    -- 使用给表起别名,简化sql语句
    SELECT * FROM category c,products p WHERE c.cid = p.category_cid;

    -- b.显示内连接
    SELECT * FROM category c INNER JOIN products p ON c.cid = p.category_cid;

    -- 查询哪些分类的商品已经上架
    -- 隐式内连接:多个查询的条件可以使用逻辑运算符连接
    SELECT * FROM category c,products p WHERE c.cid = p.category_cid AND p.flag = '1';

    -- 显示内连接:on的后边可以继续写where添加其他查询条件
    SELECT * FROM category c INNER JOIN products p ON c.cid = p.category_cid WHERE p.flag = '1';
    -- 显示内连接:多个查询的条件可以使用逻辑运算符连接
    SELECT * FROM category c INNER JOIN products p ON c.cid = p.category_cid AND p.flag = '1';

    3.外连接查询:在交叉连接查询的基础上,使用外键约束作为查询条件
    a.左外连接查询:使用关键字left [outer] join on
    格式:
    select * from 表A left [outer] join 表B on 表A.主键 = 表B.外键;
    注意:
    左外连接查询以左边的表为主
    左边有的数据,右边没有使用null代替
    左边没有的数据,右边也不能出现
    b.右外连接查询:使用关键字right [outer] join on
    格式:
    select * from 表A right[outer] join 表B on 表A.主键 = 表B.外键;
    注意:
    右外连接查询以右边的表为主
    右边有的数据,左边没有使用null代替
    右边没有的数据,左边也不能出现

    -- a.左外连接查询
    SELECT * FROM category c LEFT OUTER JOIN products p ON c.cid = p.category_cid;

    -- b.右外连接查询
    SELECT * FROM category c RIGHT OUTER JOIN products p ON c.cid = p.category_cid;

    把左外连接中两张表调换位置,相对于右外连接
    SELECT * FROM products p LEFT OUTER JOIN category c ON c.cid = p.category_cid;

    4.子查询(sql语句的嵌套)
    a.一条sql语句的查询结果,作为另外一条sql语句的查询条件
    格式:
    select * from 表B where 字段 = (select 字段 from 表A [where 条件]);
    b.一条sql语句的查询结果,作为另外一条sql语句的另一张表(隐式内连接查询,先过滤数据)
    格式:
    select * from (select * from 表A [where 条件]),表B where 表A.主键 = 表B.外键

    -- 查询商品表,只显示化妆品的信息
    SELECT * FROM products WHERE category_cid = 'c003';

    -- a.一条sql语句的查询结果,作为另外一条sql语句的查询条件
    SELECT * FROM products WHERE category_cid = (
    SELECT cid FROM category WHERE cname = '化妆品'
    );

    -- b.一条sql语句的查询结果,作为另外一条sql语句的另一张表
    SELECT * FROM (SELECT * FROM category WHERE cname = '化妆品') c,products p WHERE c.cid = p.category_cid;

    -- 查询“化妆品”和“家电”两个分类上架商品详情
    SELECT * FROM (SELECT * FROM category WHERE cname = '化妆品' OR cname = '家电') c,products p
    WHERE c.cid = p.category_cid;

    SELECT * FROM products WHERE category_cid IN (
    SELECT cid FROM category WHERE cname IN ('化妆品','家电')
    );

  • 相关阅读:
    金蝶k3 显示BOS序时簿并返回选中的值
    金蝶K3bos插件操作另一张单据
    H2.64的远程回放--开篇
    监控外网访问的几种方式
    ilbc编解码
    windows系统上安装与使用Android NDK r5 (转)
    安卓与PC网络对接实现视频实时播放
    WDR7500 花生壳问题
    要确保任何一次员工的晋升都符合公司的利益
    关于“部门建设”
  • 原文地址:https://www.cnblogs.com/xiaomingVVV/p/11331671.html
Copyright © 2020-2023  润新知