首页 > 数据库 >MySQL的基础操作(二)

MySQL的基础操作(二)

时间:2024-04-09 21:32:27浏览次数:24  
标签:grade 基础 连接 student MySQL 操作 约束 id select

目录

一.数据库约束

1.主键约束 (Primary Key)

2.唯一约束 (Unique)

3.外键约束 (Foreign Key):

4.检查约束(Check)

5.默认约束 (Default)

二.聚合查询

1.简单聚合函数

2.GROUP BY子句

3.HAVING子句

三.联合查询

1.内连接

2.左连接

3.右连接

4.子查询

5.合并查询


一.数据库约束

数据库约束是用于保证数据完整性和一致性的重要机制,它可以应用在表的列级别或表级别。以下是常见的数据库约束类型:

1.主键约束 (Primary Key)

  • 主键约束用于唯一标识表中的每一行数据。
  • 每个表只能有一个主键。
  • 主键列不允许包含NULL值。
  • 主键可以是单列或多列的组合

示例:

CREATE TABLE STUDENT (
     id INT PRIMARY KEY,
     name VARCHAR(20),
     qq_mail VARCHAR(20)
);
//设定学生表中的id字段为外键

2.唯一约束 (Unique)

  • 唯一约束确保列中的数据是唯一的,但允许NULL值。
  • 每个表可以有多个唯一约束。
  • 可以在单列或多列上定义唯一约束。

示例:

CREATE TABLE student (
   id INT UNIQUE,
   name VARCHAR(20),
   qq_mail VARCHAR(20)
)
//将学生表中的id字段设置为unique,表示为唯一的、不重复的

3.外键约束 (Foreign Key):

  • 外键约束用于建立表之间的关联关系。
  • 它指定一个或多个列作为外键,这些外键值必须存在于另一个表的主键或唯一约束中。
  • 外键可以防止对父表的引用数据进行意外的更改或删除。

语法:

foreign key (字段名) references 主表(列)
create table class(
   id int primary key,
   class_name varchar(20),
);
//先创建一个班级表class,使id为主键

create table class(
   id int primary key,
   name varchar(20),
   classes_id int,
   foreign key (classes_id) references class(id)
);
//再创建一个学生表,使用id为主键,classes_id为外键,关联班级表id

4.检查约束(Check)

  • 检查约束用于限制列中允许的值的范围。
  • 可以基于表达式或条件来定义检查约束,如果条件为假,则不允许插入或更新数据。

示例:

CREATE TABLE Grades (
   StudentID INT, 
   Score INT CHECK (Score >= 0 AND Score <= 100)
);
//在一个学生成绩表中,使用检查约束确保分数在0到100之间

5.默认约束 (Default)

  • 默认约束定义了列在没有明确指定值时应该使用的默认值。
  • 当插入新行或更新行时,如果未提供值,则数据库将使用默认值。

示例:

CREATE TABLE Employees (
   EmployeeID INT, 
   Name VARCHAR(50), 
   HireDate DATE DEFAULT CURRENT_DATE
);
//在一个员工表中,将入职日期设置为当前日期作为默认值

6.非空约束 (Not Null):

  • 非空约束确保列中的值不为空值 (NULL)。
  • 当尝试插入或更新行时,如果指定了该列,并且值为NULL,则会产生错误。

示例:

CREATE TABLE Users (
   UserID INT, 
   Username VARCHAR(50) NOT NULL
);
//在一个用户表中,确保用户名不为空

二.聚合查询

1.简单聚合函数

  • COUNT(): 计算某列的行数,或者满足特定条件的行数。
  • SUM(): 计算指定列的总和。
  • AVG(): 计算指定列的平均值。
  • MIN(): 计算指定列的最小值。
  • MAX(): 计算指定列的最大值。

示例:

select avg(math) from student;
//计算学生表数学成绩的平均值

select sum(math) from student;
//计算学生表数学成绩的总和

select max(math) from student;
//计算学生表数学成绩的最大值

2.GROUP BY子句

将结果集按照指定列进行分组,并对每个分组应用聚合函数。

语法:

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

示例:

create table student (
   id int,
   name varchar(20),
   grade varchar(5),
   math decimal(3,1),
   chinese decimal(3,1),
   english decimal(3,1)
);
//先创建一个学生表

select grade 年级,max(math+chinese+english) 总分 from student group by grage;
//查询每个年级的最高分并以年级分组
(有多少年级就分成多少组,每一个组当成单独的一张表并查询其中的最高分)  

3.HAVING子句

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

示例:

create table student (
   id int,
   name varchar(20),
   grade varchar(5),
   math decimal(3,1),
   chinese decimal(3,1),
   english decimal(3,1)
);
//先创建一个学生表

select grade 年级, count(*) 总人数 
   from student 
   group by grade 
   having count(*)>200;
//查找总人数超过200的年级  

三.联合查询

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

在介绍之前,先创建好要示例的表:

create table student (
    -> id int ,
    -> name varchar(30),
    -> e_mail varchar(30),
    -> class_id int
    -> );
//创建学生表用于储存学生个人信息
 create table grade(
    -> course varchar(20),
    -> student_id int,
    -> score int
    -> );
//创建成绩表用于储存学生的各科成绩

填充数据后为

1.内连接

  • 内连接返回两个表中匹配连接条件的行,如果某行在其中一个表中没有匹配的行,则不会包含在结果集中。
  • 内连接使用的语法是 INNER JOIN 或简写形式 JOIN
  • 内连接只返回两个表中连接条件匹配的行,不会返回任何一个表中没有匹配的行。

语法:

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

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

//两种写法都可以

示例:

select 
   student.name, 
   grade.course, 
   grade.score 
from 
   student,
   grade 
where 
   student.id=grade.student_id;

//查询学生的姓名与对应的课程名称和成绩
//注意限定条件是学生表的id与成绩表的student_id相等

结果为:

2.左连接

  • 左连接返回左表中的所有行,以及右表中匹配连接条件的行。如果右表中没有匹配的行,则返回 NULL 值。
  • 左连接使用的语法是 LEFT JOIN
  • 左连接会保留左表中没有匹配的行,并在右表中没有匹配的行处填充 NULL 值。

语法:

select 字段名  from 表名1 left join 表名2 on 连接条件;

示例:

我们先往学生表添加一个新的学生小何,但是成绩表没有添加对应的成绩

insert into
   student (name,id,class_id) 
values 
   ('小何',7,2);

接着查询学生表左连接成绩表

select 
   student.name, 
   grade.course, 
   grade.score 
from 
   student left join grade 
on
   student.id=grade.student_id;

结果为:

可以看到,小何明明没有成绩也出现在结果中了,这就是左连接保留左表多余的数据

3.右连接

  • 右连接与左连接相反,返回右表中的所有行,以及左表中匹配连接条件的行。如果左表中没有匹配的行,则返回 NULL 值。
  • 右连接使用的语法是 RIGHT JOIN
  • 右连接会保留右表中没有匹配的行,并在左表中没有匹配的行处填充 NULL 值。

语法:

select 字段 from 表名1 right join 表名2 on 连接条件;

示例:

与上方一样添加学生小何,但是查询成绩表右连接学生表

select
   student.name, grade.course, grade.score 
from 
   grade right join student 
on 
   student.id=grade.student_id;

结果为:

可以看到,将两表调换后,小何明明没有成绩也出现在结果中了,这就是右连接保留右表多余的数据

4.子查询

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

示例:

如果现在想寻找与小明同班的同学

select 
   * 
from 
   student 
where 
   class_id=(select class_id from student where name='小明');

结果为:

5.合并查询

MySQL中的合并查询指的是使用UNIONUNION ALL操作符将多个SELECT语句的结果合并成一个结果集。合并查询通常用于将多个相似的查询结果合并在一起,以便在单个结果集中检索数据

UNION操作符

UNION操作符用于合并多个SELECT语句的结果,并去除重复的行。

SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;

UNION ALL操作符

UNION ALL操作符用于合并多个SELECT语句的结果,包括重复的行。

SELECT column1 FROM table1
UNION ALL
SELECT column1 FROM table2;

标签:grade,基础,连接,student,MySQL,操作,约束,id,select
From: https://blog.csdn.net/a1806542392/article/details/137521653

相关文章

  • MySQL的基础操作
    目录一.数据库的操作1.显示当前的数据库2.创建数据库3.删除数据库4.选择数据库补充:二.表的基础操作1.常用数据类型:2.查看表结构3.创建表4.删除表三.表的增删改查1.新增(Create)2.查询(Retrieve)3.修改(Update)4.删除(Delete)一.数据库的操作1.显示当前的数据库......
  • 协程操作
    协程操作一、asyncio模块asyncio模块是Python中实现异步的一个模块,该模块在Python3.4的时候发布async和await关键字在Python3.5中引入。因此,想要使用asyncio模块,建议Python解释器的版本不要低于Python3.5。二、事件循环所谓的事件循环,我们可以把它当作是一......
  • 文档操作&异常捕获&列表、字典推导式
    【零】文档操作【1】读和写(覆盖写和追加写)#r(read):只读模式#将数据一次性全部读出#w(write):只写模式#如果文件存在则打开文件,并将文件内荣清空然后写入新的内容#如果文件不存在则新建文件,并写入新的内容#a(append):追加写模式#如果文件存在则打开文件,而......
  • 操作系统的引入
    操作系统的引入进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。所以想要真正了解进程......
  • 【前沿模型解析】潜在扩散模型 2-3 | 手撕感知图像压缩 基础块 自注意力块
    1注意力机制回顾同ResNet一样,注意力机制应该也是神经网络最重要的一部分了。想象一下你在观看一场电影,但你的朋友在给你发短信。虽然你正在专心观看电影,但当你听到手机响起时,你会停下来查看短信,然后这时候电影的内容就会被忽略。这就是注意力机制的工作原理。在处理输入......
  • MYSQL五个常见的聚合函数
    学生表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyi......
  • 【Linux】编写并运行Shell脚本程序操作实例
    关于Shell脚本的介绍:Shell脚本是一种用于自动化任务和简化常见操作的脚本语言,通常用于Linux和Unix环境中。Shell脚本允许用户通过编写一系列命令和逻辑语句来执行一系列任务,从而提高了工作效率和自动化水平。以下是关于Shell脚本的详细介绍:1.基础概念:Shell本身是一个用C......
  • Java基础知识-面向对象编程(OOP)-Java集合框架-多线程和并发-Spring框架
    Java基础知识:Java的四种基本数据类型是:byte、short、int、long(整数类型)、float、double(浮点类型)、char(字符类型)、boolean(布尔类型)。它们之间的区别主要在于占用的内存大小和表示范围不同。Java中的String是不可变的意味着一旦String对象被创建,它的值就不能被修改。这意味着St......
  • 机器学习&深度学习 操作tips
    1.在运行程序时,报错如下:usage:run.py[-h]--modelMODEL[--embeddingEMBEDDING][--wordWORD]run.py:error:thefollowingargumentsarerequired:--model答:出现这个问题是因为对于代码不够理解,对于在代码包中有多个models时,举例如下:不同的model类似于定义了不......
  • 使用C语言函数对数组进行操作
        前言       在我们了解数组和函数之后,我们对数组和函数进行结合,之后完成一些操作吧    题目描述    杰克想将函数与数组结合进行一些操作,以下是他想要达到的效果,请你帮帮他吧!    创建一个整型数组,完成对数组的操作   ......