MySQL 数据库操作总结

146 阅读6分钟

前言

作为一名刚开始工作的 Java 开发者,我在项目中频繁与 MySQL 数据库打交道,快速掌握 SQL 基本操作是提高工作效率的关键。

本文总结了常见的 MySQL 操作,包括数据库与表的管理、数据查询、常用函数与运算符等,目的是帮助像我一样的初级开发者快速上手 MySQL,更高效地处理数据库相关任务。


1. 数据库操作

  • 查看所有数据库:

    show databases;
    
  • 使用指定数据库:

    use 库名;
    
  • 创建数据库:

    create database 数据库名;
    
  • 删除数据库 (注意大小写):

    drop database 库名;
    

2. 表操作

  • 创建表:

    create table 表名 (
        字段名 字段类型,
        字段名 字段类型,
        字段名 字段类型
    );
    
  • 创建带约束的表

    • 常用约束

      • not null: 字段不能为空
      • default: 默认值
      • primary key: 主键约束
      • auto_increment: 自增长字段(通常用于主键)
      • unique: 唯一约束,可以为 null
    • 示例: 创建一个带有自增长主键、唯一、默认值等约束的表:

    create table t_user (
        id int auto_increment primary key,      -- 主键字段自增长
        name varchar(16) unique,                -- 姓名字段唯一
        age int default 20,                     -- 年龄字段默认为20
        gender char not null default 'f'        -- 性别字段不为空,默认为 'f'
    );
    
  • 查看表:

    show tables;
    
  • 删除表:

    drop table 表名;
    

3. 数据操作

  • 删除某些数据:

    delete from 表名 where 条件;
    
  • 复制表结构及数据到新表:

    create table 新表 select * from 旧表;
    
  • 插入数据:

    • 插入指定字段的数据:

      insert into 表名 (字段A, 字段B, ...) values (值A, 值B, ...);
      
    • 插入所有字段的数据:

      insert into 表名 values (值A, 值B, ...);
      
    • 一次性插入多条数据:

      insert into 表名 values (值A, 值B, ...), (值C, 值D, ...), ...;
      
  • 更新数据:

    update 表名 set 字段 = 新值 where 条件;
    

4. 查询操作

  • 查询所有字段的数据:

    select * from 表名;
    
  • 查询特定字段的数据:

    select 字段1, 字段2 from 表名;
    
  • 根据条件查询数据:

    select * from 表名 where 条件;
    
  • 运算符

    • =: 等于
    • <>!=: 不等于
    • <, <=, >, >=: 比较大小
    • between...and...: 范围(包括边界值)
    • is null: 是否为空
    • and, or: 逻辑运算
    • in: 包含
    • not: 取非
    • like: 模糊匹配

5. 模糊查询

5.1 使用 LIKE 进行模糊查询

  1. 查询员工名字中包含字母 'a' 的员工信息:

    select * from emp where ename like '%a%';
    
  2. 查询员工名字中以 'j' 开头的员工信息:

    select * from emp where ename like 'j%';
    
  3. 查询员工名字中第二个字母是 'i' 的员工信息:

    select * from emp where ename like '_i%';
    
  4. 查询员工名字中倒数第二个字母是 'a' 的员工信息:

    select * from emp where ename like '%a_';
    
  5. 查询所有姓名以 's' 开头的员工:

    select * from emp where ename like 's%';
    
  6. 查询姓名以 's' 开头的员工:

    select * from emp where ename like 's\%';
    
  • 符号说明:

    • %: 代表任意数量的字符(包括零个字符)
    • _: 代表单个字符
    • \: 用于转义字符,在 LIKE 查询中匹配反斜杠。

5.2 使用 REGEXP (正则表达式)

  1. 查询名字中包含字母 'a' 或 'e' 的员工:

    select * from emp where ename regexp 'a|e';
    

    解释:'a|e' 表示名字中包含字母 'a' 或 'e'。

  2. 查询名字以 'J' 开头并包含数字的员工:

    select * from emp where ename regexp '^J[0-9]';
    

    说明:'^J[0-9]' 表示以 'J' 开头,且后面跟着一个数字。

  3. 查询名字以 'a' 开头,且后面是两个字符的员工:

    select * from emp where ename regexp '^a..';
    

    说明:'^a..' 表示名字以 'a' 开头,后面有两个字符。

  • REGEXP 的常用正则表达式符号:

正则符号说明示例
^匹配字符串开头^abc 匹配以 "abc" 开头的字符串
$匹配字符串结尾abc$ 匹配以 "abc" 结尾的字符串
.匹配任意单个字符a.c 匹配 "abc", "axc" 等
*匹配零个或多个字符a.*b 匹配以 "a" 开头,"b" 结尾的字符串
[]匹配字符范围a[bcd] 匹配 "ab", "ac", "ad"
+匹配一个或多个字符a+b 匹配 "ab", "aab", "aaab" 等

6. 函数操作

MySQL 提供了多种用于处理数据的函数,通常分为 单行函数多行函数。这些函数用于字符串处理、数学运算、日期处理等操作。下面是一些常用的函数及其解释和示例。

6.1 单行函数 (针对每一行数据的操作)

  • lower(str) : 将字符串 str 转换为小写字母。

    select lower('Hello World');
    -- 输出: hello world
    
  • upper(str) : 将字符串 str 转换为大写字母。

    select upper('Hello World');
    -- 输出: HELLO WORLD
    
  • substr(str, start, length) : 从字符串 str 中截取从 start 开始,长度为 length 的子串。

    select substr('Hello World', 1, 5);
    -- 输出: Hello
    
  • length(str) : 返回字符串 str 的长度(即字符数)。

    select length('Hello World');
    -- 输出: 11
    
  • trim(str) : 去除字符串 str 开头和结尾的空格。

    select trim('   Hello World   ');
    -- 输出: Hello World
    
  • round(x, d) : 将数字 x 四舍五入到小数点后 d 位。

    select round(123.4567, 2);
    -- 输出: 123.46
    
  • rand() : 生成一个 0 到 1 之间的随机浮动数。

    select rand();
    -- 输出: 0.1234567  (每次输出不同)
    
  • abs(x) : 返回 x 的绝对值。

    select abs(-5);
    -- 输出: 5
    
  • ifnull(expr1, expr2) : 如果 expr1NULL,则返回 expr2,否则返回 expr1

    select ifnull(null, 'default value');
    -- 输出: default value
    
  • concat(str1, str2, ...) : 将多个字符串连接成一个字符串。

    select concat('Hello', ' ', 'World');
    
-- 输出: Hello World
```
  • pi() : 返回圆周率的值。

    select pi();
    -- 输出: 3.14159265358979
    
  • date_format(date, format) : 将 date 按指定的 format 格式化为字符串。

    select date_format(now(), '%Y-%m-%d %H:%i:%s');
    -- 输出: 2024-12-29 15:45:23  (当前时间)
    

6.2 多行函数 (针对多个行数据的操作)

  • avg(expr) : 计算某个字段的平均值。

    select avg(salary) from employees;
    -- 输出: 5000  (返回所有员工的平均薪资)
    
  • min(expr) : 返回某个字段的最小值。

    select min(age) from employees;
    -- 输出: 22  (返回员工中最小的年龄)
    
  • max(expr) : 返回某个字段的最大值。

    select max(age) from employees;
    -- 输出: 60  (返回员工中最大的年龄)
    
  • sum(expr) : 计算某个字段的总和。

    select sum(salary) from employees;
    -- 输出: 150000  (返回所有员工的薪资总和)
    
  • count(expr) : 计算某个字段或记录的数量。

    select count(*) from employees;
    -- 输出: 100  (返回员工总数)
    

6.3 其他常见函数

  • now() : 获取当前的系统日期和时间。

    select now();
    -- 输出: 当前的日期和时间 (例如: 2024-12-29 16:51:37)
    
  • date_add(date, INTERVAL expr unit) : 对日期进行加法运算。

    select date_add('2024-12-29', interval 10 day);
    -- 输出: 2025-01-08
    
  • date_sub(date, INTERVAL expr unit) : 对日期进行减法运算。

    select date_sub('2024-12-29', interval 10 day);
    -- 输出: 2024-12-19
    

7. 分组查询

  • 分组查询 (group by) :

    使用 group by 对数据进行分组,并使用聚合函数处理每组数据。

    例子: 计算每个部门的平均薪资,并筛选出平均薪资大于 3500 的部门:

    select deptno, avg(sal) from emp
    where deptno in (1,2)
    group by deptno
    having avg(sal) > 3500;
    

    注意:

    • where 子句必须位于 group by 之前
    • having 子句位于 group by 之后,通常用于过滤聚合结果
    • 如果 select 后面出现的字段在group by中没有出现 ,那么必须使用多行函数