数据库(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;

结果:

条件查询

        使用【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 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.xdnf.cn/news/1487854.html

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

相关文章

C# 实现条件变量

C# 进程通信系列 第一章 共享内存 第二章 条件变量&#xff08;本章&#xff09; 第三章 消息队列 文章目录 C# 进程通信系列前言一、关键实现1、用到的主要对象2、初始化区分创建和打开3、变量放到共享内存4、等待和释放逻辑 二、完整代码三、使用示例1、线程同步控制2、进程…

Maven概述

目录 1.Maven简介 2.Maven开发环境搭建 2.1下载Maven服务器 2.2安装&#xff0c;配置Maven 1.配置本地仓库地址 2.配置阿里云镜像地址 2.3在idea中配置maven 2.4在idea中创建maven项目 3.pom.xml配置 1.项目基本信息 2.依赖信息 3.构建信息 4.Maven命令 5.打包Jav…

【PyTorch】图像多分类项目

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 多类图像分类的目标是为一组固定类别中的图像分配标签。 目录 加载和处理数据 搭建模型 定义损失函数 定义优化器 训练和迁移学习 用随机权重进行训…

【HTML — 构建网络】HTML 入门

在本文中,我们将介绍 HTML 的绝对基础知识。为了帮助您入门,本文定义了元素、属性以及您可能听说过的所有其他重要术语。它还解释了这些在 HTML 中的位置。您将学习 HTML 元素的结构、典型的 HTML 页面的结构以及其他重要的基本语言功能。在此过程中,也将有机会玩转 HTML! …

SpringBoot 项目配置文件注释乱码的问题解决方案

一、问题描述 在项目的配置文件中&#xff0c;我们写了一些注释&#xff0c;如下所示&#xff1a; 但是再次打开注释会变成乱码&#xff0c;如下所示&#xff1a; 那么如何解决呢&#xff1f; 二、解决方案 1. 点击” File→Setting" 2. 搜索“File Encodings”, 将框…

Mac安装Hoomebrew与升级Python版本

参考 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 安装了Python 3.x版本&#xff0c;你可以使用以下命令来设置默认的Python版本&#xff1a; # 首先找到新安…

图片格式转换工具哪个好?一键转换图片格式就用这4个

在贵州的街头&#xff0c;福建的游神活动吸引了众多目光&#xff0c;人们纷纷拿出手机记录下这难得一见的盛况。然而&#xff0c;在分享这些精彩瞬间时&#xff0c;我们往往会遇到格式不兼容的问题。 想象一下&#xff0c;如果你能一键将手机拍摄的HEIC格式转换为更通用的JPG或…

2024 微信小程序 学习笔记 第二天

1. WXML 模板语法 数据绑定 事件绑定 条件渲染 列表渲染 2. WXSS 模板样式 rpx 样式导入 全局和局部样式 3. 全局配置 window tabBar 配置tabBar案例 4. 网络数据请求 Get请求 Post 请求 加载时请求 5. 案例 -本地生活&#xff08;首页&#xff09; 导航栏 轮播图 九宫格效果…

leetcode10 -- 正则表达式匹配

题目描述&#xff1a; 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 示例 1&#xff1…

配置sublime的中的C++编译器(.sublime-build),实现C++20

GCC 4.8: 支持 C11 (部分) GCC 4.9: 支持 C11 和 C14 (部分) GCC 5: 完全支持 C14 GCC 6: 支持 C14 和 C17 (部分) GCC 7: 支持 C17 (大部分) GCC 8: 完全支持 C17&#xff0c;部分支持 C20 GCC 9: 支持更多的 C20 特性 GCC 10: 支持大部分 C20 特性 GCC 11: 更全面地支持 C20 …

原生PHP/JS自主开发的交友内核框架婚恋交友系统V10

本文来自&#xff1a;婚恋交友系统V10 - 源码1688 应用介绍 原生PHP/JS自主开发的交友内核框架&#xff0c;极高性能、无捆绑、自主权、无流水扣点、独立全开源 01脱单盲盒&#xff1a;脱单盲盒类似于漂流瓶&#xff0c;先将自己《投放》到盲盒中&#xff0c;另一伴有缘将您取…

解决显存不足问题:深度学习中的 Batch Size 调整【模型训练】

解决显存不足问题&#xff1a;深度学习中的 Batch Size 调整 在深度学习训练中&#xff0c;显存不足是一个常见的问题&#xff0c;特别是在笔记本等显存有限的设备上。本文将解释什么是 Batch Size&#xff0c;为什么调整 Batch Size 可以缓解显存不足的问题&#xff0c;以及调…

【Git多人协作开发】同一分支下的多人协作开发模式

目录 0.前言场景 1.开发者1☞完成准备工作&协作开发 1.1创建dev分支开发 1.2拉取远程dev分支至本地 1.3查看分支情况和分支联系情况 1.4创建本地dev分支且与远程dev分支建立联系 1.5在本地dev分支上开发file.txt 1.6推送push至远程仓库 2.开发者2☞完成准备工作&…

【学习笔记】Elasticsearch学习汇总(包含SpringData、Spark、Flink操作)

文章目录 前言数据类型种类ES解决什么问题ELK StackES是什么数据格式正排(正向)索引倒排索引创建索引索引查询索引删除创建文档(添加数据)自定义ID 简单查询类似于主键查询查询所有数据 修改数据全量修改局部修改 删除数据条件查询请求路径(不推荐)请求体全查询分页查询指定查询…

普元EOS学习笔记-EOS的ide开发工具的介绍

前言 普元EOS开发包括低开和高开。 EOS低开&#xff0c;直接在浏览器操作即可&#xff0c;不需要编码。 EOS高开&#xff0c;需要使用EOS的ide工具&#xff0c;进行编码开发。 EOS的ide工具是普元在Eclipse基础上进行的扩展&#xff0c;添加了若干插件&#xff0c;专门用于…

如何使用Proxy实现JavaScript中的观察者模式

在软件开发中&#xff0c;尤其是JavaScript中&#xff0c;观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的关系。它允许多个观察者对象监听一个主题对象&#xff0c;并在主题状态发生变化时自动得到通知。这种模式常用于事件系统、数据绑定等场景。 在JavaScrip…

【React】箭头函数:现代 JavaScript 的高效编程方式

文章目录 一、箭头函数的基本语法二、箭头函数的特性三、在 React 中的常见用法四、最佳实践 在现代 JavaScript 中&#xff0c;箭头函数&#xff08;Arrow Functions&#xff09;是一种简洁的函数表达方式&#xff0c;并且在 React 开发中非常常见。箭头函数不仅简化了函数的语…

HighConcurrencyCommFramework c++通讯服务器框架 :目录,修改标题,配置,日志打印

目录规划 nginx 根目录下的三个文件 makefile :编译项目的入口&#xff0c;编译项目从这里开始 config.mk&#xff1a;也是个配置脚本用来增加变动的东西&#xff0c;应付可变 common.mk&#xff1a;最核心的编译脚本&#xff0c;每个子目录都要被编译.cpp程序 配置文件 配…

构建未来客户服务的智能平台架构

随着科技的飞速发展&#xff0c;客户服务不再仅仅是响应投诉和提供支持&#xff0c;而是成为企业与客户之间重要的互动和沟通桥梁。在这个信息化和智能化的时代&#xff0c;构建一个优秀的客户服务平台架构至关重要&#xff0c;它不仅能提升服务效率&#xff0c;还能增强客户满…

《0基础》学习Python——第二十一讲__网络爬虫/<4>爬取豆瓣电影电影信息

爬取网页数据&#xff08;获取网页信息全过程&#xff09; 1、爬取豆瓣电影的电影名称、导演、主演、年份、国家、评价 2、首先我们先爬取页面然后再获取信息 1、爬取网页源码 import requests from lxml import etree if __name__ __main__:#UA伪装head{User-Agent:Mozilla/…