B027-MySQL增强

目录

      • 多表查询
        • 为什么要用多表查询?
        • 笛卡尔积和内连接消除笛卡尔积
        • 外键
        • 数据库内连接练习
        • 左连接查询和右连接查询
        • 等值连接
        • out join
        • 自连接
        • 子查询
      • 数据操作(DML)
        • 数据的插入
        • 数据的删除
        • 数据的修改
      • 数据库的备份与恢复
        • Dos命令行窗口导出
        • Dos命令行窗口导入
        • Navicat导出
        • Navicat导入
      • 函数
      • 查漏补缺
        • 数据库访问控制
        • 视图
        • 三范式

多表查询

为什么要用多表查询?

可以减少单表里面的字段 ,可以很灵活的查询相要的数据。

笛卡尔积和内连接消除笛卡尔积
-- 迪卡尔积
  就是两张表组合查询时,一张表的一行数据会和另一张表的每一行都组合一下
-- 示例 
  SELECT * from product,productdir; 
-- 消除迪卡尔积  
-- 内链接
  SELECT * from product,productdir where product.dir_id =productdir.id  -- 隐式内链接
  SELECT * from product INNER JOIN productdir ON product.dir_id =productdir.id -- 显示内链接
  SELECT * from product  JOIN productdir ON product.dir_id =productdir.id -- 显示内链接 写法2
外键

含义:A表中的某一列参考B表中的某一列(id)

外键在程序中的体现:
在这里插入图片描述
CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;
RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
NO ACTION:同 RESTRICT,也是首先检查外键;

tips:MyISAM不支持外键,InnoDB才支持外键

数据库内连接练习
  -- 查询货品id,货品名称,货品所属分类名称
  SELECT product.*,productdir.dirName FROM product  INNER JOIN productdir ON product.dir_id=productdir.id
  -- 查询零售价大于200的无线鼠标
  SELECT * FROM product AS p INNER JOIN productdir AS pd  ON p.dir_id=pd.id AND p.salePrice>200 AND pd.dirName='无线鼠标'
  -- 查询零售价大于200的无线鼠标(使用表的别名)
  SELECT * FROM product AS p INNER JOIN productdir AS pd  ON p.dir_id=pd.id AND p.salePrice>200 AND pd.dirName='无线鼠标'
  -- 查询每个货品对应的分类以及对应的库存
  SELECT p.*, pd.dirName, ps.store_num FROM product p INNER JOIN productdir  pd INNER JOIN product_stock ps ON p.dir_id=pd.id AND p.id=ps.product_id
  -- 如果库存货品都销售完成,按照利润从高到低查询货品名称,零售价,货品分类(三张表).
	SELECT
		p.productName,
		p.salePrice,
		pd.dirName,
	(p.salePrice - p.costPrice) * ps.store_num AS lr
	FROM
		product p
	INNER JOIN productdir pd
	INNER JOIN product_stock ps ON p.dir_id = pd.id
	AND p.id = ps.product_id ORDER BY lr DESC
左连接查询和右连接查询

在这里插入图片描述
在这里插入图片描述

-- 外链接
  -- 左连接  LEFT JOIN
  SELECT * FROM employee INNER JOIN department ON employee.deptid=department.id;  -- 内连接
  SELECT * FROM employee LEFT  JOIN department ON employee.deptid=department.id;  -- 左连接
  -- 右连接  RIGHT JOIN 
  SELECT * FROM employee right  JOIN department ON employee.deptid=department.id; -- 右链接

-- 总结  内连接 左连接 外连接 的区别
  内连接  多表连表查询时, 只显示他们数据有关联的部分
  左连接  多表左连接查询时,  按照左表为标准,显示左边所有的数据和右表中与左表有关系的数据
  右连接  多表右连接查询时,  按照右表为标准,显示右边所有的数据和左表中与右表有关系的数据
等值连接
  -- 等值连接  (A表的外键名 和B表的外键名一致)  USING
  SELECT * FROM employee JOIN department ON employee.deptid=department.deptid; -- 原来的写法
  SELECT * FROM employee JOIN department USING (deptid)
out join

在这里插入图片描述

自连接

业务场景:
在这里插入图片描述

  -- 自连接
  SELECT p2.*, p.dirName FROM productdir AS p JOIN productdir AS p2 ON  p.id=p2.parent_id ;

在这里插入图片描述

子查询
  -- 查询零售价比罗技MX1100更高的所有商品信息。
  SELECT * from product  where  salePrice > (SELECT salePrice FROM product WHERE productName='罗技MX1100')
  -- 单行多列子查询
  需求: 查询分类编号和折扣与罗技M100相同的所有商品信息。
  SELECT * FROM product
  WHERE (dir_id,cutoff)=(
	  SELECT dir_id,cutoff FROM product WHERE productName = '罗技M100'
  )
  -- 我们真实开发中要避免过多连表查询

数据操作(DML)

数据的插入
-- 增加 
  INSERT into 表名(列名1,列名2...) values(1,2,.....) -- 写法一
  INSERT INTO employee(id,name,deptid) VALUES(6,'明锋',3); 
  INSERT INTO employee VALUES(7,'明锋',3); -- 写法二  如果我里面每一个字段都有值表后面可以省略字段 
  INSERT INTO employee(name,deptid) VALUES('明锋',3);  -- 写法三  如果列满可以省略前面的列名
-- 批量增加 
  INSERT INTO employee(name,deptid) VALUES('明锋',3),('xxx',4),('xxx2',5); 
  INSERT INTO employee (SELECT * FROM employee)  -- 把当前表的数据查询出来再插入进当前表
  INSERT INTO employee(name,deptid) (SELECT name,deptid FROM employee)  -- 把当前表的数据查询出来再插入进当前表
数据的删除
-- 删除数据
  DELETE FROM 表名  WHERE id = ?  -- 删除一条数据
  DELETE FROM 表名   -- 删除全部数据
 
-- 删除多条数据
  DELETE from employee WHERE id in(2,3); -- 这种写法
  DELETE from employee where id BETWEEN 4 AND 9
  DELETE from employee where id <= 12
数据的修改
   UPDATE 表名 SET 列名=, 列名2=-- 修改全部
   UPDATE 表名  SET 列名=, 列名2=where id=-- 按id来修改

   UPDATE employee SET name='小困困',deptid=3 WHERE id=8180
   UPDATE employee SET name='阮经天',deptid=3
   
   -- 指定id批量修改  -- 自己去研究(难)
   UPDATE employee SET name='小困困',deptid=3 WHERE id in (8180,8181,8182) -- 修改指定的id的内容
   -- 这里你们要求研究一下   扩展  -- 特难 

数据库的备份与恢复

Dos命令行窗口导出

在dos命令行窗口进行,若操作系统版本高,则使用管理员模式 --> 检索栏输入cmd - 右键以管理员身份运行

mysqldump -u账户 -p密码 数据库名称>脚本文件存储地
mysqldump -uroot -proot test1> D:\data\test.sql
Dos命令行窗口导入

速度最快(用的批量插入),导入前可先清空数据库中的表

mysql -u账户 -p密码 数据库名称< 脚本文件存储地址
mysql -uroot -proot test1< D:\data\test.sql
Navicat导出

Navicat中右键数据库 - 转储sql文件

Navicat导入

拖拽SQL文件到navicat数据库里,速度慢(一行一行插入)

函数

  -- cast
  SELECT CAST('1234.8678' AS SIGNED) --转 整型,不会四舍五入
  SELECT  CAST(deptid AS SIGNED) AS id,deptName FROM department  -- 把字符串转成整形(deptid在这里的数据库中类型定义为varchar)
  SELECT CAST('1234.8678' AS decimal)  -- 装decimal,会四舍五入
  SELECT CAST('1234.8678' AS decimal(6,2))  -- 装decimal  第一个数字:保留数字长度,第二个数字:保留小数长度

  --  ifnull
  SELECT id,productName,dir_id,IFNULL(salePrice,0) AS salePrice FROM product	-- 如果salePrice为null,赋值0 ,防止部分不能接受null值得类型收到null报错

查漏补缺

数据库访问控制

在这里插入图片描述

视图

即由sql构成的临时表,用sql来创建视图

SELECT salePrice FROM product WHERE productName='罗技MX1100'
SELECT * from product  where  salePrice > (SELECT * from haha)
三范式

1.列的原子性:列不可分割
数据库表中的所有字段值都应该是不可分解的原子值
在这里插入图片描述
2.主键相关:表中的每列都和主键相关

如订单商品用联合主键做一张表应该换成分开的两张表

3.主键直接相关,不是间接相关:

我的表不应该有别的表的数据,别的表的数据应该通过外键来关联
A表里面的字段不能拥有B表里面的数据,数据不能够重复
如下面右表虽然希望展示deptName信息,但不该有deptName字段数据,应该通过关联查询推导出来。
在这里插入图片描述

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

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

相关文章

【问题总结】Docker环境下,将Nacos版本2.0.4升级到2.2.3,操作留档 以及 踩坑记录

前记&#xff0c;鉴于nacos暴露的验证鉴权bug&#xff08;之前尝试解决但是没有完全解决&#xff01;&#xff0c;需要对公司之前架构留下来的老版本nacos进行升级 参考资料&#xff1a; https://nacos.io/zh-cn/blog/announcement-token-secret-key.html https://nacos.io/…

C++-内联函数

目录 一.什么是内联函数 1.内联函数的概念 2.内联函数的定义 二.C中引入内联函数的原因 三.什么样的函数适合被声明为内联呢&#xff1f; 四.面试题 一.什么是内联函数 1.内联函数的概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开…

iptables入门

今天我的工作遇到了巡检网络配置的任务&#xff0c;这次巡检的主机都是运行十多年的机器&#xff0c;并不是新的firewalld&#xff0c;基本都是iptables&#xff0c;上学的时候以为这些都没人用&#xff0c;所以没有认真学习&#xff0c;现在需要用到了&#xff0c;所以写一篇文…

【Midjourney实战】| 新年礼盒元素设计

文章目录 1 初步提示词2 润色提示词3 提示词发散联想 这期实践任务&#xff0c;我们想去做一个新年礼盒的效果&#xff0c;最后我们想把不同元素拼在一起&#xff0c;方便后期进行新年的相关设计 1 初步提示词 提示词初步我们乍一想&#xff0c;肯定要包括主体元素礼盒 新年礼…

C# 雪花算法生成Id工具类

写在前面 传说自然界中并不存在两片完全一样的雪花的&#xff0c;每一片雪花都拥有自己漂亮独特的形状、独一无二&#xff1b;雪花算法也表示生成的ID如雪花般独一无二&#xff0c;该算法源自Twitter。 雪花算法主要用于解决分布式系统的唯一Id生成问题&#xff0c;在生产环境…

YOLOv8改进 | 2023 | FocalModulation替换SPPF(精度更高的空间金字塔池化)

一、本文介绍 本文给大家带来的改进是用FocalModulation技术来替换了原有的SPPF&#xff08;快速空间金字塔池化&#xff09;模块。FocalModulation是今年新提出的特征增强方法&#xff0c;它利用注意力机制来聚焦于图像中的关键区域&#xff0c;从而提高模型对这些区域的识别…

Python中检查字符串是否仅包含字母的多种方法:深入探究

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 随着Python在数据处理和字符串操作方面的广泛应用&#xff0c;经常需要对字符串进行验证&#xff0c;确认其是否仅包含字母。本文将探讨Python中的多种方法来检查字符串是否只由字母组成&#xff0c;以及它们的应…

想要精确搜索商品详情?闲鱼电商API接口帮你实现!

闲鱼电商API接口是一种为开发者提供的强大工具&#xff0c;它能够帮助开发者轻松获取闲鱼平台上的商品信息&#xff0c;实现精确搜索商品详情功能。无论你是想要开发一个自有电商平台&#xff0c;还是需要定制商品搜索功能&#xff0c;闲鱼电商API接口都能够满足你的需求。 API…

C++基础 -43- STL库之set集合

在set插入数据的时候会自动排序 set集合定义格式 int myints[] {50,10,40,30,20};set<int,classcomp> second (myints,myints5);设置排序方式 struct classcomp {bool operator() (const int& lhs, const int& rhs) const{return lhs>rhs;} };举例遍历se…

解决vue3项目打包发布到服务器后访问页面显示空白问题

1.在 vite.config.ts 文件中 加入 base:./ 当你将 base 设置为 / 时&#xff0c;它表示你的应用程序将部署在服务器的根路径上&#xff0c;&#xff08;将 base 设置为 / 表示你的应用程序部署在服务器的根路径上&#xff0c;并且 Vite 会相应地处理资源和路由的路径…

数据可视化免费化:趋势背后的动因

在数字化浪潮的推动下&#xff0c;数据可视化已成为解读和利用数据的关键工具。作为一个需要经常接触各种数据可视化软件的设计师&#xff0c;我发现数据可视化工具的免费化进程正在加速。为何越来越多的数据可视化工具选择走向免费之路&#xff1f;让我们一起探讨其中的原因。…

1.vue学习笔记(vue简介+API风格+开发前的准备)

1.介绍 1.一款用于构建用户页面的JavaScript框架 2.基于HTML、CSS、JavaScript 3.官方文档&#xff1a;cn.vuejs.org2.渐进式框架 1.注重灵活性/可被逐步集成 根据需求场景&#xff1a;1.无需构建步骤&#xff0c;渐进式增强静态的HTML2.在任何页面中作为Web Components嵌入&…

【LeetCode】每日一题 2023_12_2 拼车(模拟/差分)

文章目录 刷题前唠嗑题目&#xff1a;拼车题目描述代码与解题思路学习大佬题解 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;拼车 题目链接&#xff1a;1094. 拼车 题目描述 代码与解题思路 func carPooling(trips [][]int…

计算机毕业设计 基于SpringBoot的大学生双创竞赛项目申报与路演管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【计算机组成体系结构】主存储器的基本组成

一、半导体元器件存储二进制0/1的原理 一个存储器逻辑上分为MAR&#xff0c;MDR和存储体&#xff0c;这三块在时序逻辑电路的控制下相互配合工作。 而存储体有多个存储单元构成&#xff0c;每个存储单元又由每个存储元构成。一个存储元可以存放一位的二进制的0/1。 一个存储元…

分布式ID服务实践

背景 分布式场景下需要一个全局 ID 来标识唯一性&#xff0c;比如在单数据库时通过表唯一主键即可实现唯一 ID&#xff0c;分库分表时就需要全局唯一 ID。 业务对唯一 ID 的要求如下&#xff1a; 全局唯一性 不能出现重复的 ID 号&#xff0c;既然是唯一标识&#xff0c;这…

JDK 历史版本下载以及指定版本应用

参考&#xff1a; 官网下载JAVA的JDK11版本&#xff08;下载、安装、配置环境变量&#xff09;_java11下载-CSDN博客 Gradle&#xff1a;执行命令时指定 JDK 版本 - 微酷网 下载 打开官网地址 Java Downloads | Oracle 当前版本在这里&#xff0c;但是我们要下载历史版本 选…

java中 list.size() = 1 但显示 All elements are null

一、问题描述 serve层定义一个对象集合接收mybatis返回的结果&#xff0c;查询结果为空&#xff0c;但是接收集合对象长度却为1&#xff0c;集合内部显示All elements are null&#xff1b;导致在直接调用list集合中一些方法时导致报错java.lang.NullPointerException: null …

【原创】提升MybatisPlus分页便捷性,制作一个属于自己的分页插件,让代码更加优雅

前言 MybatisPlus的分页插件有一点非常不好&#xff0c;就是要传入一个IPage&#xff0c;别看这个IPage没什么大不了的&#xff0c;最多多写一两行代码&#xff0c;可这带来一个问题&#xff0c;即使用xml的查询没法直接取对象里面变量的值了&#xff0c;得Param指定xml中的变…

一文看懂 Linux 内核,清晰明了

Linux内核预备工作 理解Linux内核最好预备的知识点&#xff1a;懂C语言 懂一点操作系统的知识 熟悉少量相关算法 懂计算机体系结构 Linux内核的特点&#xff1a; 结合了 unix 操作系统的一些基础概念。 Linux内核的任务&#xff1a; 1. 从技术层面讲&#xff0c;内核是硬…