MySql知识

join 组合两个表

SELECT * FROM A JOIN B a ON A.id = B.user_id;

  • inner join 内连接,返回两个表中都存在的行
  • left join 左连接,返回 A 表中所有的行,即使 B 表中没有对应行
  • right join 右连接,返回 B 表中所有的行,即使 A 表中没有对应行
  • full join 全连接,返回 A 和 B 表中都存在的行,以及 A 表中没有,B 表中有的行,以及 B 表中没有,A 表中有的行

limit 限制返回的行数

SELECT * FROM user LIMIT M, 10;跳过 M 行后返回十条数据
SELECT * FROM user LIMIT 10 OFFSET M

having 过滤分组

1
2
3
4
5
select email from Person
-- group by 会把相同的 email 值归为一组
group by email
-- 返回组里行的数量大于一的邮箱
having count(email) > 1

聚合函数

聚合函数的作用就是就是对有多个名字相同的结果聚合
聚合函数要搭配 group by (字段名) 使用
比如这个按商品名聚合,然后把同名商品的销售额全加在一起作为总的销售额

1
2
3
SELECT product, SUM(amount) AS total_sales
FROM sales
GROUP BY product;

聚合函数

  • count() 统计行数
  • sum() 求和
  • avg() 平均值
  • max() 最大值
  • min() 最小值

配套语法

  • group by() 分组
  • having() 过滤分组
  • distinct() 去重

执行顺序

先 from 再 where 最后 select

1
2
3
4
5
6
7
8
9
10
11
12
-- 所以这一段的逻辑是,先连接两个表把部门的值接进来
-- 然后按查的表,逐个员工对比
-- 如果他的工资与当前对比员工部门最高工资一致就返回
select d.name as Department, e.name as Employee, Salary
from Employee e left join Department d
on e.departmentId = d.id
where salary = (
-- 子查询查询某个部门最高工资
select max(salary)
from Employee
where departmentId = e.departmentId
)

变量声明

语句中只能用常量,不能用表达式

1
2
declare M int;
set M = N-1;

模糊查询

CONCAT()是拼接字符串的函数,本意为连接
SELECT * FROM user WHERE name LIKE CONCAT('%', #{name}, '%')

#{}和${}

  • 绝大部分都用#{}
  • #{}是预编译参数,可以防止 SQL 注入,MyBatis 会把 #{name} 转换成 JDBC 的 ? 占位符
  • ${}直接字符串替换,MyBatis 直接把 ${name} 替换成你传入的值,原样插入 SQL

MySql知识
http://www.981928.xyz/2025/11/17/MySql知识/
作者
981928
发布于
2025年11月17日
许可协议