RDBMS-MySQL高级

  • 数据操作语句(DML)
  • 多表/关联查询
  • Mysql中的函数
  • 事务
  • 执行流程
  • 数据库的备份与还原
  • 数据库表设计三范式

一、数据操作语句(DML)

  1. 插入数据

语法:

1.1插入(insert [into])或添加一条数据

-- 指定列表添加,只添加指定列的数据,其他列为默认值
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);-- 添加所有列的数据,值的顺序必须与表字段的顺序一致
INSERT INTO	table_name 
VALUES(value1,value2,value3...);

1.2 一次性添加多条数据

-- 指定列表添加,只添加指定列的数据,其他列为默认值
INSERT INTO	table_name (column1,column2,column3...)VALUES 
(value1,value2,value3...),
(value1,value2,value3...),
(value1,value2,value3...)..;-- 添加所有列的数据,值的顺序必须与表字段的顺序一致
INSERT INTO	table_name VALUES 
(value1,value2,value3...),
(value1,value2,value3...),
(value1,value2,value3...)..; 
  1. 修改数据

语法:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;-- 注意注意:如果省略了where子句,则全表的数据都会被修改
-- 注意注意:修改时没有FROM
  1. 删除数据

语法:

DELETE FROM	tablename [WHERE condition]; # 不会还原数据库表
TRUNCATE TABLE tablename; # 初始化表
Drop table tablename   # 删除表
-- drop效率 > truncat > delete-- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
-- 可以在 WHERE 子句中指定任何条件
-- 可以在单个表中一次性删除记录。

二、多表/关联查询

概念:实际应用中所需要的数据,经常会需要查询两个或两个以上的表。这种查询两个或两个以上数据表或视图的查询叫做连接查询多表查询,连接查询的多个表通常有关联字段,所以也可以叫关联查询
在这里插入图片描述

  1. 笛卡尔积

概念:假设两个表的记录条数分别是X和Y,笛卡尔积将返回X * Y条记录。

注意:当两个表关联查询时,不写连接条件,得到的结果即是笛卡尔积。

例子:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}

SELECT COUNT(*) FROM emp;  -- 14条记录
SELECT COUNT(*) FROM dept; -- 4条记录
SELECT * FROM emp, dept; -- 56条记录(14 * 4)

在实际运行环境下,应避免使用笛卡尔积。我们应该怎么去避免笛卡尔积?

  • 使用WHERE加入有效的连接条件
  • 连接 n张表,至少需要 n-1个连接条件
  1. 内连接

概念:内连接返回的仅是符合连接条件的行,不满足的过滤掉

语法:[INNER] JOIN … ON …,其中INNER可以省略

分类:

  • 显示内连接 (SELECT * FROM abc INNER JOIN cde ON abc.c = cde.c;)
  • 隐式内连接 (SELECT * FROM abc , cde WHERE abc.c = cde.c;)

区别:where擅长条件判断,join擅长表与表之间的联合查询,在多表查询的时候join更优where

表中使用别名:

  • 使用别名在多个表中区分相同的列,在不同表中具有相同列名的列可以用表的别名加以区分
  • 使用表名前缀可以提高执行效率
  • 如果使用了表的别名,则不能再使用表的真名,而且表的字段要加上表别名
  1. 外连接

概念:返回那些不满足连接条件的记录

语法:LEFT/RIGHT [OUTER] JOIN ON

  • 左外连接:把左表的所有数据全部查询数来,连接不上的用null值代替
  • 右外连接:把右表的所有数据全部查询数来,连接不上的用null值代替
SELECT	<selectList>
FROM A LEFT/RIGHT [OUTER] JOIN B
ON A.column_name = B.column_name;
  1. 子查询

概念:在SELECT查询中,在WHERE查询条件中的限制条件不是一个确定的值,而是来自于另外一个查询的结果。为了给查询提供数据而首先执行的查询语句叫做子查询

子查询:嵌入在其它SQL语句中的SELECT语句,大部分时候出现在WHERE子句中。子查询嵌入的语句称作主查询或父查询。主查询可以是SELECT语句,也可以是其它类型的语句

例子:

SELECT *FROM product p WHERE p.category_id = (SELECT category_id FROM product WHERE product_name= '罗技M90');
  1. 自连接

概念:把一张表看成两张表来做关联查询,一定要取别名 - 自连接是特殊的内连接,外连接或子查询

注意:一般自连接都有一个关联自己表的字段

三. Mysql中的函数

  1. 聚集/合函数

概念:聚集/聚合函数作用于一组数据,并对一组数据返回一个值,聚集函数会忽略NULL值

  • COUNT:统计结果记录数,如果列的值为NULL,不会计算在内的,即会忽略NULL值
  • MAX: 统计计算最大值
  • MIN: 统计计算最小值
  • SUM: 统计计算求和
  • AVG: 统计计算平均值,如果列的值为NULL,不会计算在内的,即会忽略NULL值
  1. 字符串函数

2.1 LENGTH(s):返回字符串s的长度(字节数)

(1) SELECT LENGTH('你好123');	-->	9(UTF-8)
(2) select length("ABCss111");	-->	8

2.2 CONCAT(s1,s2,…):将字符串s1,s2等多个字符串合并为一个字符串。

注意:如果有任何参数为null,则函数返回null。如果参数是数字,则自动转换为字符串

(1) SELECT CONCAT('12','34'); 			--> 1234
(2) SELECT CONCAT('My',null,'QL'); 	--> NULL
(3) SELECT CONCAT(12.3, 'mysql'); 	--> 12.3mysql

2.3 UPPER(s):将字符串s的所有字母变成大写字母

SELECT UPPER('abc'); 				--> ABC

2.4 LOWER(s):将字符串s的所有字母变成小写字母

SELECT LOWER('ABC'); 				--> abc

2.5 TRIM(s):去掉字符串s开始和结尾处的空格

SELECT TRIM('  abc dd '); 			--> abc dd
  1. 日期函数

3.1 CURDATE(),CURRENT_DATE(),CURRENT_DATE:返回当前日期

SELECT CURDATE(); 		-->		2018-07-10

3.2 CURTIME(),CURRENT_TIME(),CURRENT_TIME:返回当前时间

SELECT CURTIME(); 		--> 	09:02:12

3.3 NOW():返回当前日期和时间 (一般都用这个)

SELECT NOW();		 --> 	2018-07-10 09:04:34

3.4 YEAR(d):接受date参数,并返回日期的年份

(1) SELECT YEAR('2018-07-10 12:12:12'); 	--> 2018(2) SELECT YEAR('2018-07-10'); 			--> 2018
  1. 控制流程函数

4.1 IF(test,arg1,arg2):如果test是真,返回arg1;否则返回arg2;

(1) SELECT IF(1 = 1,2,3); 		--> 	2(2) SELECT IF(1 = 2,2,3); 		--> 	3

4.2 case — when — then — end;

case
when 条件1 then 要显示的值或语句;
when 条件2 then 要显示的值或语句;
...
else 要显示的值或语句;
end  # 这里注意不要打;号,因为后面还有写from 表名
--------------------------------------------------------------------------------
-- 案例
SELECTsalary,
CASEWHEN salary > 20000 THEN'A' WHEN salary > 15000 THEN'B' WHEN salary > 10000 THEN'C' ELSE 'D' END AS 工资级别 
FROMemployees;

四. 事务

概念:把多个操作看成是一个不可分割的工作单位,要么同时成功,要么同时失败

作用:

  • 确保数据库的完整性和一致性(数据库操作要么全部完成,要么全部不完成)
  • 实现并发控制(某一时刻只有一个用户或进程对数据执行修改操作)
  • 简化复杂操作(然后一次性提交或回滚,而不是逐个处理)
  • 支持回滚操作(撤销自事务开始以来的所有操作)
  • 提高性能(减少磁盘I/O操作的次数)

事务操作:

MYSQL中有两种方式进行事务的操作:

  • 自动提交事务:即执行一条sql语句提交一次事务,默认MySQL的事务是自动提交
  • 手动提交事务:先开启,再提交
-- 开启事务
begin;-- 张三账户扣钱
update t_account set balance = (balance-100) where id = 1;
-- 李四账户加钱
update t_account set balance = (balance+100) where id = 2;-- 如果成功执行
commit ;-- 如果失败执行
rollback ;

事务四大特性(简称ACID):

  • 原子性(Atomicity):事务必须是一个原子的操作序列单元,事务中操作在一次执行过程中,只允许出现两种状态之一
  • 一致性(Consistency):一个事务在执行之前和执行之后,数据库都必须处以一致性状态。
  • 隔离性(Isolation):一个事务的执行不能被其它事务干扰。
  • 持久性(Duration):事务一旦提交后,数据库中的数据必须被永久的保存下来。

五. 执行流程

  1. 关键字执行流程

写的顺序:select…from…join…on…where…group by…having…order by…limit…

执行顺序:from…join…on…where…group by…having…select…order by…limit…

  • FROM:决定从哪一个表查询
  • JOIN:决定跟哪一个表关联
  • ON:决定关联表的共同条件
  • WHERE:决定从表中哪一些开始查询(条件过滤,学会善用条件过滤)
  • GROUP BY:决定按照什么分组进行组内查询,一般跟聚集函数联合使用,MySql数据库此时可以使用别名
  • HAVING:在组内条件过滤,一般使用SELECT语句中的聚集函数作为过滤条件
  • SELECT:决定显示哪一些字段
  • DISTINCT:根据select中的字段决定显示哪一些不重复的字段
  • ORDER BY:决定显示的排序规则
  • LIMIT:决定每一页显示多少条件记录
  1. 子查询的执行流程

概念:从最里面(深)的查询语句开始执行,逐级向外执行,直到最后一层

注意:子查询一般是用在where语句和from语句中,执行流程满足上面的执行流程

六. 数据的备份与恢复

方式一:在dos命令行窗口进行,若操作系统版本高,则使用管理员模式

  • 导出:
mysqldump -u账户 -p密码 数据库名称 > 脚本文件存储地
mysqldump -uroot -padmin jdbcdemo> C:/shop_bak.sql
  • 导入:
mysql -u账户 -p密码 数据库名称 < 脚本文件存储地址
mysql -uroot -padmin jdbcdemo< C:/shop_bak.sql

方式二:使用可视化导入导出:Navicat工具的导入和导出/Navicat工具的备份和还原

七. 数据库表设计三范式

数据库表设计三范式(简称3NF):以后设计数据库表都需要遵守数据库三范式进行设计

  • 第一范式:列唯一

    列不可再分,保持原子性,关系型数据库默认支持

  • 第二范式:行唯一

    需要加一列作为唯一标识。这列被称为主键【非空且唯一】,并且行中每一列数据都与主键相关

  • 第三范式:如果一张表的数据能够通过其他表推导出来,不应该单独设计,通过外键的方式关联查询出来

    作用:减少数据冗余

反3FN:适当的反第三范式可以有效提高系统查询性能(变多表查询为单表查询)

原则上是不能违反三范式的,但是有的时候我们为了增强查询效率【不用关联查询,直接单表查询】,会设计一些冗余字段,变多表查询为单表查询

总结:三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。特殊情况,特殊对待,数据库设计最重要的是看需求跟性能(需求>性能>表结构)

课程总结:

1. DML - 数据操作语言增删改:
2.多表查询=关联查询笛卡尔积:多张表查询的时候没有写连接条件内连接:只查询连接上的,连接不上的不查询。关键字:[inner] join... on外连接:查询左表或右表的所有数据,连接不上的用null值替换。关键字:left/right join... on子查询:查询的条件或表不是确定的,是要通过查询语句查询出来。这个查询语句就是子查询。外部的查询主查询自连接:特殊的内连接,外连接或子查询。自己连自己一般自连接都有一个连接自己的字段:parent_id
3.mysql函数聚合函数:count()max()min()sum()avg()concat():拼接字符串 length()now(),year(now())if(1=2,2,3)case...then...
4.事务事务是将多个操作看成一个整体,要么都成功,要么都失败事务的sqlbegincommit,rollback事务四大特性:原子性,一致性,隔离性,持久性
5.执行流程from -> join...on -> where -> group by -> having -> select -> order by -> limit
6.数据的备份(导出)和还原(导入)客户端操作:命令操作:mysqldump -uroot -p123456 数据库>d:/sql/zxzz.sqlmysql -uroot -p123456 数据库<d:/sql/zxzz.sql
7.数据库设计三范式:列唯一(列不可再分) - 关系型数据库默认支持行唯一 - 要设计主键如果一个表的数据可以通过另外一个查询出来,数据不应该单独设计。而是设计外键关联查询反3FN - 为了提高查询效率,减少关联表的查询

要么都成功,要么都失败
事务的sql:begin,commit,rollback
事务四大特性:原子性,一致性,隔离性,持久性
5.执行流程
from -> join…on -> where -> group by -> having -> select -> order by -> limit
6.数据的备份(导出)和还原(导入)
客户端操作:
命令操作:mysqldump -uroot -p123456 数据库>d:/sql/zxzz.sql
mysql -uroot -p123456 数据库<d:/sql/zxzz.sql
7.数据库设计三范式:
列唯一(列不可再分) - 关系型数据库默认支持
行唯一 - 要设计主键
如果一个表的数据可以通过另外一个查询出来,数据不应该单独设计。而是设计外键关联查询

反3FN - 为了提高查询效率,减少关联表的查询

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DPVS 多活部署架构部署

一、目标 利用DPVS部署一个基于OSPF/ECMP的提供HTTP服务的多活高可用的测试环境。 本次部署仅用于验证功能&#xff0c;不提供性能验证。 配置两台DPVS组成集群、两台REAL SERVER提供实际HTTP服务。 注&#xff1a;在虚拟环境里面&#xff0c;通过在一台虚拟服务器上面安装FR…

Opencv(C++)学习 之RV1126平台的OPENCV交叉编译

本文特点&#xff1a;网上已经有了很多opencv移植RV1106的文章&#xff0c;本文主要记录基于cmake-gui编译&#xff0c;碰到的报错&#xff0c;及解决报错问题的方法&#xff0c;同时简单总结一些配置项相关的知识。 一、环境&#xff1a; ubuntu18 x64 RV1126交叉编译工具链 …

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动&#xff09;&#xff0c;按一下按键&#xff08;注&#xff1a;切…

C++学习Day01之namespace命名空间

目录 一、程序及输出1.1 命名空间用途&#xff1a; 解决名称冲突1.2 命名空间内容1.3 命名空间必须要声明在全局作用域下1.4 命名空间可以嵌套命名空间1.5 命名空间开放&#xff0c;可以随时给命名空间添加新的成员1.6 命名空间可以是匿名的1.7 命名空间可以起别名 二、分析与总…

Unity 图片不改变比例适配屏幕

Unity 图片不改变比例适配屏幕 前言项目场景布置代码编写添加并设置脚本效果 前言 遇到一个要让图片适应相机大小&#xff0c;填满屏幕&#xff0c;但不改变图片比例的需求&#xff0c;记录一下。 项目 场景布置 代码编写 创建AdaptiveImageBackground脚本 using System.C…

九、Qt图表使用

一、QCharts概述 Qt图表提供了&#xff1a;折线图、样条曲线图、面积图、散点图、条形图、饼图、方块胡须图、蜡烛图、极坐标图。1、QChart介绍 Qt Charts基于Qt的QGraphics View架构&#xff0c;其核心组件是QChartView和QChartQChartView是显示图标的视图&#xff0c;基类为…

JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】

JSP和JSTL板块&#xff1a;第三节 JSP四大域对象 一、page范围二、request范围三、session范围四、application范围 在服务器和客户端之间、各个网页之间、哪怕同一个网页之内&#xff0c;总是需要传递各种参数值&#xff0c;这时JSP的内置对象就是传递这些参数的载具。内置对象…

时间序列预测——GRU模型

时间序列预测——GRU模型 在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理时间序列数据的一种常见选择。上期已介绍了LSTM的单步和多步预测。本文将深入介绍一种LSTM变体——门控循环单元&#xff08;GRU&#xff09;模型&#xff0c;包括其理论基础…

NSFCdownload 国自然结题报告下载速度慢问题修复

最近有人反应国自然结题报告下载速度慢&#xff0c;大部分人出的问题都是在软件启动的时候&#xff0c;卡在那一直不动&#xff0c;卡的时间过长&#xff0c;以后就提示下载失败了。如下图所示&#xff0c;光标在这里&#xff0c;一直不往下走。 小编也是收到这个反馈以后&…

如何使用本地私有NuGet服务器

写在前面 上一篇介绍了如何在本地搭建一个NuGet服务器&#xff0c; 本文将介绍如何使用本地私有NuGet服务器。 操作步骤 1.新建一个.Net类库项目 2.打包类库 操作后会生成一个.nupkg文件&#xff0c;当然也可以用dotnet pack命令来执行打包。 3.推送至本地NuGet服务器 打开命…

LeetCode15. 三数之和

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 **注意&#xff1a;**答案中不可以包含重复…

指针的学习1

目录 什么是指针&#xff1f; 野指针 造成野指针的原因&#xff1a; 如何避免野指针&#xff1f; 内存和指针 如何理解编址&#xff1f; 指针变量和地址 取地址操作符& 指针变量和解引用操作符 指针变量 如何拆解指针类型&#xff1f; 指针变量的大小 指针变量…