MySQL学习笔记2【函数/约束/多表查询】

MySQL学习笔记


函数

字符串函数
函数功能
CONCAT(s1, s2, …, sn)字符串拼接,将s1, s2, …, sn拼接成一个字符串
LOWER(str)将字符串全部转为小写
UPPER(str)将字符串全部转为大写
LPAD(str, n, pad)左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str, n, pad)右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
TRIM(str)去掉字符串头部和尾部的空格
SUBSTRING(str, start, len)截取字符串,从start开始截取len长度的字符串,索引从1开始
REPLACE(column, source, replace)替换字符串
数值函数
函数功能
CEIL(x)向上取整
FLOOR(x)向下取整
MOD(x, y)返回x/y的模
RAND()返回0~1内的随机数
ROUND(x, y)对x的四舍五入,保留y位小数
日期函数
函数功能
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(date)获取指定date的年份
MONTH(date)获取指定date的月份
DAY(date)获取指定date的日期
DATE_ADD(date, INTERVAL expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1, date2)返回起始时间date2和结束时间date1之间的天数

一个值得说的案例,查询员工入职天数,降序排序:

SELECT 
username, DATEDIFF(NOW(), entrydate) AS entrydays 
FROM users 
ORDER BY entrydays DESC;
流程控制函数
  1. IF(value, t, f)

    • 功能:评估 value 的真假。
    • 用法:如果 value 为真,返回 t;否则返回 f
    • 示例
      SELECT IF(age >= 18, 'Adult', 'Minor') AS age_group FROM users;
      
  2. IFNULL(value1, value2)

    • 功能:检查 value1 是否为空。
    • 用法:如果 value1 不为空,返回 value1;如果为空,返回 value2
    • 示例
      SELECT IFNULL(nickname, username) AS display_name FROM users;
      
  3. CASE WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END

    • 功能:执行多个条件的检查。
    • 用法:如果 val1 为真,返回 res1,依此类推;如果都不满足,则返回 default
    • 示例
      SELECT CASE WHEN score >= 90 THEN 'A'WHEN score >= 80 THEN 'B'ELSE 'C'END AS grade
      FROM scores;
      
  4. CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END

    • 功能:与第3个函数类似,但通过评估一个表达式来进行条件判断。
    • 用法:如果 expr 等于 val1,返回 res1;如果不匹配,返回 default
    • 示例
      SELECT CASE user_typeWHEN 'admin' THEN 'Administrator'WHEN 'user' THEN 'Regular User'ELSE 'Unknown'END AS user_role
      FROM users;
      

约束

约束条件关键字说明
主键PRIMARY KEY唯一标识表中的每一行,主键列的值不能重复且不能为空。
自动增长AUTO_INCREMENT使字段在插入新行时自动增加(常用于主键)。
不为空NOT NULL指定字段不能接受空值。
唯一UNIQUE确保字段的所有值都是唯一的,允许空值,但不能重复。
逻辑条件(条件一定要加上括号)CHECK(约束条件)用于限制列中的值满足某些条件,必须使用括号以包围条件表达式。
默认值DEFAULT指定列的默认值,插入时如果不提供该列的值,则使用默认值。
  • 值得一提的是,如果想要同时插入多个数据,只要有一条数据不满足约束,这条语句全部执行失败,就算其他数据符合约束条件,也不会插入进数据。
  • 插入数据违反UNIQUE约束时,自增主键将会+1。
删除/更新行为

ON DELETE/UPDATE


行为说明
NO ACTION当在父表中删除或更新对应记录时,首先检查该记录是否有对应的外键。如果有,系统将不允许删除或更新(这与 RESTRICT 行为一致)。
RESTRICTNO ACTION 一样,删除或更新前会检查是否存在对应外键,如果存在,则不允许进行操作。
CASCADE当在父表中删除或更新对应记录时,如果该记录有对应的外键,系统会自动删除或更新子表中相关的记录。
SET NULL当在父表中删除或更新对应记录时,如果该记录有对应的外键,系统会将子表中该外键的值设置为 NULL(前提是该外键允许为 NULL)。
SET DEFAULT当父表的记录发生变更时,子表中的外键将被设为一个默认值(InnoDB 不支持此选项)。

多表查询

关系类型定义示例描述数据库表示示例
一对多一个表中的一条记录可以关联到另一个表中的多条记录,而另一表中的每条记录只能关联到一条记录。员工对应一个部门,部门有多个员工department 表与 emp 表,通过 dept_id 关联。
多对多一个表中的多条记录可以关联到另一个表中的多条记录。通常需要一个关联表来实现这种关系。一个学生可以选修多门课程,一门课程可以被多个学生选修。students 表与 courses 表,通过 student_courses 关联表。
一对一一个表中的一条记录只能关联到另一个表中的一条记录,反之亦然。每个用户有一条用户详情记录。users 表与 user_details 表,通过 user_id 关联。
  • 一对一可以用来对单表进行拆分,结构更加清晰。
1. 合并查询(笛卡尔积)
  • 定义:合并查询会显示两个表的所有组合结果,即笛卡尔积, 可以理解为19和09可以组合成多少个2位数

  • 示例

    SELECT * FROM employee, dept;
    
2. 内连接查询
  • 定义:内连接只返回两张表交集的部分,即满足连接条件的记录。

  • 隐式内连接

    • 通过逗号分隔表名和用 WHERE 子句指定连接条件:
    SELECT e.name, d.name FROM employee AS e, dept AS d WHERE e.dept = d.id;
    
  • 显式内连接

    • 使用 JOIN 关键字来显示连接关系,语法更清晰:
    SELECT e.name, d.name FROM employee AS e INNER JOIN dept AS d ON e.dept = d.id;
    
3. 外连接查询
  • 左外连接(LEFT OUTER JOIN)

    • 返回左表(employee)的所有数据,包含与右表(dept)交集部分的数据。
    SELECT e.*, d.name FROM employee AS e LEFT OUTER JOIN dept AS d ON e.dept = d.id;
    
  • 右外连接(RIGHT OUTER JOIN)

    • 返回右表(dept)的所有数据,包含与左表(employee)交集部分的数据。
    SELECT d.name, e.* FROM employee AS e RIGHT OUTER JOIN dept AS d ON e.dept = d.id;
    
  • tips:

    • 左连接可以查询到没有部门的员工,右连接可以查询到没有员工的部门,此处可以做这道题练习一下
4. 自连接查询
  • 定义:当前表与自身进行连接查询,需要使用表别名。

  • 语法

    SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;
    
  • 示例

    • 查询员工及其所属领导的名字:
    SELECT a.name, b.name FROM employee AS a, employee AS b WHERE a.manager = b.id;
    
    • 查询没有领导的员工:
    SELECT a.name, b.name FROM employee AS a LEFT JOIN employee AS b ON a.manager = b.id;
    
5. 联合查询
SELECT 字段列表 FROM 表A
UNION [ALL]
SELECT 字段列表 FROM 表B;
注意事项
  1. 去重行为

    • UNION:会去掉重复的记录,只返回唯一的结果集。
    • UNION ALL:包括所有结果,保留重复记录。
  2. 查询效率

    • 在某些情况下,使用UNION可能会比OR效率高。这是因为对于UNION,数据库可以对每个查询的结果集进行合并,而避免了对整个数据表的扫描。
    • 使用OR条件可能会导致某些情况下索引(现在还不知道这个是什么, 姑且先记一下)失效,从而导致查询性能下降。
  3. 字段要求

    • 使用UNIONUNION ALL时,所有的SELECT查询返回的字段数和数据类型必须一致。
  4. 执行顺序

    • 如果查询的顺序很重要,可以使用ORDER BY对最终的结果集进行排序,但需要注意ORDER BY只能在最后一个查询之后使用。
使用示例
-- 查询两个表中用户的名字,去重
SELECT name FROM Customers
UNION
SELECT name FROM Employees;-- 查询两个表中用户的名字,包括重复
SELECT name FROM Customers
UNION ALL
SELECT name FROM Employees;
6.子查询

嵌套查询,也称为子查询,是一个查询嵌入在另一个查询内部。这种结构可以让我们在一个查询中利用另一个查询的结果。


子查询的分类
  1. 根据结果形式

    • 标量子查询:返回单个值(如一个数字、一个字符串等)。
    • 列子查询:返回一列,可以是多行。
    • 行子查询:返回一行,包含多个列。
    • 表子查询:返回多行多列的结果。
  2. 根据位置

    • WHERE之后:用于过滤主查询的结果。
    • FROM之后:作为数据源提供给主查询。
    • SELECT之后:用于计算和生成字段值。
常用的操作符
  • 标量子查询:常用操作符包括=, <, >, >=, <=
  • 列子查询:常用操作符包括IN, NOT IN, ANY, SOME, ALL
  • 行子查询:可以使用=, <, >, IN, NOT IN
  • 表子查询:多用于IN操作符。
示例分析
  1. 标量子查询示例

    SELECT * 
    FROM employee 
    WHERE entrydate > ( #子查询返回一个常量SELECT entrydate FROM employee WHERE name = 'xxx'
    );
    
  2. 列子查询示例

    SELECT * 
    FROM employee 
    WHERE dept 
    IN (	#子查询返回很多列,如果dept存在于查询的结果之中,则算满足条件.SELECT id FROM dept WHERE name = '销售部' OR name = '市场部'
    );
    
  3. 行子查询示例

    SELECT * 
    FROM employee
    WHERE (salary, manager) = (   #查询一列,返回N行,如果这几行全部相等,那么则算满足条件,SELECT salary, manager FROM employee WHERE name = 'xxx'
    );
    
  4. 表子查询示例

    SELECT e.*, d.* 
    FROM (  #查询一张表,从这张表中再进行条件过滤或者左连接SELECT * FROM employee WHERE entrydate > '2006-01-01'
    ) AS e
    LEFT JOIN dept AS d 
    ON e.dept = d.id;
    

TIPS:表字查询也可以放在WHERE '字段' IN后面, 和列子查询类似,只要满足其中一列全部相等,那么则算满足条件

值得一提的案例
SELECT d.id, 	#此处可以理解为先从FROM中查询到了id,再将id传入子查询中,通过count得出人数d.name, (SELECT COUNT(*) FROM emp e WHERE e.dept_id = d.id) AS '人数'
FROM dept d;

结语

该篇笔记主要涵盖了关于MySQL基本的函数/约束以及多表查询的相关内容,如果有什么问题,欢迎留言,希望对你也会有帮助。

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

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

相关文章

python学习笔记—17—数据容器之字符串

1. 字符串 (1) 字符串能通过下标索引来获取其中的元素 (2) 旧字符串无法修改特定下标的元素 (3) index——查找字符串中任意元素在整个字符串中的起始位置(单个字符或字符串都可以) tmp_str "supercarrydoinb" tmp_position1 tmp_str.index("s") tmp_p…

跟着逻辑先生学习FPGA-第八课 基于 I2C 协议的 EEPROM 驱动控制

硬件平台&#xff1a;征战Pro开发板 软件平台&#xff1a;Vivado2018.3 仿真软件&#xff1a;Modelsim10.6d 文本编译器&#xff1a;Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1知识背景 I2C 通讯协议&#xf…

Mac上鸿蒙配置HDC报错:zsh: command not found: hdc -v

这个问题困扰了好久&#xff0c;按照官方文档去配置的&#xff0c;就是会一直报错&#xff0c;没有配置成功&#xff0c;主要原因是官网ide的路径可能和你本地的ide的路径不一致&#xff0c;因为官网的ide版本可能是最新的 一.先查找你本地的toolchains目录在哪里&#xff0c;…

基于华为ENSP的OSPF状态机、工作过程、配置保姆级别详解(2)

本篇技术博文摘要 &#x1f31f; 基于华为enspOSPF状态机、OSPF工作过程、.OSPF基本配置等保姆级别具体详解步骤&#xff1b;精典图示举例说明、注意点及常见报错问题所对应的解决方法 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我…

【Rust自学】11.1. 编写和运行测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.1.1. 什么是测试 在Rust里一个测试就是一个函数&#xff0c;它被用于验证非测试代码的功能是否和预期一致。 在一个测试的函数体里通…

计算机网络 (31)运输层协议概念

一、概述 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。运输层的一个核心功能是提供从源端主机到目的端主机的可靠的、与实际使用的网络无关的信息传输。它向高层用…

cache原理

理论基础 时间局部性空间局部性 存储结构 存储器 ROMRAM SRAM->CACHEDRAM->MEM CACHE与主存映射 直接映射 假定主存储器32位地址&#xff0c;cache行64B&#xff0c;cache容量512B&#xff0c;则cache有8行 全相联映射 假定主存储器32位地址&#xff0c;cache…

嵌入式入门Day38

C Day1 第一个C程序C中的输入输出输出操作coutcin练习 命名空间使用方法自定义命名空间冲突问题 C对字符串的扩充C风格字符串的使用定义以及初始化C风格字符串与C风格字符串的转换C风格的字符串的关系运算常用的成员变量输入方法 布尔类型C对堆区空间使用的扩充作业 第一个C程序…

流浪猫流浪狗领养PHP网站源码

源码介绍 流浪猫流浪狗领养PHP网站源码&#xff0c;适合做猫狗宠物类的发信息发布。当然其他信息发布也是可以的。 导入数据库&#xff0c;修改数据库配置/application/database.php 设置TP伪静态&#xff0c;设置运行目录&#xff0c; 后台&#xff1a;/abcd.php/dashboard?…

深度学习|表示学习|一个神经元可以干什么|02

如是我闻&#xff1a; 如果我们只有一个神经元&#xff08;即一个单一的线性或非线性函数&#xff09;&#xff0c;仍然可以完成一些简单的任务。以下是一个神经元可以实现的功能和应用&#xff1a; 1. 实现简单的线性分类 输入&#xff1a;一组特征向量 x x x 输出&#xff…

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起&#xff0c;正向定位到当前行的首个字符 b2 从光标位置起&#xff0c;反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…

使用 SQL 和表格数据进行问答和 RAG(7)—将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中

将表格数据&#xff08;CSV 或 Excel 文件&#xff09;加载到向量数据库&#xff08;ChromaDB&#xff09;中。这里定义的类 PrepareVectorDBFromTabularData&#xff0c;它的主要功能是读取表格数据文件到DataFrame中、生成嵌入向量、并将这些数据存储在向量数据库的集合中&am…

【git】-2 分支管理

目录 一、分支的概念 二、查看、创建、切换分支 1、查看分支-git branch 2、创建分支- git branch 分支名 3、切换分支- git checkout 分支名 三、git指针 -实现分支和版本间的切换 四、普通合并分支 git merge 文件名 五、冲突分支合并 ​​​​​​【git】-初始gi…

搜广推面经五

饿了么推荐算法 一、介绍InfoNCE Loss、InfoNCE温度系数的作用 InfoNCE Loss&#xff08;Information Noise Contrastive Estimation Loss&#xff09;是一种常用于自监督学习和对比学习中的损失函数&#xff0c;特别是在信息论和无监督学习中有广泛应用。 它的核心思想是通过…

如何选择适合的证件照制作软件,让您的照片制作更轻松

在当今数字化的时代&#xff0c;制作证件照不再需要专门前往照相馆。选择一款合适的证件照制作软件&#xff0c;您可以在家中轻松完成标准证件照的拍摄与制作。然而&#xff0c;面对市面上琳琅满目的软件&#xff0c;找到最适合您需求的软件并不简单。本文将为您详细介绍选择证…

【数据库】一、数据库系统概述

文章目录 一、数据库系统概述1 基本概念2 现实世界的信息化过程3 数据库系统内部体系结构4 数据库系统外部体系结构5 数据管理方式 一、数据库系统概述 1 基本概念 数据&#xff1a;描述事物的符号记录 数据库&#xff08;DB&#xff09;&#xff1a;长期存储在计算机内的、…

安卓硬件加速hwui

安卓硬件加速 本文基于安卓11。 从 Android 3.0 (API 级别 11) 开始&#xff0c;Android 2D 渲染管道支持硬件加速&#xff0c;这意味着在 View 的画布上执行的所有绘图操作都使用 GPU。由于启用硬件加速所需的资源增加&#xff0c;你的应用程序将消耗更多内存。 软件绘制&am…

第R4周:LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、代码流程1、导入包&#xff0c;设置GPU2、导入数据3、数据集可视化4、数据集预处理5、设置X&#xff0c;y6、划分数据集7、构建模型8、定义训练函…

Spring 设计模式:经典设计模式

Spring 设计模式&#xff1a;经典设计模式 引言 Spring 框架广泛使用了经典设计模式。 这些模式在 Spring 内部发挥着重要作用。 通过理解这些设计模式在 Spring 中的应用&#xff0c;开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。 经典设计模式 控制反转&am…

现代企业架构白皮书(可以在线阅读完整PDF文件)

数据架构元模型综述 数据架构的内容元模型包括“结构”、“端口”两个部分&#xff0c;如下图所示&#xff1a; 结构部分用来对数据模型、数据处理建模&#xff0c;其中包括数据对象、数据组件 端口部分用来对数据模型的边界建模&#xff0c;其中包括数据服务 数据架构元模型…