MySQL《必知必会》笔记 二

第5章

  • 介绍什么是计算字段, 如何创建计算字段
  • 介绍常用函数以及汇总数据
  • 介绍如何分组数据

1. 计算字段

  • 储存在表中的数据往往是比较基础的, 不适合应用直接使用的
  • 需要用到计算字段来得到应用所需的
  • 计算字段实在运行SELECT语句时创建的


  • 拼接字段: 将两个列拼接成一个列输出: 使用Concat( )函数拼接

    • SELECT Concat( vend_name, '(', vend_county,')') AS vend_title FROM vendors ORDER BY vend_name;
    • Concat()将两个列拼接成一个列
    • AS 表示为新列取名
  • 使用算数操作符: 在sql语句中可以对列进行算术运算(如果可以的话), 支持加减乘除, 同样可以使用别名

2. 常用数据处理函数

  • SQL支持使用函数进行数据处理
  • 不同DBMS之间函数可能不通


  • 常用处理函数:MySQL函数讲解


  • 汇总数据: 一系列MySQL提供的函数, 用于汇总数据, 方便分析和生成报表

    • 栗子1. 确定表中行的数量( 或者满足条件的行的数量 )
    • 栗子2. 获得表中行组的和
    • 栗子3. 找出( 特定条件的 )表列的最大值最小值等等
  • 汇总函数如下:
    • AVG(): 返回( 满足条件的 )某列的平均值
      • AVG()只能用于单个列, 多列平均数需要用多个AVG()函数
      • AVG()函数忽略NULL的行
    • Count(): 返回( 满足条件的 )某列的行数
      • 用法1: COUNT( * ): 统计表中行数, 包括null行
      • 用法2: COUNT( 列名 ):对特定列进行技术, 忽略null
      • ps: DISTINCT不允许用于COUNT(*)
    • Max(): 返回某列的最大值
      • 必须指定列名
    • Min(): 返回某列的最小值
      • 必须指定列名
    • SUM(): 返回某列值之和

3. 分组数据

  • 使用Group By 和 Having字句进行汇总总表内容的子集
  • 看下面这个栗子 : 统计出每个供应商的商品量

    • SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;
    • 上面的SELECT语句指定列出两个列, vend_id表示供应商的id, COUNT(*)建立计算字段, GROUP BY表示按照vend_id来分组数据

  • 使用HAVING来进行分组过滤:

    • HAVING与WHERE意思很接近, 不同的是WHERE 过滤行, HAVING过滤分组
  • 看先这个栗子: 统计订单数大于等于两个的用户id
    • SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >=2

第6章

  • 介绍子查询和如何使用子查询
  • 介绍联结和使用联结组合查询

1.子查询

  • 子查询是指嵌套在查询中的查询
  • 举个栗子:
    1. 检索包含物品TNT2所有订单编号
    2. 检索前一步骤列出的订单编号对应的客户id
    3. 检索出前一步的客户id对应的客户信息
    4. SELECT cust_name, cust_concat
      FROMcustomers
      WHERE cust_id IN
      ( SELECT cust_id FROM orders WHERE order_num IN
      ( SELECT order_num FROM orderitems WHERE prod_id = ' TNT2' )
      );
  • 上述sql执行了3条SELECT, 最里层返回订单号列表, 根据这个订单号次里层返回客户id列表, 最外层根据客户id返回客户信息


  • 使用子查询的另一方法: 创建计算字段

    • 比如需要显示customers中每个客户的订单总数:
    • 先从customers中检索客户列表, 对检索出的每个客户统计其在orders表中额订单数目
    • SELECT cust_name, cust_state
      (SELECT COUNT(*) FROM orders
      WHERE orders.cust_id = customers.cust_id ) AS orders
      FROM customers
      ORDER BY cust_name;
    • 请注意查询有歧义的列名的时候, 务必使用表名+列名

2. 联结和关联查询

  • 考虑两个表:
    • vendors : 储存供应商信息, 每个供应商占一行, 提供一个唯一标识作为主键用以区分
    • products : 存储商品信息, 以及供应商表的主键作为外键
    • 外键: 表中某一列, 包含另一张表的主键值
  • 将数据分解为多张表可以更方便的存储和处理, 用一条SELECT查询出多个表的数据


  • 创建联结: SELECT vend_name, prod_name, pro_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;

  • 笛卡尔积: 如果两个表没有联结关系, 那么将检索出第一个表rows * 第二个表rows数量的行, 包含了不正常的关系
  • 上面的联结方法使用的是等值联结, 基于两个表之间的相等测试, 这种联结也叫做内部联结, 可以用不同的语法来表示:
    • SELECT vend_name, prod_name, pro_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;
    • INNER JOIN左右指定联结的两个表, ON指定联结条件, 与WHERE相同, 使用INNER JOIN…ON可以确保不会忘记联结条件
    • ps: 不建议联结过多的表, 会严重影响性能

3. 高级联结

  • 使用表别名: 表名后+ AS, 方便缩短SQL语句, 允许单条SELECT多次使用相同的表
  • 自联结: 当需要查询的两个表为同一个表的时候, 为表赋不同的表别名, 用以区分不同列对应的表
    • SELECT p1.prod_id, p2.pro_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR;
    • 上面的查询: 查出ID 为 DTNTR的商品 的供应商 生产的其他商品
  • 自然连接: 使用联结的时候必然有至少一个被连接列出现在不同表中, 使用自然联结排除多次出现的列
    • 目前所有建立的内部联结都是自然连接
  • 外部联结: 检索所有客户及其订单:
    • SELECT customers.cust_id, orders.order_num FROM custumers LEFT OUTER JOIN orders ON custumers.cust_id = orders.cust_id;
    • 使用了OUTER JOIN表示外部联结, 需要指定 RIGHT 还是 LEFT, 左右表示选择左右的所有行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值