【SQL】关系模型与查询和更新数据

一、关系模型

1.1 主键

主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。

可以使用多个列作为联合主键,但联合主键并不常用。

1.2 外键 FOREIGN KEY

关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。

1.3 索引

  • 可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
  • 对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。
  • UNIQUE关键字我们就添加了一个唯一索引。
  • 通过对数据库表创建索引,可以提高查询速度。通过创建唯一索引,可以保证某一列的值具有唯一性。数据库索引对于用户和应用程序来说都是透明的。

二 、查询数据

附录:表-students

id

class_id

name

gender

score

1

1

小明

M

90

2

1

小红

F

95

3

1

小军

M

88

4

1

小米

F

73

5

2

小白

F

81

6

2

小兵

M

55

7

2

小林

M

85

8

3

小新

F

91

9

3

小王

M

89

10

3

小丽

F

88

2.1 基本查询

SELECT * FORM

查询一个表的所有行和所有列的数据,SELECT查询的结果是一个二维表。

2.2 条件查询

  • SELECT * FROM WHERE
  • 条件表达式可以:AND、OR、NOT
  • 优先级:NOT、AND、OR,加括号可以改变优先级。

2.3 投影查询

Select 列1,列2,列3,则可以进返回指定列,这种称为投影。

SELECT id, score points, name FROM students WHERE gender = 'M';

2.4 排序

  • ORDER BY:SELECT id,name,FROM studentS ORDER BY score;
  • DESC 倒序:SELECT id,name,FROM studentS ORDER BY score DESC;
  • ASX 升序,从小到大:

SELECT id, name, gender, score FROM students WHERE class_id = 1 ORDER BY score DESC;

使用ORDER BY可以对结果进行排序,可以对多列进行升序、倒序排序。

2.5 分页查询

  • 使用LIMIT OFFSET 可以对结果集进行分页,每次查询返回结果集的一部分
  • LIMIT总是设定为pageSize;
  • OFFSET计算公式为pageSize * (pageIndex - 1)。这样就能正确查询出第N页的记录集。

案例:

--查询第4页 SELECT id, name, gender, score FROM students ORDER BY score DESC LIMIT 3 OFFSET 9;

2.6 聚合查询

除了COUNT()函数外,SQL还提供了如下聚合函数:

函数

说明

SUM

计算某一列的合计值,该列必须为数值类型

AVG

计算某一列的平均值,该列必须为数值类型

MAX

计算某一列的最大值

MIN

计算某一列的最小值

注意,MAX()和MIN()函数并不限于数值类型。如果是字符类型,MAX()和MIN()会返回排序最后和排序最前的字符。

-- 使用聚合查询计算男生平均成绩: SELECT AVG(score) average FROM students WHERE gender = 'M';

要特别注意:如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL:

-- WHERE条件gender = 'X'匹配不到任何行: SELECT AVG(score) average FROM students WHERE gender = 'X';

分组

GROUP BY

-- 查出每个班级的平均分,结果集应当有6条记录: SELECT class_id, gender,AVG(score) FROM students GROUP BY gender,class_id;

class_id

gender

AVG(score)

1

M

89

1

F

84

2

F

81

2

M

70

3

F

89.5

3

M

89

2.7 连接查询

  • 是一种多表查询,JOIN运算,简单的说就是先确定一个主表作为结果集,然后把其他表的性有选择地“连接”在主表结果集上。
  • INNER JOIN是最常用的一种JOIN查询,它的语法是SELECT ... FROM INNER JOIN ON ;
  • JOIN查询仍然可以使用WHERE条件和ORDER BY排序
  • 其他的语法如下:

三、修改数据

3.1 INSERT 一次向一个表中插入1条或者多条记录

语法: INSERT INTO (字段1,字段2) VALUES (值1,值2,值N...)

添加一条记录

insert into students(class_id,name,gender,score)values (2,'daniu','M',80)

添加多条记录

insert into students(class_id,name,gender,score)values (2,'daniu','M',80),(3,'xxx','M',90)

3.2 UPDATE 一次向一个表中更新1条或者多条记录

语法: update 表名 set 字段1=值1,字段2=值2 where ...;

eg: update students set name=‘大牛’,score=66 where id=6;

  • update的where和select的where条件是一样的
  • update可以使用表达式,如update students set score=score+10
  • where条件没有匹配到任何记录,update也不会报错,也不会有任何记录被更新,如update students set score=1000 where id=999;
  • UPDATE后面可以没有WHERE,,如

UPDATE students SET score=60;

这时,整个表的所有记录都会被更新。所以,在执行

UPDATE语句时要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用UPDATE更新。

  • 注意 MYSQL中的更新方式:update语句会返回更新的行数以及where条件匹配行数。eg:mysql> UPDATE students SET name='大宝' WHERE id=1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

3.3 DELETE 删除一条或多条记录

语法

delete from 表名 where..;

  • 删除1条记录:eg:delete from students where id=1;
  • 删除多条记录,可以使用条件表达式:delete from students where id>=5 and id
  • 如果没有匹配结果,那么也不会报错。
  • 最后,要特别小心的是,和UPDATE类似,不带WHERE条件的DELETE语句会删除整个表的数据:

DELETE FROM students;

这时,整个表的所有记录都会被删除。所以,在执行DELETE语句时也要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用DELETE删除。

  • MYSQL中的使用:delete语句可以已返回删除的函数以及where条件匹配的行数。如:mysql> DELETE FROM students WHERE id=1;

Query OK, 1 row affected (0.01 sec)

四、参考资料

关系模型

查询数据

修改数据

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

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

相关文章

Compose学习 - 环境配置及compose、kotlin插件、gradle、AndroidStudio版本对应关系

最近学习Compose,一开始学习的Compose版本是1.1.1,学习的过程中发现, LazyHorizontalGrid这个方法只有在1.2.0以后版本才支持。 想着既然要升级,直接用最新的好了。后面按照官网建议,下载了最新的AndroidStudio&#…

设计模式-7--代理模式(Proxy Pattern)

一、什么是代理模式(Proxy Pattern) 代理模式(Proxy Pattern)是一种结构型设计模式,它允许一个对象(代理)充当另一个对象(真实对象)的接口,以控制对该对象的…

如何飞速成为开源贡献者(Contributor)

如何飞速成为开源贡献者Contributor 一、环境信息1.1 硬件信息1.2 软件信息 二、Git安装2.1 Git介绍2.2 Git下载安装 三、开源项目选定四、GitHub参与开源流程4.1 Fork项目4.2 SSH配置4.2.1 为什么要配置SSH4.2.2 如何配置SSH 4.3 Clone项目4.4 IDEA关联4.5 PR生成4.6 PR提交 一…

SpringCloud入门实战(十五)分布式事务框架Seata简介

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…

虚拟世界指南:从零开始,一步步教你安装、配置和使用VMware,镜像ISO文件!

本章目录 CentOS简介镜像下载一、新建虚拟机(自定义)1、进入主页,在主页中点击“创建新的虚拟机”2、点击创建虚拟机创建自己的虚拟机。可以选择自定义3、在“硬件兼容性(H)中选择:Workststion 15.x” ->下一步4、选择“稍后安…

牛客网刷题

牛客网刷题-C&C 2023年9月3日15:58:392023年9月3日16:37:01 2023年9月3日15:58:39 2023年9月3日16:37:01 整型常量和实型常量的区别

已知两地经纬度,计算两地直线距离

文章目录 1 原理公式2 代码实现2.1 JavaScript2.2 C2.3 Python2.4 MATLAB 1 原理公式 在地球上,计算两点之间的直线距离通常使用地理坐标系(例如WGS84)。计算两地直线距离的公式是根据经纬度之间的大圆距离(Great Circle Distanc…

2024王道408数据结构P144 T18

2024王道408数据结构P144 T18 思考过程 首先还是先看题目的意思,让我们在中序线索二叉树里查找指定结点在后序的前驱结点,这题有一点难至少对我来说…我讲的不清楚理解一下我做的也有点糊涂。在创建结构体时多两个变量ltag和rtag,当ltag0时…

Python实现多子图绘制系统

文章目录 修改DrawTypeDrawType的调用逻辑绘图逻辑源代码 Python绘图系统: 📈从0开始的3D绘图系统📉一个3D坐标系,多个函数图表类型和风格:📉极坐标绘图📊散点图和条形图📊混合类型…

java.sql.SQLException: com.mysql.cj.jdbc.Driver

这篇文章分享一下Springboot整合Elasticsearch时遇到的一个问题,项目正常启动,但是查询数据库的时候发生了一个异常java.sql.SQLException: com.mysql.cj.jdbc.Driver java.sql.SQLException: com.mysql.cj.jdbc.Driverat com.alibaba.druid.util.JdbcU…

软件架构模式+系统架构

架构模式对比 分层模式 一般信息系统中最常见的4层划分如下: Presentation layer 表示层(也就是UI层)Application layer 应用层(也就是服务层)Business logic layer 业务逻辑层(也就是领域层)…

eureka服务注册和服务发现

文章目录 问题实现以orderservice为例orderservice服务注册orderservice服务拉取 总结 问题 我们要在orderservice中根据查询到的userId来查询user,将user信息封装到查询到的order中。 一个微服务,既可以是服务提供者,又可以是服务消费者&a…