MySQL day7

    科技2022-07-21  93

    连接查询

    含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

    笛卡尔乘积现象:表1 有m行 ,表2有n行,结果=m*n行

    发生原因:没有有效的连接条件 如何避免:添加有效的连接条件

    分类: 按年代分类: sql92标准 仅仅支持内连接 sql99标准【推荐】 支持内连接+外连接(左外、右外) +交叉连接

    按功能分类: 内连接: 等值连接 非等值连接 自连接 外连接: 左外连接 右外连接 全外连接 交叉连接

    sql92语法 #一、内连接 #一) 等值连接 语法: select 查询列表 from 表名1 别名1,表名2 别名2 … where 等值连接的连接条件 特点: 1、为了解决多表中的字段名重名问题,往往为表起别名,提高语义性 2、表的顺序无要求

    #2、非等值连接

    #3、自连接

    -------sql99语法

    一、内连接

    语法: select 查询列表 from 表名1 别名1 [inner] join 表名2 别名2 (inner可省略) on 连接条件 where 筛选条件 group by分组列表 having 分组后筛选 order by 排序列表

    sql92和sql99的区别: sql99 使用join关键字代替了之前的逗号,并且将连接条件和筛选条件进行了分离,提高阅读性

    #1.等值连接

    #2.非等值连接

    #3.自连接 sql99 多表相连 外连接

    说明:查询结果为主表中所有的记录,如果从表有匹配项,则显示匹配项,如果从表没有匹配项,则显示null

    应用场景: 一般用于查询主表中有但从表没有的记录

    特点: 1、外连接分主从表,两表的顺序不能任意调换 2、左连接的话,左边为主表 右连接的话,右边为主表

    ##就相当于 用连接条件 从主表 去 从表依次每行匹配 匹配不到就全为null 匹配到了 就查到

    语法: select 查询列表

    from 表1 别名 left|right [outer] join 表2 别名 on 连接条件 where 筛选条件

    子查询

    说明: 当一个查询语句中又嵌套了另一个完整的select语句,则被嵌套的select语句称为子查询或内查询 外面的select语句成为主查询或外查询

    分类:

    按子查询出现的位置进行分类: 1、select后面 要求:子查询的结果为单行单列(标量子查询) 2、from后面 要求:子查询的结果可以为多行多列 3、where或having后面 要求:子查询的结果必须为单列 单行子查询 多行子查询 4、exists后面 要求:子查询结果必须为单列(相关子查询)

    按结果集的行列数不同: 标量子查询(结果集只有一行一列) 列子查询(结果集只有一列多行) 行子查询(结果集只有一行多列) 表子查询(结果集一般为多行多列) 特点: 1、子查询放在条件中,要求必须放在条件的右侧 2、子查询一般放在小括号中 3、子查询的执行优先于主查询 4、单行子查询对应了 单行操作符:> < >= <= = <> 多行子查询对应了 多行操作符:any/some all in

    #一、where后面

    #标量子查询

    #案例一:谁的工资比Abel高?

    #列子查询(多行子查询 一列多行)

    #行子查询(结果集一行多列或 多行多列) 注:有条件限制 子查询的where 筛选条件都为 = 或者相同时

    #二、select后面 仅仅支持标量子查询

    #三、from后面 将子查询结果充当一张表,要求必须起别名

    #四、exists后面(相关子查询) 语法: exists(完整的查询语句) 结果: 1或0

    Processed: 0.009, SQL: 8