MySQL基础到进阶

23 阅读7分钟

sql语句的增、删、改、查

  1. 从表中选取数据
SELECT <列名>, 
FROM <表名>;

从表中选取符合条件的数据

SELECT <列名>, ……
FROM <表名>
WHERE <条件表达式>;

比较下面两者输出结果的不同:

-- 用来选取product type列为衣服的记录的SELECT语句
SELECT product_name, product_type
  FROM product
 WHERE product_type = '衣服';
-- 也可以选取出不是查询条件的列(条件列与输出列不同)
SELECT product_name
  FROM product
 WHERE product_type = '衣服';
  • 星号(*)代表全部列的意思。
  • SQL中可以随意使用换行符,不影响语句执行(但不可插入空行)。
  • 设定汉语别名时需要使用双引号(")括起来。
  • 在SELECT语句中使用DISTINCT可以删除重复行。
  • 注释是SQL语句中用来标识说明或者注意事项的部分。分为:
    1行注释"-- "
    和多行注释两种"/* */"。
  1. 算术运算符和比较运算符 SQL语句中可以使用的四则运算的主要运算符如下:
含义运算符
加法+
减法-
乘法*
除法/

示例:

-- 选取出sale_price列为500的记录
SELECT product_name, product_type
  FROM product
 WHERE sale_price = 500;

SQL常见比较运算符如下:

运算符含义
=和 ~ 相等
<>和 ~ 不相等
>=大于等于 ~
>大于 ~
<=小于等于 ~
<小于 ~
  • SELECT子句中可以使用常数或者表达式。
  • 使用比较运算符时一定要注意不等号和等号的位置。
  • 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
  • 希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
-- SQL语句中也可以使用运算表达式
SELECT product_name, sale_price, sale_price * 2 AS "sale_price x2"
  FROM product;
-- WHERE子句的条件表达式中也可以使用计算表达式
SELECT product_name, sale_price, purchase_price
  FROM product
 WHERE sale_price - purchase_price >= 500;
/* 对字符串使用不等号
首先创建chars并插入数据
选取出大于‘2’的SELECT语句*/
-- DDL:创建表
CREATE TABLE chars
(chr CHAR3NOT NULL, 
PRIMARY KEY(chr));
-- 选取出大于'2'的数据的SELECT语句('2'为字符串)
SELECT chr
  FROM chars
 WHERE chr > '2';
-- 选取NULL的记录
SELECT product_name, purchase_price
  FROM product
 WHERE purchase_price IS NULL;
-- 选取不为NULL的记录
SELECT product_name, purchase_price
  FROM product
 WHERE purchase_price IS NOT NULL;
  1. 逻辑运算符
    NOT运算符
SELECT product_name, product_type, sale_price
 FROM product
WHERE sale_price >= 1000;
SELECT product_name, product_type, sale_price
 FROM product
WHERE NOT sale_price >= 1000;

NOT sale_price >= 1000 与 sale_price < 1000 是等价的。虽然通过 NOT 运算符否定一个条件可以得到相反查询条件的结果,但是其可读性明显不如显式指定查询条件,因此,不可滥用该运算符

AND运算符和OR运算符

AND 相当于“并且”,类似数学中的取交集 OR 相当于“或者”,类似数学中的取并集

如果我要查询商品种类为办公用品”并且“登记日期是 2009 年 9 月 11 日或者 2009 年 9 月 20 日

SELECT product_name, product_type, regist_date
  FROM product
 WHERE product_type = '办公用品'
   AND regist_date = '2009-09-11'
    OR regist_date = '2009-09-20';

以上查询结果是错误的--错误的原因是 AND 运算符优先于 OR 运算符 ,想要优先执行OR运算,可以使用括号

SELECT product_name, product_type, regist_date
  FROM product
 WHERE product_type = '办公用品'
   AND ( regist_date = '2009-09-11'
        OR regist_date = '2009-09-20');

运算符优先级请参考下图

image

对表进行聚合查询

  1. 聚合函数
    SQL中用于汇总的函数叫做聚合函数。以下五个是最常用的聚合函数

    • SUM:计算表中某数值列中的合计值
    • AVG:计算表中某数值列中的平均值
    • MAX:计算表中任意列中数据的最大值,包括文本类型和数字类型
    • MIN:计算表中任意列中数据的最小值,包括文本类型和数字类型
    • COUNT:计算表中的记录条数(行数)
  2. 使用 DISTINCT 进行删除重复值的聚合运算
    当对整表进行聚合运算时,表中可能存在多行相同的数据,比如商品类型(product_type 列)。
    在某些场景下,就不能直接使用聚合函数进行聚合运算了,必须搭配 DISTINCT 函数使用。
    比如:要计算总共有几种咖啡类型在售,该怎么计算呢?
    如前所述,DISTINCT 函数用于删除重复数据,应用 COUNT 聚合函数之前,加上 DISTINCT 关键字就可以实现需求。

    SELECT COUNT(DISTINCT product_type)
      FROM product;
    

    聚合函数应用法则

    • COUNT 聚合函数运算结果与参数有关,COUNT(*) / COUNT(1) 得到包含 NULL 值的所有行,COUNT(<列名>) 得到不包含 NULL 值的所有行。
    • 聚合函数不处理包含 NULL 值的行,但是 COUNT(*) 除外。
    • MAX / MIN 函数适用于文本类型和数字类型的列,而 SUM / AVG 函数仅适用于数字类型的列。
    • 在聚合函数的参数中使用 DISTINCT 关键字,可以得到删除重复值的聚合结果。
  3. 对表进行分组
    GROUP BY语句
    当你想将进行分组汇总时(即:将现有的数据按照某列来汇总统计),GROUP BY可以帮助你:

    SELECT <列名1>,<列名2>, <列名3>, ……
      FROM <表名>
     GROUP BY <列名1>, <列名2>, <列名3>, ……;
    

    GROUP BY的子句书写顺序有严格要求,不按要求会导致SQL无法正常执行,目前出现过的子句顺序为:

    1. SELECT ➡️ 2. FROM ➡️ 3. WHERE ➡️ 4. GROUP BY
      其中前三项用于筛选数据,GROUP BY对筛选出的数据进行处理

    在WHERE子句中使用GROUP BY

    SELECT purchase_price, COUNT(*)
      FROM product
     WHERE product_type = '衣服'
     GROUP BY purchase_price;
    
  4. 为聚合结果指定条件
    用 HAVING 得到特定分组
    将表使用 GROUP BY 分组后,怎样才能只取出其中两组?这里 WHERE 不可行,因为,WHERE子句只能指定记录(行)的条件,而不能用来指定组的条件(例如,“数据行数为 2 行”或者“平均值为 500”等)。
    值得注意的是:HAVING 子句必须与 GROUP BY 子句配合使用,且限定的是分组聚合结果,WHERE 子句是限定数据行(包括分组列),二者各司其职,不要混淆。
    HAVING特点:

    -- 常数
       SELECT product_type, COUNT(*)
         FROM product
        GROUP BY product_type
       HAVING COUNT(*) = 2;
    
       -- 错误形式(因为product_name不包含在GROUP BY聚合键中)
       SELECT product_type, COUNT(*)
         FROM product
        GROUP BY product_type
       HAVING product_name = '圆珠笔';
    
  5. 对查询结果进行排序
    ORDER BY
    在某些场景下,需要得到一个排序之后的结果,比如运动员在奥运赛场的得分,组委会用得分倒序结果来判定金银铜牌到底花落谁家。而 SQL 语句执行结果默认随机排列,想要按照顺序排序,需使用 ORDER BY 子句。

    SELECT <列名1>, <列名2>, <列名3>, ……
      FROM <表名>
     ORDER BY <排序基准列1> [ASC, DESC], <排序基准列2> [ASC, DESC], ……
    

    其中,参数 ASC 表示升序排列,DESC 表示降序排列,默认为升序,此时,参数 ASC 可以缺省。

    示例:按照销售价格倒序排列

    -- 降序排列
    SELECT product_id, product_name, sale_price, purchase_price
      FROM product
     ORDER BY sale_price DESC;
    

    如果有多列排序需求,只需在 ORDER BY 子句中依次书写排序列 + 排序参数即可,详见如下代码:

    -- 多个排序键
    SELECT product_id, product_name, sale_price, purchase_price
      FROM product
     ORDER BY sale_price, product_id;
    

    需要特别说明的是:由于 NULL 无法使用比较运算符进行比较,也就是说,无法与文本类型,数字类型,日期类型等进行比较,当排序列存在 NULL 值时,NULL 结果会展示在查询结果的开头或者末尾。

    -- 当用于排序的列名中含有NULL时,NULL会在开头或末尾进行汇总。
    SELECT product_id, product_name, sale_price, purchase_price
      FROM product
     ORDER BY purchase_price;