mysql操作(进阶)

news2024/12/27 19:27:34

1.数据库约束

数据库自动对数据的合法性进行校验检查的一系列机制,目的是为了保证数据库中能够避免被插入或者修改一些非法数据。

(1)mysql中提供了以下的约束:

a.NOT NULL:指定某列不能为null

b.UNIQUE:该列不能重复的值(唯一)

通过UNIQUE这个约束,会让后续插入,修改数据时都会先进行一次查询,通过该次查询看数据是否存在,从而这个操作就会影响执行效率(Mysql数据库是比较吃资源的,是一个比较慢的系统(相对其他数据库而言))。

c.PRIMARY KEY:主键,是NOT NULL和UNIQUE的结合,代表某列既不能为null,且是唯一的

一张表中只有一个主键。主键一般会搭配auto_increment(自增)来进行使用,在进行插入数据的时候,就不需要手动去赋值,mysql会根据当前主键的值自动分配一个值(从1开始),用来表示主键的唯一性。

使用auto_increment(主键一般是int/bigint类型)时需要注意:

如果此时里面已经有1,2,3,4这几个主键,此时插入一个主键:9,此时后续在进行插入数据时,会从9开始往后加,中间主键没用到的地方,只能通过手动插入的方式来进行设置。

eg:现有一张表student(create table student values(id int primary key auto_increment,name varchar(20)); ),里面有id(主键)和name属性,此时插入数据(insert into student values(null,"lisi"),(null,"zhangsan");),可以看到这里的主键在添加auto_increment对id传null表示交给mysql去处理,给我们自动分配一个值,而不是表示null值;如果没有这个auto_increment的话就会报错,主键不能为null。

d.FOREIGN KEY:外键,保证一个表中的数据匹配另一个表中的值的参照完整性

ps:

外部约束的那一列必须是主键/UNIQUE(唯一),被外部约束的键放在前面,外部进行约束的键放在最后。两张表此时相当于建立了一个父子关系。如果外键创建成功,那么每一次插入/修改数据的时候,都会先去父表中查询一下是否存在,这个过程也会一定程度上影响执行效率。

eg:class表(父):create table class values(classid int primary key, classname varchar(20);)

student表(子):create table student values(id int,name varchar(20), foreign key(id) references class(classid);)

如果class中classid不是主键,创建student表时不会创建成功。如果创建成功,student表中id属性将会被class中classid属性给约束,id属性进行插入时,只能插入classid中有的值,没有的插入不成功(父类约束子类);如果想对class中的classid属性进行修改,如果在student中被用了,此时修改不会成功(子类在一定程度上也会约束父类)。

不能直接删除父表,如果要删除需要先删除子表,然后再进行删除父表。

e.CHECK:保证列中的值符合指定条件,对于Mysql数据库,忽略CHECK字句

f.DEFAULT:某列在没有赋值的时候的默认值,没有进行修改这个dafault就默认为null

以上约束都是在表创建时所加的约束,一旦表已经创建好了,就不可在进行约束的更改,除非删表重新创建表。

2.查询(进阶)

(1)查询搭配插入使用

eg:insert into s1 select * from s2;  将s2中的所有数据插入到s1中,前提:两个表中的数据类型,个数,顺序要一致。  

(2)聚合查询

前面的表达式查询是针对列与列之间的查询,而聚合查询是针对行与行之间的查询。

a.count 

eg:select count(*) from s1; ( 假如s1表中有8条数据,其中有一条为null)

select count(distinct english) from s1;( s1表中有个english属性,english属性中一条null记录,两条重复的记录) 

此时得到的结果为8(count(*)这个操作会包含null这条记录,且不会进行去重),但单单用count计算某一列的数量(如果没加distinct的话,此时也是计算的总行数,加了去重的话就不一定了),不会将null计算进去(在这里得到的结果也就是7),

b.sum

数字类型求和:

eg:select sum(english) from s1; (计算s1表中所有english加起来的成绩)

字符窜类型求和:

eg:select sum(name) from s1;(这个操作,mysql会尝试把字符串转化成double类型的数据,如果转化失败,会报错;否则可以正常进行运算)结果为0,并且会报警告(可以通过show warnings; 操作进行警告的查看)

如果有这样的规则,那么插入数据:insert into s1 values("006",95);(以"数字"的这种形式) ,此时对name进行求和就可以得到6;

表达式求和:

eg:select sum(english+chinese) from s1;(s1表中还有个chinese属性,此时结果为整个表中chinese和english的总和)

其他使用方式大多相似,不一一进行列举,参考上述两种方式。

(3)group by

主要有两种用法:

加where:分组之前的的条件,在group by 之前

加having:分组之后的条件,在group by 之后

eg:现有一张工资表(一个公司各个职位的工资)s(有name,role,salary属性),现要查询除了张三以外所有员工(分职位)的平均工资,应该执行的操作为:select name avg(salary) from s where name != "张三" group by role; 很明显这个条件应该是在分组之前被执行,所以用where。现还要查询每个岗位的工资,除了工资超过2w的岗位,应该执行的操作为:select name,avg(salary) group by role having avg(salary) < 20000; 

(4)联合查询

前面的查询都是针对一个表进行查询,而在实际开发过程中,经常可能会对多个表进行查询,此时就需要用到联合查询。

关键思路:笛卡尔积。笛卡尔积是简单无脑的排列组合,把所有情况都列举了一遍,需要通过连接条件来筛选出有意义的数据。笛卡尔积的行数是多个表的行数相乘,列数是多个表的列数相加。

a.内连接

语法:select 列名 from 表1 as 别名1,表2 as 别名2 where 连接条件 and 连接条件;

select 列名 from 表1 as 别名1 [inner] join 表2 as 别名2 on 连接条件 and 连接条件;

b.外连接

分为左外连接和右外连接。左侧的表(表1)完全显示出来就是左外连接,右侧的表(表2)完全显示出来就是有外连接,另一侧表不存在的用null/default填充。

语法:select 列名 from 表1 as 别名1 left join 表2 as 别名2 on 连接条件 and 连接条件;

select 列名 from 表1 as 别名1 rightjoin 表2 as 别名2 on 连接条件 and 连接条件; 

内连接和外连接的关系:

如果两张表中的数据是一一对应的,则内连接与外连接没有区别;

如果不是一一对应的,则内外连接所查询到的结果不同。

(5)自连接

一张表,自己与自己进行笛卡尔积,通过此方式可以实现一张表中行与行之间的比较。mysql本身只能进行列与列之间的比较。

(6)子查询

本质是套娃,会把多个简单的sql语句变成一个复杂的sql语句,违背了编程设计的一贯原则,在实际开发中不建议使用,但是还是需要了解一下。

eg:现在有stutdent表(里面有name,classid等属性),现在要查询“张三”(假设张三所在班编号为1)的同班同学,应该执行的操作:select classid from student where name = “张三”; select name,classid from student where classid = 1 and name != "张三";  而用子查询的话sql语句:select name,classid from student where classid = (select classid from student where name = “张三”) and name != "张三";

(7)合并查询

使用union关键字,把多个sql查询的结果集合,合并在一起。合并的前提是两个表的列属性参数类型,个数和顺序(列名可以不同)要相同。

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

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

相关文章

防火墙工具iptables应用详解

文章目录 前言一、Netfilter内核二、Netfilter与iptables的关系三、iptables的表与链四、iptables的常用命令与参数五、 iptables使用案例 前言 iptables是Linux系统中一款强大的防火墙工具&#xff0c;它基于Netfilter内核模块&#xff0c;允许管理员定义数据包的转发、过滤和…

RabbitMQ中如何防止消息堆积的情况发生?

RabbitMQ中如何防止消息堆积的情况发生&#xff1f; 消息堆积是消息队列系统中常见的问题&#xff0c;尤其是在高负载环境下。RabbitMQ作为一个流行的消息代理系统&#xff0c;也不可避免地会遇到这种情况。为了防止消息堆积&#xff0c;我们可以采取以下几种方法&#xff1a;…

基于node.js中国传统节日介绍网站32006-计算机毕业设计项目选题推荐(附源码)

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中国传统节日介绍网站当然也不能排除在外。中国传统节日介绍网站是以实际运用为开发背景&#xff0c;运用软件工程原理和…

Ubuntu22.04系统下,图像修复项目CodeFormer的部署——点动科技

Ubuntu22.04系统下&#xff0c;图像修复项目CodeFormer的部署——点动科技 一、前言&#xff1a;二、开始2.1 ubuntu和docker基本环境配置1.更新包列表&#xff1a;2. 安装docker依赖3. 添加docker密钥4.添加阿里云docker软件源5.安装docker6.安装完成docker测试7. docker配置国…

windows11远程桌面如何打开

随着远程办公的普及&#xff0c;选择合适的远程桌面工具变得尤为重要。在Windows 11上&#xff0c;用户可以利用系统自带的远程桌面功能&#xff0c;或选择更专业的第三方解决方案&#xff0c;如Splashtop。本文将详细介绍如何在Windows 11上启用远程桌面&#xff0c;并对比Win…

C语言——位运算

一、位运算符和位运算 C语言提供如下表所列出的位运算符&#xff1a; 说明&#xff1a; (1)位运算符中除&#xff5e;以外&#xff0c;均为二目(元)运算符&#xff0c;即要求两侧各有一个运算量。 (2)运算量只能是整型或字符型的数据&#xff0c;不能为实型数…

简单的docker学习 第4章 docker容器

第4章 Docker容器 4.1 容器基础 4.1.1 容器启动流程 通过 docker run 命令可以启动运行一个容器。该命令在执行时首先会在本地查找指定的镜像&#xff0c;如果找到了&#xff0c;则直接启动&#xff0c;否则会到镜像中心查找。如果镜像中心存在该镜像&#xff0c;则会下载到…

读零信任网络:在不可信网络中构建安全系统10认证身份

1. 用户所知道的信息 1.1. 只有用户本人知道的信息 1.2. 密码 1.2.1. 密码是常用的认证机制 1.2.2. 密码验证就是确认用户“所知”性的较好途径 1.2.3. 用户可以利用密码管理器来便捷地管理多个高强度密码&#xff0c;从而有效降低数据泄露风险 1.2.4. 长度足够长 1.2.4.1…

Docker数据管理,数据卷,容器服务器数据卷

一、容器的数据管理介绍 1.1 Docker容器分层 Docker镜像由多个只读层叠加而成&#xff0c;启动容器时&#xff0c;Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件&#xff0c;那该文件将会从读写层下面的只读层复制到…

GroupMamba实战:使用GroupMamba实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

基于NSGAII的的柔性作业调度优化算法MATLAB仿真,仿真输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于NSGAII的的柔性作业调度优化算法MATLAB仿真,仿真输出甘特图,完工时间:,延期,机器负载,机器能耗。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &a…

Stack Overflow2024年度调查:76%的程序员正在或计划使用AI工具!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之路不迷路,2024我们一起变强。 1. 最受…

零售EDI:OBI欧倍德EDI项目案例

OBI欧倍德公司是德国建材和家居装饰零售连锁店&#xff0c;在德国以及其他欧洲国家拥有众多分店&#xff0c;是欧洲领先的DIY&#xff08;Do It Yourself&#xff09;零售商之一。为了更好地处理与全球供应商之间的业务数据往来&#xff0c;OBI采用EDI提高其供应链的自动化水平…

继承(一)

概念&#xff1a;继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层次结构&#xff0c…

基于Verilog HDL的FPGA开发入门

在电子设计自动化领域&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;是一种强大的工具&#xff0c;它允许设计者在硬件层面上实现自定义的逻辑电路。Verilog HDL&#xff08;硬件描述语言&#xff09;是描述FPGA设计的主要语言之一&#xff0c;以其简洁性和强大的功…

工具收集 - tinytask(相当于迷你的按键精灵)

工具收集 - tinytask&#xff08;相当于迷你的按键精灵&#xff09; 简介首页 简介 TinyTask 是一款极简主义的 PC 自动化应用程序&#xff0c;您可以用它来记录和重复操作。顾名思义&#xff0c;它小得令人难以置信&#xff08;仅 36KB&#xff01;&#xff09;&#xff0c;极…

调度系统之Oozie

Apache Oozie 是一个工作流调度系统&#xff0c;专门设计用于管理在 Apache Hadoop 平台上运行的工作流。Oozie 提供了丰富的功能&#xff0c;使得大规模数据处理任务的调度和管理变得更加高效和灵活。以下是对 Oozie 的详细介绍&#xff1a; 核心功能 1. 工作流管理 Oozie 允…

营养学基础

目录 一&#xff0c;指标概念 二&#xff0c;中国居民膳食矿物质 三&#xff0c;婴儿奶粉矿物质计算 1&#xff0c;冲奶粉 2&#xff0c;奶粉营养表 3&#xff0c;计算示例 一&#xff0c;指标概念 简单来说&#xff0c;UL是上限&#xff0c;其他3个是推荐值。 RNI的可信…

牛客JS题(二十四)验证是否是身份证

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 正则表达式一代与二代身份证判断 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><style>/* 填写样式 */</style></head><…

【旧数字组合新数字】有1,2,3,4个数字,求能组成多少个互不相同且无重复数字的三位数,都是多少

有1&#xff0c;2&#xff0c;3&#xff0c;4个数字&#xff0c;求能组成多少个互不相同且无重复数字的三位数&#xff0c;都是多少&#xff0c;使用C语言实现 具体代码&#xff1a; #include<stdio.h>int main(){int i,j,n;for(i1;i<5;i){for(j1;j<5;j){for(n1;…