SQL Tips汇集及常见问题

news2024/11/24 7:40:53

SQL Tips汇集及常见问题

表与数据

-- 创建并初始化部门表

DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`  (
  `deptno` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '部门编号',
  `dname` varchar(15) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '部门名称',
  `loc` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '部门所在位置',
  PRIMARY KEY (`deptno`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 41 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (1, '张三', '{\"dname\": \"销售部\", \"dno\": \"1\", \"dmanagerId\": \"3\"}');
INSERT INTO `dept` VALUES (2, '李四', '{\"dname\": \"财务部\", \"deptno\": \"2\", \"dmanagerId\": \"4\"}');
INSERT INTO `dept` VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES (40, 'OPERATIONS', 'BOSTON');

-- 创建并初始化员工表
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp`  (
  `empno` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '雇员编号',
  `ename` varchar(15) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '雇员对应的领导的编号',
  `hiredate` date NULL DEFAULT NULL COMMENT '雇员的雇佣日期',
  `sal` decimal(7, 2) NULL DEFAULT NULL COMMENT '雇员的基本工资',
  `comm` decimal(7, 2) NULL DEFAULT NULL COMMENT '奖金',
  `deptno` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '所在部门',
  PRIMARY KEY (`empno`) USING BTREE,
  INDEX `deptno`(`deptno`) USING BTREE,
  CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 7935 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '雇员表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20);
INSERT INTO `emp` VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30);
INSERT INTO `emp` VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30);
INSERT INTO `emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20);
INSERT INTO `emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30);
INSERT INTO `emp` VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30);
INSERT INTO `emp` VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10);
INSERT INTO `emp` VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-07-13', 3000.00, NULL, 20);
INSERT INTO `emp` VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10);
INSERT INTO `emp` VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30);
INSERT INTO `emp` VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-07-13', 1100.00, NULL, 20);
INSERT INTO `emp` VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30);
INSERT INTO `emp` VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20);
INSERT INTO `emp` VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10);

LEFT JOIN与WHERE及On Clause

    SELECT A.* ,B.*
    FROM dept A
    LEFT JOIN emp B
    ON A.deptno = B.deptno  AND mgr = 7839

-- 等同于如下写法:

    SELECT A.* ,B.*
    FROM dept A
    LEFT JOIN
        (SELECT *
            FROM emp B WHERE  mgr = 7839
        )B
    ON A.deptno = B.deptno

即先通过B表(emp)按照mgr=7839筛选出一批deptno,然后再以A表(dept)为主表通过dept进行关联出最终结果。

deptno

dname

loc

empno

ename

job

mgr

hiredate

sal

comm

deptno(1)

1

张三

{"dname": "销售部", "dno": "1", "dmanagerId": "3"}

2

李四

{"dname": "财务部", "deptno": "2", "dmanagerId": "4"}

10

ACCOUNTING

NEW YORK

20

RESEARCH

DALLAS

30

SALES

CHICAGO

7499

ALLEN

SALESMAN

7698

1981-02-20

1600.00

300.00

30

30

SALES

CHICAGO

7521

WARD

SALESMAN

7698

1981-02-22

1250.00

500.00

30

30

SALES

CHICAGO

7654

MARTIN

SALESMAN

7698

1981-09-28

1250.00

1400.00

30

30

SALES

CHICAGO

7844

TURNER

SALESMAN

7698

1981-09-08

1500.00

0.00

30

30

SALES

CHICAGO

7900

JAMES

CLERK

7698

1981-12-03

950.00

30

40

OPERATIONS

BOSTON

而如果是想仅取A和B表关联后mgr=7839的记录,则需要在WHERE Clause后写条件,及如下形式:

SELECT A.* ,B.*
    FROM dept A
    LEFT JOIN emp B
    ON A.deptno = B.deptno 
    WHERE   mgr = 7698

deptno

dname

loc

empno

ename

job

mgr

hiredate

sal

comm

deptno(1)

30

SALES

CHICAGO

7499

ALLEN

SALESMAN

7698

1981-02-20

1600.00

300.00

30

30

SALES

CHICAGO

7521

WARD

SALESMAN

7698

1981-02-22

1250.00

500.00

30

30

SALES

CHICAGO

7654

MARTIN

SALESMAN

7698

1981-09-28

1250.00

1400.00

30

30

SALES

CHICAGO

7844

TURNER

SALESMAN

7698

1981-09-08

1500.00

0.00

30

30

SALES

CHICAGO

7900

JAMES

CLERK

7698

1981-12-03

950.00

30

:在inner join(一般缩写为join)时在ON clause后写条件和where后结果是一致的。

    SELECT A.* ,B.*
    FROM dept A
    INNER JOIN emp B
    ON A.deptno = B.deptno
    WHERE   mgr = 7839

 -- 结果等同于:
SELECT A.* ,B.*
    FROM dept A
    INNER JOIN emp B
    ON A.deptno = B.deptno  AND mgr = 7839

低版本mysql实现row_number

低版本mysql(如5.7)系统没有内置的窗口分析函数,比如ROW_NUMBER,需要手动实现。

select empno,deptno,sal,rank from (
  select heyf_tmp.empno,heyf_tmp.deptno,heyf_tmp.sal,@rownum := @rownum+1 ,
  if(@pdept= heyf_tmp.deptno,@rank:=@rank +1, @rank:= 1) as rank,
  @pdept:=heyf_tmp.deptno
  from (
  select empno,deptno,sal from emp order by deptno asc ,sal desc
  ) heyf_tmp ,
  (select @rownum:=0 , @pdept:= null ,@rank:= 0) a
) result

order by deptno,rank;

empno

deptno

sal

rank

7839

10

5000.00

1

7782

10

2450.00

2

7934

10

1300.00

3

7788

20

3000.00

1

7902

20

3000.00

2

7566

20

2975.00

3

7876

20

1100.00

4

7369

20

800.00

5

7698

30

2850.00

1

7499

30

1600.00

2

7844

30

1500.00

3

7521

30

1250.00

4

7654

30

1250.00

5

7900

30

950.00

6

CASE WHEN分区间统计

SELECT CASE WHEN sal > 0 AND sal <= 2000 THEN 'level1'
            WHEN sal > 2000 AND sal <= 4000 THEN 'level2'
            ELSE 'leve13' END level_name,COUNT(DISTINCT empno) emp_num,SUM(sal) sum_sal
            FROM emp

GROUP BY
CASE WHEN sal > 0 AND sal <= 2000 THEN 'level1'
            WHEN sal > 2000 AND sal <= 4000 THEN 'level2'
            ELSE 'leve13' END
            ORDER BY level_name

level_name

emp_num

sum_sal

leve13

1

5000.00

level1

8

9750.00

level2

5

14275.00

NULL值不参与聚合函数的计算

-- 对comm字段求平均值
SELECT AVG(comm),(300+500+1400+0)/4
FROM emp
-- 这里不难发现,comm为NULL的不参与AVG聚合计算,即仅有值的参与计算,具体为:
-- (300+500+1400+0)/4

-- 写法等价于如下:
SELECT SUM(comm)/COUNT(1) avg_value
FROM emp WHERE comm IS NOT NULL

NULL值与GREATEST、LEAST的使用

-- 计算所有部门累计工资里的最大值,注意没有部门40。

SELECT
GREATEST(
SUM( CASE WHEN deptno = 10 THEN sal ELSE NULL END) ,
SUM( CASE WHEN deptno = 20 THEN sal ELSE NULL END) ,
SUM( CASE WHEN deptno = 30 THEN sal ELSE NULL END),
SUM( CASE WHEN deptno = 40 THEN sal ELSE NULL END)
) max_value
FROM emp

max_value

查不到的数据返回默认值

-- 查找员工号为10000的工资,如果查不到则返回为0。

SELECT IFNULL(MAX(sal),0)
FROM emp
WHERE empno = 10000

sal

0.00

统计连续字段的个数

-- 统计连续月份的最大值,注意给出的月份数据必须持续递增的且不能重复。
SELECT MAX(cnt) max_val
FROM
(
SELECT datediff,COUNT(1) cnt
FROM
(

           SELECT seq,order_date,DATE_ADD(order_date,interval -seq month) datediff FROM
           (
           SELECT 1 seq,'2023-03-01' order_date UNION ALL
           SELECT 2 seq,'2023-04-01' order_date UNION ALL
           SELECT 3 seq,'2023-05-01' order_date UNION ALL
           SELECT 4 seq,'2023-07-01' order_date UNION ALL
           SELECT 5 seq,'2023-08-01' order_date UNION ALL
           SELECT 6 seq,'2023-10-01' order_date UNION ALL
           SELECT 7 seq,'2023-12-01' order_date
           -- UNION ALL SELECT 8 seq,'2023-12-01' order_date  注意这种脏数据需过滤掉
           ) A
)B        
GROUP BY datediff
)C

max_val

3

空、空字符串及NA值

1、查不到数据时,显示为N/A,但结果并不是NULL。

注意:这里的IFNULL(NULL,’Seeme’)并未执行。

2、能查到数据时IFNULL(NULL,’Seeme’)可以执行

3、能查到数据和查不到数据取UNION ALL时结果显然是查到的数据。

SELECT deptno,IFNULL(deptno,'Seeme'),IFNULL(NULL,'Seeme')
FROM dept WHERE deptno = 50
UNION ALL
SELECT deptno,IFNULL(deptno,'Seeme'),IFNULL(NULL,'Seeme')
FROM dept WHERE deptno = 40

4、同理通过length函数,我们可以看出空字符串、空及N/A的区别

空及空字符串的length分别为NULL及0

5、如果想从N/A里查出NULL,可以用如下的写法:

注:该情况仅支持查一个字段。

连接时用ON 1= 1

在拼接宽表的单个指标时可以通过表关联ON 1= 1,这种方式主要是用于数据的拼接。

比如将A结果集的dname和B结果集里的sal合并出两列。

SELECT A.dname,B.sal
FROM
           (SELECT dname FROM  dept WHERE deptno = 1
           ) A
LEFT JOIN
           (
           SELECT sal FROM emp WHERE empno = 7369
           )B
ON 1= 1

dname

sal

张三

800.00

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯青少组python:第十三届省赛第二场

选择题 1、十进制 55 55 55转换为十六进制是() A、 1101111 1101111 1101111 B、 313 313 313 C、 37 37 37 D、 67 67 67 2、下列关于函数的说法正确是&#xff08;&#xff09; A、函数的定义必须的程序的开头 B、函数定义后&#xff0c;其中的程序就可以自动运行 C、函数定…

如何让技术架构师具有预知未来业务发展的能力

大家好&#xff0c;今天我们来分享业务架构&#xff0c;但是我们并不是以产品经理角度讲述一个业务架构是什么以及如何做&#xff1f;而是以一个技术架构师的角度&#xff0c;讲述如何承接业务架构或在没有业务架构的时候&#xff0c;如何判断业务变化趋势而对系统架构提前做出…

【Linux】2.4 使用 git 命令行

git git —— 一个版本管理的工具。 &#xff08;gitee/github 底层都是git&#xff0c;只是不同的网页化的结果&#xff09; 有否&#xff1f;&#xff1a;查看是否有git——git --version [RoundBottleVM-12-2-centos ~]$ git --version git version 1.8.3.1安装&#xff…

排查java进程被linux杀掉

1、查找进程 通过jps -l查找相关的进程发现进程已经不存在 2、查看服务日志 查看服务日志后&#xff0c;发现凌晨4点53并未产生相关的错误日志导致程序出现OOM&#xff0c;此时进行进一步分析&#xff0c;是否是linux杀掉了进程 3、查看linux系统日志 通过less /var/logs/me…

超越大数据的边界:Apache Flink实战解析【上进小菜猪大数据系列】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。欢迎订阅专栏 Apache Flink是一种快速、可靠、可扩展的开源流处理框架&#xff0c;被广泛应用于大数据领域。本文将介绍Apache Flink的实战运用&#xff0c;包括其核心概念、架构设…

Redis学习---04

一、Redis.conf配置文件 (1) units&#xff1a;对于大小写不敏感 导入 绑定ip和端口&#xff1a; (2) 通用&#xff1a; 以守护进程开启&#xff0c;默认为no 进程文件&#xff1a; 日志&#xff1a; 数据库的数量&#xff1a;是16个 是否显示logo&#xff1a; (3) 快照&…

探究ChatGPT与GPT-4的缺陷不足,揭示大预言LLM模型的局限性——没有完美的工具

目录 ChatGPT与GPT-4的缺陷不足——任何工具都不是万能的1. 引言2. 事实性错误2.1 问题示例2.2 原因分析2.3 解决方法 3. 实时更新3.1 问题示例3.2 原因分析3.3 解决方法 4. 总结 参考资料其它资料下载 ChatGPT与GPT-4的缺陷不足——任何工具都不是万能的 1. 引言 2022 年末 C…

借助TeeChart 图表控件,这家公司轻松创建了可视化图表看板

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。技术交流Qqun&#xff1a…

版本控制工具之Git使用文档

以下讨论基于gitlab系统作为代码仓库。 项目Git初始化 创建一个空的git库或者初始化一个旧有git仓库 git init 现有项目关联到远程仓库 git remote add origin git172.16.200.39:public-team/spring-learn.git 下载代码 git clone <仓库地址> 查看已关联远程仓库 …

脑的物理系统

⼤脑模块化 人脑是一个复杂的网络&#xff0c;一般将大脑划分为不同的区域&#xff08;即节点&#xff09;&#xff0c;并使用某种方法表征大脑区域之间的关系&#xff08;即连接的边&#xff09;来构建人脑网络。在功能磁共振成像&#xff08;fMRI&#xff09;数据的网络模型…

浪涌保护器:保护电子设备免受雷击侵害

引言&#xff1a; 随着电子设备在现代生活和工业领域的普及和广泛应用&#xff0c;雷击对电子设备的损害成为一个严重的问题。浪涌保护器作为一种重要的防雷设备&#xff0c;发挥着至关重要的作用。本文将介绍浪涌保护器的防雷作用、行业应用&#xff0c;并重点介绍浪涌保护器…

SPI接口协议详解

一、SPI总线简介 SPI总线是摩托罗拉公司开发的一种高速、全双工、同步的通信总线&#xff0c;它通常由四条线组成&#xff1a; CS 片选信号SCLK 时钟信号MOSI 主机输出从机输入接口MISO 主机输入从机输出接口 SPI分为主机和从机&#xff0c;主机提供通信所需的时钟信号。 二…

盘点那些让人笑疯了的520创意文案!

520&#xff0c;一场关于爱情和狗粮的龙卷风快来了&#xff1a; 玫瑰花&#xff0c;涨价了&#xff1b; 民政局&#xff0c;周末要加班&#xff1b; 肯德基&#xff0c;推出了萌宠玩具套餐&#xff1b; 很多人&#xff0c;站在风里等那没影儿的爱情。 今天原本计划是要写一…

【JAVA程序设计】(C00137)基于SSM(非maven)的校园BBS论坛系统

基于SSM&#xff08;非maven&#xff09;的校园BBS论坛系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本项目为基于SSM的校园BBS论坛管理系统包含前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1…

使用taro+canvas实现微信小程序的图片分享功能 | 京东云技术团队

业务场景 二轮充电业务中&#xff0c;用户充电完成后在订单详情页展示订单相关信息&#xff0c;用户点击分享按钮唤起微信小程序分享菜单&#xff0c;将生成的图片海报分享给微信好友或者下载到本地&#xff0c;好友可通过扫描海报中的二维码加群领取优惠。 使用场景及功能&a…

网站在腾讯云备案的要求条件说明

腾讯云网站备案要求首先你有一个需要备案的域名&#xff0c;域名实名认证信息和备案主体相同&#xff1b;在腾讯云有一台符合备案条件的云服务器、轻量应用服务器等云产品&#xff1b;然后根据备案主体所在省份地区&#xff0c;符合当地的通信管理局要求。下面腾讯云百科来详细…

相见恨晚的Matlab编程小技巧(4)-程序运行太慢了咋解决——合理使用循环语句(2)

上一篇博客介绍了通过向量化运算、预分配空间两种常用的方式提高代码的运行效率。实际上&#xff0c;matlab还有几种内置函数来避免循环语句的使用&#xff0c;分别为arrayfun、cellfun以及structfun函数。由于这几种函数需要用到匿名函数以及函数句柄的概念&#xff0c;很多人…

厚积薄发|迭代为什么叫冲刺?

上士闻道&#xff0c;勤而行之&#xff1b;中士闻道&#xff0c;若存若亡&#xff1b;下士闻道&#xff0c;大笑之。不笑不足以为道。–《道德经》 软件工程从原始的作坊式工作方式&#xff0c;经过了哪些思考、哪些方案的试探&#xff0c;才在不断地尝试与改善后&#xff0c;走…

E. Border(裴蜀定理)

Problem - E - Codeforces 太空人纳塔莎抵达了火星。她知道火星人非常贫穷。为了保障火星公民更好的生活&#xff0c;他们的皇帝决定向每个游客征收税费。纳塔莎是地球的居民&#xff0c;因此她必须支付进入火星领土所需的税费。 火星上有n种纸币面额&#xff1a;第i种纸币的面…

TTL、 RS-232,RS-485的区别

TTL、 RS-232&#xff0c;RS-485的区别 参考:【gt】TTL&#xff0c; RS-232&#xff0c;RS-485的区别 前言&#xff1a;串口、UART口、COM口、USB口是指的物理接口形式(硬件)。而TTL、RS-232、RS-485是指的电平标准(电信号)。 TTL &#xff1a;全双工 &#xff0c;逻辑0对应…