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

news2024/11/15 17:52:39

        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;

结果:

条件查询

        使用【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 两表的关系

        内联查询适合于:表少但数据量大,内存占用小,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;

结果:

全连接

子连接

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

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 classid

select * 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 sc
    LEFT JOIN student on sc.sid=student.Sid
    where 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 sc
	LEFT JOIN student on sc.sid=student.Sid
	where 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 sc
	LEFT JOIN student on sc.sid=student.Sid
	where 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 tsex
    when 0 then '男'
    when 1 then '女'
    else '保密'
END '性别' ,tbirthday FROM teacher

结果:

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

SELECT score,
CASE
 	when 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.coloradmin.cn/o/1944940.html

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

相关文章

User Allocation In MEC: A DRL Approach 论文笔记

论文&#xff1a;ICWS 2021 移动边缘计算中的用户分配&#xff1a;一种深度强化学习方法 代码地址&#xff1a;使用强化学习在移动边缘计算环境中进行用户分配 目录 Ⅰ.Introduction II. MOTIVATION-A.验证假设的观察结果 II. MOTIVATION-A Motivating Example 数据驱动…

我在百科荣创企业实践——简易函数信号发生器(5)

对于高职教师来说,必不可少的一个任务就是参加企业实践。这个暑假,本人也没闲着,报名参加了上海市电子信息类教师企业实践。7月8日到13日,有幸来到美丽的泉城济南,远离了上海的酷暑,走进了百科荣创科技发展有限公司。在这短短的一周时间里,我结合自己的教学经验和企业的…

C#,.NET常见算法

1.递归算法 1.1.C#递归算法计算阶乘的方法 using System;namespace C_Sharp_Example {public class Program{/// <summary>/// 阶乘&#xff1a;一个正整数的阶乘Factorial是所有小于以及等于该数的正整数的积&#xff0c;0的阶乘是1&#xff0c;n的阶乘是n&#xff0…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(五)-无人机跟踪

目录 引言 5.3 无人机跟踪 5.3.1 无人机跟踪模型 5.3.2 无人机位置报告流程 5.3.3 无人机存在监测流程 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everyth…

Samtec技术科普小课堂 | 一文入门射频连接器~

【摘要/前言】 在本文中&#xff0c;我们将回到基础知识&#xff0c;了解一下什么是射频连接器。如果您是信号完整性专家&#xff0c;请点击阅读原文访问我们的网站视频&#xff0c;通过我们的网络研讨会视频了解教科书上可能找不到的知识。 如果您是电气工程领域的新手&#…

Prometheus 监控Tomcat等java应用的状态

5月应用服务出现问题&#xff0c;当别的小伙伴问我&#xff0c;有没有Tomcat等应用状态的监控的时候&#xff0c;我有点儿尴尬。所以赶紧抽空部署一下。 在配置之前&#xff0c;就当已经会安装jdk和tomcat了。 一、下载jmx_exporter #linux下 cd /usr/local/prometheus wget …

新增ClamAV病毒扫描功能、支持Java和Go运行环境,1Panel开源面板v1.10.12版本发布

2024年7月19日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布了v1.10.12版本。 在这一版本中&#xff0c;1Panel新增了多项实用功能。社区版方面&#xff0c;1Panel新增ClamAV病毒扫描功能、支持Java和Go运行环境&#xff0c;同时1Panel还新增了文件编辑器…

浪潮GS企业管理软件GetChildFormAndEntityList存在反序列化漏洞

一、漏洞简介 浪潮GS 面向大中型集团企业采用SOA 架构和先进开放的GSP 应用中间件开发,形成了集团管控13 大领域15 大行业60余个细分行业的解决方案。在管理方面,浪潮GS 有效帮助企业有效实现财务集中管理、资金集中管理、资产集中管理、供应链集中管理,从而达到集团信息的…

案例|华能某风电场配电房智能巡检机器人解决方案

随着风电产业的迅猛发展&#xff0c;风电场内配电房是风电场电能传输和转换的关键节点&#xff0c;其设备运行状况直接影响到风电场的整体运行效率和安全性。传统的人工巡检方式存在效率低、误差大、安全风险高等问题&#xff0c;难以满足现代风电场对高效、可靠运维的需求。智…

第一百七十二节 Java IO教程 - Java I/O缓冲区

Java IO教程 - Java I/O缓冲区 什么是NIO&#xff1f; 在NIO中&#xff0c;我们处理I/O操作的通道和缓冲区。 像流一样的通道表示数据源/接收器和用于数据传输的Java程序之间的连接。 通道提供双向数据传输设施。我们可以使用通道来读取数据以及写入数据。根据我们的需要&a…

【python】Python常见的面试题解析:深入探索与实践,助你少走弯路

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Redis分布式系统中的主从复制

本篇文章主要对Redis的主从复制进行讲解。主要分析复制的原理&#xff0c;包括:建立复制、全量复制、部分复制、全量复制、心跳检测等。希望本篇文章会对你有所帮助。 文章目录 一、主从复制简介 二、配置主从复制模式 断开主从复制 安全性 只读 传输延迟 三、拓扑结构 四、主…

秋招复习笔记——八股文部分:网络TCP

TCP 三次握手和四次挥手 TCP 基本认识 序列号&#xff1a;在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&#xf…

字符的统计——423、657、551、696、467、535

423. 从英文中重建数字 最初思路 首先要有一个指针&#xff0c;对于3/4/5为一组地跳跃。起初想的是后瞻性&#xff0c;如果符合0-9任意&#xff0c;则更换index、跳跃。此时写了一个函数&#xff0c;用来判断s的截取段和0-9中有无符合。这个思路并没有进行下去&#xff0c;虽然…

C++ - 基于多设计模式下的同步异步⽇志系统

1.项目介绍 项⽬介绍 本项⽬主要实现⼀个⽇志系统&#xff0c; 其主要⽀持以下功能: • ⽀持多级别⽇志消息 • ⽀持同步⽇志和异步⽇志 • ⽀持可靠写⼊⽇志到控制台、⽂件以及滚动⽂件中 • ⽀持多线程程序并发写⽇志 • ⽀持扩展不同的⽇志落地⽬标地 2.开发环境 • Cent…

第二证券:净现比是什么?怎么计算?

1、净现比的含义 净现比是指运营活动产生的现金净流量与净获利的百分比&#xff0c;是用来衡量企业实在盈利才干的目标。净现比也叫做净获利现金含量&#xff0c;即企业的净获利中&#xff0c;有多少转化成现金进入我们的钱包。 2、净现比的核算 净现比的核算公式为&#xf…

聊聊预训练模型的微调

前言 Transformers 提供了一个 Trainer 类&#xff0c;处理微调在数据集上提供的任何预训练模型。 完成所有数据预处理工作后&#xff0c;只需执行几个步骤即可定义 Trainer。 最困难的部分可能是准备运行 Trainer.train() 的环境&#xff0c;因为它在 CPU 上运行速度非常慢。…

全面解析:如何开发智能的食堂采购管理系统

今天&#xff0c;小编将全面解析如何开发一个智能的食堂采购系统&#xff0c;包括需求分析、系统设计、技术选择、开发过程以及测试和部署等方面。 一、需求分析 在开发智能食堂采购系统之前&#xff0c;首先需要进行详细的需求分析。这一步至关重要&#xff0c;因为它直接决定…

【Java 数据结构】ArrayList类介绍

ArrayList类介绍 初识List接口ArrayList类ArrayList类是什么顺序表的模拟实现初始化增加元素删除元素查找元素修改元素 ArrayList类使用构造方法ArrayList源码阅读常用方法及其注意事项 初识List接口 List 是集合框架中的一个接口, 它的里面包含了一些方法, 例如add(), remove…

【Python系列】详解 open 函数:文件操作的基石

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…