MySQL SELECT 查询(一):基础查询语句的实现

MySQL SELECT 查询(一):基础查询语句的实现

1. SELECT 结构

1.1 基本语法结构

SELECT 列名1, 列名2, ... FROM 表名;

1.2 常见结构与问题

  • 列的别名

    • 使用空格 + 别名:

      SELECT 12 * salary AS "ANNUAL SALARY"
      FROM employees e;
      
    • 使用 AS 关键字 + 别名:

      SELECT 12 * salary AS annual_salary
      FROM employees e;
      
  • DISTINCT 去重

    • 正确示范:

      SELECT DISTINCT department_id 
      FROM employees e;
      
    • 错误示范:

      SELECT employee_id, DISTINCT department_id 
      FROM employees e;  -- 此处 DISTINCT 使用错误
      
  • NULL值问题

    • NULL 不是 0。
    • NULL 不能参与运算。
  • 着重号 (``)

    • 当列名与关键字冲突时使用。
  • 显示表结构

    DESC employees;
    

2. WHERE 语句

  • 过滤条件

    SELECT *
    FROM employees e 
    WHERE last_name = 'king';
    

    执行时间为最先执行(为第一道筛网)。

2.1 算术运算符

  • 伪表 dual
    SELECT 3 * 4 AS result FROM dual;
    
  • 基本运算符:
    • +, -, *, / (或 DIV)
      • 结果类型为浮点型。
    • % (或 MOD):
      • 结果的符号只与前一个数有关。

2.2 比较运算符

  • 基本(与 NULL 无关):

    • =, <> (或 !=), <, <=, >, >=, <=>(NULL 安全比较)。
  • 与 NULL 有关:

    • IS NULL, IS NOT NULL, ISNULL()

2.3 特殊函数和判断

  • LENGTH() - 判断字符串长度。

  • LEAST() - 返回最小值。

  • GREATEST() - 返回最大值。

  • BETWEEN - 判断在区间内,包含边界:

    SELECT *
    FROM employees e 
    WHERE salary BETWEEN 6000 AND 8000;
    
  • IN (set)NOT IN (set)

    SELECT *
    FROM employees e 
    WHERE salary IN (6000, 7000, 8000);
    

2.4 模糊查询

  • LIKE 用于模糊匹配。

  • % 表示任意字符:

    SELECT *
    FROM employees e 
    WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';
    
  • _ 表示单个字符:

    SELECT *
    FROM employees e 
    WHERE last_name LIKE '_a%';
    
  • 查找字符 _

    SELECT *
    FROM employees e 
    WHERE last_name LIKE '_\_%' ESCAPE '\';
    

    ESCAPE关键字用于指定 LIKE 语句中通配符的替代字符,从而避免匹配特定的字符。

2.5 正则表达式

  • 使用示例:
    SELECT 'shkstart' REGEXP '^shk', 'shkstart' REGEXP 't$'
    FROM dual;
    
    SELECT *
    FROM your_table
    WHERE your_column REGEXP '^a.*b$';
    
    SELECT *
    FROM your_table
    WHERE your_column RLIKE 'ex[^a-zA-Z]*';
    

2.6 逻辑运算符

  • 基本:
    • AND (或 &&), OR (或 ||), NOT (或 !)。

2.7 位运算符

  • 基本运算符:
运算符作用示例
&按位与SELECT A & B
|按位或
~按位取反
^按位异或 (XOR)
>>按位右移
<<按位左移

3. 排序 ORDER BY

  • ORDER BY 关键字

    • ASC 升序(默认):

      SELECT *
      FROM employees e 
      ORDER BY salary;
      
    • DESC 降序:

      SELECT *
      FROM employees e 
      ORDER BY salary DESC;
      
    • ORDER BYWHERE 的顺序:

      • WHERE 要写在 ORDER BY 前,FROM 后:
        SELECT *
        FROM employees e 
        WHERE department_id IN (30, 40, 50)
        ORDER BY salary DESC;
        
    • 连续排序:

      SELECT *
      FROM employees e 
      WHERE department_id IN (30, 40, 50)
      ORDER BY salary DESC, department_id ASC;
      

4. 分组GROUP BY

在 MySQL 中,分组功能通过 GROUP BY 子句实现,它允许用户根据一个或多个列对结果集进行分组。分组通常与聚合函数(如 COUNTSUMAVGMAXMIN 等)结合使用,以汇总各组的数据。

4.1 基本语法

SELECT 列名1, 聚合函数(列名2)
FROM 表名
WHERE 条件
GROUP BY 列名1;
  • 列名1: 用于分组的列,通常是需要汇总的属性。
  • 聚合函数: 用于计算每个组的统计值。例如:
    • COUNT():计算行数。
    • SUM():计算总和。
    • AVG():计算平均值。
    • MAX():找到最大值。
    • MIN():找到最小值。
  • FROM: 指定要查询的表。
  • WHERE: 可选,过滤条件,限制查询的行。
  • GROUP BY: 指定按哪个列进行分组。

4.2 示例

假设有一个 employees 表,结构如下:

employee_idlast_namedepartment_idsalary
1Smith106000
2Johnson207500
3Williams108000
4Brown305000
5Jones209500
  • 查询每个部门的员工数量
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;

结果:

department_idemployee_count
102
202
301

4.3 与聚合函数结合使用

  • 查询每个部门的平均薪水

    SELECT department_id, AVG(salary) AS average_salary
    FROM employees
    GROUP BY department_id;
    

    结果:

    department_idaverage_salary
    107000
    208500
    305000

4.4 多重分组

可以按多个列进行分组。例如,查询每个部门中每个职位的员工数量:

SELECT department_id, job_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, job_id;

4.5 与Having结合

  • 数据

    department_idjob_idemployee_count
    1012
    2022
    3031
  • 查询员工数量大于 1 的部门

    SELECT department_id, COUNT(*) AS employee_count
    FROM employees
    GROUP BY department_id
    HAVING COUNT(*) > 1;
    
  • 结果:

    department_idemployee_count
    102
    202

5. 分页

  • LIMIT

    • 默认偏移量为 0:

      SELECT *
      FROM employees e 
      LIMIT 20, 20;  -- 偏移量,数量
      
    • 有序声明:

      SELECT *
      FROM employees e 
      WHERE department_id IN (50, 60, 70)
      ORDER BY salary
      LIMIT 20, 20;
      
    • 8.0 版本的新特性:

      SELECT *
      FROM employees e 
      LIMIT 20 OFFSET 20;  -- 数量, 偏移量
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值