数据库基础篇(二)——SQL之数据查询
csdh11 2025-01-07 12:04 34 浏览
目录
- 数据准备
- DQL语言的学习
- 基础查询
- 条件查询
- 排序查询
- 分组查询
- 常见函数
- 连接查询
- 子查询
- 分页查询
- union联合查询
前言
当你读到这篇文章时,前提是已经将MySQL的环境以及客户端安装完成(如未安装可参考上篇文章),并掌握了它的基础知识。那么,今天我们来学习SQL语言的DQL,SQL语言分别包括DQL数据查询、DML数据操作、DDL数据定义、TCL事务控制。工作中最常用的是数据查询和数据操作语言;数据定义(建库、建表等)一般由拥有权限的开发人员或者管理人员来创建;事务控制语言通常在开发场景使用的更多。所以,如果你是偏业务或者数据分析方向,重点学习前两个就够用。
数据准备
接下来,我们将使用员工相关的四张样本数据表,来学习SQL,建议你在学习过程中多动手练习,理解才会更深刻。表和字段含义,如下图:
如何利用SQL语句来操作以上数据呢?我们必须将样本数据导入MySQL客户端(如:Navicat)中。可以在客户端操作数据,或者在终端窗口。工作中经常在客户端操作,所以本文所有SQL语句将在Navicat中学习。
首先将sql脚本保存到桌面(获取方式:关注"Python之每日一课"公众号,后来回复"sql基础数据",即可。),导入SQL脚本的具体操作流程如下:
1、 选中本地数据库—>点击运行SQL文件
2、 选中三个点—>选择要执行的SQL脚本—>打开
3、 点击开始—>数据导入成功—>关闭
4、选中库—>右键刷新—>完成!
现在数据准备完成。这里是导入sql脚本;导出同理,选择”转储SQL“文件。当然了,Navicat也支持将当前表或查询结果导出Excel、CSV等文件类型。
下面可以写SQL语句了(每个sql脚本可以保存,下次直接使用),如下:
DQL语言的学习
1、 基础查询
1)语法
select 要查询的东西 【from 表名】
2)特点
类似于Python中 :print(要打印的东西)
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 要查询的东西 可以是常量值、表达式、字段、也可以是函数
3)举栗
# 查询常量
SELECT 100;
# 查询表达式
SELECT 100 * 2
# 查询单个字段
SELECT last_name FROM employees;
# 查询多个字段
SELECT last_name,email FROM employees;
# 查询所有字段
SELECT * FROM employees;
# 查询表的记录总数(函数)
SELECT COUNT(*) FROM employees;
# 查询员工表中的部门编号并去重(字段前加关键字)
SELECT DISTINCT department_id FROM employees;
补充:可以给字段起别名,好处是提高可读性,更方便理解;多表连接时,区分字段。用AS 或 空格来实现。如下:
2、 条件查询
条件查询:根据条件过滤原始表的数据,查询到想要的数据
1)语法
select 要查询的字段|表达式|常量值|函数from 表where 条件;
2)分类
①条件表达式
示例:salary>10000
条件运算符:
> < >= <= = != <>
②逻辑表达式
示例:salary>10000 && salary<20000
逻辑运算符:
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
③模糊查询
# 常用关键字
like
between and
in|exists
is|is not null
3)举栗
# 查询工资大于12000的员工信息
SELECT * FROM employees where salary >12000;
# 查询工资大于10000同时小于2000的员工信息
SELECT * FROM employees WHERE salary>10000 AND salary<20000;
# 查询员工名中以字符a开头的员工信息
# %代表任意多个字符,如果需求为包含a的员工信息 就写为 %a%
SELECT * FROM employees WHERE last_name LIKE 'a%';
# 查询员工编号在100到120之间的员工信息(between and)
# 写法一 逻辑表达式 and
SELECT
*
FROM
employees
WHERE
employee_id >= 100
AND employee_id <= 120;
# 写法二 between and
# 特点:1、简洁 2、包含临界值
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 100
AND 120;
? 注意:where 一定要放到 from 后面。NULL 不是假,也不是真,而是"空";任何运算符,判断符碰到NULL,都得NULL;NULL的判断只能用is null,is not null;NULL 影响查询速度,一般避免使值为NULL。exists查询可以与in型子查询互换,它们之间区别以后语句优化时会详细讲解。
3、 排序查询
1)语法
select 要查询的东西from 表名where 条件order by 排序的字段|表达式|函数|别名 【asc|desc】
2)举栗
# 查询员工信息,要求工资从高到低排序
SELECT
*
FROM
employees
ORDER BY salary DESC;
?注意:order by 一定要放到 语句最后(limit前面)
4、分组查询
1)语法
select 分组函数(字段),字段[要求出现在group by后面的字段] from 表名group by 分组的字段
2)特点
①可以按单个字段分组
②和分组函数一同查询的字段最好是分组后的字段
③分组筛选(where 和 having区别)
?关键字 | ?针对的表 | ?位置 | ?执行顺序 |
where | 原始表 | group by前面 | 分组前筛选 |
having | 分组后结果集 | group by后面 | 分组后筛选 |
④可以按多个字段分组,字段之间用逗号隔开
⑤可以支持排序
⑥having后可以支持别名
3)举栗
# 简单分组:查询每个部门的平均薪资
SELECT
AVG(salary),
department_id
FROM
employees
GROUP BY
department_id;
# 添加筛选条件:查询2000(包含2000)年以前入职的各部门平均工资
SELECT
department_id,
AVG(salary)
FROM
employees
WHERE hiredate <= '2000-01-01'
GROUP BY
department_id;
# 添加复杂筛选条件:查询哪个部门的员工个数大于5,并按降序排列,取前两个
# 思路1、先按部门分组,查询每个部门的员工个数 2、根据1、的结果进行筛选
SELECT
department_id,
COUNT(*) as num
FROM
employees
GROUP BY
department_id
HAVING num >=5
ORDER BY num DESC
LIMIT 2;
? 注意:关键字顺序是where —>group by—>having—>order by—>limit
(having不能单独使用,需结合group by ,表示对分组后的结果进行筛选;
而group by 必须结合分组聚合函数一起使用,比如:count()、max()等)
5、 常见函数
1)单行函数
2)分组函数
sum() 求和
max() 最大值
min() 最小值
avg() 平均值
count() 计数
3)分组函数特点
①以上五个分组函数都忽略null值,除了count(*)
②sum和avg一般处理数值型,max、min、count可以处理任何数据类型
③都可以搭配distinct使用,用于统计去重后的结果
④count的参数可以支持:字段、*、常量值,一般放1
6、连接查询(多表查询)
单个表不能满足需求时,需要结合多张表,去除有关联的数据。这时就需要用连接查询,连接查询有三种,通常join使用的最多。
1)连接方式一 :等值连接(连接条件有等号)——非等值连接(相反)
①等值连接的结果 = 多个表的交集
②多个表不分主次,没有顺序要求
③一般为表起别名,提高阅读性和性能
# 等值连接:查询所有员工的姓名、工种ID、工种名称
SELECT
a.last_name,a.job_id,b.job_title
FROM
employees a ,jobs b
WHERE a.job_id = b.job_id;
2)连接方式二:通过join关键字实现连接
①语法
select 字段名,……from 表1【inner|left|right】join 表2 on 连接条件【where 筛选条件】【group by 分组字段】【having 分组后的筛选条件】【order by 排序的字段或表达式】
②好处
语句上,连接条件和筛选条件实现了分离,简洁。
? 注意:左右连接可互换 A left join B 等价于B right join A;内连接是左
右连接的交集;mysql没有外连接。
# 用内连接 实现查询所有员工的姓名、工种ID、工种名称
SELECT
a.last_name,
a.job_id,
b.job_title
FROM
employees a
INNER JOIN jobs b ON a.job_id = b.job_id;
3)连接方式三:自连接
自连接相当于等值连接,但是等值连接涉及多个表,而自连接仅仅是它自己。如下:在员工信息表里,查询员工名和直接上级的名。
# 自连接:查询员工名和直接上级的名
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;
# 等值连接方式
SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;
7、子查询
一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。在外面的查询语句,称为主查询或外查询。
1)特点
①子查询都放在小括号内
②子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
③子查询优先于主查询执行,主查询使用了子查询的执行结果
④子查询根据查询结果的行数不同分为以下两类:
?单行子查询
结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空
?多行子查询
结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in:属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替
2)举栗
# 查询位置ID是1700的所有部门人员信息
SELECT
first_name
FROM
employees
WHERE
department_id IN (
SELECT
department_id
FROM
departments
WHERE
location_id = 1700
)
8、分页查询 (可选)
实际web开发中,当显示的数据,一页显示不完时,需要分页提交sql请求。
1)语法
select 字段|表达式,... from 表名【where 条件】【group by 分组字段】var2=value2【having 条件】【order by 排序的字段】limit 【起始的索引,显示个数】;
2)特点
①起始条目索引默认从0开始
②limit子句放在查询语句的最后
③公式:select * from 表 limit (page-1)*sizePerPage,
sizePerPage:每页显示条目数
page:要显示的页数
3)举栗
# 查询 员工信息前5条(0可以省略)
SELECT
*
FROM
employees
LIMIT 0,5;
# 查询 员工信息前5-10条
SELECT
*
FROM
employees
LIMIT 5,5;
9、union联合查询
union用于把涉及多个表的SELECT语句的结果组合到一个结果集合中。适用于查
询条件较多,多个表之间没有连接关系的场景。
1)语法
select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】.....select 字段|常量|表达式|函数 【from 表】 【where 条件】
2)特点
①多条查询语句的查询的列数必须是一致的
②多条查询语句的查询的列的类型几乎相同
③union 代表去重,union all 代表不去重
3)举栗
# 执行下面语句,创建测试数据
# 学生表
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` tinyint(4) DEFAULT NULL,
`classId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES ('1', 's1', '20', '1'), ('2', 's2', '22', '1'),('3', 's3', '22', '2'), ('4', 's4', '25', '2');
# 教师表
CREATE TABLE `teacher` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `teacher` VALUES ('1', 't1', '36'), ('2', 't2', '33'), ('3', 's3', '22');
# 查询所有学生和教师的id,姓名,年龄
# UNION
SELECT id, name, age FROM student
UNION
SELECT id, name, age FROM teacher;
# UNION ALL
SELECT id, name, age FROM student
UNION ALL
SELECT id, name, age FROM teacher;
UNION 和 UNION ALL 运行结果的区别如下:
? 注意:在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。
好,今天学习到这里。工作中用的最多就是查询。如果能消化本文涉及到的所有内容,大概能解决80%的工作需求。本文更多的是原理介绍,例子不多,只有先知道是什么,才能知道怎么学。那么,接下来最重要的是要多练习实践。因为实际的业务场景要复杂很多,给大家推荐两个刷题的网站,力扣和牛客网,里面有大量的sql面试题。能进一步提高我们sql的水平。这篇文章主要是SQL的常用查询。明天继续学习SQL的DML增删改。一起加油!
- 上一篇:开机显示黑屏一串英文字母
- 下一篇:玩家曝光改任天堂账号邮箱很简单 只需要基本资料
相关推荐
- 知名软件变“木马”:2小时感染10万电脑
-
近日,腾讯电脑管家监测发现,一款通过“驱动人生”升级通道,并同时利用“永恒之蓝”高危漏洞传播的木马突然爆发,仅2个小时受攻击用户就高达10万。腾讯电脑管家可精准拦截该病毒攻击,管家团队也将持续跟踪该款...
- 腾讯电脑管家发布病毒预警:“驱动人生木马”爆发,2小时感染10万台电脑
-
新华网天津12月15日电(记者周润健)腾讯电脑管家15日紧急发布病毒预警,14日下午,腾讯电脑管家监测发现,一款通过“驱动人生”升级通道,并同时利用“永恒之蓝”高危漏洞传播的木马突然爆发,仅2个小时受...
- 全新“撒旦”勒索病毒来袭 瑞星推出独家解密工具
-
新华社北京7月26日电瑞星威胁情报平台近日发现多起国内用户感染“撒旦”勒索病毒事件。据瑞星安全研究人员介绍,该病毒运行后会加密受害者计算机文件,加密完成后会用中英韩三国语言索取1个比特币作为赎金,并...
- 新勒索病毒“WannaCry”疯狂来袭 乌克兰副总理电脑中招
-
据外媒报道,从6月27日开始,一种新勒索病毒再次疯狂来袭,已席卷欧洲多个国家,连乌克兰副总理的电脑都已中招。报道称,这轮病毒足以与五月席卷全球的勒索病毒“WannaCry”的攻击性相提并论。该病毒代号...
- 蠕虫病毒利用“永恒之蓝”漏洞传播 单位局域网受威胁最大
-
日前,火绒安全团队通过“火绒威胁情报系统”发现蠕虫病毒“Worm/Sharp”正在全网传播,其中在政府、企业、学校、医院等单位的局域网具有非常强的传播能力。该病毒通过“永恒之蓝”漏洞、多个电脑常用端口...
- 新病毒爆发:利用“永恒之蓝”传播,2小时感染10万台电脑挖矿
-
驱动人生发布的声明。据腾讯安全专家介绍,通过追溯病毒传播链发现,该病毒自12月14日约14点,利用“驱动人生”、“人生日历”等软件最早开始传播,另有约30%的传播通过“永恒之蓝”漏洞在局域网内进行主动...
- 逍遥安卓模拟器定制手游电脑版 手机电脑账号完全互通
-
从今年起大量回合制端游转向手游方向,无论是《梦幻西游》、《大话西游》、《神武》还是刚刚发行的《问道》手游,都是非常重度需要大量时间来做任务挂机升级的游戏。很多人习惯了端游的时候一个电脑可以多开的玩法,...
- 安卓模拟器绿色U盘移动版 公司玩游戏无痕迹
-
安卓模拟器已经不稀奇了!随着安卓手游的盛行,特别是《梦幻西游手游》之类的重度手游发布,玩手游花的时间也越来越多。用手机玩这些游戏存在着屏幕小、点量少、费流量还有容易被电话打断,在电脑上用安卓模拟器玩游...
- 苹果推出 iCloud 照片和视频转移服务:可转移至谷歌相册
-
IT之家3月4日消息据MacRumors今日报道,苹果公司本周推出了一项新服务,帮助iCloud用户方便快捷的将其存储的照片和视频转移到谷歌照片上。苹果在其支持文档中表示,用户可以登...
- NAS PK台,4核带m.2的威联通TS-264C vs 双核TS-462C
-
因为618年中大促看到威联通TS-264C和TS-462C这两机型售价差不多,就做个比较以供参考。毕竟作为自2007年以来就一直卖威联通的NAS老油来说,对威联通各NAS机型的识别还是相当全面的,对不...
- 前端学AI(七):构造 RAG 系统评估测试数据集
-
引言在基于DeepSeek+Chroma+LangChain开发一个简单RAG系统...
- 惨重教训!调查显示挪威“英斯塔”号宙斯盾舰撞油轮后本不必“丧命”
-
最新公布的调查报告显示,挪威皇家海军“英斯塔”号护卫舰2018年11月与油轮相撞后,如果其舰员接受了更好的损管训练,并且对舰艇的稳定特性更加熟悉的话,这艘宙斯盾型战舰本来是可以挽救的。↑挪威“英斯塔”...
- 「必买」盘点2021年男人们的败家清单,越“败”越香
-
心里总想买点啥?看看《必买》,全网最有料的场景种草指南。草原割不尽,春风吹又生。在过去的2021年,不断被各种数码产品种草,一直在买买买,剁手不停。大部分产品都经过详细的对比做足了功课,也有部分是一时...
- 实现浏览器播放rtsp视频流的解决方案
-
有同学问道:需要实时播放摄像头rtsp视频流,而浏览器不能直接播放,怎样解决?实现这个需求可以通过插件或者转码来实现。要实现这个目的,可以采用的方案非常得多,有商业的也有开源的,这里主要列举一些开源的...
- ISO9000你知道多少?
-
1ISO9000族标准是什么?ISO9000族标准是指由国际标准化质量管理和质量保证技术委员会(ISO/TC176)制订的所有国际标准。ISO9000族标准可帮助各种类型和规模的组织实施并有效运行质...
- 一周热门
- 最近发表
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)
- dos 删除目录下所有子目录及文件 (36)