MySQL基础篇(01):经典实用查询案例,总结整理

本文源码:GitHub·点这里 || GitEE·点这里

一、连接查询

图解示意图

1、建表语句

部门和员工关系表:

CREATE TABLE `tb_dept` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键ID‘,
  `deptName` varchar(30) DEFAULT NULL COMMENT ‘部门名称‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
CREATE TABLE `tb_emp` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键ID‘,
  `empName` varchar(20) DEFAULT NULL COMMENT ‘员工名称‘,
  `deptId` int(11) DEFAULT ‘0‘ COMMENT ‘部门ID‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

2、七种连接查询

  • 图1:左外连接
select t1.*,t2.empName,t2.deptId
from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptId;
  • 图2:右外连接
select t1.*,t2.empName,t2.deptId
from tb_dept t1 RIGHT JOIN tb_emp t2 on t1.id=t2.deptId;
  • 图3:内连接
select t1.*,t2.empName,t2.deptId
from tb_dept t1 inner join tb_emp t2 on t1.id=t2.deptId;
  • 图4:左连接

查询tb_dept表特有的地方。

select t1.*,t2.empName,t2.deptId
from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptId
WHERE t2.deptId IS NULL;
  • 图5:右连接

查询tb_emp表特有的地方。

select t1.*,t2.empName,t2.deptId
from tb_dept t1 RIGHT JOIN tb_emp t2 on t1.id=t2.deptId
WHERE t1.id IS NULL;
  • 图6:全连接
select t1.*,t2.empName,t2.deptId
from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptId
UNION
select t1.*,t2.empName,t2.deptId
from tb_dept t1 RIGHT JOIN tb_emp t2 on t1.id=t2.deptId
  • 图7:全不连接

查询两张表互不关联到的数据。

select t1.*,t2.empName,t2.deptId
from tb_dept t1 RIGHT JOIN tb_emp t2 on t1.id=t2.deptId
WHERE t1.id IS NULL
UNION
select t1.*,t2.empName,t2.deptId
from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptId
WHERE t2.deptId IS NULL

二、时间日期查询

1、建表语句

CREATE TABLE `ms_consume` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键ID‘,
  `user_id` int(11) NOT NULL COMMENT ‘用户ID‘,
  `user_name` varchar(20) NOT NULL COMMENT ‘用户名‘,
  `consume_money` decimal(20,2) DEFAULT ‘0.00‘ COMMENT ‘消费金额‘,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT=‘消费表‘;

2、日期统计案例

  • 日期范围内首条数据

场景:产品日常运营活动中,经常见到这样规则:活动时间内,首笔消费满多少,优惠多少。

SELECT * FROM
    (
        SELECT * FROM ms_consume
        WHERE
            create_time
        BETWEEN ‘2019-12-10 00:00:00‘ AND ‘2019-12-18 23:59:59‘
        ORDER BY create_time
    ) t1
GROUP BY t1.user_id ;
  • 日期之间时差

场景:常用的倒计时场景

SELECT t1.*,
       timestampdiff(SECOND,NOW(),t1.create_time) second_diff
FROM ms_consume t1 WHERE t1.id=‘9‘ ;
  • 查询今日数据
-- 方式一
SELECT * FROM ms_consume
WHERE DATE_FORMAT(NOW(),‘%Y-%m-%d‘)=DATE_FORMAT(create_time,‘%Y-%m-%d‘);
-- 方式二
SELECT * FROM ms_consume
WHERE TO_DAYS(now())=TO_DAYS(create_time) ;
  • 时间范围统计

场景:统计近七日内,消费次数大于两次的用户。

SELECT user_id,user_name,COUNT(user_id) userIdSum
FROM ms_consume WHERE create_time>date_sub(NOW(), interval ‘7‘ DAY)
GROUP BY user_id  HAVING userIdSum>1;
  • 日期范围内平均值

场景:指定日期范围内的平均消费,并排序。

SELECT * FROM
    (
        SELECT user_id,user_name,
            AVG(consume_money) avg_money
        FROM ms_consume t
        WHERE t.create_time BETWEEN ‘2019-12-10 00:00:00‘
                            AND ‘2019-12-18 23:59:59‘
        GROUP BY user_id
    ) t1
ORDER BY t1.avg_money DESC;

三、树形表查询

1、建表语句

CREATE TABLE ms_city_sort (
    `id` INT (11) NOT NULL AUTO_INCREMENT COMMENT ‘主键ID‘,
    `city_name` VARCHAR (50) NOT NULL DEFAULT ‘‘ COMMENT ‘城市名称‘,
    `city_code` VARCHAR (50) NOT NULL DEFAULT ‘‘ COMMENT ‘城市编码‘,
    `parent_id` INT (11) NOT NULL DEFAULT ‘0‘ COMMENT ‘父级ID‘,
    `state` INT (11) NOT NULL DEFAULT ‘1‘ COMMENT ‘状态:1启用,2停用‘,
    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间‘,
    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘修改时间‘,
    PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = ‘城市分类管理‘;

2、直接SQL查询

SELECT t1.*, t2.parentName
FROM ms_city_sort t1
LEFT JOIN (
    SELECT
        m1.id,m2.city_name parentName
    FROM
        ms_city_sort m1,ms_city_sort m2
    WHERE m1.parent_id = m2.id
    AND m1.parent_id > 0
) t2 ON t1.id = t2.id;

3、函数查询

  • 查询父级名称
DROP FUNCTION IF EXISTS get_city_parent_name;
CREATE FUNCTION `get_city_parent_name`(pid INT)
RETURNS varchar(50) CHARSET utf8
begin
    declare parentName VARCHAR(50) DEFAULT NULL;
    SELECT city_name FROM ms_city_sort WHERE id=pid into parentName;
    return parentName;
end

SELECT t1.*,get_city_parent_name(t1.parent_id) parentName FROM ms_city_sort t1 ;
  • 查询根节点子级
DROP FUNCTION IF EXISTS get_root_child;
CREATE FUNCTION `get_root_child`(rootId INT)
    RETURNS VARCHAR(1000) CHARSET utf8
    BEGIN
        DECLARE resultIds VARCHAR(500);
        DECLARE nodeId VARCHAR(500);
        SET resultIds = ‘%‘;
        SET nodeId = cast(rootId as CHAR);
        WHILE nodeId IS NOT NULL DO
            SET resultIds = concat(resultIds,‘,‘,nodeId);
            SELECT group_concat(id) INTO nodeId
            FROM ms_city_sort WHERE FIND_IN_SET(parent_id,nodeId)>0;
        END WHILE;
        RETURN resultIds;
END  ;

SELECT * FROM ms_city_sort WHERE FIND_IN_SET(id,get_root_child(5)) ORDER BY id ;

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

原文地址:https://blog.51cto.com/14439672/2461529

时间: 2024-10-11 04:48:56

MySQL基础篇(01):经典实用查询案例,总结整理的相关文章

Java基础篇(01):基本数据类型,核心点整理

本文源码:GitHub·点这里 || GitEE·点这里 一.基本类型 1.基本类型 不使用New创建,声明一个非引用传递的变量,且变量的值直接置于堆栈中,大小不随运行环境变化,效率更高.使用new创建的引用对象存储在堆中. 2.基本信息 基本类型包括如下几种:byte.short.int.long.float.double.boolean.char,可以通过相关方法查看范围大小. public class IntType01 { public static void main(String[]

Javascript DOM 基础篇 01

DOM基础 DOM是什么 答:文件对象模型(Document Object Model,简称DOM),DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构!来自网络 本节了解了下面知识点: DOM节点 childNodes  nodeType 获取子节点 children parentNode 例子:点击链接,隐藏整个li offsetParent 例子:获取元素在页面上的实际位置 DOM节点(2) 首尾子节点 有兼容性问题 firstChild.firstElementChil

mysql基础篇 - SELECT 语句详解

基础篇 - SELECT 语句详解 SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELECT 语句的用法. 二.实验准备 在正式开始本实验内容之前,需要先下载相关数据库表,搭建好一个名为mysql_shiyan 的数据库(有三张表:department,employee,project),并向其中插入数据. 具体操作如下,首先输入命令进入 /home/shiyanlou/Desktop 目录: cd /

[MySQL实战-Mysql基础篇]-mysql架构

1.基本组成 下面是mysql的基本架构示意图  图一 图二 我们可以从图上看出,mysql大体分为两个部分,一个是server层,另一个是引擎层. server层中包含了连接器.查询缓存.分析器.优化器.执行器等,涵盖Mysql的大多数核心服务功能,以及所有的内置函数(如时间.日期.数学.加密等),所有跨存储引擎的功能都在这一层实现,比如存储过程.触发器.视图等. 而存储引擎层负责数据的存储和提取.其架构模式是插件式的,支持InnoDB,MyISAM.Memory等多个存储引擎.现在最常用的存

mysql基础篇 - 数据库及表的修改和删除

基础篇 - 数据库及表的修改和删除 修改和删除 一.实验简介 本节实验中,我们将学习并实践如何对数据库的内容做修改,删除,重命名等操作. 二.实验准备 在正式开始本实验内容之前,需要先下载相关代码. 该代码可以新建两个数据库,分别名为 test_01 和mysql_shiyan ,并在 mysql_shiyan 数据库中建 4 个表(department,employee,project,table_1),然后向其中插入数据. 具体操作如下,首先输入命令进入 /home/shiyanlou/De

mysql 基础篇5(mysql语法---数据)

6 增删改数据 -- ********一.增删改数据********* --- -- 1.1 增加数据 -- 插入所有字段.一定依次按顺序插入 INSERT INTO student VALUES(1,'张三','男',20); -- 注意不能少或多字段值 -- INSERT INTO student VALUES(2,'李四','女'); -- 插入部分字段 INSERT INTO student(id,NAME) VALUES(2,'李四'); -- 1.2 修改数据 -- 修改所有数据(建

MySQL基础篇(06):事务管理,锁机制案例详解

本文源码:GitHub·点这里 || GitEE·点这里 一.锁概念简介 1.基础描述 锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题.锁机制是一个非常大的模块,贯彻MySQL的几大核心难点模块:索引,锁机制,事务.这里是基于MySQL5.6演示的几种典型场景,对面MySQL这几块问题时,有分析流程和思路是比较关键的.在MySQL中常见这些锁概念:共享读锁.排它写锁 ; 表锁.行锁.间隙锁. 2.存储引擎和锁 MyISAM引擎:基于读写两种模式,支持表级锁 ; Inn

mysql 基础篇-数据查询(1)

一.查询数据的概念:查询数据.筛选数据.确定数据的以什么样的格式输出. 二.数据查询的基本语句 1.基本语句格式 :select 字段列表  FROM 表或者视图  where 查询条件 2.1 单表查询的内容:查询所有字段.查询指定字段.查询指定记录.查询空值.多条件的查询 对查询结果进行排序. 2.1.1  查询所有字段,通过* 通配符来实现. SELECT * FROM fruits:(*代表所有的表中的字段,fruits是表名) 数据返回的时候按照定义表时候的顺序显示的. 一般不推荐使用

sql语句复习(基础-提升-技巧-经典数据开发案例-sql server配置)

1 基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'--- 开始 备份BACKUP DATABASE pubs TO testBack 4.说明:创建新表 cre