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 方法来判断是否存在相应的数据。根据判断结果执行更新、插入和删除操作。

相关推荐
卡皮巴拉爱吃小蛋糕9 分钟前
MySQL的MVCC【学习笔记】
数据库·笔记·mysql
玄明Hanko18 分钟前
生产环境到底能用Docker部署MySQL吗?
后端·mysql·docker
清流君20 分钟前
【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
数据库·人工智能·笔记·mysql·ue5·数字孪生
邂逅岁月20 分钟前
MySQL表的增删改查初阶(下篇)
数据库·sql·mysql
逾非时2 小时前
MySQL触法器
android·mysql·sqlserver
聪明的墨菲特i2 小时前
SQL进阶知识:九、高级数据类型
xml·数据库·sql·mysql·json·空间数据类型
艺杯羹2 小时前
JDBC 批处理与事务处理:提升数据操作效率与一致性的密钥
数据库·mysql·jdbc·事务处理·批处理数据
珹洺3 小时前
Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互
java·运维·前端·mysql·intellij-idea·jsp
_extraordinary_6 小时前
MySQL 库的操作 -- 增删改查,备份和恢复,系统编码
android·mysql·oracle
mutianhao10246 小时前
SQLAlchemy 2.x 异步查询方法比较
python·mysql·sqlalchemy