探讨MySQL中 “约束“ 下的查询

news2024/9/21 16:38:59

目录:

一. 数据库约束

二. 表的设计

三. 聚合查询

四.联合查询




一. 数据库约束:

1.约束类型汇总:

约束类型                    说明             
NULL约束使用NOT NULL指定列不为 空
UNIQUE唯一约束指定列为唯一的、不重复的
DEFAULT默认值约 束指定列为空时的默认值
主键约束(primary key)

NOT NULL 和 UNIQUE 的 结合

外键约束

关联其他表的主键或唯一键

语法:foreign key (列) references 主表(列)

CHECK约束保证列中的值符合指定的条件

1.1 NULL约束:

创建表时,可以指定某列不为空:

DROP TABLE IF EXISTS student;
CREATE TABLE student (
   id INT NOT NULL,
   sn INT,
   name VARCHAR(50),
   qq_mail VARCHAR(50)
);

1.2 DEFAULT:默认值约束:

mysql> CREATE TABLE student (
    ->    id INT NOT NULL,
    ->    name VARCHAR(20) DEFAULT '默认为无名氏');

1.3 PRIMARY KEY:主键约束:

CREATE TABLE student2 (
    -> id bigint primary key auto_increment,
    -> name VARCHAR(20) DEFAULT '默认为无名氏');

这里还使用了auto_increment,在插入时不指定,可以让id字段自增。   

  注意这里一个表不可以有多个主键,都是可以有复合主键

如下:

1.4 FOREIGN KEY:外键约束:

外键用于关联其他表的主键或唯一键

语法:

foreign key (本表要关联的字段) references 主表(列)

例子:创建班级表classes,id为主键;

创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键, classes_id为外键,关联班级表id。

 create table student(
    -> id INT PRIMARY KEY auto_increment,
    -> class_id int,
    -> foreign key (class_id) references class (id)
    -> );

create table class(
    -> id INT PRIMARY KEY auto_increment,
    -> name varchar(50)
    -> );

注意:这里的class_id的类型,要和主表class的id类型一致这里都是(int)

不然会报类型不兼容错误导致定义失败



二. 表的设计:

1.设计表的时候要遵循三大范式。

第一范式:表里的字段不可以再进行拆分

第二范式:再满足第一范式的基础上,不存在非关键字段对任意候选键的部分函数依赖

(简单来说就是非主键字段对任意主键,外键,唯一键的部分函数依赖)

小结:一个表没有复合主键就天然满足第二范式

第三范式:再满足第二范式的基础上,不存在非关键字段对任意候选键的传递依赖

第三范式可以解决数据冗余,更新异常,插入异常,删除异常等问题

 

  

2.设计时表之间的三大关系:

一.  一对一:比如用户和账号信息,可以建立在一个表中

 二.  一对多:一个班级有多个学生设计如下:

 

三.  多对多:一个学生可以选多门课,一门课可以被多个学生选

学生表和课程表是多对多的关系,这里通过课程表(关系表)关联



三. 聚合查询:

1.常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

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

例子:

1.1COUNT:统计行数

统计班里有多少同学:

1.2 SUM:

统计语文成绩总分:

1.3 AVG:

统计语文平均分:

 

1.4 MAX:

语文最高分:

1.5 MIN

语文最低分:

2.GROUP BY子句:

2.1 SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函 数中。

2.2:语法:

select 需要分组的列, sum(column2), .. from table group by 需要分组的列

2.3:例子:

mysql> create table emp(
    ->  id int primary key auto_increment,
    ->  name varchar(20) not null,
    ->  role varchar(20) not null,
    ->  salary numeric(11,2)
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> insert into emp(name, role, salary) values
    -> ('马云','服务员', 1000.20),
    -> ('马化腾','游戏陪玩', 2000.99),
    -> ('孙悟空','游戏角色', 999.11),
    -> ('猪无能','游戏角色', 333.5),
    -> ('沙和尚','游戏角色', 700.33),
    -> ('隔壁老王','董事长', 12000.66);
Query OK, 6 rows affected (0.04 sec)

查询每个角色的最高工资:

3.HAVING条件语句:

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING

例子:查询每个角色小于一万的最高工资:



 

四.联合查询:

1.实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积。

笛卡尔积其实是个全排列的过程

 

语法:

select * from 表名 表名

 

如图:

 

上面有很多无用数据,我们可以通过连接条件过滤

 

2.内连接:

写法一:select 字段 from 表1 别名1  join 表2 别名2 on 连接条件 and 其他条件;

写法二:select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

 

例子:这里我们过滤一下上面的class和student的查询

从图可以看出两个表的class_id有依赖关系,只要他们相等即可。

 

 

3.外连接:

 外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完 全显示我们就说是右外连接 

语法:

-- 左外连接,表1完全显示 select 字段名  from 表名1 left join 表名2 on 连接条件;

-- 右外连接,表2完全显示 select 字段 from 表名1 right join 表名2 on 连接条件;

如果是left join,就以左边的表为基准显示;

如果是right join ,就以右边的表为基准显示;

这里就是以右边student表为基准表显示的

 

 4.自连接:

自连接是指在同一张表连接自身进行查询

 

 

 

5.子查询:

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。

分为:

5.1.单行子查询:返回一行记录的子查询(返回一个对象)

 例子:查询与“韩立” 同学的同班同学

5.2.多行子查询:返回多行记录的子查询(返回一个集合,包含多个对象);用到IN关键字

 例子:在成绩表中查询彩儿和清涟同学的成绩的成绩信息

 

 

6.合并查询:

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL时,前后查询的结果集中,字段需要一致也就是两张表要完全一致

  6.1 UNION:

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行

例子:

 

6.2.nion all:

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

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

相关文章

Xchart 相关操作

using Newtonsoft.Json; using System.Collections; using System.Collections.Generic; using UnityEngine; using XCharts; /***************************************************************************** Copyright (C) 2013-2023 北京普源瑞新仿真科技有限公司 All Ri…

工作流(低代码)提升工作效率的秘密武器

如何看待“低代码”开发平台的兴起? 在当今快速变化的数字化时代,企业面临着前所未有的挑战和机遇。如何在激烈的市场竞争中脱颖而出,成为每个企业必须思考的问题。而低代码工具,正是帮助企业提升工作效率,实现快速响…

在Windows上用Visual Studio编译OpenCV

在Windows上编译开源项目,有时候让人痛不欲生,有时候却出奇地顺利。OpenCV属于后者。本文记录这次愉快的过程。 注:OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了大…

移动学习平台小程序的设计

管理员账户功能包括:系统首页,个人中心,教师管理,学生管理,班级管理,课程分类管理,课程信息,作业信息管理,系统管理 微信端账号功能包括:系统首页&#xff0…

全面解析被低估的 Symbiosis — 一站式跨链 AMM DEX,跨链交易的未来

在区块链技术快速发展过程中,互操作性和流动性问题一直是行业面临的核心挑战。随着越来越多的区块链网络(无论是 Layer 1 还是 Layer 2),以及不同虚拟机环境(EVM 和非 EVM)的出现,用户和开发者都…

P37-数据存储

数据类型介绍 前面学习了基本的内置类型: 以及它们所占存储空间的大小。 类型的意义: 1.使用这些类型开辟空间的大小(大小决定了使用范围) 2.如何看带内存空间的视角 类型的基本归类 整形家族 之所以char也分类在其中是因为实…

云原生时代的数据守护者:Velero 备份与迁移实战

项目背景 在云计算和容器技术飞速发展的今天,Kubernetes 已经成为容器编排和管理的事实标准。然而,随着业务的不断扩展,如何在云原生环境下保护和迁移 Kubernetes 集群资源,成为了摆在运维人员面前的一大挑战。Velero&#xff0c…

RazorSQL for Mac/Win:强大的跨平台多功能SQL数据库编辑器RazorSQL for Mac/Win:功能强大的跨平台 SQL 数据库编辑器

RazorSQL 是一款备受赞誉的多功能 SQL 数据库编辑器,适用于 Mac 和 Windows 操作系统,为用户提供了高效、便捷且强大的数据库管理和操作体验。 首先,RazorSQL 支持多种主流的数据库类型,包括但不限于 MySQL、Oracle、SQL Server、…

搭建内网开发环境(三)|基于nexus搭建docker私服

引言 上一篇教程中演示如果安装和 nexus 的基本使用,本篇教程将演示如果在 nexus 中搭建 docker 私服,并实战如何上传镜像到私服和从私服下载镜像。 搭建内网开发环境(一)|基于docker快速部署开发环境 搭建内网开发环…

MySQL基础--触发器,锁

触发器 触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的 SQL 语句集合,触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。 使用别名 …

KNN 图像识别

KNN(K-Nearest Neighbors,K最近邻)算法是一种简单而有效的分类算法,也可以用于图像识别。它的基本思想是通过计算样本之间的距离,将待分类的样本归为其在训练集中最相近的K个样本所属的类别中最常见的类别 1. 准备工作…

阿里巴巴25校招内推

内推投递链接: http://aidc-jobs.alibaba.com/campus/qrcode/home?codeMx8ppk_s4MjkOFnb6XS3Vw%3D%3D 流程安排 简历投递(网申、内推) 8.16开启笔试:集中笔试为8月-10月面试:启动后持续推进offer发放:启动后持续推进 内推二维…

FPGA 综合笔记

仿真时阻塞赋值和非阻塞赋值 Use of Non-Blocking Assignment in Testbench : Verilog Use of Non-Blocking Assignment in Testbench : Verilog - Stack Overflow non-blocking assignment does not work as expected in Verilog non-blocking assignment does not work a…

华为APP审核,权限说明弹窗

工具类 import android.app.Activity; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.PopupWindow; import android.widget.TextV…

OD C卷 - 建立Huffman树

生成Huffman树 (100) 给定一个数值数组weights&#xff0c;每个值代表二叉树叶子节点的权值&#xff08;>1&#xff09;;根据权值数组&#xff0c;生成哈夫曼树&#xff0c;并中序遍历输出&#xff1b;左节点权值< 右节点权值&#xff0c;根节点权值为左右节点权值之和&…

git提交规范检查husky

一、Eslint 尤雨溪推荐的 prettierrc 配置&#xff0c;句尾不带分号 单引号。 尤雨溪推荐配置&#xff1a;vue-next/.prettierrc lint lint 是最著名的 C 语言工具之一&#xff0c;是由贝尔实验室 SteveJohnson 于 1979 在 PCC(PortableC Compiler) 基础上开发的静态代码分…

自己搭建远程桌面服务器-RustDesk 极简版

linux搭建RustDesk保姆间教程_rustdesk linux-CSDN博客https://blog.csdn.net/yzs2022/article/details/135136491 背景 在某公司工作&#xff0c;向日葵等远程办公软件均已屏蔽&#xff0c;无法使用&#xff08;也没有明文规定不允许使用远程控制软件&#xff09;&#xff0c…

2024批量下载知乎回答/文章/想法/专栏/视频/收藏夹,导出excel和pdf

之前分享过文章2024 批量下载知乎回答/文章/想法/专栏导出excel和pdf&#xff0c;再次更新&#xff0c;2024 批量下载知乎回答/文章/想法/专栏/视频导出 excel 和 pdf&#xff0c;今天再加上知乎收藏夹批量下载。 下载所有知乎回答以渤海小吏的号为例 https://www.zhihu.com/p…

关于SQLModel库的一些封装思路和实战,fastzdp_sqlmodel库封装过程中的一些笔记,20240817

概述 最近在对SQLModel做一些封装&#xff0c;本篇文章主要记录封装过程中的一些思路和实战代码。 实现or查询 原本的代码 from typing import Optional from sqlmodel import Field, SQLModel, create_engine, Session, select, or_class Hero(SQLModel, tableTrue):id: O…