MySQL数据库3——函数与约束

一.函数

1.字符串函数

MySQL中内置了很多字符串函数,常用的几个如下:

在这里插入图片描述

使用方法:

SELECT 函数名(参数);

注意:MySQL中的索引值即下标都是从1开始的。

2.数值函数

常见的数值函数如下:

在这里插入图片描述

使用方法:

SELECT 函数名(参数);

3.日期函数

常见的日期函数如下:
在这里插入图片描述

注意:

  • datediff函数计算用的是第一个时间减去第二个时间,所以尽量让大的时间放在第一个,否则出来的结果是负数
  • date_add中间的关键字interval必不可少,例如select date_add(now(),interval 2 day);

4.流程函数

流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。

在这里插入图片描述

注意:始终要记住函数在查询语句中的使用位置。

在这里插入图片描述

二.约束

1.概述

概念:约束是作用于表中字段上的规则,用来限制存储在表中的数据

目的:保证数据库中数据的正确、有效和完整

分类:

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRMARY KEY
默认约束保存数据,如果未指定该字段值,则采用默认值DEFAULT
检查约束保证字段满足某一条件CHECK
外键约束用来让两个表的数据建立连接,保证数据一致和完整FOREIGN KEY

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

2.约束演示

在这里插入图片描述

要完成上述表的建立:

create table worker(id int primary key auto_increment comment '主键',name varchar(10) not null unique comment '姓名',age int check(age>0 && age<=120) comment '年龄',status char(1) default '1' comment '状态',gender char(1) comment '性别'
)comment '员工表';

3.外键约束

添加外键语法:

CREATE TABLE 表名(字段名 数据类型,……[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名);

这里添加外键一直报错,说一下注意事项:

  • 首先外键关联的父表与子表的字段类型保持一致
  • 如果表中已经有数据,请保证子表中对应字段的数据在父表对应的数据范围内。

删除外键:

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

当删除外键父表中的对应字段时,如果存在对应的映射关系,删除记录则会失败。

删除/更新行为:

在这里插入图片描述

语法:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ON UPDATE CASCADE ON DELETE CASCADE;

三.多表查询

在上一节简单介绍了多表查询,现在直接详细深入一下学习。

1.多表关系

​ 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所
以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多(多对一)
  • 多对多
  • 一对一

一对多:

案例:部门与员工的关系
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的关系表建立外键,指向一的关系表的主键

多对多:

案例:学生与 课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现:建立第三张中间表(SC),中间表至少包含两个外键,分别关联两方主键(S#,C#)

一对一:

案例:用户与用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

2.概述

多表查询分类:

  • 连接查询

    • 内连接:相当于查询A、B交集部分数据

    • 外连接:

      • 左外连接:查询左表所有数据,以及两张表交集部分数据
      • 右外连接:查询右表所有数据,以及两张表交集部分数据
    • 自连接:当前表与自身的连接查询,自连接必须使用表别名

  • 子查询

多表查询分为两个大类:连接查询和子查询,其中连接查询在上一节我们接触过。

3.连接查询-内连接

内连接查询的是两张表交集的部分;

隐式内连接:

SELECT 字段列表 FROM1,2 WHERE 条件……;

显示外连接:

SELECT 字段列表 FROM1 [INNER] JOIN2 ON 连接条件;

注意:在多表查询时,我们经常使用起别名的方式简化操作,但起别名后,我们不能再通过原来的表名访问字段。

4.连接查询-外连接

左外连接:

SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 条件……;

右外连接:

SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 条件……;

左连接会包含坐标的所有数据,右连接会包含右表的所有数据,具体效果实操就知道了。

5.连接查询-自连接

语法:

SELECT 字段列表 FROM 表名 别名1 JOIN 表名 别名2 ON 条件……;

自连接的连接方式可以是内连接也可以是外连接。

6.联合查询

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

SELECT 字段列表 FROM 表A……
UNION [ALL]
SELECT 字段列表 FROM 表B……;

这里的all选项是(假设第一个查询结果和第二个查询结果有交集)是否对其进行去重,保留代表不去重,没有all代表去重。

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

7.子查询

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询

子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个

四.多表查询练习

1.案例一

  1. 查询员工的姓名、年龄、职位、部门信息 (隐式内连接)

    select e.name , e.age , e.job , d.name from emp e , dept d where e.dept_id = d.id;
    
  2. 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)

    select e.name , e.age , e.job , d.name from emp e inner join dept d on e.dept_id = d.id where e.age < 30;
    
  3. 查询拥有员工的部门ID、部门名称

    select distinct d.id , d.name from emp e , dept d where e.dept_id = d.id;
    
  4. 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来

    select e.*, d.name from emp e left join dept d on e.dept_id = d.id where e.age > 40 ;
    
  5. 查询所有员工的工资等级

    select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary between s.losal and s.hisal;
    

2.案例2

  1. 查询 “研发部” 所有员工的信息及 工资等级

    select e.* , s.grade from emp e , dept d , salgrade s where e.dept_id = d.id and ( e.salary between s.losal and s.hisal ) and d.name = '研发部';
    
  2. 查询 “研发部” 员工的平均工资

    select avg(e.salary) from emp e, dept d where e.dept_id = d.id and d.name = '研发部';
    
  3. 查询工资比 “灭绝” 高的员工信息。

-- a. 查询 "灭绝" 的薪资
select salary from emp where name = '灭绝';-- b. 查询比她工资高的员工数据
select * from emp where salary > ( select salary from emp where name = '灭绝' );
  1. 查询比平均薪资高的员工信息

    -- a. 查询员工的平均薪资
    select avg(salary) from emp;-- b. 查询比平均薪资高的员工信息
    select * from emp where salary > ( select avg(salary) from emp );
    
  2. 查询低于本部门平均工资的员工信息

```sql
select * from emp e2 where e2.salary < ( select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id );
```
  1. 查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称

    -- 表: student , course , student_course
    -- 连接条件: student.id = student_course.studentid , course.id = student_course.courseidselect s.name , s.no , c.name from student s , student_course sc , course c where s.id = sc.studentid and sc.courseid = c.id ;
    

五.事务

1.事务理解

事务:是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

2.事务操作

查看/设置事务提交方式:

SELECT @@autocommit;                     -- 用来查看事务的提交方式
SET @@AUTOCOMMIT=0;

第一句用来查看事务的提交方式,如果自动提交就返回1,手动提交就返回0;第二句把提交方式设置为手动提交。

提交事务:

COMMIT;

回滚事务:

ROLLBACK

除了这一种方式以外,我们还有另一种方式进行事务操作

START TRANSACTIONBEGIN;

这种方式并没有修改事务的提交方式

3.事务特性-ACID

事务四大特性:

  • 原子性 (Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
  • 隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability): 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

4.并发事务问题

问题描述
脏读一个事务读到另一个事务还没有提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”

5.隔离级别

√表示会出线对应的问题,×表示解决了对应的问题。

查看失去隔离级别:

SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别:

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE};
  • 选项:SESSION表示仅针对当前窗口有效,GLOBAL表示针对所有窗口有效;

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

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

相关文章

Proteus 8.17的详细安装教程

通过百度网盘分享的文件&#xff1a;Proteus8.17(64bit&#xff09;.zip 链接&#xff1a;https://pan.baidu.com/s/1zu8ts1Idhgg9DGUHpAve7Q 提取码&#xff1a;8q8v 1.右击【Proteus8.17(64bit&#xff09;.zip】&#xff0c;选择【全部解压缩......】。 &#xff0c; 2.…

MySQL安装及数据库基础

目录 一. MySQL下载安装 1.1 安装&#xff08;如果之前有安装过MySQL&#xff0c;先执行下面的卸载流程&#xff09; 1.1.1 更新系统的软件包列表 1.1.2 安装MySQL服务器 1.1.3 检查MySQL服务是否启动&#xff0c;若没有启动手动启动 1.1.4 登录MySQL&#x…

NavVis VLX3的精度怎么去进行验证?【上海沪敖3D】

01、精度评价现状 三维捕捉行业还没有建立一个用于估算或验证移动激光扫描系统精度的统一标准。因此&#xff0c;需要高精度交付成果的专业人士很难相信设备所标注的精度规格&#xff0c;也就很难知道基于SLAM的移动激光扫描系统是否适合当前的项目。 NavVis将通过展示一种严格…

css3新特性(二十六课)

1、css3盒子模型 box - sizing: content - box&#xff1b; 是 CSS 中用于定义盒模型宽度和高度计算方式的一个属性值。在这种盒模型下&#xff0c;元素的宽度和高度&#xff08;width和height属性&#xff09;仅包括内容区域&#xff08;content&#xff09;的大小&#xff…

macbook外接2k/1080p显示器调试经验

准备工具 电脑 满足电脑和显示器要求的hdmi线或者转接头或者扩展坞 betterdisplay软件 Dell P2419H的最佳显示信息如下 飞利浦 245Es 2K的最佳显示比例如下 首选1152

【Hadoop】【大数据技术基础】实践三 NoSQL数据库 大数据基础编程、实验和案例教程(第2版)

第6章 典型NoSQL数据库的安装和使用 Redis安装和使用MongoDB的安装和使用 6.1 Redis安装和使用 6.1.1 Redis简介 Redis是一个键值&#xff08;key-value&#xff09;存储系统&#xff0c;即键值对非关系型数据库&#xff0c;和Memcached类似&#xff0c;目前正在被越来越多的…

零基础Java第二十二期:异常(二)

目录 一、异常的捕获 1.1. 多个异常&#xff0c;一次捕获 1.2. 异常之间的父子关系 1.3. finally 二、自定义异常 一、异常的捕获 1.1. 多个异常&#xff0c;一次捕获 由于Exception类是所有异常类的父类&#xff0c;因此可以用这个类型表示捕捉所有异常。也就是说&am…

IO流(九):打印流-字节打印流PrintStream、字符打印流PrintWriter

目录 1、什么是打印流&#xff1f; 2、字节打印流-PrintStream 2.1 代码演示以及注释 2.2 演示几种字节打印流常用的创建方式 3、字符打印流-PrintWriter 3.1 代码演示以及注释 3.2 演示几种字符打印流常用的创建方式 4、案例-System.out.println();输出内容重定向到指…

如何将几个音频合成一个音频?非常简单的几种合成方法

如何将几个音频合成一个音频&#xff1f;音频合成不仅仅是将不同的音频文件按顺序排列&#xff0c;它还可能涉及到音量调节、剪辑、淡入淡出、音效调整等多个方面。对于一些专业的音频制作人员来说&#xff0c;音频的每一部分细节都可能需要精心打磨&#xff0c;以确保最终合成…

JVM性能分析工具JProfiler的使用

一、基本概念 JProfiler&#xff1a;即“Java Profiler”&#xff0c;即“Java分析器”或“Java性能分析工具”。它是一款用于Java应用程序的性能分析和调试工具&#xff0c;主要帮助开发人员识别和解决性能瓶颈问题。 JVM&#xff1a;即“Java Virtual Machine”&#xff0c…

Flutter 扫描二维码

在今天的移动开发中&#xff0c;二维码扫描已经成为了常见的功能之一。Flutter作为一款跨平台的开发框架&#xff0c;提供了丰富的插件和功能&#xff0c;使得开发者可以轻松实现二维码扫描以及图像识别功能。本文将介绍如何在Flutter中通过结合 scan 插件、permission_handler…

金山云Q3调整后EBITDA率提升至9.8% 经营效率和盈利能力强劲增长

11月19日&#xff0c;金山云公布了2024年第三季度业绩。 季度内&#xff0c;公司在收入规模、盈利能力、经营现金流方面都取得了扎实的进展。财报显示&#xff0c;金山云Q3营收18.9亿元&#xff0c;同比回归两位数快速增长&#xff0c;达16.0%&#xff1b;公有云实现收入11.8亿…

AI模型新发现:精度的重要性超出预期

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Pytest 学习 @allure.severity 标记用例级别的使用

一、前言 使用allure.serverity注解&#xff0c;可以在allure报告中清晰的看到不同级别用例情况 使用等级介绍 allure提供的枚举类 二、等级介绍 二、等级介绍 blocker&#xff1a;阻塞缺陷&#xff08;功能未实现&#xff0c;无法下一步&#xff09; critical&#xff1a;…

R语言 | 宽数据变成一列,保留对应的行名和列名

对应稀疏矩阵 转为 宽数据框&#xff0c;见 数据格式转换 | 稀疏矩阵3列还原为原始矩阵/数据框&#xff0c;自定义函数 df3toMatrix() 目的&#xff1a;比如查看鸢尾花整体的指标分布&#xff0c;4个指标分开&#xff0c;画到一个图中。每个品种画一个图。 1.数据整理&#…

Java——多线程

&#x1f3e1;个人主页&#xff1a;謬熙&#xff0c;欢迎各位大佬到访❤️❤️❤️~ &#x1f472;个人简介&#xff1a;本人编程小白&#xff0c;正在学习互联网开发求职知识…… 如果您觉得本文对您有帮助的话&#xff0c;记得点赞&#x1f44d;、收藏⭐️、评论&#x1f4ac…

HCIP --OSI七层参考模型回顾、TCP/UDP协议复习

目录 一、OSI 二、重要的三个协议报头格式 名词注解 MTU 封装 解封装 PDU ARP DNS TCP/IP与OSI的区别 三、数据包转发过程 四、获取目标ip地址方式 五、获取目标mac地址方式 六、交换机的工作原理 七、TCP/UDP TCP&#xff08;Transmission Control Protocol&a…

基于Java Springboot甘肃旅游管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

基于YOLOv8深度学习的独居老人情感状态监护系统(PyQt5界面+数据集+训练代码)

本研究提出了一种创新的独居老人情感状态监护系统&#xff0c;基于YOLOV8深度学习模型&#xff0c;旨在通过对老年人面部表情的实时监测与分析&#xff0c;来精准识别其情感变化&#xff0c;从而提高独居老人的生活质量&#xff0c;确保其心理健康。本系统通过整合先进的YOLOV8…

博客文章怎么设计分类与标签

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;博客文章怎么设计分类与标签 新网站基本上算是迁移完了&#xff0c;迁移之后在写文章的过程中&#xff0c;发现个人的文章分类和标签做的太混乱了&#xff0c;分类做的像标签&#xff0c;标签也不是特别的丰富&#x…