MySQL笔记------03

本文围绕DQL语言展开,介绍了连接查询,包括笛卡尔乘积及解决办法,按年代分为sql92和sql99并阐述其语法;还讲解了子查询,按出现位置和结果集行列分类并举例;此外,提及分页查询、联合查询的应用场景、语法及特点,最后总结了查询语法。

DQL语言(2)

  • 连接查询
     
     一、含义
      当查询中涉及到了多个表的字段,需要使用多表连接
       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 别名;
       特点:
        类似于笛卡尔乘积

  • 子查询
     
     一、含义
       嵌套在其他语句内部的select语句称为子查询或内查询,
       外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
       外面如果为select语句,则此语句称为外查询或主查询
     
     二、分类
      1、按出现位置
       select后面:
        仅仅支持标量子查询
       from后面:
        表子查询
       where或having后面:
        标量子查询
        列子查询
        行子查询
       exists后面:
        标量子查询
        列子查询
        行子查询
        表子查询
      
      2、按结果集的行列
       标量子查询(单行子查询):结果集为一行一列
       列子查询(多行子查询):结果集为多行一列
       行子查询:结果集为多行多列
       表子查询:结果集为多行多列
     
     三、示例
      where或having后面
       1、标量子查询
        案例:查询最低工资的员工姓名和工资
        ①最低工资
          select min(salary) from employees
        
        ②查询员工的姓名和工资,要求工资=①
         select last_name,salary
         from employees
         where salary=(
          select min(salary) from employees
         );
       
       2、列子查询
        案例:查询所有是领导的员工姓名
         ①查询所有员工的 manager_id
           select manager_id
           from employees
         
         ②查询姓名,employee_id属于①列表的一个
           select last_name
           from employees
           where employee_id in(
            select manager_id
             from employees
           );

  • 分页查询
     
     一、应用场景
      当要查询的条目数太多,一页显示不全
     
      二、语法
      select 查询列表
      from 表
      limit 【offset,】size;
      注意:
      offset代表的是起始的条目索引,默认从0卡死
      size代表的是显示的条目数

      
      公式:
       假如要显示的页数为page,每一页条目数为size
       select 查询列表
       from 表
       limit (page-1)*size,size;

  • 联合查询
     
     一、含义
       union:合并、联合,将多次查询结果合并成一个结果
     
     二、语法
       查询语句1
       union 【all】
       查询语句2
       union 【all】
       …
     
     三、意义
      1、将一条比较复杂的查询语句拆分成多条语句
      2、适用于查询多个表的时候,查询的列基本是一致
     
     四、特点
      1、要求多条查询语句的查询列数必须一致
      2、要求多条查询语句的查询的各列类型、顺序最好一致
      3、union 去重,union all包含重复项

  • 查询总结 
     语法:
      select 查询列表 ⑦
      from 表1 别名 ①
      连接类型 join 表2 ②
      on 连接条件 ③
      where 筛选 ④
      group by 分组列表 ⑤
      having 筛选 ⑥
      order by排序列表 ⑧
      limit 起始条目索引,条目数; ⑨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值