前言
作为一名刚开始工作的 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 进行模糊查询
-
查询员工名字中包含字母 'a' 的员工信息:
select * from emp where ename like '%a%'; -
查询员工名字中以 'j' 开头的员工信息:
select * from emp where ename like 'j%'; -
查询员工名字中第二个字母是 'i' 的员工信息:
select * from emp where ename like '_i%'; -
查询员工名字中倒数第二个字母是 'a' 的员工信息:
select * from emp where ename like '%a_'; -
查询所有姓名以 's' 开头的员工:
select * from emp where ename like 's%'; -
查询姓名以 's' 开头的员工:
select * from emp where ename like 's\%';
-
符号说明:
%: 代表任意数量的字符(包括零个字符)_: 代表单个字符\: 用于转义字符,在LIKE查询中匹配反斜杠。
5.2 使用 REGEXP (正则表达式)
-
查询名字中包含字母 'a' 或 'e' 的员工:
select * from emp where ename regexp 'a|e';解释:
'a|e'表示名字中包含字母 'a' 或 'e'。 -
查询名字以 'J' 开头并包含数字的员工:
select * from emp where ename regexp '^J[0-9]';说明:
'^J[0-9]'表示以 'J' 开头,且后面跟着一个数字。 -
查询名字以 '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): 如果expr1为NULL,则返回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中没有出现 ,那么必须使用多行函数