MySQL基础篇(01):经典实用查询案例,总结整理
发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,本文源码:GitHub·点这里 || GitEE·点这里一、连接查询图解示意图1、建表语句部门和员工关系表:CREATE TABLE `tb_dept` ( `id` int(11) NOT NUL
千家信息网最后更新 2024年11月23日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.deptIdWHERE 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.deptIdWHERE t1.id IS NULL;
- 图6:全连接
select t1.*,t2.empName,t2.deptId from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptIdUNIONselect 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.deptIdWHERE t1.id IS NULLUNIONselect t1.*,t2.empName,t2.deptId from tb_dept t1 LEFT JOIN tb_emp t2 on t1.id=t2.deptIdWHERE 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 ) t1GROUP 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 ) t1ORDER 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.parentNameFROM ms_city_sort t1LEFT 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 utf8begin declare parentName VARCHAR(50) DEFAULT NULL; SELECT city_name FROM ms_city_sort WHERE id=pid into parentName; return parentName;endSELECT 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-baseGitEE·地址https://gitee.com/cicadasmile/mysql-data-base
查询
日期
时间
场景
消费
名称
范围
地址
城市
用户
语句
部门
统计
员工
地方
数据
方式
活动
案例
倒计时
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
电话呼叫中心软件开发
厦门睿路达互联网科技公司
重庆服务器电源出售
工业园区电子网络技术怎么样
数据库基础试卷与答案
华中科技大学毕业互联网名人
网络安全与信息化专业可以考研
万方数据库期刊论文能在线阅读吗
软件开发多少
苏州个人软件开发管理方法
pc服务器是什么东西
电力监控系统网络安全反事故演习
wpf一般用哪种数据库
vs2010 自带数据库吗
梦幻西游 服务器列表
青云数据库
应急处理和网络安全研判会
db2数据库查看配置
文档数据库支持的文档类型
mac微信出现数据库异常
网络技术人员的级别
职员数据库储存函数
网络安全靠人民活动
文件加密服务器
唐山app软件开发外包
wbs软件开发模板案例
数据库与软件服务工程
网页选择服务器有用吗
数据库外键语句是什么
禅道数据库配置