数据库查询详解

news2024/11/24 13:44:01

数据库查询操作

前置:首先我们创建一个练习的数据库

/*
SQLyog Professional v12.09 (64 bit)
MySQL - 5.6.40-log : Database - studentsys
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`studentsys` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `studentsys`;

/*Table structure for table `course` */

DROP TABLE IF EXISTS `course`;

CREATE TABLE `course` (
  `cno` varchar(10) NOT NULL,
  `cname` varchar(20) NOT NULL,
  `credit` int(2) DEFAULT NULL,
  PRIMARY KEY (`cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `course` */

insert  into `course`(`cno`,`cname`,`credit`) values ('C01','网页基础',1),('C02','数据库系统',2),('C03','计算机基础',3);

/*Table structure for table `dept` */

DROP TABLE IF EXISTS `dept`;

CREATE TABLE `dept` (
  `did` int(11) NOT NULL AUTO_INCREMENT,
  `dname` varchar(20) NOT NULL,
  PRIMARY KEY (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Data for the table `dept` */

insert  into `dept`(`did`,`dname`) values (1,'计算机系'),(2,'土木工程系'),(3,'英语系');

/*Table structure for table `sc` */

DROP TABLE IF EXISTS `sc`;

CREATE TABLE `sc` (
  `sno` varchar(10) DEFAULT NULL,
  `cno` varchar(10) DEFAULT NULL,
  `degree` int(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `sc` */

insert  into `sc`(`sno`,`cno`,`degree`) values ('S01','C01',80),('S01','C02',85),('S01','C03',90),('S02','C01',63),('S02','C02',58),('S03','C01',55),('S03','C03',65),('S04','C01',58);

/*Table structure for table `student` */

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (
  `sno` varchar(10) NOT NULL,
  `sname` varchar(20) NOT NULL,
  `sex` char(4) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `brithday` datetime DEFAULT NULL,
  `address` varchar(200) DEFAULT NULL,
  `did` int(11) DEFAULT NULL,
  PRIMARY KEY (`sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `student` */

insert  into `student`(`sno`,`sname`,`sex`,`age`,`brithday`,`address`,`did`) values ('S01','陈宇乐','男',21,'2022-02-02 00:00:00','浙江义乌',1),('S02','陈紫樱','女',20,'2022-02-10 00:00:00','',1),('S03','杜陈宇','男',21,NULL,NULL,1),('S04','陈宇乐','男',23,NULL,NULL,2),('S05','陈樱','女',21,NULL,NULL,2),('S06','杜佳佳','男',19,NULL,NULL,NULL);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

1 查询基础

1.1 select 操作

select 思维导图

参考sql

#查询所有学生信息
select * from student;

#查询学生表中的学号与姓名
select sno,sname from student;

#查询学生表中的学号与姓名,并且给一个字段别名
select sno as snum,sname as `姓名` from student;

#查询学生表中的姓名信息,并过滤掉相同姓名信息
select distinct sname from student;

#查询学生个数,年龄总和,平均年龄,最大年龄,最小年龄,并给他们一个别名
select count(*) as `学生个数` ,sum(age) as `年龄总和` from student;

select avg(age) as `平均年龄` ,max(age) as `最大年龄`,min(age) as `最小年龄` from student;

1.2 where

在这里插入图片描述
参考SQL

#查询所有男生的信息
select * from student where `sex`="男";

#查询所有21岁男生的信息

select * from student where `sex`="男"
and age = 21;

1.3 模糊查询

参考SQL

#查询姓‘陈’的同学
select * from student where sname like '陈%';

#查询名字中出现‘陈’的同学
select * from student where sname like '%陈%';

#查询姓陈的二个字姓名的同学
select * from student where sname like '陈_';

#查询名字结尾是‘樱’的三个字姓名的同学
select * from student where sname like '__樱';

1.4 排序

在这里插入图片描述

参考SQL

#根据学生年龄从大到小进行排序学生信息
select * from student order by age desc;

#根据学生年龄从小到大进行排序'男'同学信息
select * from student  where sex='男'
order by age;

#第一排序根据学生年龄升序进行排序,第二排序根据‘学号’降序排序的同学信息
select * from student  order by age asc , sno desc;

1.5 分组与having子句

在这里插入图片描述

参考SQL

#分组一般和聚合函数一起使用
#根据性别进行分组,并分别统计各组的人数
select sex,count(*) as `人数` from student group by sex;

#根据性别进行分组,并分别统计各组的同学的平均年龄
select sex,avg(age) as `平均年龄` from student group by sex;

#HAVING子句 一般是配合GROUP BY使用
#根据性别进行分组,并统计各组的人数大于3人的分组信息
select sex,count(*) as `性别组` from student group by sex having `性别组` > 3


having 和 where 的区别

WHERE与HAVING的根本区别在于:

WHERE子句在GROUP BY分组和聚合函数之前对数据行进行过滤;
HAVING子句对GROUP BY分组和聚合函数之后的数据行进行过滤。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.6 限制显示条数-limit

参考SQL

#显示学生表信息的前3条
select * from student limit 3;

#显示学生表信息的2-4条
select * from student limit 1,3;

#显示年龄第2大和第3大的"男"学生
select * from student where sex='男' order by age desc limit 1,2;

2 比较逻辑运算

在这里插入图片描述

参考SQL

#查询年龄大于20岁小于23岁的男生
select * from student where age > 20 and age < 23 and sex='男';

#区间的另一种写法 BETWEEN 大于等于20岁小于等于23岁
select  * from student where  sex='男' and age between 20 and 23;

#查询性别是男,或者年龄大于等于21岁的学生
select  * from student where  sex='男' or age >= 21;

#查询地址为''的学生信息
select  * from student where  address = '';

#查询地址为null的学生信息,和is搭配
select  * from student where  address is null;

#查询年龄不是21岁的学生
select  * from student where  age != 21;
select  * from student where  age <> 21;
#查询地址不为null的学生信息
select  * from student where  address is not null;

3 多表连接

在这里插入图片描述

3.1 内连接

参考SQL

#显示拥有系别学生学号,姓名,及所在系名称-[内连接方式]
select s.sno,s.sname,d.dname from student s inner join dept d on s.did = d.did;

#不推荐写法
select s.sno,s.sname,d.dname from student s ,dept d where s.did = d.did;

3.2 左连接

参考代码

#显示所有学生信息,及所在系情况-[左连接/左外连接]
#左连接已左边的表为主
select s.sno,s.sname,d.dname from student s left join dept d on s.did = d.did;

3.3 右连接

参考代码

#右连接/右外连接
select s.*,d.dname from student s right join dept d on s.did = d.did

3.4 全连接

MYSQL不支持FULL JOIN

select s.*,d.dname from student s left join dept d on s.did = d.did
union
select s.*,d.dname from student s right join dept d on s.did = d.did;

3.5 综合案例

#查询已选课学生姓名,课程名称,课程成绩
select st.sname,c.cname,sc.degree from sc  
left join student st on sc.sno = st.sno 
inner join course c on sc.cno = c.cno;

#查询至少选修一门课的女同学姓名,除去重复姓名项
select st.sname,sc.degree from sc  
join student st on sc.sno = st.sno where st.sex = '女';

4 子查询

在这里插入图片描述

4.1 =

SQL代码

#查询和'陈樱'同龄的学生信息
select * from student where age = (
select age from student where sname = '陈樱'
);

4.2 in/not in

SQL代码

#查询课程成绩不及格的选修课课程信息
select * from course where cno in (
select distinct cno from sc where degree < 60
);

#查询课程成绩及格的选修课课程信息
select * from course where cno not in (
select distinct cno from sc where degree < 60
);

#in或者not in一般来说查询效率低,采用多表连接
select distinct c.cname from sc join course c on sc.cno =  c.cno
where sc.degree < 60;

4.3 all

满足所有条件
SQL代码

#ALL表示必须满足子查询结果的所有记录
#查询sc表里成绩最高的记录
select * from sc where degree >= ALL (select degree  from sc);

#查询sc表里成绩最低的记录
select * from sc where degree <= ALL (select degree  from sc);

4.4 any

满足其中的一个条件
SQL代码

#any表示满足子查询结果的任意一条记录即可,和some一样
#查询选择’C01‘课程的成绩高于’C02‘的成绩的学生的学号
select * from sc where cno = 'C01' and degree > any(
select degree from sc where cno = 'C02'
);

select * from sc where cno = 'C01' and degree > some(
select degree from sc where cno = 'C02'
);

4.5 exist/not exists

SQL代码

#EXISTS子查询返回结果类型bool
#EXISTS运算符的含义为"存在",
#使用 EXISTS 关键字引入一个子查询时,就相当于进行一次存在测试。
#外部查询的 WHERE 子句测试子查询返回的行是否存在。
#子查询实际上不产生任何数据;它只返回 TRUE 或 FALSE 值

#显示已经选修了课程的学生信息
select distinct s.* from student s 
inner join sc
on sc.sno = s.sno;

select * from student s where exists (select * from sc where s.sno = sc.sno);


#查询选修了C03课程的学生信息
select * from student s where exists (select * from sc where s.sno = sc.sno and sc.cno = 'C03');

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

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

相关文章

【uniapp】自定义导航栏时,设置安全距离,适配不同机型

1、在pages.json中&#xff0c;给对应的页面设置自定义导航栏样式 {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitl…

智慧电力物联网系统引领电力行业数字化发展

智慧电力物联网系统是以提高用户侧电力运行安全、降低运维成本为目的的一套电力运维管理系统。综合分析采用智慧物联网、人工智能等现代化经济信息网络技术&#xff0c;配置智能采集终端、小安神童值班机器人或边缘网关&#xff0c;实现对企事业用户供配电系统的数字化远程监控…

网关、网桥、路由器和交换机之【李逵与李鬼】

概念 网关 网关简单来说是连接两个网络的设备,现在很多局域网都是采用路由器来接入网络,因此现在网关通常指的就是路由器的IP。网关可用于家庭或者小型企业,连接局域网和Internet,也有用于工业应用的。 网桥 网桥也叫桥接器,是连接两个局域网的一种存储/转发设备,它能…

Python字符串处理:掌握文本的艺术

更多资料获取 &#x1f913; 作者主页&#xff1a;涛哥聊Python &#x1f4da; 个人网站&#xff1a;涛哥聊Python 在Python编程中&#xff0c;字符串是一种不可或缺的数据类型&#xff0c;用于表示文本和字符数据。本文将深入探讨Python字符串的各个方面&#xff0c;从基础概…

网络安全(黑客技术)—小白自学笔记

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

缓冲流 java

字节缓冲池的默认大小 &#xff08;8192/byte&#xff09;字节输入输出流 字节缓冲输入接口也是 InputStream 读字节 实现类BufferedInputStream 字节缓冲输出接口也是 OutputStream 写字节 实现类BufferedOutputStream package BufferFlow;import CopysIO.Myconnectio…

vue-next-admin本地部署

开源地址 文档 本次学习的代码地址https://gitee.com/lyt-top/vue-next-admin/tree/vue-next-admin-nest/&#xff0c;这个做了前后端分离方便学习 部署 下载代码&#xff0c;解压 后台 创建数据库 CREATE DATABASE vuenextadmin01 CHARACTER SET utf8 COLLATE utf8_bin;…

25 mysql like 是否使用索引

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

大文件上传,前端vue 做分片上传

html – 以弹窗的形式 <!-- 上传算法文件 --> <el-dialog title"上传算法文件" :visible.sync"uploadPop" width"60%" :close-on-click-modal"false" :before-close"closeUploadPop" append-to-body custom-class…

完美收官丨深圳信驰达科技IOTE 2023第二十届国际物联网展参展回顾

►►►展会风采 2023年9月22日&#xff0c;为期三天的IOTE 2023第二十届国际物联网展 • 深圳站在深圳国际会展中心&#xff08;宝安馆&#xff09;9、10、11号馆圆满落幕。本届展会以“IoT构建数字经济底座”为主题&#xff0c;吸引覆盖IoT全栈生态的参展商&#xff0c;展出超…

【数据结构】快排的详细讲解

目录&#xff1a; 介绍 一&#xff0c;递归快排确定基准值 二&#xff0c;递归遍历 三&#xff0c;非递归的快排 四&#xff0c;快排的效率 介绍 快排是排序算法中效率是比较高的&#xff0c;快排的基本思想是运用二分思想&#xff0c;与二叉树的前序遍历类似&#xff0c;…

C++ 之如何将数组传递给函数?

在本文中&#xff0c;您将学习将数组传递给C 中的函数。您将学习如何传递一维和多维数组。 数组可以作为参数传递给函数。也可以从函数返回数组。考虑以下示例&#xff0c;将一维数组传递给函数&#xff1a; 示例1&#xff1a;将一维数组传递给函数 C 程序通过将一维数组传递…

从事嵌入式工作有哪些优势?

随着物联网和人工智能的发展&#xff0c;嵌入式技术越来越值钱&#xff0c;学嵌入式的人也越来越多&#xff0c;现在开始入行嵌入式。根据一些权威部门统计&#xff0c;我国目前嵌入式软件人才缺口每年为40万人左右&#xff0c;嵌入式人才供给一直处于供不应求的状态。 那么从…

Docker私有仓库打开2375端口(linux)

前言 在我们开发测试过程中&#xff0c;需要频繁的更新docker镜像&#xff0c;然而默认情况下&#xff0c;docker的2375端口是关闭的&#xff0c;下面介绍如何打开端口。 1、打开步骤 1.1、修改配置 登录docker所在服务器&#xff0c;修改docker.service文件 vi /usr/lib/sys…

Mac解压缩软件BetterZip免费版注册码下载

软件介绍 BetterZip免费版是一款适用于Mac系统的解压缩软件&#xff0c;软件具备了专业、实用、简单等特点&#xff0c;它可以让用户更快捷的向压缩文件中添加和删除文件&#xff0c;同时兼容性也十分优秀&#xff0c;支持ZIP &#xff0c; SIT &#xff0c; TAR、BZIP2 &…

Linux 系统日常运维经典技能

【微|信|公|众|号&#xff1a;厦门微思网络】 【微思网络www.xmws.cn&#xff0c;成立于2002年&#xff0c;专业培训21年&#xff0c;思科、华为、红帽、ORACLE、VMware等厂商认证及考试&#xff0c;以及其他认证PMP、CISP、ITIL等】 linux运维必备认证-RHCE&#xff0c;学RHC…

mysql 物理备份及恢复

一、物理复制的基本概念 物理备份:直接复制数据库文件&#xff0c;适用于大型的数据库环境&#xff0c;不受存储引擎的限制&#xff0c;但不能恢复到不同的mysql版本 完整备份&#xff1a;也叫完全备份&#xff0c;每次将所有数据&#xff08;不管自第一次备份有没有修改过&…

盘点日本IT行业到底怎么样?赴日IT分析

相比其它行业&#xff0c;日本的IT行业对于人才需求旺盛、就业前景比较光明。一方面&#xff0c;日本IT企业在创新和开发方面寻求领先&#xff0c;需要大量的IT人才为其所用。另一方面&#xff0c;随着全球数字化趋势的加速和政府信息化的不断推进&#xff0c;各个领域都在不断…

力扣第257题 二叉树的所有路径 c++ 树 深度优先搜索 字符串 回溯 二叉树

题目 257. 二叉树的所有路径 简单 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2-&g…

Win11右键恢复Win10老版本

Win11右键恢复Win10老版本 最近自己更新了windows11的OS,整体感觉都是不错的,但是就是每次右键菜单我都要再次点击下展开更多选项,这对追求极简主义的我,就是不爽, 手动恢复win10操作吧! 第一种:创建文件(简单快速) 1.新建一个resoreRightKey.reg文件,并在里面填入如下代码 W…