mysql学习实践

这里写目录标题

sql 复制代码
-- 【 等值连接 sql99标准 】
-- 案例1.查询员工名、部门名
SELECT last_name,department_name
from employees e
INNER JOIN departments d
on e.department_id = d.department_id;

-- 案例2.查询名字中包含e的员工名和工种名
SELECT last_name,job_title
from employees e
INNER JOIN jobs j
on e.job_id = j.job_id
WHERE e.last_name LIKE '%e%';

-- 案例3.查询部门个数>3的城市名和部门个数(分组+筛选)
SELECT city,COUNT(*) 部门个数
from departments d
INNER JOIN locations l
ON d.location_id=l.location_id
GROUP BY city
HAVING COUNT(*)>3;

-- 案例4.查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)
SELECT department_name,COUNT(*) 员工个数
FROM employees e
INNER JOIN departments d
ON d.department_id = e.department_id
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) desc;
---------------------------------------------------------------------------------
-- 【 非等值连接 】

---------------------------------------------------------------------------------
-- 【 自连接 】
-- 案例5.查询员工的名字和上级的名字
SELECT e.last_name, m.last_name 上级名字
FROM employees e
JOIN employees m
ON e.`manager_id`= m.`employee_id`;

2、外连接

应用场景:用于查询一个表中有,另一个表没有的记录

特点:

  • 外连接的查询结果为主表中所有记录
    • 如果从表中有和它匹配的,则显示匹配的值
    • 如果从表中没有和它匹配的,则显示null
    • 外连接查询结果=内连接结果+主表中有而从表中没有的记录
  • 左外连接,left join左边的是主表
  • 右外连接,right join右边是主表
  • 左外和右外交换两个表的顺序,可以实现同样的效果
  • 全外连接=内连接的结果+表1中有但表2没有+表2中有但表1没有的
sql 复制代码
-- 1)、左外连接:left【outer】
-- 查询没有男朋友的女生名
 SELECT b.name
 FROM beauty b
 LEFT JOIN boys bo
 ON b.`boyfriend_id` = bo.`id`
 WHERE bo.`id` IS NULL;
 
-- 2)、右外连接:right 【outer】
-- 查询没有男朋友的女生名
SELECT b.name
FROM boys bo
RIGHT JOIN beauty b
ON bo.`id` = b.`boyfriend_id`
WHERE bo.`id` IS NULL

-- 3)、全外连接:full【outer】
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.id;

3、交叉连接:cross

sql 复制代码
 SELECT b.*,bo.*
 FROM beauty b
 CROSS JOIN boys bo;

查找重复数据

查找重复数据的字段值以及重复的次数

SELECT project_code, COUNT(*) AS count

FROM business_order

GROUP BY project_code

HAVING count > 1;

如果你只想查找重复数据,而不需要知道重复的次数,可以简化查询如下

SELECT project_code

FROM order_info

GROUP BY project_code

HAVING COUNT(*) > 1;

根据某个字段查询重复的数据,并取id最大的那条数据(用于商机列表展示)

sql 复制代码
SELECT
	MAX( id ) id,
	project_code
FROM
	business_order 
WHERE
	project_code = 'WZ23080203' 
GROUP BY
	project_code 
-- ORDER BY id DESC;

将逗号分隔的字符串进行切割并统计个数

sql 复制代码
SELECT LENGTH(your_column) - LENGTH(REPLACE(your_column, ',', '')) + 1 AS count
FROM your_table;

这个查询使用了 REPLACE 函数将逗号替换为空字符串,然后计算原始字符串长度与替换后的字符串长度之差,并加上1,从而得到逗号分隔的字符串中的元素个数。

计算某个字段之和大于|等于某个值,更新审核状态

审批人员有两个,auditor = '101,102' 的时候,代表两人均已审核通过,将status更改为审核通过状态

你可以使用UPDATE语句来同时判断 count 等于3的情况,并将 status 字段更改为1。以下是一个示例的MySQL查询:

sql 复制代码
UPDATE your_table
SET status = 1
WHERE LENGTH(your_column) - LENGTH(REPLACE(your_column, ',', '')) + 1 = 3;

根据前端传过来的List,进行更新、插入和删除操作

  1. 首先,从数据库中获取与前端传来的List相关的所有数据。
  2. 遍历前端传来的List,对于每个元素:
    • 如果数据库中存在该元素,执行更新操作。
    • 如果数据库中不存在该元素,执行插入操作。
  3. 遍历数据库中的数据,对于每个元素:
    • 如果该元素不在前端传来的List中,执行删除操作。
java 复制代码
// 前端传过来的List
List<YourObject> frontendList = ...;

// 从数据库中获取相关数据
List<YourObject> dbList = yourDao.getAll();

// 更新数据库中已存在的数据,插入不存在的数据
frontendList.forEach(frontendObj -> {
    boolean found = dbList.stream().anyMatch(dbObj -> dbObj.getId() == frontendObj.getId());
    if (found) {
        // 执行更新操作
        yourDao.update(frontendObj);
    } else {
        // 执行插入操作
        yourDao.insert(frontendObj);
    }
});

// 删除未更新的数据
dbList.forEach(dbObj -> {
    boolean found = frontendList.stream().anyMatch(frontendObj -> frontendObj.getId() == dbObj.getId());
    if (!found) {
        // 执行删除操作
        yourDao.delete(dbObj.getId());
    }
});

使用Lambda表达式可以更简洁地遍历集合并进行条件判断。在上述代码中,我们使用 forEach 方法遍历前端传来的List和数据库中的数据,并使用 stream 方法结合 anyMatch 方法来判断是否存在相应的数据。根据判断结果执行更新、插入和删除操作。

相关推荐
ThisIsClark18 分钟前
【后端面试总结】MySQL主从复制逻辑的技术介绍
mysql·面试·职场和发展
Python之栈1 小时前
【无标题】
数据库·python·mysql
亦世凡华、2 小时前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
White_Mountain12 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
老王笔记12 小时前
GTID下复制问题和解决
mysql
Lojarro13 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
TianyaOAO14 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong14 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
W215515 小时前
Liunx下MySQL:表的约束
数据库·mysql
nbsaas-boot17 小时前
探索 JSON 数据在关系型数据库中的应用:MySQL 与 SQL Server 的对比
数据库·mysql·json