MySQL必知必会阅读笔记

590 阅读3分钟

检索数据

  • 检索单个列
    • SELECT prod_name FROM products;
    • 使用完全限定的表名,表名也可以通过database.products的方式: SELECT products.vend_id FROM products;
  • 检索多个列 SELECT prod_name,vend_id FROM products;
  • 检索所有列 SELECT * FROM products;
  • 检索去重使用distinct: SELECT DISTINCT vend_id FROM products;
  • 限制查询行数使用limit
    • 返回不多于5行: SELECT vend_id FROM products LIMIT 5;
    • 返回第2行开始的3行(初始行为0):
      • SELECT DISTINCT vend_id FROM products LIMIT 2,3
      • SELECT DISTINCT vend_id FROM products LIMIT 3 OFFSET 2;

排序检索

升序ASC(ASC可不用,默认是升序的)

  • 单个列排序 SELECT prod_name FROM products ORDER BY prod_name;
  • 多个列排序,先按名字再按id排序 SELECT prod_name,prod_price,prod_id FROM products ORDER BY prod_name,prod_id;

降序DESC

  • 单个列降序 SELECT prod_name,prod_id FROM products ORDER BY prod_id DESC;
  • 多个列降序DESC关键字只应用到直接位于其前面的列名 SELECT prod_name,prod_id FROM products ORDER BY prod_id DESC,prod_name;

过滤

简单的WHERE过滤

  • SELECT prod_name,prod_price FROM products WHERE prod_price=2.5;
  • 不等于
    • <>: SELECT prod_price FROM products WHERE prod_price<>2.5;
    • !=: SELECT prod_price FROM products WHERE prod_price!=2.5;
  • BETWEEN两个值之间 SELECT prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
  • IS NULL空值检查 IS NULL:SELECT cust_id FROM customers WHERE cust_email IS NULL;

组合WHERE过滤

  • WHERE计算次序:先处理AND再处理OR
  • AND SELECT prod_id,prod_price FROM products WHERE vend_id=1003 AND prod_price<=10;
  • OR SELECT prod_id,prod_price FROM products WHERE vend_id=1003 OR prod_price<=10;
  • IN
    • SELECT prod_id,prod_price FROM products WHERE prod_price IN (5.99,9.99,10);
    • IN可以包含其他select语句
    • IN操作符比OR操作符清单执行更快
  • NOT操作符 SELECT prod_id,prod_price FROM products WHERE prod_price NOT IN (5.99,9.99,10);

通配符过滤LIKE:用操作符替代未知字符查找信息

  • %通配符:任何字符出现任意次数,不能匹配NULL
    • 以jet开始 SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'jet%';
    • 以jet结尾 SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '%jet';
    • 以包含jet字段 SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '%jet%';
  • _通配符:单个字符 SELECT prod_name FROM products WHERE prod_name LIKE '_etPack 1000';
  • 通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长

正则表达式REGEXP:找出满足某种条件的信息

  • . 匹配任意一个字符 SELECT prod_id,prod_name FROM products WHERE prod_name REGEXP '.etPack 1000';

  • 因为REGEXP匹配不区分大小写,如果希望按大小写查找,使用BINARY关键字:SELECT prod_name FROM products WHERE prod_name REGEXP BINARY '.etPack 1000';

  • |:or 匹配 SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000';

  • 匹配几个字符之一 SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton';

  • []中使用^:[^123]匹配除1,2,3外的任何东西

  • 匹配范围:[1-9],[b-h]

  • 匹配特殊字符如.,_,需要加转义\\

  • 匹配多个实例:重复元字符

    元 字 符 说 明
    * 0个或多个匹配
    + 1个或多个匹配(等于{1,})
    ? 0个或1个匹配(等于{0,1})
    {n} 指定数目的匹配
    {n,} 不少于指定数目的匹配
    {n,m} 匹配数目的范围( m不超过255)
  • 定位符:^:文本的开始,$:文本的结尾

创建计算字段

  • 拼接字段,使用concat拼接 SELECT CONCAT (prod_name,'(',prod_id,')') FROM products;
  • 使用别名做表头,用AS关键字 SELECT CONCAT (prod_name,'(',prod_id,')') AS vend FROM products;
  • 算术计算,如果需要其他列执行算术计算得到新的列 SELECT quantity*item_price AS vend FROM orderitems;

数据处理函数

  • 文本处理函数:
    • 删除左右多余的空格: RTrim,LTrim,Trim
    • 文本转为大写或小写: Upper,Lower
    • 串左边或右边的字符: Left,Right
  • 日期处理函数
  • 数值处理函数

汇总

  • 聚集函数:AVG,COUNT,MAX,MIN,SUM
  • 聚集不同值 SELECT AVG(DISTINCT prod_price) AS avg_price FROM products;

分组GROUP BY

  • 数据分组 SELECT vend_id,COUNT(*)AS num_prods FROM products GROUP BY vend_id;
  • 过滤分组 HAVING SELECT vend_id,COUNT(*)AS num_prods FROM products GROUP BY vend_id HAVING num_prods >0;
  • SELECT子句顺序 SELECT > FROM > WHERE > GROUP BY > HAVING > ORDER BY > LIMIT