【韩顺平老师讲MySQL】函数和多表查询

news2024/11/17 6:34:25

文章目录

  • P33.数学函数
  • P34.日期函数
  • P37.加密函数
  • P38.流程控制函数
  • P39.查询增强
  • P40.分页查询
  • P41.分组查询
  • P42.多子句查询
  • P43.多表查询笛卡尔积(重难点)
  • P44.多表查询
  • P45.自连接
  • P46.多行子查询

P33.数学函数

image-20221024235045940

# 绝对值
SELECT ABS(-12) FROM DUAL;

# 十进制转为二进制
SELECT BIN(10) FROM DUAL;

# 向上取整
SELECT celling(-1.1) FROM DUAL;

# 向下取整
SELECT FLOOR(1.1) FROM DUAL;

# 保留n小数位数(四舍五入)
SELECT FORMAT(12.323412,3) FROM DUAL;

# 随机值
SELECT RAND() FROM DUAL;

# 伪随机值
SELECT RAND(1) FROM DUAL;

P34.日期函数

image-20221024235524915

# 当前日期 2022-10-24
SELECT CURRENT_DATE() FROM DUAL;

# 当前时间
SELECT CURRENT_TIME() FROM DUAL;

# 当前时间戳
SELECT CURRENT_TIMESTAMP FROM DUAL;

# 创建一个测试表(测试current_timestamp的用法)
CREATE TABLE mes (
	id INT,
	content VARCHAR(30),
	send_time DATETIME);
# 添加一条记录
INSERT INTO mes VALUES(1,'北京新闻',CURRENT_TIMESTAMP());

INSERT INTO mes VALUES(2,'上海新闻',NOW());
INSERT INTO mes VALUES(3,'广州新闻','2022-10-14 10:00:00');
SELECT * FROM mes;

# 显示所有的新闻信息,发布日期只显示日期,不显示时间
SELECT id,content,DATE(send_time) FROM mes;


# 请查询在十分钟内发布的帖子
SELECT * 
	FROM mes
	WHERE DATE_ADD(send_time,INTERVAL 10 MINUTE)>NOW();
SELECT * 
	FROM mes
	WHERE DATE_SUB(NOW(),INTERVAL 10 MINUTE)<send_time;

# 请用mysql的sql语句中求出2011-11-11和1990-1-1相差多少天
SELECT DATEDIFF('2011-11-11','1990-1-1') FROM DUAL;
-- 大的时间写在前面

# 请用sql语句求出你活了多少天
SELECT DATEDIFF(NOW(),'2002-9-11') FROM DUAL;

# 请用sql语句求出你大概活了多少年
SELECT DATEDIFF(NOW(),'2002-9-11')/365 FROM DUAL;

# 如果你能活到80岁,求出你还能活多少天
SELECT DATEDIFF(DATE_ADD('2002-9-11',INTERVAL 80 YEAR),NOW()) FROM DUAL;

ps:这里的datediff还可以把date换成time,datetime,timestamp等,比如:

image-20221025002752243

# 我只希望看到当前日期和时间的时间部分
SELECT TIME(NOW()) FROM DUAL;
# 我只希望看到当前日期和时间的日期的月部分
SELECT MONTH(NOW()) FROM DUAL;

-- unix_timestamp: 返回的是从1970-1-1到现在的秒数
SELECT UNIX_TIMESTAMP(NOW()) FROM DUAL;

# from_unixtime可以把时间戳转换成想要的日期格式
# 意义,用一个整数记录时间,需要显示的时候转换
SELECT FROM_UNIXTIME(1666629079,'%Y-%m-%d %H:%i:%s') FROM DUAL;

ps:在开发中,一般都是用datetime直接记录时间,但是如果有人用int记录时间戳,你要知道后面他肯定要用from_unixtime转换函数来换成datetime的时间格式.

P37.加密函数

# 可以查询到登入mysql的有哪些用户,以及登录的ip
SELECT USER() FROM DUAL;

# 为字符串算出一个MD5 32的字符串,常用于加密
# root密码-->123456-->加密-->数据库存放的是加密后的
SELECT MD5('123456') FROM DUAL;

# 计算加密后密码的统一位数
SELECT LENGTH(MD5('123456')) FROM DUAL;

# 应用:加密后的密码的存入和查询
USE syh_db01;
CREATE TABLE login (
	NAME VARCHAR(32),
	PASSWORD CHAR(32) );
INSERT INTO login VALUES('song',MD5('syh'));
INSERT INTO login VALUES('li',MD5('123456'));
SELECT DISTINCT * FROM login;
SELECT DISTINCT NAME FROM login WHERE PASSWORD=MD5('123456');
  1. 这里求md5函数加密后的字符串的长度的时候,可以用到length(md5(string))
  2. 存到数据库的是加密后的密码,查询的时候也要用加密后的密码去查询

在一个数据库中想临时看一眼另一个数据库中的一个表的时候,为了不使用use databasename;反复切换数据库【要切换至少要两次】

我们可以使用select * from databasename.tablename

image-20221025103739197

P38.流程控制函数

image-20221025102244539

# if(expr1,expr2,expr3)如果expr1为true,则返回表达式expr2,否则返回expr3
SELECT IF(TRUE,'北京','上海') FROM DUAL;-- 返回的是北京
SELECT IF(FALSE,'北京','上海') FROM DUAL;-- 返回的是上海

#ifnull(expr1,expr2) 如果expr1不为空,则返回expr1,否则返回expr2
SELECT IFNULL(NULL,12) FROM DUAL;-- 返回12
SELECT IFNULL(13,'韩') FROM DUAL;-- 返回13

# 如果expr1为真,则返回epxr1,如果expr3为真,则返回expr4,否则返回expr5
# 多分支
SELECT CASE 
	WHEN TRUE THEN 'song'
	WHEN TRUE THEN 'li'
	ELSE 'chen' END;
	-- 如果有两个都为真,则返回第一个为真的,if elseif

先来看看我们后面要用到的emp表:

image-20221025103903322

INSERT INTO emp (sex_rename,birthday,entry_date,job,RESUME,image,NAME) VALUES('','2020-1-2','2022-1-3','打杂','简介','暂无','宋永红');
# 1. 查询emp表,如果id为空,则显示0.0
SELECT IFNULL(id,0.00) AS id是否为空 FROM emp;
SELECT IF(id IS NOT NULL,id,0.00) FROM emp;-- 判断的是等于用is,不是等于用is not

# 2.如果表的job是打杂,则显示小工,如果表是切菜,则显示长工
SELECT CASE
	WHEN job='打杂' THEN '小工'
	WHEN job='切菜' THEN '长工'
	END FROM emp;

image-20221025105433033

判断是否为空用is,判断其他是否是某一个值用=

job is not null
job='song'

P39.查询增强

看一下我们的笔记大纲:

我们之前讲的select查询都是基于一张表的单表查询.这里我们开始通过查询增强过渡到多表查询了

image-20221025111632102

# 查询增强
SELECT * FROM emp;
# 使用where子句  查询2022-1-1后入职的员工
-- 老韩说明:在mysql中,日期类型可以直接比较
SELECT * FROM emp
	WHERE entry_date>'2022-01-01';
	
# like模糊查询
-- %表示0-多个任意字符,_表示单个任意字符
# 如何查询首字母为s的员工姓名和工作
SELECT NAME,job FROM emp
	WHERE NAME='s%';
# 如何查询第三个字符为大写o的所有员工的姓名和工作
SELECT NAME,job FROM emp
	WHERE NAME='__O%';
# 如何查询没有id的雇员的姓名
SELECT NAME FROM emp
	WHERE id IS NULL;
	
# 查询表结构
DESC emp;

# 使用order by子句
-- 升序排入职时间
SELECT * FROM emp
	ORDER BY entry_date;
	

P40.分页查询

当数据的记录多的时候,比如有10w行,不可能通过一个页面来显示,所以我们就得知道如何分页查询

# 分页查询
# 1.按雇员的id好升序取出,每一页显示3条记录,请分别显示第1页,第2页...
-- 基本语法: select...limit start rows 表示从start+1行开始取,start从0开始计算
SELECT * FROM emp 
	ORDER BY id;-- 升序
SELECT * FROM emp
	ORDER BY id
	LIMIT 0,3;-- 第一页
SELECT * FROM emp
	ORDER BY id,
	LIMIT 6,9; -- 第二页

image-20221025113932782

推导一个公式

SELECT * FROM emp
	ORDER BY id
	LIMIT 每一页显示的记录数*(第几页-1),每一页显示的纪律数;

P41.分组查询

-- 增强group by的使用
# 显示"各种岗位"的雇员总数,平均工资
SELECT COUNT(*),AVG(sal),job FROM emp
	GROUP BY job;
	
# 显示雇员总数,以及获得补助的雇员数量
SELECT COUNT(*),COUNT(comm) FROM emp;
-- 老师的拓展要求
SELECT COUNT(*),COUNT(IF(comm  IS NULL,1,NULL)) FROM emp;
-- 或者
SELECT COUNT(*)-COUNT(comm) FROM emp;

# 显示管理者的总人数(提示:一个管理者可能管理多个部门)
-- 先理解下面的去重的效果
SELECT DISTINCT mgr FROM emp;
SELECT COUNT(DISTINCT(mgr)) FROM emp; -- 先去重再计算个数


# 显示雇员工资的最大差额
SELECT MAX(sal)-MIN(sal) FROM emp;

P42.多子句查询

image-20221027212354695

# 应用案例:请统计各个部门group by 的平均工资 avg
# 并且是大于1000的 having 并且按照平均工资从高到低排序 order by
# 取出前两行记录 limit
SELECT dep,AVG(sal) FROM emp
	GROUP BY dep
	HAVING avg_sal>1000
	ORDER BY 0,2;

P43.多表查询笛卡尔积(重难点)

# 多表查询
-- 显示雇员名,雇员工资和所在部门的编号
# 老韩分析
-- 1.雇员名和雇员工资 来自emp表
-- 2.雇员所在编号 来自dep表

SELECT * FROM emp,login;
# 这样两个表的组合,是还没有写过滤条件的笛卡尔积
# 多表查询的目的就是找出正确的"笛卡尔积"
# 所以多表查询的重难点就是找出过滤条件

image-20221027214703099

# +上过滤条件
SELECT NAME,salary,deptname FROM emp,login
	WHERE emp.deptno=dep.deptno;
-- 注意:这里不能加上显示deptno,因为这合并的表中有两个deptno
-- 但是我们可以指定显示某一个表的列emp.deptno

ps:多表查询的条件不能少于表的个数-1

P44.多表查询

注意这里where子句使用and连接表示逻辑与

SELECT COUNT(*) FROM course,scores,student
	WHERE scores.s_id=student.id AND scores.c_id=course.id;
# 如何显示每一个员工的姓名,工资来自emp13
	-- 工资级别 salgrade 5
SELECT ename,sal,grade
	FROM emp,salgrade
	WHERE sal BETWEEN losal AND hisal;

写sql思路:

  1. 先写一个全笛卡尔积
  2. 然后写过滤条件
  3. 然后再选择表中显示哪些数据

P45.自连接

ps:自连接的特点:

  1. 一张表作为两张表使用
  2. 表必须起两个表别名

image-20221027222434340

image-20221027222910583

SELECT worker.ename AS '职员名',boss.ename AS '老板名' FROM emp worker,emp boss
	WHERE worker.mar=boss.empno;

一张表通过起表别名来作为两张表使用,此时显示的前面必须加上是哪一个别名的ename

P46.多行子查询

image-20221027223954809

-- 子查询的演示
-- 请思考:怎么查询到smith同一个部门的所有员工
/*	1.先查询到smith所在的部门号
	2.然后把上面的select 语句当作一个子查询
*/
SELECT deptno FROM emp
	WHERE ename='smith';
	
SELECT * FROM emp
	WHERE deptno=(

);
# 合并后
SELECT * FROM emp
	WHERE deptno=(
	SELECT deptno FROM emp
	WHERE ename='smith';
);

先拿到smith所在的编号,然后显示编号等于smith所在编号的所有信息.

# 课堂练习:如何查询和部门10的工作相同的雇员的
# 名字,岗位,工资,部门号,但是不含自己的

-- 查询部门10的工作
SELECT DISTINCT job FROM emp
	WHERE deptno=10;
-- 将上面的查询结果当作子查询使用
SELECT ename,job,sal,deptno FROM emp
	WHERE job IN(
	SELECT DISTINCT job FROM emp
	WHERE deptno=10;
	) AND deptno!=10;


mysql中的等于=

不等于!=

不等于也可以用<>

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

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

相关文章

【offer拿到手软系列】面试小贴士

​ 学习好一门语言贵在坚持——初识JavaScript&#x1f3f9;&#x1f481;‍♂️&#xff01; 首先&#xff1a; 博主是&#x1f466;一个帅气的boy&#xff0c;你可以叫我山鱼君 &#x1f5b1; ⌨个人主页&#xff1a;山鱼菌的个人主页 &#x1f496;&#x1f496;如果对你有帮…

vmlogin多登防关联浏览器中配置Geolocation定位插件的使用教程

Geolocation 接口是一个用来获取设备地理位置的可编程的对象&#xff0c;它可以让Web内容访问到设备的地理位置&#xff0c;这将允许Web应用基于用户的地理位置提供定制的信息。说实话&#xff1a;其实Geolocation 就是用来获取到当前设备的经纬度&#xff08;位置&#xff09;…

Zookeeper ---- Zookeeper集群操作

Zookeeper ---- Zookeeper集群操作1. 集群操作1. 集群规划2. 选举机制&#xff08;面试重点&#xff09;3. ZK集群启动停止脚本2. 客户端命令操作1. 命令行语法2. znode节点数据信息3. 节点类型&#xff08;持久/短暂/有序号/无序号&#xff09;4. 监听器原理5. 节点删除与查看…

2022年NPDP新版教材知识集锦--【第三章节】(1)

【新产品开发概论】 产品创新是“风险与回报”的过程 随着新产品的累积成本增加&#xff0c;产品的不确定性降低。成功率在很大程度上取决于企业采用的新产品开发实践和流程的质量。 【决策基本框架】 ⚫识别问题或机会 ⚫收集信息(信息来源&#xff1a;内部、外部、内外部…

iOS开发之Undefined symbol:_OBJC_CLASS_$_****

更新了Xcode14.0.1以后&#xff0c;项目突然曝出了此问题Undefined symbol:_OBJC_CLASS_$_****&#xff0c;因此记录一下&#xff0c;解决此问题的步骤&#xff1a; 第一步&#xff1a;首先在Build Phases中找到 Compile Sources&#xff0c;查看是否有对应的***.m文件&#x…

查找算法【二叉查找树】 - 二叉查找树的插入

查找算法【二叉查找树】 - 二叉查找树的插入 因为二叉查找树的中序遍历存在有序性&#xff0c;所以首先要查找待插入关键字的插入位置&#xff0c;当查找不成功时&#xff0c;再将待插入关键字作为新的叶子节点成为最后一个查找节点的左孩子或右孩子。 【算法步骤】 ① 若二…

vim编辑器使用和vim一键配置

1.vim的三种模式 开始之前&#xff0c;先简单说&#xff0c;vim并不是只有这三种模式。总的来说vim大概有12种模式&#xff0c;不同的版本可能也有一些具体的区别。今天我们先介绍三种常用的模式。 先用一张图来大概介绍三种模式之间的转换 命令模式&#xff08;Normal mod…

强化学习算法实践(一)——策略梯度算法

文章目录Reference1. REINFORCE1.1 Basic1.2 Code2. Improvement Tips2.1 Assign Suitable Credit2.2 Add a Baseline2.3 Advantage Function3. Actor-Critic(A2C)3.1 Basic3.2 Code策略梯度是一种基于策略的算法&#xff0c;相比于DQN一类的基于价值的算法&#xff0c;它会直接…

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环

前言 &#x1f47b;作者&#xff1a;龟龟不断向前 &#x1f47b;简介&#xff1a;宁愿做一只不停跑的慢乌龟&#xff0c;也不想当一只三分钟热度的兔子。 &#x1f47b;专栏&#xff1a;C初阶知识点 &#x1f47b;工具分享&#xff1a; 刷题&#xff1a; 牛客网 leetcode笔记软…

jupyter怎么换环境?

1.为什么要换环境而不用使用默认环境&#xff1f; 在这之前我只知道&#xff0c;要pip安装很多环境包&#xff0c;来在程序中调用使用&#xff0c;但是在不同的项目中&#xff0c;环境总是相互矛盾&#xff0c;总会出现诸多版本问题。所以需要每个项目对应一个环境。conda默认…

2022第二届中国高校大数据竞赛A题(实时更新)

题目 制造业是国民经济的主体&#xff0c;近十年来&#xff0c;嫦娥探月、祝融探火、北斗组网&#xff0c;一大批重大标志性创新成果引领中国制造业不断攀上新高度。作为制造业的核心&#xff0c;机械设备在工业生产的各个环节都扮演着不可或缺的重要角色。但是&#xff0c;在…

【FTP工具】FileZila安装以及使用详解

一、FTP概念 安装FTP主要是为了传输文件&#xff0c;FTP是持久的&#xff0c;只有一次认证过程&#xff0c;传输多个文件都是使用同一个连接。因为FTP就是为远程文件交互而设计的&#xff0c;有些时候只是为了单纯做一个文件传输&#xff0c;往往搭建FTP服务更省时和节约成本。…

【每日刷题】之【Z字形变换】

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【力扣刷题篇】 &#x1f432;&#x1f432;本篇内容&#xff1a; 每日刷题 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&#…

BI设计上篇 - 像设计师一样思考

形式服从功能。这句产品设计的箴言也适用于数据可视化。就数据可视化的形式和功能而言&#xff0c;我们首先考虑的是我们希望受众能用数据做什么&#xff08;功能&#xff09;&#xff0c;然后才是用可视化&#xff08;形式&#xff09;来简化这个过程。在本文中&#xff0c;我…

总结flutter玩转之-安卓view 承载flutter 的页面

1.假设你已经熟悉flutter 开发熟悉dart 语言 android 原生开发技能 一、在安卓原生项目添加代码 1.创建示例布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

【Linux修炼】6.gcc/g++及Makefile【工具篇】

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 Linux-gcc/g及Makefile本节目标程序的翻译过程1.程序的翻译过程2. 理解选项的含义3. 动态链接和静态链接Linux项目自动化构建工具-make/Makefile1. 背景2. “见见猪跑”3. makefile原理及语法3.1 Makefile原理3.2 Makefile…

pytorch初学笔记(二):TensorBoard之add_scale()的使用

目录 一、SummaryWriter类的介绍 1. 定义 2. SummaryWriter初始化 2.1 初始化 2.2 帮助文档给出的使用范例 2.3 常用方法 二、add_scale()方法介绍 1. 常用参数介绍 2. 绘制图形 2.1 安装tensorboard 2.2 对应代码 2.3 打开tensorboard窗口 2.3 注意事项 三、a…

kubernetes学习笔记

参考 Cloudman 老师的《每天5分钟玩转Kubernetes》&#xff0c;记录如何使用 Kubernetes &#xff0c;由于版本变化&#xff0c;一些命令也有相应的变化&#xff0c;本文对应 Kubernetes 1.25.3 5. 运行应用 010.123 用 Deployment 运行应用 原文使用kubectl run命令&#x…

JS(Dom对象的属性和方法)第十六课

Dom对象的属性和方法自定义的熟悉操作上面是今天博客要讲述的内容 一个案例回顾上次课讲的内容 下面是Html中的元素布局结构 <div>我是div审查元素<p>我是p标记的元素</p><span>我是span的元素信息</span></div><div class"one&…

搭建ftp服务器注意事项

很早之前写过一篇关于FTP服务器相关博客&#xff1a;FTP服务器主动被动模式详解。直到最近生产环境需要搭建一个FTP服务&#xff0c;才发现一些细节还需注意。 生产环境搭建ftp服务器&#xff0c;如果有外部用户需要连接ftp服务器下载文件&#xff0c;一般用的是Passive (PASV&…