MySQL对表操作

目录

CRUD

增加(Create)

查询(Retrieve)

全列查询

指定列查询

查询字段为表达式 

别名

去重:DISTINCT 

排序:ORDER BY

条件查询:WHERE

逻辑运算符:

修改(Update)

删除(Delete) 

数据库约束

约束的作用:

约束类型:

NULL约束

 UNIQUE:唯一约束

DEFAULT:默认值约束

 PRIMARY KEY:主键约束

FOREIGN KEY:外键约束 

check约束

表的设计

查询

单表查询

聚合函数

GROUP BY子句

HAVING 

多表查询 

笛卡尔积

消除笛卡尔积

内连接:

外连接 

全链接


结束了上一章内容,我们对数据库的操作有一定的了解,本章内容就是针对表中的数据进行操作的。

针对表中数据的操作绝大部分都是增删改查(CRUD),CRUD也就是四个单词的缩写:

增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete);

这也是数据库存在的主要目的。

CRUD

增加(Create)

增加即向表中插入数据,上一章中已经提到过了,基本语法如下:

insert into 表名 value(值1,值2......);【单行插入】

insert into 表名 values(值1,值2......),(值1,值2......);【多行插入】

例如:

 values 方式插一行,插多行都可以,但是value每次只能插入一行记录。

查询(Retrieve)

全列查询

 如上图,我们用的是 *  的方式是全列查询,上一章也提到,对于大数据的查询是非常危险的,带宽会被这一条语句占满,服务器不可能只服务一个用户端。

指定列查询

有时候呢,我们一张表有很多的数据,比如一个人,有年龄,性别,名字,是否已婚,等等....;但是我们有时候又不是需要全部信息,我们只需要取一部分,那么这就需要我们的指定列查询了。

还是拿 student 表来举例:我们拿出所有学生的名字:

 否则就会报错:

查询字段为表达式 

 select 表达式 对比结果如下:

别名

为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称,语法:

SELECT column [AS] alias_name [...] FROM table_name;
就是有时候我们不想让列名那么奇怪,或者我们像简单点表示列名,那就需要用到别名。

例如,我们设置一个成绩表,并添加数据:

我想查询每个人的总分数:

我们可以怎么写:

 这时候我们看这个总分的列名非常不好,于是可以用到别名:

 这下舒服多了!

去重:DISTINCT 

 使用DISTINCT关键字对某列数据进行去重;

就拿上面的分数表来说,我再次添加一个数据:

我们现在查询数学成绩看看结果:

 去重也就是取出重复数据,我们来试试看:

 结果的确是将重复数据剔除了。

排序:ORDER BY

上学时期每次考完试,班主任总会对学生的总分进行排序,我们这里也不例外;

我们也可以对上面总成绩进行一个排序;

语法如下:

-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

结果如下:

 我们也可以升序排序:

asc 是升序,默认也是升序; desc 的 全拼是 descend(下降)。

条件查询:WHERE

我们在查询的时候会对一些数据进行筛选,并非全部数据都是我们需要的,而 where 条件查询也分很多:

 比较运算符:

运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=>等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <>不等于
BETWEEN a0 AND
a1
范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, ...)如果是 option 中的任意一个,返回 TRUE(1)
IS NULL是 NULL
IS NOT NULL不是 NULL
LIKE模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字

举个例子:

比如我想查找,总分大于250 分的所有同学,我们可以这么写:

但是我觉得怎么写,sum 总分不好看,我们再换一种写法: 

这里我们发现,sum是未定义的,为什么呢?

起别名是在进行排序的时候起的,而排序是在 where 筛选之后才有的,当然找不到sum列了

我们发现这样的写法也是错误的,那么只能:

除了比较运算符,还有其他的的运算符:

逻辑运算符:

运算符说明
AND多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT条件为 TRUE(1),结果为 FALSE(0)

相信大家对逻辑运算符是不陌生的,在Java中不知道写过多少了。

举例:

我要查询数学和语文都大于90 分的全部信息:

我们就可以用and语句来执行:

或者,我要查询,语文或数学大于 90 的人:

对条件查询做个小结:

1. WHERE条件可以使用表达式,但不能使用别名。
2. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分 

对上面的查询,我就不一一举例了,没事的时候,可以自己动手试一试,光是看无法提升自己的能力,不会的时候可以动手查;反正现在是学习时间,有足够的时间试错!

修改(Update)

在我们添加数据的过程中总会出现添加错误的情况,在这种情况下先删除,再添加显然不是最好的方法,于是就有了修改。

基本语法如下:

UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]

比如:

将张三的语数英都改为100 分:

等等,我就不一一举例了。

删除(Delete) 

对于过时的数据,我们就需要执行删除操作:

基本语法如下:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

比如我们需要删除 jerry 的成绩:

 上述都是对表中数据的简单操作,现在进入进阶部分,难度要大于以上内容。

数据库约束

约束的作用:

一般在创建表的时候需要给数据添加各种约束以保证添加到表中的数据是正确的,保证数据的有效性、完整性和正确性;若违反了约束,则无法添加进入表中;若是先添加数据再加约束,若其中有数据违反了约束则约束添加失败。

约束类型:

NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句

NULL约束

我们重新创建一个学生表 设置id不为空:

 UNIQUE:唯一约束

sn列为唯一的、不重复的

DEFAULT:默认值约束

指定插入数据时,name列为空,默认值unkown:

 PRIMARY KEY:主键约束

指定id列为主键:

 对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。

例如:

FOREIGN KEY:外键约束 

外键用于关联其他表的主键或唯一键 , 基本语法如下:

foreign key (字段名) references 主表(列)

举例:

 这就把两个表链接起来了。

check约束

了解即可:

MySQL使用时不报错,但忽略该约束:

表的设计

本章不涉及表的设计,对于刚刚入职的而言,在这方面压根不会让我们上,这玩意需要一段时间的累积,初学者其实没必要去掌握。等以后技术起来了再来了解。

查询

单表查询

顾名思义,单表查询就是对一个表进行查询。

聚合函数

聚合查询类似于Java中的API,系统给我们写好的函数,我们直接拿来用即可,常用的聚合函数如下:

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义

我们拿几个举例:

看看我之前写好的员工表:

假设我们要计算有多少个员工,就可以用count() 这个函数:

一个count(*)解决问题;

 count()里面也可以是其他列名。

再比如,我想知道其中工资最高的男员工:

 其他的用法类似,我就不一一举例了,可以自己一个个去试。

GROUP BY子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中;语法如下:

select column1, sum(column2), .. from table group by column1,column3;

就拿上面的例子:

找出每个部门中工资最高的的一个:

 找出每个部门的最高工资,平均工资,最低工资:

HAVING 

having 作用于group by 语句之后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用having。

例如:

 找出每个部门的最高工资,平均工资,最低工资;并且平均工资高于11000 的部门情况:

多表查询 

在了解多表查询之前我们得了解以下:笛卡尔积

笛卡尔积

 简单的说就是两个集合相乘的结果;

我们可以百度查一下,下面是我搜索的:

现在,我们有两个集合A和B。

A = {0,1} B = {2,3,4}

集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

可以得出A×B和B×A的笛卡尔积,但总体思路为用

以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。

从以上的数据分析我们可以得出以下两点结论:

1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;

2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;

我们举个例子,来看看结果如何?

创建一个学生表和课程表:结果如下:

 笛卡尔积就是将我们选中的两个表进行一个排列组合;

因此,需要注意的是:我们在进行多表查询的时候(计算笛卡尔积的过程),如果两个表数据很,就会非常低效,甚至成为危险操作

所以对其操作要小心!!!

Tip(多表情况):如果是三个表的话,那么就是先将两个表进行笛卡尔积运算,再用这个表与另外一个表进行笛卡尔积操作(以此类推)。

消除笛卡尔积

我们可以通过连接查询来消除笛卡尔积、连接查询分为:

内连接:

语法:

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

比如我想查询每个人的课程:

或者

 

注意:这里都有相同的记录名(classId),所以这里通过 表名.列名 的方法实现,如果不用则会报错:

 

外连接 

左连接:左连接显示的结果为tb1中所有的内容,及tb2中满足条件的内容,若tb1中有的内容而tb2中没有,则显示tb2对应的内容时显示为null

select * from tb1 Left Join tb2 where tb1.ID = tb2.ID
右连接:右连接显示的结果为tb2中所有的内容,及tb1中满足条件的内容,若tb2中有的内容而tb1中没有,则显示tb1对应的内容时显示为null

select * from tb2 Right Join tb1 where tb2.ID = tb1.ID

我们再添加一个数据看看结果:

任然 查询每个人的课程

 左连接就是以左边的表为准,即使右边的表中不存在某个数据,就为空。

右链接:

以右边的表为准右边表不存在的数据不出现。

全链接

全连接:MySQL现在不支持全连接,但可以通过unionunion all实现,但是两个表的列数必须相同

-- union 可以过滤重复数据
select * from world.city union select * from world.country;
-- union all 不会过滤重复数据
select * from world.city union all select * from world.country;

这章节就到这,其他还有一些不是那么频繁的查询可以在查查资料!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「入门指南」轻松学习嵌入式 GPIO:从原理到应用一步到位

嵌入式系统是指在其他系统中嵌入的计算机系统&#xff0c;通常由微处理器或微控制器、内存和其他支持电路组成。嵌入式系统的应用领域非常广泛&#xff0c;涉及从智能家居设备到汽车控制系统&#xff0c;再到飞机、医疗设备等各种设备。对于嵌入式系统的应用&#xff0c;GPIO是…

我在字节当主管:百次面试结果,总结一个刷掉99%求职者的问题!

我一个在大厂当主管的朋友&#xff0c;跟我说&#xff1a;“现在招性能测试太难了&#xff0c;当然不是说没人干&#xff0c;一开招聘信息就能收到一大把简历&#xff0c;其中不乏学历亮眼、背景出色、简历里各种高并发、大流量的项目经验的人才。问题在于&#xff0c;当你提出…

【C++】模板初阶

文章目录泛型编程函数模板概念格式实例化匹配原则类模板定义格式实例化泛型编程 当我们的一个函数涉及到多个类型的处理时&#xff0c;我们就需要重载函数来实现&#xff0c;但是重载函数是存在一些局限性的。   重载函数仅仅是类型不同&#xff0c;代码的复用率较低&#xf…

【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)

目录 写在前面&#xff1a; 题目&#xff1a;94. 递归实现排列型枚举 - AcWing题库 读题&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 数据范围&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码&#xff1a; AC &…

使用new bing简易教程

申请new bing 首先先申请new bing然后等待通过&#xff0c;如下图 申请完&#xff0c;用edge浏览器&#xff0c;若有科学方法&#xff0c;就能在右上角的聊天进行向AI提问 使用插件来进行直接访问New Bing 在edge浏览器中安装一个插件&#xff0c;地址为&#xff1a;Mod…

HTML樱花飘落

樱花效果 FOR YOU GIRL 以梦为马&#xff0c;不负韶华 LOVE YOU FOREVER 实现代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv"…

Windows逆向安全(一)之基础知识(二)

反汇编分析C语言 空函数反汇编 #include "stdafx.h"//空函数 void function(){}int main(int argc, char* argv[]) {//调用空函数function();return 0; }我们通过反汇编来分析这段空函数 函数外部 12: function(); 00401048 call ILT5(func…

一款丧心病狂的API测试工具:Apifox!

你好&#xff0c;我是测试开发工程师——凡哥。欢迎和我交流测试领域相关问题&#xff08;测试入门、技术、python交流都可以&#xff09; 我们平时在做接口测试的时候&#xff0c;对于一些常用的接口测试工具的使用应该都非常熟悉了&#xff1a; 接口文档&#xff1a;Swagge…

2023年网络安全比赛--attack(新)数据包分析中职组(超详细)

一、竞赛时间 180分钟 共计3小时 任务环境说明: 1 分析attack.pcapng数据包文件,通过分析数据包attack.pcapng找出恶意用户第一次访问HTTP服务的数据包是第几号,将该号数作为Flag值提交; 2.继续查看数据包文件attack.pcapng,分析出恶意用户扫描了哪些端口,将全部的端口号…

比df更好用的命令!

大家好&#xff0c;我是良许。 对于分析磁盘使用情况&#xff0c;有两个非常好用的命令&#xff1a;du 和 df 。简单来说&#xff0c;这两个命令的作用是这样的&#xff1a; du 命令&#xff1a;它是英文单词 disk usage 的简写&#xff0c;主要用于查看文件与目录占用多少磁…

π-Day快乐:Python可视化π

π-Day快乐&#xff1a;Python可视化π 今天是3.14&#xff0c;正好是圆周率 π\piπ 的前3位&#xff0c;因此数学界将这一天定为π\bold{\pi}π day。 π\piπ 可能是最著名的无理数了&#xff0c;人类对 π\piπ 的研究从未停止。目前人类借助计算机已经计算到 π\piπ 小数…

考研408 王道计算机考研 (初试/复试) 网课笔记总结

计算机初试、复试笔记总结&#xff08;导航栏&#xff09;&#x1f4dd; 408 考研人&#xff0c;人狠话不多&#xff1a;3、2、1&#xff0c;上链接 &#xff01; 408 考研初试 - 备战期&#xff0c;专业课笔记&#xff0c;导航&#x1f6a5;&#x1f6a5;&#x1f6a5; &…

编写Java哪个编译器好

现在能够编写Java代码的工具简直不要太多&#xff0c;各种各样五花八门&#xff0c;但目前效率最高的还是Intellij Idea。但这个工具对于完全零基础的小白来说&#xff0c;第一次用起来是比较复杂的&#xff0c;因为它的功能太多了。这就好比你要学开车&#xff0c;如果上来就给…

量化(1):基础知识

1. Tops的含义 1TOPS代表处理器每秒可进行一万亿次(10^12)操作 2. 定点数 2.1 定点数的含义 大家都知道,数字既包括整数,又包括小数,如果想在计算机中,既能表示整数,也能表示小数,关键就在于这个小数点如何表示? 计算机科学家们想出一种方法,即约定计算机中小数…

MySQL:JDBC

什么是JDBC&#xff1f; JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 &#xff0c;它是一种用于数据库访问的应用程序 API &#xff0c;由一组用Java语言编写的类和接口组成&#xff0c;有了JDBC就可以 用统一的语法对多种关系数据库进行访问&#xff0c;而不用担…

Docker三剑客之swarm

一、什么是docker swarm Swarm是Docker公司推出的用来管理docker集群的平台&#xff0c;几乎全部用GO语言来完成的开发的&#xff0c;代码开源在https://github.com/docker/swarm&#xff0c; 它是将一群Docker宿主机变成一个单一的虚拟主机&#xff0c;Swarm使用标准的Docker…

排序算法 - 冒泡排序

冒泡排序算法应该可以说是很经典的一种对数据进行排序的的算法了&#xff0c;甚至在很多的介绍算法的数据中&#xff0c;它可能还是放在最前面开始讲解的。 冒泡排序算法到底是咋样的呢&#xff1f;冒泡这个说法又是怎么得来的呢&#xff1f; 首先先理解一下冒泡算法的实现原理…

Java开发 - 布隆过滤器初体验

目录 前言 布隆过滤器 什么是布隆过滤器 布隆过滤器的作用 布隆过滤器原理 怎么设计布隆过滤器 布隆过滤器使用案例 安装布隆过滤器 添加依赖 添加配置 添加工具类 添加测试代码 简单测试 特别提醒​​​​​​​ 结语 前言 前面三篇&#xff0c;已经把消息队列…

裸辞3个月,面试了25家公司,终于找到心仪的工作了

​上半年裁员&#xff0c;下半年裸辞&#xff0c;有不少人高呼裸辞后躺平真的好快乐&#xff01;但也有很多人&#xff0c;裸辞后的生活五味杂陈。 面试25次终于找到心仪工作 因为工作压力大、领导PUA等各种原因&#xff0c;今年2月下旬我从一家互联网小厂裸辞&#xff0c;没…

蓝桥杯刷题第九天

题目描述本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。素数就是不能再进行等分的整数。比如7&#xff0c;11。而 9 不是素数&#xff0c;因为它可以平分为 3 等份。一般认为最小的素数是2&#xff0c;接着是 3&#xff0c;5&…