数据库讲解---(数据查询)【MySQL版本】

news2024/12/25 22:07:10

零.前言

数据库讲解(MySQL版)(超详细)【第一章】-CSDN博客

数据库-ER图教程_e-r图数据库-CSDN博客

数据库讲解(MySQL版)(超详细)【第二章】【上】-CSDN博客

数据库讲解---(SQL语句--表的使用)【MySQL版本】-CSDN博客

目录

零.前言

一.单表查询

1.1SELECT语句

1.2例子说明

1.3SELECT使用

1.3.1在学生表中找出所有学生的籍贯

1.3.2查询学生表中的所有信息

1.3.3给列定义别名返回

1.4WHERE的使用

1.4.1查询所有不及格课程的学生的学号、课程号及成绩

1.4.2在学生表中找出信电学院2000年后出生的学生的记录

1.4.3查询出生年份在“1996-1998”年出生的学生的姓名、性别、学院、出生年份

1.4.4查询信电学院、理学院、计算机学院的学生的学号、姓名、学院

1.4.4查询学院不是“信电学院”的学生的学号、姓名、学院

1.5字符匹配(模糊匹配)

1.5.1查询所有姓王的学生的姓名、学号、性别

1.5.2查询名字中,第二个字为“小”字的学生的姓名和学号

1.5.3查找课程名是“DB_Design”课程的课程号、课程性质

1.5.4空值

1.6GROUP BY

1.6.1查询学号在091501~091506至少选修了三门课程的学生的学号和选修课程的课程数

1.7集函数

1.7.1查询学生总人数

1.7.2查询计算机学院学生的平均年龄

1.7.3查询学习180101号课程的学生的最高分数

1.8对查询结果排序

1.8.1查询选修了180102号课程的学生的学号和成绩,查询结果按照成绩从高到低排序

1.8.2查询全体学生情况,查询结果按所在学院的名称升序排列,对同一学院中的学生按年龄降序排列

二.多表查询(连接查询)

2.1等值与非等值连接查询

2.1.1查询每个学生及其选修课程的情况

2.1.2使用自然连接“学生”表和“学习”表

2.2自身连接查询

2.2.1求每一门课程的间接选修课(先修课的先修课)

2.3外连接查询

2.3.2查询所有学生的姓名以及他们选修课程的课程号和成绩

2.3.3查询所有的课程信息及选修该课程的学生的学号及成绩

2.4复合条件连接查询

2.4.1查询选修180101号课程且成绩在90分以上的学生学号,姓名及成绩

2.5多表连接

2.6集合运算连接查询

2.6.1查询选修了180101号或180102号课程或二者都选修了的学生学号、课程号和成绩


一.单表查询

1.1SELECT语句

SELECT语句用于查询数据库中数据:

语法:

SELECT [ALL | DISTINCT] <属性列表>
FROM <表1或视图1>,<表2或视图2>,<表3或视图3>,....
[WHERE <>条件表达式]
[GROUP BY <列名>]
[HAVING <条件表达式>]
[ORDER BY <列名> [ASC | DESC]];

SELECT完成“投影运算”、WHERE完成“选择运算

至于“WHERE”、“GROUP BY”、”HAVING“、“ORDER BY”,我们之后再说 

DISTINCT”和“ALL”用来表示“是否对相同列去重

  • “DISTINCT”:“对具有相同属性值的记录去重”
  • “ALL”:“保留相同属性值记录”

1.2例子说明

在接下来的例子中,我们统一使用下面的三张“”作为数据来源

学生表:

课程表:

学习表:

1.3SELECT使用

SQL查询可以归纳为下面五种操作

  • 选择表中的若干列
  • 选择表中的若干元组(记录)
  • 对查询进行分组
  • 使用集函数
  • 对查询结果排序

1.3.1在学生表中找出所有学生的籍贯

SELECT DISTINCT 籍贯
FROM 学生;

1.3.2查询学生表中的所有信息

两种方法:

一种是手动列出所有属性

SELECT 学号,姓名,性别,籍贯,出生年份,院系
FROM 学生;

另一种使用:*”代指所有属性

SELECT *
FROM 学生;

1.3.3给列定义别名返回

如果一个属性名字不是我们想要的,我们可以设置这个属性名字并返回,方法:

COLUMN AS <别名> 或者 COLUMN <别名>

 例如:

SELECT 学号 year(now()) - 出生年份 AS 年龄
FROM 学生;

结果:

在这里,我们将:“year(now()) - 出生年份”的名字修改为:“年龄

1.4WHERE的使用

查询满足指定条件的元组可以通过WHERE实现,可以这么理解,WHERE的作用是“编程语言中的if

可用连接词:

1.4.1查询所有不及格课程的学生的学号、课程号及成绩

SELECT 学号,课程号,成绩
FROM 学习
WHERE 成绩 < 60;

1.4.2在学生表中找出信电学院2000年后出生的学生的记录

SELECT *
FROM 学生
WHERE 学院 = '信电' AND 出生年份 >= 2000;

1.4.3查询出生年份在“1996-1998”年出生的学生的姓名、性别、学院、出生年份

SELECT 姓名,性别,学院,出生年份
FROM 学生
WHERE 出生年份 BETWEEN 1996 AND 1998;

这条查询语句等价于:

SELECT 姓名,性别,学院,出生年份
FROM 学生
WHERE 出生年份 >= 1996 AND 出生年份 <= 1998;

1.4.4查询信电学院、理学院、计算机学院的学生的学号、姓名、学院

SELECT 学号,姓名,学院
FROM 学生
WHERE 学院 IN ('信电','理学院','计算机');

这条查询语句等价于:

SELECT 学号,姓名,学院
FROM 学生
WHERE 学院 = '信电' OR 学院 = '理学院' OR 学院 = '计算机';

可以看到“IN”在某个“()”中起到选择的作用,可以是“()”中的任意一个,即相当于“OR”(),因为我们查询的是三种学院,所以只要是三种学院中的一种即可。

1.4.4查询学院不是“信电学院”的学生的学号、姓名、学院

在某个学院,我们可以使用“IN”,那么不在某个学院,我们可以使用“NOT IN”,表示“除了..

SELECT *
FROM 学生
WHERE 学院 NOT IN ('信电');

1.5字符匹配(模糊匹配)

字符匹配可以帮助我们从字符串中筛选“符合要求”的“子串

语法:

[NOT] LIKE '<匹配串>' [ESCAPE '<转码字符>']

匹配串”:可以是一个完整的字符串,也可以含有通配符“%”和“_

  • “%”:表示任意长度(可以为0)的字符串
  • “_”:表示任意单个字符

1.5.1查询所有姓王的学生的姓名、学号、性别

SELECT 姓名,学号,是性别
FROM 学生
WHERE 姓名 LIKE '王%';

1.5.2查询名字中,第二个字为“小”字的学生的姓名和学号

SELECT 姓名,学号
FROM 学生
WHERE 姓名 LIKE '_王%';

因为是“第二个字”,所以前面一定还有一个字,为此我们需要使用一个“_”来代指第一个字,那么名字可能有第三个字、第四个字...因此我们使用“%”来表示后面的第“3”、“4”、“5”...个字

1.5.3查找课程名是“DB_Design”课程的课程号、课程性质

SELECT 课程号,课程性质
FROM 课程
WHERE 课程名 LIKE 'DB\_Design' ESCAPE '\';

在这里,因为“_”是特殊字符,所以需要使用“\”(转义字符)特别标出

1.5.4空值

如果某条元组的某个属性,是一个“空值”即“NULL”,那么就需要用“IS”来指出,其实使用”=“也是可以的,不过不建议使用

SELECT 学号,课程号,成绩
FROM 学习
WHERE 成绩 IS NULL;

1.6GROUP BY

SELECT 课程号,COUNT(学号) AS 选课人数
FROM 学习
GROUP BY 课程号;

COUNT()”函数用来计算每个组的人数,“COUNT()”函数只能和GROUP BY搭配使用,而“GROUP BY 课程号”,将相同的课程号分为一组

1.6.1查询学号在091501~091506至少选修了三门课程的学生的学号和选修课程的课程数

SELECT FROM 学号,COUNT(课程号) AS 选课数
FROM 学习
WHERE 学号 BETWEEN '091501' AND '091506'
GROUP BY 学号
HAVING COUNT(课程号) >= 3;

我们来一步一步分析:

  1. 我们需要返回:“学号”、“课程数”,而课程数就是“课程号”的数量
  2. 学号在091501~091506之间是一个范围,因此我们需要使用WHERE 筛选出符合条件的学号
  3. 因为一个学生可能会修多门学科,所以一个学生就是一个组,每组中的元素是“课程”
  4. HAVING用来对组筛选,只有组内课程(元素)大于等于3的组才会被展示出来

怎么样,这么一分析,是不是很简单了?

1.7集函数

SQL有许多集函数:

  • COUNT([DISTINCT|ALL] *) :统计元组个数
  • COUNT([DISTINCT|ALL] <列名>):统计一列中值的个数
  • SUM([DISTINCT|ALL] <列名>):计算一列值的总和
  • AVG([DISTINCT|ALL] <列名>):计算一列值的平均值(此列必须是数值型)
  • MAX([DISTINCT|ALL] <列名>):求一列值中最大值
  • MIN([DISTINCT|ALL] <列名>):求一列值中最小值

DISTINCT”和“ALL”还是老作用,用来指定是否对重复值去重

1.7.1查询学生总人数

SELECT COUNT(*) AS 总人数
FROM 学生;

COUNT(*)表示对所有元组统计,值得注意的是,使用COUNT之后,返回的元组只有一个(30),这是因为COUNT(*)对所有属性筛选并对所有属性别名为:“总人数”,并且计算后的结果只有一个“30

1.7.2查询计算机学院学生的平均年龄

SELECT AVG(year(now())-出生年龄) AS 平均年龄
FROM 学生
WHERE 学院 = '计算机';

1.7.3查询学习180101号课程的学生的最高分数

SELECT MAX(成绩) AS 最高分
FROM 学习
WHERE 课程号 = '180101';

1.8对查询结果排序

如果没有指定查询结果的显示顺序,SQL默认将其按照最方便的顺序(即先后顺序)输出结果

如果需要对结果排序,我们可以使用:“ORDER BY ASC(升序) | DESC(降序)”进行排序

注意:“ORDER BY只对最终查询结果排序,不能对中间结果排序!!!

1.8.1查询选修了180102号课程的学生的学号和成绩,查询结果按照成绩从高到低排序

SELECT 学号,成绩
FROM 学习
WHERE 课程号 = '180102'
ORDER BY 成绩 DESC;

1.8.2查询全体学生情况,查询结果按所在学院的名称升序排列,对同一学院中的学生按年龄降序排列

SELECT *
FROM 学生
ORDER BY 学院 ASC,year(now()) - 出生年份 DESC;

二.多表查询(连接查询)

2.1等值与非等值连接查询

用来连接两个表的条件称为“连接条件”或“连接谓词”,一般格式为:

[<表1>] <列1> <比较运算符> [<表2>] <列2>

 比较运算符主要有:

“=”、“>”、“<”、“>=”、“<=”、“!=”

除此之外,连接谓词还可以使用以下形式:

[<表1>] <列1> BETWEEN [<表2>] <列2> AND [<表2>] <列3>

连接谓词为“=”时,称为等值连接,使用其他运算符时为非等值连接

2.1.1查询每个学生及其选修课程的情况

SELECT 学生.*,学习.*
FROM 学生,学习
WHERE 学生.学号 = 学习.学号;

2.1.2使用自然连接“学生”表和“学习”表

自然连接是等值连接运算中的一种特殊情况,即按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列

使用自然连接,相同的属性会去重一列

SELECT 学生.学号,姓名,性别,出生年份,学院,课程号,成绩
FROM 学生,学习
WHERE 学生.学号 = 学习.学号;

2.2自身连接查询

自身连接即将一张表与自身连接在一起

2.2.1求每一门课程的间接选修课(先修课的先修课)

分析:“题目要求先修课的先修课,而表中只有先修课的信息,因此我们需要先找到一门课再按此先修课的课程号,查找它的先修课程,这相当于将表自身连接

SELECT FIRST.课程号 AS 课程号,FIRST.课程名 AS 课程名,SECOND.先修课程号 AS 间接先修课程号
FROM 课程 AS FIRST,课程 AS SECOND
WHERE FIRST.先修课程号 = SECOND.课程号;

2.3外连接查询

外连接分为:“左外连接”和“右外连接

左外连接

规定所有记录都应该从连接语句左侧的表中返回。

当右侧表中没有匹配的记录时,左标中的记录依然会返回,而对应的右侧表中的列值会自动填充NULL

2.3.2查询所有学生的姓名以及他们选修课程的课程号和成绩

SELECT 姓名,课程号,成绩
FROM 学生 LEFT OUTER JOIN 学习 ON 学生.学号 = 学习.学号;

右外连接

规定所有记录都应该从连接语句右侧的表中返回,当左侧表中没有匹配的记录时,右侧表中的值依然返回,而对应的左侧表中的值将自动填充NULL

2.3.3查询所有的课程信息及选修该课程的学生的学号及成绩

SELECT 课程名,学号,成绩
FROM 学习 RIGHT OUTER JOIN 课程 ON 学习.课程号 = 课程.课程号;

2.4复合条件连接查询

WHERE字句中有多个条件的连接操作,称为复合条件连接

2.4.1查询选修180101号课程且成绩在90分以上的学生学号,姓名及成绩

SELECT 学生.学号,姓名,成绩
FROM 学生,学习
WHERE 学生.学号 = 学习.学号 AND 学习.课程号 = '180101' AND 学习.成绩 > 90;

2.5多表连接

有时我们可能需要两张以上的表来查询,这时叫作“多表连接

SELECT 学生.学号,姓名,课程名,学习.成绩
FROM 学生,学习,课程
WHERE 学生.学号 = 学习.学号 AND 学习.课程号 = 课程.课程号;

2.6集合运算连接查询

当我们希望使用SQL语句完成:“集合运算(并、交、差)”来查询时,我们可以使用“UNION”、“INTERSECT”、“EXCEPT

MySQL支持并运算,所以我们在这里介绍“并运算”:

2.6.1查询选修了180101号或180102号课程或二者都选修了的学生学号、课程号和成绩

(
    SELECT 学号,课程号,成绩
    FROM 学习
    WHERE 课程号 = '180101'
)
   UNION
(
    SELECT 学号,课程号,成绩
    FROM 学习
    WHERE 课程号 = '180102'
)

注意:UNION运算自动去除重复

如果想保留重复,可以使用UNION ALL来代替UNION

UNION是在查询完结果之后,对两次结果进行并集

而OR是在中间结果中进行并集!!

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

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

相关文章

[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度

一、算法的时间和空间复杂度 文章目录 一、算法的时间和空间复杂度1、时间复杂度2、空间复杂度 二、Transformer的时间复杂度分析1、 self-attention 的时间复杂度2、 多头注意力机制的时间复杂度 三、transformer的空间复杂度 算法是指用来操作数据、解决程序问题的一组方法。…

专题十二、字符串

字符串 1. 字符串字面量1.1 字符串字面量中的转义序列1.2 延续字符串字面量1.3 如何存储字符串字面量1.4 字符串字面量的操作1.5 字符串字面量与字符常量 2. 字符串变量2.1 初始化字符串变量2.2 字符数组与字符指针 3. 字符串的读和写3.1 用 printf 函数和 puts 函数写字符串3.…

通俗白话了解资产负债现金利润三张表

看到一本小书不错《财务小白轻松入门》&#xff0c;里面通俗说了三张表之间的关系。贴图摘录下&#xff1a;

SSL证书添加与ICP备案,对于SpringBoot的要求

配置了SSL证书之后&#xff0c;在SpringBoot的resources文件夹里的application.properties会添加以下代码&#xff1a; server.port443 不需要添加server.address。不然会报错。 https类型的请求默认在Postman里面不可请求。 经过SSL证书处理的网页&#xff0c;链接中使默认…

RAG文本加载和分块调研

文本加载和分块 一、文本加载 文本加载是RAG文本增强检索重要环节。文件有不同类型&#xff08;excel、word、ppt、pdf、png、html、eps、gif、mp4、zip等&#xff09;&#xff0c;衍生出了很多第三方库。使用python处理文件是各种python开发岗位都需要的操作。主要涉及到的标准…

TryHackMe - HTTP Request Smuggling

学完、打完后的复习 HTTP 1 这部分比较简单&#xff0c;直接略过 HTTP2请求走私 首先要了解HTTP2的结构&#xff0c;与HTTP1之间的一些差异 HTTP2中不再使用CRLF来作为字段的边界限定&#xff0c;而是在二进制中直接通过长度、名字、值长度、值&#xff0c;来确认边界 而这…

【C++】用红黑树封装map和set

我们之前学的map和set在stl源码中都是用红黑树封装实现的&#xff0c;当然&#xff0c;我们也可以模拟来实现一下。在实现之前&#xff0c;我们也可以看一下stl源码是如何实现的。我们上篇博客写的红黑树里面只是一个pair对象&#xff0c;这对于set来说显然是不合适的&#xff…

软件可靠性基本概念_1.定义和定量描述

1.软件可靠性定义 软件可靠性&#xff08;Software Reliability&#xff09;是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。规定的条件是指直接与软件运行相关的使用该软件的计算机系统的状态和软件的输入条件&#xff0c;或统称为软件运行时的外部输入条件&am…

【MATLAB源码-第183期】基于matlab的图像处理GUI很全面包括滤波,灰度,边缘提取,RGB亮度调节,二值化等。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. RGB颜色亮度调整 1.1 RGB颜色模型 RGB颜色模型是一种加色模型&#xff0c;使用红色&#xff08;R&#xff09;、绿色&#xff08;G&#xff09;、蓝色&#xff08;B&#xff09;三种颜色的不同组合来表示各种颜色。每种…

OceanBase V4.2 MySQL模式下,如何通过DBLINK实现跨数据源访问

概述 跨数据源访问可通过 DBLINK&#xff08;以下简称DBLINK&#xff09;实现&#xff0c;从而使得业务代码能够像访问本地数据库一样轻松访问远端数据库。原先&#xff0c;DBLINK主要服务于Oracle模式&#xff0c;但由于OceanBase 的MySQL模式租户同样存在访问远端数据库的需…

【二分查找】Leetcode 点名

题目解析 LCR 173. 点名 算法讲解 1. 哈希表 class Solution { public:int takeAttendance(vector<int>& nums) {map<int, int> Hash;for(auto n : nums) Hash[n];for(int i 0; i < nums[nums.size() - 1]; i){if(Hash[i] 0)return i;}return nums.si…

【ZZULIOJ】1053: 正弦函数(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 输入x&#xff0c;计算上面公式的前10项和。 输入 输入一个实数x。 输出 输出一个实数&#xff0c;即数列的前10项和&#xff0c;结果保留3位小数。 样例输入 Copy 1 样例输出 Copy 0.841 c…

Python学习笔记11 - 列表

1. 列表的创建与删除 2. 列表的查询操作 3. 列表的增、删、改操作 4. 列表元素的排序 5. 列表生成式

PostgreSQL入门到实战-第十弹

PostgreSQL入门到实战 PostgreSQL数据过滤(三)官网地址PostgreSQL概述PostgreSQL中OR操作理论PostgreSQL中OR实操更新计划 PostgreSQL数据过滤(三) 了解PostgreSQL OR逻辑运算符以及如何使用它来组合多个布尔表达式。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列…

免费SSL证书跟付费SSL证书有什么区别?

免费SSL证书与付费SSL证书的主要区别如下&#xff1a; 1. 类型与验证级别&#xff1a; - 免费SSL证书通常仅提供域名验证&#xff08;DV&#xff09;&#xff0c;这是一种最基本的验证级别&#xff0c;仅验证域名的所有权&#xff0c;确认申请者对所申请域名的有效控制。 - 付费…

如何在 iOS 项目中集成 MiniApp SDK,快速构建智能小程序?

本文介绍如何在 iOS 项目中&#xff0c;集成 MiniApp SDK&#xff0c;使之能够构建智能生活小程序&#xff0c;运行在你的 IoT App 上。 准备工作 在集成 MiniApp SDK 之前&#xff0c;您需要在 涂鸦 IoT 开发平台 上&#xff1a; 注册开发者账号、创建产品、创建功能点等。…

汇智知了堂:AIGC引领数字营销新革命,你准备好了吗?

ChatGPT火了&#xff0c;带火的还有AIGC。 经过长时间的蓄力&#xff0c;AIGC技术落地的应用场景呈平铺式展开&#xff0c;已经逐渐渗透到各行各业中&#xff0c;AIGC时代已来。 AIGC浪潮来袭&#xff0c;电商行业从业者该如何应对&#xff1f; AIGC技术会给电商行业带来哪些变…

排序算法—快速排序

文章目录 快速排序一、递归实现二、非递归实现总结 快速排序 以下均以排升序为最终目的。 一、递归实现 有一个排序能解决所有问题吗&#xff1f;没有&#xff01;不过&#xff0c;快速排序这种排序适用于大多数情况。 我们前面讨论排序算法一般都是先讨论一趟的情况&#…

传输层 --- TCP (上篇)

目录 1. TCP 1.1. TCP协议段格式 1.2. TCP的两个问题 1.3. 如何理解可靠性 1.4. 理解确认应答机制 2. TCP 报头中字段的分析 2.1. 序号和确认序号 2.1.1. 序号和确认序号的初步认识 2.1.2. 如何正确理解序号和确认序号 2.2. TCP是如何做到全双工的 2.3. 16位窗口大小…

TypeScript系列之-理解TypeScript类型系统画图讲解

TypeScript的输入输出 如果我们把 Typescript 编译器看成一个黑盒的话。其输入则是使用 TypeScript 语法书写的文本或者文本集合。 输出是编译之后的 JS 文件 和 .d.ts 的声明文件 其中 JS 是将来需要运行的文件(里面是没有ts语法&#xff0c;有一个类型擦除的操作)&#xff0…