当前位置: 首页 > news >正文

mysql中表的设计

我们可以根据实际的需求场景,明确当前要创建几个表,每个表内部有什么,这些表之中哪些表是存在着一定联系的.

先梳理清楚需求看需要哪些表,表里面需要哪些内容

再确定好表与表之间的"关系"

表与表之间的关系有:

一对一

一个学生只能拥有一个账号.一个账号也只能披一个学生拥有

student-account(studentld, name,)
 

一对多

一个学生,只能在一个班级中,一个班级,可以包含多个学生

class (id, name)
1    一班

student(id, name, classld)
1  张三  1
2 李四 1
3 王五  1

多对多

一个学生,可以选择多门课程.—门课程,也可以包含多个学生.

student-course(studentld, courseld,name)
1  1   张三选了语文课
1   2   张三选了数学课
2  1   李四选了语文课
2   3   李四选了英语课

上述都属于设计数据库表结构的固定套路.

聚合查询

增加数据

查询可以搭配插入使用,把查询语句的查询结果,作为插入的数值

总和查询
 

表达式查询,是针对列和列之间进行运算的
聚合查询,相当于是在行和行之间进行运算了.
注:

sql中可以通过--表示注释--后头至少要有一个空格.

另外也支持#开头作为注释

先执行select*,再针对结果集合进行统计(看看具体有几行)

直接查询时也可以查看具体有多少行,为什么还要使用count(*)???

因为这是mysql客户端内置的功能,
如果你是通过代码来操作mysql服务器可就没有这个功能

count(*)得到的结果还可以参与各种算术运算,还可以搭配其他sql使用.

1)如果当前的列里面有null
两种方式计算的count就不同了.

 select count(*) from 表名;

2)指定具体列,是可以进行去重的

 select count(distinct 列名) from 表名;



.

求合查询

把这一列的若干行,给进行求和.(算术运算)只能针对数字类型使用.

1.select chinese + math 把对应的列相加,得到一个临时表
2.在把这个临时表的结果进行行和行相加.

分组查询

使用group by进行分组,针对每个分组,再分别进行聚合查询.
针对指定的列进行分组,把这一列中,值相同的行,分成到一组中,得到若干个组,针对这些组,分别使用聚合函数
统计同名的人有多少

使用group by还可以搭配其他条件

需要区分清楚,该条件是分组之前的条件,还是分组之后的条件

分组之前的where一般都是在分组之前的,并且其在gruop by之前

分组之后的条件使用having 描述条件.having子句一般写在group by 的后面

联合查询

联合查询是同时对多个针对多个表来进行的查询。

要想明白联合查询就要先理清笛卡尔积在这的作用。

class (id,name)          student ( id,  name,    class_ld)

1  1班                                         1  张三       1                                                                                    

2  2班                                        2  李四         2

3  3班                                       3   王五         3

将这两个表进行笛卡尔积,会得到一个更大的表。

笛卡尔积的列数,是这两个表的列数相加.笛卡尔积的行数,是这两个表的行数相乘.

id,       name      id ,     name,    class_ld

1       1班             1       张三       1       

1       1班             2       李四       2

1       1班             3       王五      3        

类似不完全的表(只写出了class表的第一行于student表的组合 )

从上表中可以看出,数据有一些不符合实际情况的数据,比如第二行和第三行数据无法使用,因为他两不可能同时是两个班的学生。

所以进行多表查询的时候,就需要把有意义的数据筛选出来,无意义的数据,排除掉


如何通过 sql的条件筛选出来呢??

就需要将两个表中数据相关联的数据进行连接如下

where班级表的id =学生表的class_ld

建议使用表明.列名   可读性强

还可以只查询张三的信息

只查询张三部分信息



上面这些操作都是基于"内连接"
mysql来说,进行联合查询,还可以使用"外连接"(左外连接,右外连接)

如果这两个表,里面的记录都是存在对应关系,内连接和外连接的结果是一致的.如果存在不对应的记录,内连接和外连接就会出现差别.

内连接

逗号换成 join一样

             


 

左外连接

left join

左外连接,就是以左侧表为基准,保证左侧表的每个数据
都会出现在最终结果里.如果在右侧表中不存在,对应的列就填成null

-
右外连接

right join


右外连接,是以右侧表为基准,保证右侧表的每个数据
都会出现在最终结果里.如果左侧表中不存在,对应的列就填成null

自连接.一张表,自己和自己进行笛卡尔积.
有的时候,需要去进行行和行之间的比较

而sql只能进行列和列之间比较

sql里写个条件,都是列和列之间进行比较
但是有的时候可能会涉及到需求是进行行和行比较.
就可以使用自连接,把行的关系转换成列的关系

查找出谁的1课程的成绩高于3课程的成绩

注:自连接必修要进行起别名。

子查询

子查询:本质上是在"套娃"
把多个简单的SQL拼成一个复杂的SQL

现在查找和躺平的同班同学中想考研的人


中间括号是必修返回一行数据否则会报错

这就是单行子查询。

现在查找和考研的同班同学中不想考研的人

这就是多行子查询。

合并查询        

把多个sql查询的结果集合,合并到一起.
union关键字

 

允许把两个不同的表,查询结果合并在一起.合并的两个sql的结果集的列,需要匹配.
列的个数和类型,是要一致的(列名不需要一致)
合并的时候,是会去重的
要是不想去重,可以使用union all
 

相关文章:

  • 帝国CMS模板源码整站安装说明(图文)
  • APIFY集成客服系统:提升用户运营效率
  • 技术 SEO 初学者指南
  • hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序
  • 详解 Redis 在 Centos 系统上的安装
  • STM32为什么不能跑Linux?
  • Linux、Docker、Brew、Nginx常用命令
  • 高新技术企业上市要达到什么条件
  • Linux入门攻坚——18、SELinux、Bash脚本编程续
  • hive-分桶-索引(初篇)
  • 【DevOps工具篇】Keycloak安装配置及脚本化
  • 【算法】双指针算法
  • 你知道 Java 线程池的原理吗?
  • 基于javassmJSP的教学质量评价系统
  • c++ 根据ip主机号和子网掩码随机生成ip
  • 网络传输文件的问题
  • 【刷算法】从上往下打印二叉树
  • 【知识碎片】第三方登录弹窗效果
  • Brief introduction of how to 'Call, Apply and Bind'
  • CSS 三角实现
  • CSS相对定位
  • fetch 从初识到应用
  • HTTP中的ETag在移动客户端的应用
  • Java的Interrupt与线程中断
  • Rancher如何对接Ceph-RBD块存储
  • react-native 安卓真机环境搭建
  • Vue.js 移动端适配之 vw 解决方案
  • 力扣(LeetCode)22
  • 人脸识别最新开发经验demo
  • 深度学习中的信息论知识详解
  • FaaS 的简单实践
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • !$boo在php中什么意思,php前戏
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (4)logging(日志模块)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (分类)KNN算法- 参数调优
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (转) ns2/nam与nam实现相关的文件
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .net生成的类,跨工程调用显示注释
  • @Conditional注解详解
  • [04]Web前端进阶—JS伪数组
  • [383] 赎金信 js
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [CF226E]Noble Knight's Path
  • [CF543A]/[CF544C]Writing Code
  • [CSS]文字旁边的竖线以及布局知识
  • [dfs] 图案计数