数据库(MySQL)-DQL数据查询语言

        DQL(Data Query Language 数据查询语言)的用途是查询数据库数据,如select语句。其中,可以根据表的结构和关系分为单表查询和多表联查。

单表查询

        单表查询:针对数据库中的一张数据表进行查询

全字段查询

        语法:select 字段名 from 表名

#推荐
select sid,sname,birthday,ssex,classid from student;
#不推荐,不利于SQL优化
SELECT * from student;

结果:

 部分字段查询

SELECT sname from student;

结果:

字段起名

        语法:select 旧字段名 as 新字段名,旧字段名 ‘新字段名’,..., 旧字段名 ‘新字段名’  from 表名

select sname as '姓名', birthday '生日' from student;

结果:

添加字段

        语法:select 旧字段名,...,旧字段名,‘新字段值’  新字段名 from 表名

SELECT sname,'猿究院' 学校 from student;

结果:

 

select sid,sname,birthday,ssex,classid,'猿究院' 学校 from student;

去重

使用distinct去重

        语法: select distinct 需要去重的值 from 表名

select distinct ssex from student;

结果:

        要注意的是,所有字段都相同时,distinct才去重。若有一个陈同学 男和陈同学 女,我们不应该将其视为去重对象:

select distinct sname,ssex from student;

结果:

使用group by去重

条件查询

        使用【where】条件子句进行查询。

单条件查询

        语法:select * from 表名 where 条件;

# 在student表中查询sid等于5的数据
select * from student where sid=5;
select * from student where sid<>5;

结果:

多条件查询

        使用"and" 和"or"来连接多个条件

#查找1班的女同学
select * from student where classid=1 and ssex='女';

结果:

         那我们想查找sid为3,6,9的学生信息呢?

SELECT * FROM student 
WHERE sid=3 OR sid=200 OR sid=6;

        也可以使用in关键字:

SELECT * FROM student 
WHERE sid in(3,6,9);

         结果:

 模糊查询

        模糊符号:① "%":匹配任意多个字符

                         ② _:匹配任意一个字符

        首先我们先插入几条数据:

insert into student (sname)
values('卫小佳'),('小佳佳'),('卫公主'),('宇宙无敌美女佳佳'),('卫美女');

我们想查找关于‘卫小佳’的信息,就可以通过模糊查询进行查找:

SELECT *FROM student WHERE sname LIKE '%佳%'

 结果:

SELECT *FROM student WHERE sname LIKE '卫__';
SELECT *FROM student WHERE sname LIKE '卫%';

结果:

 查找null和非null值

关键字:is null

SELECT * FROM student WHERE birthday IS NULL;

结果:

关键字:is not null 

select * from student where birthday is not null;

结果:

常用聚合函数

1.count():统计个数

语法:select count(字段\常量\*) from 表名  

注意:count()方法不统计null

统计行数:

SELECT COUNT(sid) from student;
SELECT COUNT('a') from student; -- 不推荐
SELECT COUNT(1) from student;
SELECT COUNT(*) from student;

 2.max():求最大值
3.min():求最小值
4.sum():求和
5.avg():求平均

SELECT COUNT(score) from sc;
SELECT sum(score) from sc;
SELECT avg(score) from sc;
SELECT max(score) from sc;
SELECT min(score) from sc;

6.综合

案例1. 统计出一共有多少场考试,平均分,总成绩、最高分、最低分

select count(*),sum(score),avg(score),max(score),min(score) from sc;

结果:

 分组-group by

关键字:group by

案例1.

select ssex,count(*) from student group by ssex;

结果:

案例2.查询各班有多少人

select classid,count(*) from student group by classid;

结果:

案例3.查看成绩表中每个同学的总分和平均分

select sid,sum(score),avg(score) from sc group by sid;

运行结果:

案例4.统计平均分不及格的同学

SELECT sid,avg(score) FROM sc
WHERE avg(score)<60 GROUP BY sid;

         运行后发现报错:

        原因是:where语句是用来判断每一条子句的,后面不能跟聚合函数,我们可以使用having关键字来判断。

select sid,avg(score) from sc group by sid having avg(score)<60;

结果:

排序-order by

升序-asc

使用ASC关键字,也可以不写,默认为升序排序:

select * from sc order by score;
select * from sc order by score asc;

结果:

降序-desc

        使用dsc关键字进行降序排序,不可省略:

select * from sc order by score desc;

结果:

综合排序

        案例:先按score降序,若相同,再按cid升序排序

select * from sc score desc,cid asc;

结果:

分页-limit

        语法:select * from student limit 开始位置 步长,位置=页码-1*步长

SELECT * from student LIMIT 0,3

结果:

2.

SELECT * from student LIMIT 1,3

 结果:

3. 找到成绩及格的总分数排名第二的 sid总成绩

select sid,sum(score) from sc
group by sid
having sum(score)>60
order by sum(score) desc
limit 1,1;

结果:

多表联查

        多表联查:针对数据库中两张或两张以上的表同时进行查询

        多表联查可以通过连接运算,即将多张通过主外键关系关联在一起进行查询,以下五张表是我们的数据:

内联查询

 非等值查询

        非等值查询就是将两个表做了笛卡尔积运算,运行结果的逻辑时混乱的

SELECT * FROM student,class;

 

等值查询

        只有完全满足条件(主外键关系)的数据才能显示结果

案例1:查询出学生和班级的信息

select * from student,class
where student.classid=class.classid;

结果:

案例2: 5张表联查

select * from student,class,teacher,sc,course
where student.classid=class.classid and
course.Tid=teacher.Tid and 
course.Cid=sc.Cid and 
sc.Sid=student.sid;

结果:

案例3:查询学过张三老师课程的学生的学号姓名

select sid,sname from student,teacher,sc,course
where course.Tid=teacher.Tid and 
course.Cid=sc.Cid and 
sc.Sid=student.sid and
tname='张三';

结果:

案例4:查询每个学生的平均成绩

select sname,classname,avg(score) 'avg'
from student,class,sc
where student.classid=class.classid and student.Sid=sc.Sid
group by student.sid;

结果:

inner join on内联 

        关键字:inner join on 两表的关系

        内联查询适合于:表少但数据量大,内存占用小,io高

案例1:查询出学生和班级的信息

select * from student
inner join class on student.classid=class.classid;

结果:

 案例2:男同学的班级信息

SELECT * FROM student
INNER JOIN class on student.classid=class.classid
WHERE ssex='男';

结果:

案例3:五表联查

SELECT * FROM studen
INNER JOIN class on student.classid=class.classid
INNER JOIN sc on sc.Sid=student.sid
INNER JOIN course ON course.Cid=sc.Cid
INNER JOIN teacher on course.Tid=teacher.Tid;

结果:

案例4:查询每门课程的平均成绩 显示:课程名称 老师名称 平均成绩

SELECT Cname,Tname,avg(sc.score) from sc
inner JOIN course ON course.Cid=sc.Cid
INNER JOIN teacher on teacher.Tid=course.Tid
GROUP BY course.Cid;

结果:

外联查询

重点要找到主查表:student

LEFT JOIN ON 左外联

主表(student)在 jion的左边:

SELECT *FROM student
LEFT JOIN class on student.classid=class.classid;

结果:

 RIGHT JOIN ON 右外联

主表(student)在 jion的右边

SELECT *FROM class
RIGHT JOIN student on student.classid=class.classid;

结果:

综合

案例1:查询所有的学生都学过多少门课程

select sname,count(cname) '课程数' from student
left join sc on student.sid=sc.sid
LEFT JOIN course ON sc.cid=course.Cid
group by student.sid

结果:

案例2:查询没有班级的同学

SELECT * FROM student
LEFT JOIN class ON class.classid=student.classid
WHERE class.classid is null;

结果:

案例3:查询没有同学的班级

SELECT * FROM class
LEFT JOIN student on class.classid=student.classid
WHERE student.sid is not NULL;

结果:

并集-UNION

注意:UNION有去重机制(所有参数必须完全相同才会被去重)

案例1:查询所有人的名字

SELECT sname FROM student
UNION
SELECT tname FROM teacher

结果:

案例2:查询所有人的姓名和性别(在student表中,性别的类型是char,而在teacher表中,性别的类型是int,但是不同类型的字段可以合并)

SELECT sname,ssex FROM student
UNION
SELECT tname ,tsex FROM teacher

结果:

//不同列数量的结果集不可以合并:

SELECT sname,ssex,sid FROM student
UNION
SELECT tname ,tsex FROM teacher

结果:

//起别名给第一个结果集才有用:

SELECT sname 姓名,ssex 性别 FROM student
UNION
SELECT tname ,tsex FROM teacher

结果:

SELECT sname ,ssex  FROM student
UNION
SELECT tname 姓名,tsex 性别 FROM teacher 

结果:

案例3: 查询没有班级的同学和查询没有同学的班级

SELECT * FROM student
LEFT JOIN class ON class.classid=student.classid
WHERE class.classid is null
UNION
SELECT * FROM student
RIGHT JOIN  class on class.classid=student.classid
WHERE student.sid is not NULL;

结果:

全连接

去重

案例:要获取没有班级的同学、查询没有同学的班级还要既有班级又有同学的

SELECT * FROM student
LEFT JOIN class ON class.classid=student.classid
UNION
SELECT * FROM student
RIGHT JOIN  class on class.classid=student.classid

不去重

SELECT * FROM student
LEFT JOIN class ON class.classid=student.classid
UNION ALL
SELECT * FROM student
RIGHT JOIN  class on class.classid=student.classid

 

子连接

        子查询又叫内部查询,子查询必须放在小括号中,子查询的效率极低

1.WHERE子查询

案例1:找出最大id的学生信息

select * from student
where sid=(select max(sid) from student)

结果:(先执行子查询,查找出最大的id,根据最大i查出学生信息)

案例2:查询每个班id最大的学生

#子句:查询出每个最大的id
#select max(sid) from student group by classidselect * from student
where sid in(
select max(sid) from student group by classid
)

结果:

案例3:查询学过张三老师课程的学生

select * drom student where sid in(select sid from sc where cid=(select cid from course where tid=(select tid from teacher where tname='张三')))

结果:

案例4:查询没学过张三老师课程的学生

select * drom student where sid not in(select sid from sc where cid=(select cid from course where tid=(select tid from teacher where tname='张三')))

结果:

2.FROM子查询

案例1:查询人数大于5的班级 显示:班级 人数

方法1:不使用子查询

select classname count(*) from class
left join student on class.classid=student.classid
group by class.classid 
having count(*)>5

结果:

方法2:使用子查询

select classname,人数 from class 
left join
(select classid,count(*) 人数 from student
group by classid) t1 
on class.classid=t1.classid
where 人数>5 

结果:

3.EXISTS子查询

用法:子句有结果,父查询执行;子句没有结果,父查询不执行:

select * from teacher
where exists(SELECT * FROM student where classid=1)

子句有结果:

父查询执行:

4.ANY\SOME\ALL子查询

案例1:查询1班比2班最低成绩高的学生

方法1:使用子查询

//子查询先查询出2班的最低成绩
/*
SELECT min(score) from sc
LEFT JOIN student on sc.sid=student.Sid
where sc.cid=2;
*/
select student.* from sc
left join student on sc.sid=student.Sid
where student.classid=1 and score>(SELECT min(score) from scLEFT JOIN student on sc.sid=student.Sidwhere sc.cid=2;
)

方法2:使用any

SELECT DISTINCT student.* FROM sc
LEFT JOIN student on sc.sid=student.Sid
WHERE student.classid=1 and score >any(
SELECT score from scLEFT JOIN student on sc.sid=student.Sidwhere student.classid=2)

结果:

 案例2:查询1班比2班最高成绩高的学生

使用all关键字:

SELECT DISTINCT student.* FROM sc
LEFT JOIN student on sc.sid=student.Sid
WHERE student.classid=1 and score >all(
SELECT score from scLEFT JOIN student on sc.sid=student.Sidwhere student.classid=2)

结果:

结果集的控制语句

1.IF(expr1,expr2,expr3)

参数:

-- expr1 条件
-- expr2 条件成立,显示数据
-- expr3 条件不成立,显示数据

//例如在teacher表中,性别是通过int类型表示的,当我们想让结果集按我们规定的:1代表女,0代表男来显示,就可以使用if控制语句:

select tid,tname,if(tsex=1,'女','男') 性别,tbirthday,taddress from teacher;

结果:

2.IFNULL(expr1,expr2)

参数:

-- expr1 字段
-- expr2 字段为null时显示的默认值

//查询student表中的数据,当birthday为null时显示"石头里蹦出来的":

select sidsname,ifnull(birthday,'石头里蹦出来的') 生日,ssex from student

结果:

3.CASE WHEN THEN END

这个语句类似于java中的switch语句,具体用法如下:

select tid,tname
case tsexwhen 0 then '男'when 1 then '女'else '保密'
END '性别' ,tbirthday FROM teacher

结果:

注意:这个语句自带break语句:

SELECT score,
CASEwhen score>=90 THEN 'A'when score>=80 THEN 'B'when score>=70 THEN 'C'when score>=60 THEN 'D'when score <60 THEN '不及格'
end '等级' from sc;

结果:

案例1:统计各个分数段的人数

思路:通过CASE WHEN THEN END语句可以只显示出满足该成绩段的成绩,其余不显示:

SELECT
CASE WHEN score<=100 and score>=90 then score end '100-90',
CASE WHEN score<=90 and score>=70 then score end '90-70',
CASE WHEN score<=70 and score>=60 then score end '70-60',
CASE WHEN score<60 then score end '不及格'
from sc

结果:

然后可以直接通过count()统计每个分数段的行数(count不统计null值),得出的行数就是该分数段的人数:

SELECT  '人数' 分数段,
count(CASE WHEN score<=100 and score>=90 then score end)  '100-90',
count(CASE WHEN score<=90 and score>=70 then score end)  '90-70',
count(CASE WHEN score<=70 and score>=60 then score end) '70-60',
count(CASE WHEN score<60 then score end)  '不及格'
FROM sc

结果:

方法2:

SELECT '100-90' 分数段 ,count(score) 分数 FROM sc
WHERE score<=100 and score>=90
UNION
SELECT '90-70' 分数段 ,count(score) 分数 FROM sc
WHERE score<=90 and score>=70
UNION
SELECT '70-60' 分数段 ,count(score) 分数 FROM sc
WHERE score<=70 and score>=60
UNION
SELECT '不及格' 分数段 ,count(score) 分数 FROM sc
WHERE score<=100 and score<60

 结果:

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

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

相关文章

报警系统与机房动力环境监控系统的集成及报警功能实施

在当今的运维行业中&#xff0c;确保关键基础设施的安全与稳定运行面临着诸多挑战&#xff0c;如设备故障、环境异常、非法入侵等。为了有效应对这些挑战&#xff0c;报警系统与机房动力环境监控系统的集成变得至关重要。本文旨在为运维团队提供关于报警系统与机房动力环境监控…

使用frrouting、gns3、pim实现ipv6组播(三)

翻遍整个网络都没有找到用ipv6进行组播推流的实例。 朋友说&#xff1a;A true strong person never complains about the environment 那么&#xff0c;就由我来创造一个吧~ 此文涉及到的所有软件均为开源软件&#xff0c;进行深入学习与其他平台移植时十分便利。 记得点赞额…

如何在GPU服务器上安装Stable Diffusion webUI

一、前提条件 1、硬件条件 GPU&#xff1a;12G&#xff0c;建议16G以上&#xff0c;还是尽量勾搭&#xff0c;好像现在最大32G&#xff0c;目前个人性价比24G有时长出售。 内存&#xff1a;16G以上&#xff0c;建议32G&#xff0c;也是越大越好。 硬盘&#xff1a;最好使用…

2024年【金属非金属矿山(地下矿山)安全管理人员】考试报名及金属非金属矿山(地下矿山)安全管理人员模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试报名为正在备考金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的金属非…

抖音矩阵管理系统功能说明:一站式掌握

在当下这个信息爆炸的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;其用户规模持续扩大&#xff0c;影响力日益增强。对于内容创作者和营销人员来说&#xff0c;如何高效管理抖音账号&#xff0c;实现内容的多平台分发和精准触达&#xff0c;成为了亟待解决的问题。…

Redis常用指令(不定期更新)

Redis常用指令&#xff08;不定期更新&#xff09; 查询指定前缀key的数量查看键空间事件开启键空间通知 查询指定前缀key的数量 查询【TEST前缀】的key数量 EVAL "return #redis.call(keys,TEST:*)" 0返回信息 查看键空间事件 config get notify-keyspace-even…

Navicat Charts Creator for Mac:数据可视化利器

Navicat Charts Creator for Mac是一款专为Mac用户设计的数据可视化工具&#xff0c;它将复杂的数据转化为直观、易懂的图表&#xff0c;帮助用户更好地理解和分析数据。 该软件支持连接到多种数据库&#xff0c;如MySQL、MariaDB、PostgreSQL等&#xff0c;轻松获取实时数据&…

【QGroundControl二次开发】七.QGC自定义MAVLink消息MavLink通信协议 C++应用

1. 接收解析源码分析 通过接收串口或UDP发来的的字节流buffer&#xff0c;长度lengthbuffer.size()&#xff0c;通过下列脚本解析&#xff0c;每解析出一个mavlink数据包就执行onMavLinkMessage函数 for(int i 0 ; i < length ; i){msgReceived mavlink_parse_char(MAVL…

VS2022下安装和配置OpenCV环境参数+QT开发环境搭建

1.工具准备 VS2022,OpenCV4.5.5版本&#xff0c;QT5.12.12 VisualStudio最新版直接官网下载&#xff0c;根据需要进行下载&#xff0c;我下载的免费社区版本。日常开发完全够用。 qt官网下载5.12版本。 OpenCVReleases - OpenCV 选择Windows版本下载并解压到本地磁盘&#xff0…

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代&#xff0c;信息安全的重要性不言而喻&#xff0c;尤其当涉及到个人隐私和账户安全时。每天&#xff0c;无数的用户登录各种在线服务&#xff0c;从社交媒体到银行账户&#xff0c;再到电子邮件和云存储服务。这些服务的背后&#xff0c;是复杂的系统架构&am…

【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’

No Python at ‘C:Users…Python Python39python. exe’ 目录 No Python at ‘C:Users…Python Python39python. exe’ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班…

【linux服务器】大语言模型实战教程:LLMS大模型快速部署到个人服务器

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生&#xff0c;大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…

【数据结构】线性表与顺序表

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

【算法】分布式共识Paxos

一、引言 在分布式系统中&#xff0c;一致性是至关重要的一个问题。Paxos算法是由莱斯利兰伯特&#xff08;Leslie Lamport&#xff09;在1990年提出的一种解决分布式系统中一致性问题的算法。 二、算法原理 Paxos算法的目标是让一个分布式系统中的多个节点就某个值达成一致。算…

【Django】前端技术-网页样式表CSS

文章目录 一、申明规则CSS的导入方式行内样式内部样式外部样式 二、CSS的选择器1. 基本选择器标签选择器&#xff1a; 选择一类标签 标签{}类选择器 class&#xff1a; 选择所有class属性一致的表情&#xff0c;跨标签.类名{}ID选择器&#xff1a;全局唯一 #id名{} 2.层次选择器…

束搜索(与贪心、穷举对比)

一、贪心搜索 1、基于贪心搜索从Y中找到具有最高条件概率的词元&#xff0c;但贪心可能不是最优解 2、比如 &#xff08;1&#xff09;贪心&#xff1a;.5*.4*.2*.1.0024 &#xff08;2&#xff09;另外&#xff1a;.5*.3*.6*.6.0054 二、穷举搜索 &#xff08;1&#xff0…

Transformer中的Multi-head Attention机制解析——从单一到多元的关注效益最大化

Transformer中的Multi-head Attention机制解析——从单一到多元的关注效益最大化 Multi-head Attention的核心作用 组件/步骤描述多头注意力机制&#xff08;Multi-head Attention&#xff09;Transformer模型中的关键组件&#xff0c;用于处理序列数据功能允许模型同时关注到…

数据库 执行sql添加删除字段

添加字段&#xff1a; ALTER TABLE 表明 ADD COLUMN 字段名 类型 DEFAULT NULL COMMENT 注释 AFTER 哪个字段后面; 效果&#xff1a; 删除字段&#xff1a; ALTER TABLE 表明 DROP COLUMN 字段;

科普文:分布式架构中的三高:高并发、高性能、高可用

关于高并发 高并发场景 互联网应用以及云计算的普及&#xff0c;使得架构设计和软件技术的关注点从如何实现复杂的业务逻 辑&#xff0c;转变为如何满足大量用户的高并发访问请求。 一个简单的计算处理过程&#xff0c;如果一旦面对大量的用户访问&#xff0c;整个技术挑战就…

人工智能类——计算机科学与技术

计算机科学与技术是一个非常大的门类。目前计算机科学与技术类招生的专业主要有计算机科学与技术、软件工程、网络工程、信息安全、物联网工程等&#xff0c;后面的几个专业是计算机科学与技术的重要分支&#xff0c;而这个门类的其他分支并没有单列出来一个本科专业&#xff0…