DQL:查询表中数据

1. 基础查询

  1. 查询整表
    SELECT * FROM 表名; -- 不推荐使用"*",不方便阅读
    
  2. 选择性查询
    SELECT 列名,列名,列名 FROM 表名;
    
  3. 去重查询
    SELECT DISTINCT 列名 FROM 表名;
    
  4. 带多列名的去重查询
    -- 和单列名去重查询区别,要同时满足多个列名组合起来的非独一性才能算重复,两个结果完全一样才算重复
    SELECT DISTINCT 列名,列名 FROM 表名;
    
  5. 计算数值数据
    SELECT 列名,列名,列名 + 列名 FROM 表名; -- 注意,NULL加任何值都为NULL。数值可以加减乘除取余。
    
  6. 带修正的计算数据
    -- 如果遇到指定列中为NULL,那么将NULL设置为指定数据
    SELECT 列名,列名,列名 + IFNULL(列名,指定数据) FROM 表名;
    
  7. 为列名起别名
    SELECT 列名 AS '别名', 列名 AS '别名' FROM 表名; -- AS 是可以用空格来替代
    

2. 条件查询

  1. 比较
    SELECT 列名 FROM 表名 WHERE 列名 > 条件值; -- 查询大于条件值的数据
    SELECT 列名 FROM 表名 WHERE 列名 < 条件值; -- 查询小于条件值的数据
    SELECT 列名 FROM 表名 WHERE 列名 >= 条件值; -- 查询大于等于条件值的数据
    SELECT 列名 FROM 表名 WHERE 列名 <= 条件值; -- 查询小于等于条件值的数据
    SELECT 列名 FROM 表名 WHERE 列名 = 条件值; -- 查询等于条件值的数据
    SELECT 列名 FROM 表名 WHERE 列名 <> 条件值; -- 查询不等于条件值的数据
    SELECT 列名 FROM 表名 WHERE 列名 != 条件值; -- 查询不等于条件值的数据,MySQL特有。
    
  2. 范围
    -- 查询大于等于条件值1~小于等于条件值2的数据
    SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 条件值1 AND 条件值2;
    -- 查询列名和集合中的条件值匹配的数据
    SELECT 列名 FROM 表名 WHERE 列名 IN (条件值1,条件值2);
    
  3. 空值
    -- 查询指定列为NULL的数据。NULL很特殊,不能结合运算符。
    SELECT 列名 FROM 表名 WHERE 列名 IS NULL;
    -- 查询指定列不为NULL的数据。
    SELECT 列名 FROM 表名 WHERE 列名 IS NOT NULL;
    
  4. 逻辑运算符
    SELECT 列名 FROM 表名 WHERE 列名=条件值 AND 列名=条件值; -- 同时符合所有条件的值被查询
    SELECT 列名 FROM 表名 WHERE 列名=条件值 OR 列名=条件值; -- 符合任一条件的值都被查询
    SELECT 列名 FROM 表名 WHERE 列名 NOT IN (条件值1,条件值2); -- 查询除了条件值外任何数据,NOT后面任何条件都取反
    
  5. 模糊查询
    SELECT 列名 FROM 表名 WHERE 列名 LIKE '条件值%'; -- 类似于通配符,"%"代表任意个数字符
    SELECT 列名 FROM 表名 WHERE 列名 LIKE '条件值_'; -- 类似于通配符,"_"代表任意个数字符,这两种排列可以混合放置到任何位置
    


3. 排序查询

  1. 基础排序
    SELECT 列名 FROM 表名 ORDER BY 列名;
    
  2. 指定排列顺序
    -- 组合排序,前面的列名 排序方式优先级高,在相同的条件下,判断下一级的数据优先级
    SELECT 列名 FROM 表名 ORDER BY 列名 排序方式 , 列名 排序方式;
    -- 升序,也是默认的排序方式
    SELECT 列名 FROM 表名 ORDER BY 列名 ASC;
    -- 降序
    SELECT 列名 FROM 表名 ORDER BY 列名 DESC;
    

4. 聚合函数

聚合函数就是将纵向数据作为整体进行运算,给出结果。但是计算时是排除NULL空值的,尽量不要计算包含空值的列,会导致结果与预期偏差。

  1. 无视空值
    SELECT COUNT(列名) FROM 表名; -- 计算一列数据的非空个数
    SELECT MAX(列名) FROM 表名; -- 计算一列数据的非空最大值
    SELECT MIN(列名) FROM 表名; -- 计算一列数据的非空最小值
    SELECT SUM(列名) FROM 表名; -- 计算一列数据的非空数之和
    SELECT AVG(列名) FROM 表名; -- 计算一列数据的非空数平均值
    
  2. 处理空值
    SELECT COUNT(IFNULL(列名,替换值)) FROM 表名; -- 计算一列数据的个数
    

5. 分组查询

分组查询的原理就是将指定的列相同的内容进行分组,然后对分组后的指定数据进行聚合计算。要查询的数据必须要有共性的,否则非共性的数据查询出来是无意义的。

  1. 普通分组
    SELECT 列名,聚合函数(列名)  FROM 表名 GROUP BY 分组列名;
    
  2. 限制分组
    带有数据限定的分组,使用 WHERE 和 HAVING 对结果前后进行处理。
    SELECT 列名,聚合函数(列名)  FROM 表名 WHERE 列名 运算符 条件值
    GROUP BY 分组列名 HAVING 列名/聚合函数(列名) 运算符 条件值;
    
    WHERE 子句是分组前将数据进行处理;HAVING 子句是分组处理后对结果进行处理。
    因为 WHERE 是分组前处理原始数据,故不可处理聚合函数;而 HAVING 两种数据都可以处理。

6. 分页查询

将查询出来的数据分为多组显示,指定每组的开始数据索引和每页显示多少数据完成。
每页开始的索引计算公式是:每页开始索引 = (当前页码 - 1) * 每页显示条数。
第一页开始索引是从 0 开始的,每页开始索引是按照查询出的数据的序号排的。
注意:LIMIT 子句是MySQL的特有语句,其他数据库软件实现分页也有不同的语句。

SELECT 列名 FROM 表名 LIMIT <每页开始索引>,<每页几条数据>;

7. 多表查询

  1. 问题描述
    假设目前有两张表,员工表和部门表。想要查询员工的部门,就需要将两张表结合起来查询。


    如果单纯的用 SELECT * FROM dept,emp; 查询,则会查询出错误的结果。这种结果叫做"笛卡尔积"。

    使用正确的多表查询语句就可以消除查询结果中无用的数据。

  2. 内连接

    1. 隐式内连接
      使用 WHERE 语句,判断两表对应字段的数据匹配来完成查询。
      SELECT 表名.列名 FROM 表名,表名 WHERE 表名.列名 运算符 表名.列名;
      
    2. 显式内连接
      使用 INNER JOIN ON ,显式的匹配合适数据,与 WHERE 效果一样。
      SELECT 表名.列名 FROM 表名 INNER JOIN 表名 ON 表名.列名 运算符 表名.列名;
      
    3. 注意
      要查询的数据在哪些表中;查询的条件是什么;需要那些字段(列)的数据。
  3. 外连接
    外连接为了解决部分数据在内连接时数据不合法的问题。

    1. 左外连接
      查询左表所有数据和右表和左表的交集数据。这个常用,因为左右表的位置调换就可以实现右外连接。
      SELECT 表名.列名 FROM 表名 LEFT OUTER JOIN 表名 ON 表名.列名 运算符 表名.列名;
      
    2. 右外连接
      查询右表所有数据和左表和右表的交集数据。
      SELECT 表名.列名 FROM 表名 RIGHT OUTER JOIN 表名 ON 表名.列名 运算符 表名.列名;
      
  4. 子查询

    1. 基础概念
      SELECT 查询出来的数据可以成为另一个 SELECT 的源数据来进行查询,这个称为嵌套查询,也叫子查询。
      例:查询最高工资的员工和他的全部信息。
    2. 单行单列子查询
      子查询可以作为条件,使用运算符进行判断筛选。
    3. 多行单列子查询
      子查询的结果变得多了起来,但是还是一种属性,可以当作一个集合来使用。
      例如:查询"财务部"和"市场部"的员工信息。
    4. 多行多列子查询
      此时子查询出来的结果就是一张临时表(虚拟表),此时就可以将这个子查询作为一张表进行多表查询。
      注意:要使用临时表中的数据,需要给这个虚拟表起一个别名,方便使用。
      例如:查询入职日期晚于2010-01-01的员工信息和部门。
posted @ 2019-09-08 22:13  苍凉温暖  阅读(232)  评论(0编辑  收藏  举报