【javaweb】学习日记Day7 - Mysql 数据库 DQL 多表设计

 之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客

目录

一、DQL 数据查询

1、基本查询

2、条件查询

3、分组查询

(1)聚合函数

① count函数

②  max min avg sum函数

(2)分组查询

① where和having的区别

(3)排序查询 

(4)分页查询

(5)案例

① if 和 case

二、多表设计

1、一对多 - 外键

 ① SQL 语句

② IDEA图形化操作

2、一对一  

3、多对多 

4、案例


一、DQL 数据查询

  

1、基本查询

*号代表查询所有字段,但不直观,影响效率(开发中尽量少用)

-- 查询name,entrydate
select name,entrydate from tb_emp;

-- 查询所有字段
select * from tb_emp;


-- 查询所有员工的name,entrydate,并起别名(姓名,入职日期)
select name as 姓名,entrydate as 入职日期 from tb_emp;

-- 查询员工所在的职位类型(不重复)
select distinct job from tb_emp;

2、条件查询

like 占位符      (_匹配单个字符,%匹配任意字符)

-- 查询name为杨逍的员工
select * from tb_emp where name='杨逍';

-- 查询id≤5的员工信息
select * from tb_emp where id<=5;

-- 查询没有分配职位的员工信息
select * from tb_emp where job is null;

-- 查询有职位的员工信息
select * from tb_emp where job is not null;

-- 查询密码不等于123456的员工信息
select * from tb_emp where password<>'123456';

-- 查询入职日期在[2000-01-01,2010-01-01]的员工信息
select * from tb_emp where entrydate >= '2000-01-01' and entrydate <= '2010-01-01';

select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01';

-- 查询入职日期在[2000-01-01,2010-01-01]且性别为女的员工信息
select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01' and gender=2;

-- 查询职位是2或3或4的员工信息
select * from tb_emp where job in (2,3,4);

-- 查询姓名是两个字的员工信息
select * from tb_emp where name like '__';

-- 查询姓张的员工信息
select * from tb_emp where name like '张%';

3、分组查询

(1)聚合函数

一列数据作为一个整体,进行纵向运算

不对null值进行统计

select 聚合函数(字段列表) from 表名
函数

功能

count统计数量
max最大值
min最小值
avg平均值
sum求和

① count函数

 推荐使用count(*) 

-- 1. 统计该企业员工数量
-- A.count(字段)
select count(id) from tb_emp;

-- B.count(常量)
select count('A') from tb_emp;

-- C.count(*)  -- 推荐!
select count(*) from tb_emp;

②  max min avg sum函数

-- 2. 统计该企业员工 ID 的平均值
select avg(id) from tb_emp;

-- 3. 统计该企业最早入职的员工
select min(entrydate) from tb_emp;

-- 4. 统计该企业最迟入职的员工
select max(entrydate) from tb_emp;

-- 5. 统计该企业员工的 ID 之和
select sum(id) from tb_emp;

(2)分组查询

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组过滤后的条件]

where > 聚合函数 > having,where不能对聚合函数进行判断,having可以

① where和having的区别

  • 执行时机不同:where是分组前过滤,不满足where,不参与分组;having是分组之后对结果进行过滤
  • 判断条件不同:having可以对聚合函数进行判断,where不行

 分组后,查询字段一般为聚合函数分组字段,查询其他字段无意义 

-- 分组
-- 1. 根据性别分组 , 统计男性和女性员工的数量
select gender,count(*) from tb_emp group by gender;

-- 2. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job,count(*) from tb_emp where entrydate <= '2015-01-01' group by job having count(*)>=2;

(3)排序查询 

select 字段列表 from 表名 [where 条件] [group by 分组字段名] order by 字段1 排序方式1,字段2 排序方式2...
  • ASC 升序(默认值)
  • DESC 降序
-- 1. 根据入职时间, 对员工进行升序排序
select * from tb_emp order by entrydate asc;

-- 2. 根据入职时间, 对员工进行降序排序
select * from tb_emp order by entrydate desc;

-- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
select * from tb_emp order by entrydate, update_time desc;

(4)分页查询

select 字段列表 from 表名 limit 起始索引,查询记录数;
  •  起始索引 = (页码 - 1)* 每页展示记录数
  • 如果查询的是第1页数据,则可以省略索引
  • 先查询再排序!
-- 1. 从起始索引0开始查询员工数据, 每页展示5条记录
select * from tb_emp limit 0,5;

-- 2. 查询 第1页 员工数据, 每页展示5条记录
select * from tb_emp limit 0,5;

-- 3. 查询 第2页 员工数据, 每页展示5条记录
select * from tb_emp limit 5,5;

-- 4. 查询 第3页 员工数据, 每页展示5条记录
select * from tb_emp limit 10,5;

(5)案例

-- 按需求完成员工管理的条件分页查询 - 根据输入条件,查询第一页数据,每一页展示10条记录
-- 输入条件:
-- 姓名:张
-- 性别:男
-- 入职时间:2000-01-01   2015-12-31
-- 要求查询结果根据最后修改时间进行倒序排序
-- 支持分页查询
select *
from tb_emp
where name like '张%'
  and gender = 1
  and entrydate between '2000-01-01' and '2015-12-31'
order by update_time desc
limit 10;

① if 和 case

  • if (条件表达式,true取值,false取值)
  • case 表达式 when 值1 then 结果1 when值2 then 结果2 ... else 结果n end
-- 按需求完成员工的性别统计  -- count(*)
-- if(条件表达式,true取值,false取值)
select if(gender = 1, '男', '女') as 性别, count(*) as 人数
from tb_emp
group by gender;



-- 按需求完成员工的职位信息统计  -- count(*)
-- case 表达式 when 值1 then 结果1 when值2 then 结果2 ... else 结果n end
select (case job
            when 1 then '班主任'
            when 2 then '讲师'
            when 3 then '学工主管'
            when 4 then '教研主管'
            else '未分配职位' end) 职位, count(*)人数
from tb_emp
group by job;

 

二、多表设计

1、一对多 - 外键

在作为【多】的表中将【一】的主键设置为外键

 ① SQL 语句

create table 表名(
    字段名 数据类型,
    ...
    constraint 外键名称 foreign key (外键字段名) reference 主表(字段名)
);

-- 指定完表后添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名) reference 主表(字段名)

② IDEA图形化操作

  

  

     

2、一对一  

在任意一方加入外键,关联另一方的主键,并设置外键为唯一的unique

  

3、多对多 

建立一个中间表,该表包含两个外键,分别关联两方主键

  

4、案例

  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Tkinter系列02/5】界面初步和布局

本文是系列文章第二部分。前文见&#xff1a;【Tkinter系列01/5】界面初步和布局_无水先生的博客-CSDN博客 说明 一般来说&#xff0c;界面开发中&#xff0c;如果不是大型的软件&#xff0c;就不必用QT之类的实现&#xff0c;用Tkinter已经足够&#xff0c;然而即便是Tkinter规…

基于大数据+django+mysql的银行信用卡用户的数仓系统

系统阐述的是银行信用卡用户的数仓系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构…

gitcode中删除已有的项目

镜像地址&#xff1a; https://www.jianshu.com/p/504c1418adb7?v1693021320653 扩展阅读 如何在GitLab中删除一个项目 https://www.codenong.com/cs106866762/ 简介&#xff1a; 如何在GitLab中删除一个项目 最近GIT上建了太多项目。想清一下&#xff0c;就在网上查了查…

opencv-答题卡识别判卷

#导入工具包 import numpy as np import argparse import imutils import cv2# 设置参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--image", requiredTrue,help"path to the input image") args vars(ap.parse_args())# 正确答案…

【动手学深度学习】--18.图像增广

文章目录 图像增广1.常用的图像增广方法1.1翻转和裁剪1.2改变颜色1.3结合多种图像增广方法 2.使用图像增广进行训练3.训练 图像增广 官方笔记&#xff1a;图像增广 学习视频&#xff1a;数据增广【动手学深度学习v2】 图像增广在对训练图像进行一系列的随机变化之后&#xff…

实验八 网卡驱动移植

【实验目的】 掌握 Linux 内核配置的基本方法&#xff0c;完成对网卡驱动、NFS 等相关功能的配置 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具&#xff1a;arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&…

21.2 CSS 三大特性与页面布局

1. 开发者工具修改样式 使用开发者工具修改样式, 操作步骤如下: * 1. 打开开发者工具: 在浏览器中右键点击页面, 然后选择检查或者使用快捷键(一般是 F12 或者 CtrlShiftI)来打开开发者工具.* 2. 打开样式编辑器: 在开发者工具中, 找到选项卡或面板, 一般是Elements或者Elemen…

最新AI系统ChatGPT程序源码/微信公众号/H5端+搭建部署教程+完整知识库

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

不系安全带抓拍自动识别

不系安全带抓拍自动识别系统通过yolo系列算法框架模型利用高清摄像头&#xff0c;不系安全带抓拍自动识别算法对高空作业场景进行监控&#xff0c;当检测到人员未佩戴安全带时会自动抓拍并进行告警记录。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用ancho…

一生一芯8——在github上添加ssh key

为在github上下载代码框架&#xff0c;这里在github上使用ssh key进行远程连接&#xff0c;方便代码拉取 参照博客https://blog.csdn.net/losthief/article/details/131502734 本机 系统ubuntu22.04 git 版本2.34.1 本人是第一次配置&#xff0c;没有遇到奇奇怪怪的错误&…

Faster RCNN网络数据流总结

前言 在学习Faster RCNN时&#xff0c;看了许多别人写的博客。看了以后&#xff0c;对Faster RCNN整理有了一个大概的了解&#xff0c;但是对训练时网络内部的数据流还不是很清楚&#xff0c;所以在结合这个版本的faster rcnn代码情况下&#xff0c;对网络数据流进行总结。以便…

TiDB 源码编译之 TiProxy 篇

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/3d57f54d TiProxy 简介 TiProxy 是一个基于 Apache 2.0 协议开源的、轻量级的 TiDB 数据库代理&#xff0c;基于 Go 语言编写&#xff0c;支持 MySQL 协议。 TiProxy 支持负载均衡&#xff0c;接收来…

【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

Spring Cloud Gateway简介 Spring Cloud Gateway是Spring Cloud体系的第二代网关组件&#xff0c;基于Spring 5.0的新特性WebFlux进行开发&#xff0c;底层网络通信框架使用的是Netty&#xff0c;所以其吞吐量高、性能强劲&#xff0c;未来将会取代第一代的网关组件Zuul。Spri…

opencv-gpu版本编译(添加java支持,可选)实现硬解码

目录 opencv gpu版本编译&#xff0c;实现硬解码&#xff0c;加速rtsp视频流读取1、准备文件2、复制 NVCUVID 头文件到 cuda 安装目录 include3、安装相关依赖4、 执行cmake5、编译安装6、测试 opencv gpu版本编译&#xff0c;实现硬解码&#xff0c;加速rtsp视频流读取 前置条…

为什么使用Nacos而不是Eureka(Nacos和Eureka的区别)

文章目录 前言一、Eureka是什么&#xff1f;二、Nacos是什么&#xff1f;三、Nacos和Eureka的区别3.1 支持的CAP3.2连接方式3.3 服务异常剔除3.4 操作实例方式 总结 前言 为什么如今微服务注册中心用Nacos相对比用Eureka的多了&#xff1f;本文章将介绍他们之间的区别和优缺点…

2023前端面试笔记 —— CSS3

系列文章目录 内容链接2023前端面试笔记HTML52023前端面试笔记CSS3 文章目录 系列文章目录前言一、CSS选择器的优先级二、通过 CSS 的哪些方式可以实现隐藏页面上的元素三、px、em、rem之间有什么区别&#xff1f;四、让元素水平居中的方法有哪些五、在 CSS 中有哪些定位方式六…

windows11系统重装步骤及优化技巧

目录 目录 本文目的 Windows11介绍 Windows下载 和win10对比 重装步骤 系统设置调整 系统备份还原 C盘减肥&#xff0c;空间优化技巧 Java开发工具 本文目的 说明windows11的系统重装步骤&#xff0c;大部分步骤也适用于其他windows版本。常用软件的安装与介绍。系统…

Jmeter 如何才能做好接口测试?

现在对测试人员的要求越来越高&#xff0c;不仅仅要做好功能测试&#xff0c;对接口测试的需求也越来越多&#xff01; 所以也越来越多的同学问&#xff0c;怎样才能做好接口测试&#xff1f; 要真正的做好接口测试&#xff0c;并且弄懂如何测试接口&#xff0c;需要从如下几…

HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制LazyForEach数据懒加载

LazyForEach从提供的数据源中按需迭代数据&#xff0c;并在每次迭代过程中创建相应的组件。当LazyForEach在滚动容器中使用了&#xff0c;框架会根据滚动容器可视区域按需创建组件&#xff0c;当组件划出可视区域外时&#xff0c;框架会进行组件销毁回收以降低内存占用。一、接…

Oracle-rolling upgrade升级19c

前言: 本文主要描述Oracle11g升19c rolling upgrade升级测试&#xff0c;通过逻辑DGautoupgrade方式实现rolling upgrade&#xff0c;从而达到在较少停机时间内完成Oracle11g升级到19c的目标 升级介绍&#xff1a; 升级技术: rolling upgrade轮询升级&#xff0c;通过采用跨版…