From c507fabf88bf0d333e185ae4de101582df0d52ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=8C?= <280180014@qq.com> Date: Sun, 26 Feb 2023 18:56:56 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=90=B4=E6=96=8C=E7=9A=84=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ML\347\232\204\345\255\246\344\271\240.md" | 0 ...11\350\243\205\346\225\231\347\250\213.md" | 164 ++++ ...15\347\232\204\345\255\246\344\271\240.md" | 0 ...37\347\232\204\345\255\246\344\271\240.md" | 0 ...46\347\232\204\345\255\246\344\271\240.md" | 0 ...04\345\205\250\347\254\224\350\256\260.md" | 699 ++++++++++++++++++ 6 files changed, 863 insertions(+) rename "15 \345\220\264\346\226\214/20220216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" => "15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240.md" (100%) create mode 100644 "15 \345\220\264\346\226\214/22030213 \345\256\211\350\243\205\346\225\231\347\250\213.md" rename "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" => "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240.md" (100%) rename "15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" => "15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" (100%) rename "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" => "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240.md" (100%) create mode 100644 "15 \345\220\264\346\226\214/22030223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" diff --git "a/15 \345\220\264\346\226\214/20220216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" "b/15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240.md" similarity index 100% rename from "15 \345\220\264\346\226\214/20220216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" rename to "15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240.md" diff --git "a/15 \345\220\264\346\226\214/22030213 \345\256\211\350\243\205\346\225\231\347\250\213.md" "b/15 \345\220\264\346\226\214/22030213 \345\256\211\350\243\205\346\225\231\347\250\213.md" new file mode 100644 index 0000000..e62f625 --- /dev/null +++ "b/15 \345\220\264\346\226\214/22030213 \345\256\211\350\243\205\346\225\231\347\250\213.md" @@ -0,0 +1,164 @@ +## 1.mysql下载地址 + +[https://dev.mysql.com/downloads/windows/installer](https://link.zhihu.com/?target=https%3A//dev.mysql.com/downloads/windows/installer) + +![img](https://pic4.zhimg.com/80/v2-f6080ab6d03039e990da89004d5cbbe3_1440w.webp) + +## 2、安装步骤 + +### **1)双击下面这个安装程序。** + +![img](https://pic1.zhimg.com/80/v2-9329589f8dfd3b7bd04d70be18e838fc_1440w.webp) + +**2)出现如下这个界面后,勾选"I accept the license terms",点击"Next"。** + +![img](https://pic1.zhimg.com/80/v2-e90b34d9c35c818a79a87f9bb4d4478c_1440w.webp) + +**3)出现如下这个界面后,选择"Custom",,点击"Next"。** + +![img](https://pic2.zhimg.com/80/v2-6490c1fb4964cda56b88835a082bf731_1440w.webp) + +**4)出现如下界面后,我们进行如下的操作。** + +![img](https://pic2.zhimg.com/80/v2-ac08ad709afa91da3d1534fadafa3d89_1440w.webp) + +**5)同时在这个界面中,还可以查看"MySQL Server 5.7.21-X64"默认安装路径。** + +注:这里的第5步操作,你一定要按照我这里说的,操作一遍。 + +### **第一步:先选中"MySQL Server 5.7.21-X64"。** + +![img](https://pic3.zhimg.com/80/v2-39c7fab7373b58121545b9f7f3fb827e_1440w.webp) + +**第二步:点击右下角"Acvanced Options"。** + +![img](https://pic2.zhimg.com/80/v2-fdbda1442d3bb9b945dab4162ae6a08d_1440w.webp) + +**第三步:此时,会出现如下界面。** + +![img](https://pic4.zhimg.com/80/v2-ca07b8951abebf4f59c56fea924dddf3_1440w.webp) + +**注意如下:** + +![img](https://pic1.zhimg.com/80/v2-c1b811644df2e1609bd00c5c6dd90af8_1440w.webp) + +### **6)出现如下界面后,证明可以了,点击"Execute"。** + +![img](https://pic4.zhimg.com/80/v2-3bea1ebd6b40ca893e878b97c7e6898f_1440w.webp) + +**7)当出现如下界面后,点击"Next"。** + +![img](https://pic3.zhimg.com/80/v2-5f67f3d9ce671491159f7cc76e4c9bf6_1440w.webp) + +**8)当出现如下界面后,点击"Next"。** + +![img](https://pic2.zhimg.com/80/v2-dfa1ee8dc861d3653262b16fafd56899_1440w.webp) + +**9)当出现如下界面后,勾选红黄色方框中内容,点击"Next"。** + +![img](https://pic1.zhimg.com/80/v2-273b3b72c4ad3925268fce70e6212aac_1440w.webp) + +**10)当出现如下界面后,使用界面默认内容即可,点击"Next"。** + +![img](https://pic3.zhimg.com/80/v2-eae2ea588e15eb77b76ed441664d14be_1440w.webp) + +**11)当出现如下界面后,设置好密码后,点击"Next"。** + +![img](https://pic3.zhimg.com/80/v2-49ddb3f25eb927fa449d661456d96b66_1440w.webp) + +**12)当出现如下界面后,进行如下设置后,点击"Next"。** + +![img](https://pic3.zhimg.com/80/v2-3975b7704307703b785777b167b707fe_1440w.webp) + +**13)当出现如下界面后,直接点击"Next"。** + +![img](https://pic4.zhimg.com/80/v2-ba192820b056d5db3baea3b6e0eaa4ab_1440w.webp) + +**14)当出现如下界面后,直接点击"Next"。** + +![img](https://pic2.zhimg.com/80/v2-f6adcdecdf630457471166e40e38fe45_1440w.webp) + +**15)当出现如下界面后,直接点击"Execute"。** + +![img](https://pic2.zhimg.com/80/v2-dd8c02999bcfa17ee3a02ad59b8988a1_1440w.webp) + +### **16)当出现如下界面后,直接点击"Finish"。** + +![img](https://pic1.zhimg.com/80/v2-bfd9e24cc3e081b4da716150ff2e7410_1440w.webp) + +**17)当出现如下界面后,直接点击"Next"。** + +![img](https://pic4.zhimg.com/80/v2-af480ce6570dfe16424981b8a4c6e63b_1440w.webp) + +**18)当出现如下界面后,直接点击"Finish"。** + +![img](https://pic1.zhimg.com/80/v2-b82a6c3a7ea8f86612694450f2760090_1440w.webp) + +**19)配置环境变量** + +在上述第5步的时候,我们知道了数据库管理系统(Mysql Server)是安装在如下目录中: + +![img](https://pic2.zhimg.com/80/v2-687cff4e210a1e401548c7fde2c7cb3d_1440w.webp) + +我们找到mysql server的安装目录:C\Program Files\MySQL\MySQL Server 5.7,并进入bin目录,里面会有很多“二进制可执行文件”。 + +![img](https://pic1.zhimg.com/80/v2-ac12b9103e65add2f2d641b9fbaf92ac_1440w.webp) + +- 利用mysql.exe可执行文件,就能实现对mysql的接,但是你不能在这里直接双击,即使你双击,也只是出现一个“闪屏”。mysql.exe可执行文件,只能在CMD黑窗口中运行。在CMD黑窗口中,其实你配置不配置环境变量,都可以执行这个可执行文件。当你不配置环境变量,就只能切换到mysql.exe所在的目录,才能执行mysql的启动命令;当你配置了环境变量,只要是你打开了CMD窗口,你在任何一个路径下就可以执行mysql的启动命令。 +- 当没有配置环境变量; + +![img](https://pic2.zhimg.com/80/v2-d56ca0069ea6cd5a496aaf273aa29f3d_1440w.webp) + +- 配置环境变量;打开我的电脑->属性->高级->环境变量,在系统变量里选择PATH。 +- 只需要添加如下两处内容即可: + +![img](https://pic4.zhimg.com/80/v2-68fa535c9839c7a5618b44954f75c4d7_1440w.webp) + +**①** **为什么需要配置环境变量?** + +- 环境变量,代表系统的一个全局搜索路径。 +- 当你没有配置环境变量的时候,你想要执行某个目录下的某个程序,就必须找到它的具体位置,才能够执行它。你仔细想一下,假如你在其它的文件路径下,想要执行另外一个目录下的某个程序,你觉得可以吗? +- 当不配置环境变量,想要执行某个程序可以吗?当然也是可以的,就拿启动mysql来说,你如果不配置环境变量,就必须在CMD黑窗口中,使用cd命令切换到mysql server下的bin目录下,才可以执行启动。你每次这样启动是不是觉得很麻烦,当你需要经常使用mysql,需要经常执行mysql启动。这就是为什么我们需要配置环境变量的原因。 +- 当配置了某个环境变量,如果你想要执行某个程序,你可以在任何路径下,执行这个称序。首先,系统会在当前目录下,搜索是否存在想要执行的某个程序,假如没有,系统会再去系统环境变量中的目录进行一个个搜索,当搜索到了该程序,便会立即执行。 + +## 3**、对mysql中几个重要的安装目录的讲解** + +在上述第5步的时候,我们知道了数据库管理系统是安装在如下目录中: + +![img](https://pic2.zhimg.com/80/v2-687cff4e210a1e401548c7fde2c7cb3d_1440w.webp) + +**1)进入该路径下:C:\ProgramData\MySQL\MySQL Server 5.7。** + +这里面有一个重要的目录和一个重要的配置文件,需要我们注意: + +![img](https://pic1.zhimg.com/80/v2-5feb5463fed280b0be798fccb29bc994_1440w.webp) + +对于配置文件my.ini的详细说明,这里不介绍,可以参考如下网址:[https://blog.csdn.net/hanwuqia0370/article/details/85680775](https://link.zhihu.com/?target=https%3A//blog.csdn.net/hanwuqia0370/article/details/85680775)对于这个data目录,先看看里面有什么: + +![img](https://pic4.zhimg.com/80/v2-36906c578795c30aa919dc90babb4e3f_1440w.webp) + +从上图中可以看到: + +![img](https://pic4.zhimg.com/80/v2-eb1c9decf1b69bdec98c90145a077807_1440w.webp) + +系统默认的数据库: + +![img](https://pic2.zhimg.com/80/v2-a6ccf91ca42784762af84ad51d07dc25_1440w.webp) + +### **2)安装mysql后,注意区分如下几个目录的作用。** + +![img](https://pic1.zhimg.com/80/v2-e12008921171f57d346661164d1017bc_1440w.webp) + +上述各个目录的具体安装位置,都是在安装mysql步骤的第4、5步进行了详细说明: + +![img](https://pic4.zhimg.com/80/v2-7744a75f8cccf369774547cca97be3ff_1440w.webp) + +## **4、怎么查看MYSQL服务是否在Windows启动?** + +### **1)在左下角输入框(或win7中使用Win + R可以打开搜索框)中,输入"services.msc"。** + +![img](https://pic1.zhimg.com/80/v2-c628264ea282b25e818243bb86aa44cc_1440w.webp) + +**2)当启动了MySQL后,会在这里出现一个MYSQL服务进程,可以检查MYSQL是否启动。** + +![img](https://pic3.zhimg.com/80/v2-3102fa9f0b3365c56de5ad6813e41136_1440w.webp) \ No newline at end of file diff --git "a/15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" "b/15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" rename to "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240.md" diff --git "a/15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" "b/15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" rename to "15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" diff --git "a/15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" "b/15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240\345\222\214\344\275\234\344\270\232.md" rename to "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240.md" diff --git "a/15 \345\220\264\346\226\214/22030223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" "b/15 \345\220\264\346\226\214/22030223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" new file mode 100644 index 0000000..648d76c --- /dev/null +++ "b/15 \345\220\264\346\226\214/22030223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" @@ -0,0 +1,699 @@ +# 基础篇 + +## 通用语法及分类 + +- DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段) +- DML: 数据操作语言,用来对数据库表中的数据进行增删改 +- DQL: 数据查询语言,用来查询数据库中表的记录 +- DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限 + +### DDL(数据定义语言) + +数据定义语言 + +#### 数据库操作 + +查询所有数据库: +`SHOW DATABASES;` +查询当前数据库: +`SELECT DATABASE();` +创建数据库: +`CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];` +删除数据库: +`DROP DATABASE [ IF EXISTS ] 数据库名;` +使用数据库: +`USE 数据库名;` + +##### 注意事项 + +- UTF8字符集长度为3字节,有些符号占4字节,所以推荐用utf8mb4字符集 + +#### 表操作 + +查询当前数据库所有表: +`SHOW TABLES;` +查询表结构: +`DESC 表名;` +查询指定表的建表语句: +`SHOW CREATE TABLE 表名;` + +创建表: +```mysql +CREATE TABLE 表名( + 字段1 字段1类型 [COMMENT 字段1注释], + 字段2 字段2类型 [COMMENT 字段2注释], + 字段3 字段3类型 [COMMENT 字段3注释], + ... + 字段n 字段n类型 [COMMENT 字段n注释] +)[ COMMENT 表注释 ]; +``` +**最后一个字段后面没有逗号** + +添加字段: +`ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];` +例:`ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称';` + +修改数据类型: +`ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);` +修改字段名和字段类型: +`ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];` +例:将emp表的nickname字段修改为username,类型为varchar(30) +`ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵称';` + +删除字段: +`ALTER TABLE 表名 DROP 字段名;` + +修改表名: +`ALTER TABLE 表名 RENAME TO 新表名` + +删除表: +`DROP TABLE [IF EXISTS] 表名;` +删除表,并重新创建该表: +`TRUNCATE TABLE 表名;` + +### DML(数据操作语言) + +#### 添加数据 + +指定字段: +`INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);` +全部字段: +`INSERT INTO 表名 VALUES (值1, 值2, ...);` + +批量添加数据: +`INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);` +`INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);` + +##### 注意事项 + +- 字符串和日期类型数据应该包含在引号中 +- 插入的数据大小应该在字段的规定范围内 + +#### 更新和删除数据 + +修改数据: +`UPDATE 表名 SET 字段名1 = 值1, 字段名2 = 值2, ... [ WHERE 条件 ];` +例: +`UPDATE emp SET name = 'Jack' WHERE id = 1;` + +删除数据: +`DELETE FROM 表名 [ WHERE 条件 ];` + +### DQL(数据查询语言) + +语法: +```mysql +SELECT + 字段列表 +FROM + 表名字段 +WHERE + 条件列表 +GROUP BY + 分组字段列表 +HAVING + 分组后的条件列表 +ORDER BY + 排序字段列表 +LIMIT + 分页参数 +``` + +#### 基础查询 + +查询多个字段: +`SELECT 字段1, 字段2, 字段3, ... FROM 表名;` +`SELECT * FROM 表名;` + +设置别名: +`SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;` +`SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;` + +去除重复记录: +`SELECT DISTINCT 字段列表 FROM 表名;` + +转义: +`SELECT * FROM 表名 WHERE name LIKE '/_张三' ESCAPE '/'` +/ 之后的\_不作为通配符 + +#### 条件查询 + +语法: +`SELECT 字段列表 FROM 表名 WHERE 条件列表;` + +条件: + +| 比较运算符 | 功能 | +| ------------------- | ------------------------------------------- | +| > | 大于 | +| >= | 大于等于 | +| < | 小于 | +| <= | 小于等于 | +| = | 等于 | +| <> 或 != | 不等于 | +| BETWEEN ... AND ... | 在某个范围内(含最小、最大值) | +| IN(...) | 在in之后的列表中的值,多选一 | +| LIKE 占位符 | 模糊匹配(\_匹配单个字符,%匹配任意个字符) | +| IS NULL | 是NULL | + +| 逻辑运算符 | 功能 | +| ------------------ | ---------------------------- | +| AND 或 && | 并且(多个条件同时成立) | +| OR 或 || | 或者(多个条件任意一个成立) | +| NOT 或 ! | 非,不是 | + +例子: +```mysql +-- 年龄等于30 +select * from employee where age = 30; +-- 年龄小于30 +select * from employee where age < 30; +-- 小于等于 +select * from employee where age <= 30; +-- 没有身份证 +select * from employee where idcard is null or idcard = ''; +-- 有身份证 +select * from employee where idcard; +select * from employee where idcard is not null; +-- 不等于 +select * from employee where age != 30; +-- 年龄在20到30之间 +select * from employee where age between 20 and 30; +select * from employee where age >= 20 and age <= 30; +-- 下面语句不报错,但查不到任何信息 +select * from employee where age between 30 and 20; +-- 性别为女且年龄小于30 +select * from employee where age < 30 and gender = '女'; +-- 年龄等于25或30或35 +select * from employee where age = 25 or age = 30 or age = 35; +select * from employee where age in (25, 30, 35); +-- 姓名为两个字 +select * from employee where name like '__'; +-- 身份证最后为X +select * from employee where idcard like '%X'; +``` + +#### 分组查询 + +语法: +`SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];` + +例子: + +```mysql +-- 根据性别分组,统计男性和女性数量(只显示分组数量,不显示哪个是男哪个是女) +select count(*) from employee group by gender; +-- 根据性别分组,统计男性和女性数量 +select gender, count(*) from employee group by gender; +-- 根据性别分组,统计男性和女性的平均年龄 +select gender, avg(age) from employee group by gender; +-- 年龄小于45,并根据工作地址分组 +select workaddress, count(*) from employee where age < 45 group by workaddress; +-- 年龄小于45,并根据工作地址分组,获取员工数量大于等于3的工作地址 +select workaddress, count(*) address_count from employee where age < 45 group by workaddress having address_count >= 3; +``` + +#### 排序查询 + +语法: +`SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;` + +排序方式: + +- ASC: 升序(默认) +- DESC: 降序 + +例子: + +```mysql +-- 根据年龄升序排序 +SELECT * FROM employee ORDER BY age ASC; +SELECT * FROM employee ORDER BY age; +-- 两字段排序,根据年龄升序排序,入职时间降序排序 +SELECT * FROM employee ORDER BY age ASC, entrydate DESC; +``` + +##### 注意事项 + +如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 + +## 约束 + +分类: + +| 约束 | 描述 | 关键字 | +| ------------ | ------------ | ------------ | +| 非空约束 | 限制该字段的数据不能为null | NOT NULL | +| 唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE | +| 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY | +| 默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT | +| 检查约束(8.0.1版本后) | 保证字段值满足某一个条件 | CHECK | +| 外键约束 | 用来让两张图的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY | + +约束是作用于表中字段上的,可以再创建表/修改表的时候添加约束。 + +### 常用约束 + +| 约束条件 | 关键字 | +| ------------ | ------------ | +| 主键 | PRIMARY KEY | +| 自动增长 | AUTO_INCREMENT | +| 不为空 | NOT NULL | +| 唯一 | UNIQUE | +| 逻辑条件 | CHECK | +| 默认值 | DEFAULT | + +例子: + +```mysql +create table user( + id int primary key auto_increment, + name varchar(10) not null unique, + age int check(age > 0 and age < 120), + status char(1) default '1', + gender char(1) +); +``` + +### 外键约束 + +添加外键: + +```mysql +CREATE TABLE 表名( + 字段名 字段类型, + ... + [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名) +); +ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名); + +-- 例子 +alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id); +``` + +删除外键: +`ALTER TABLE 表名 DROP FOREIGN KEY 外键名;` + +#### 删除/更新行为 + +| 行为 | 说明 | +| ------------ | ------------ | +| NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与RESTRICT一致) | +| RESTRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新(与NO ACTION一致) | +| CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则也删除/更新外键在子表中的记录 | +| SET NULL | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(要求该外键允许为null) | +| SET DEFAULT | 父表有变更时,子表将外键设为一个默认值(Innodb不支持) | + +更改删除/更新行为: +`ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE 行为 ON DELETE 行为;` + +## 多表查询 + +### 多表关系 + +- 一对多(多对一) +- 多对多 +- 一对一 + +#### 一对多 + +案例:部门与员工 +关系:一个部门对应多个员工,一个员工对应一个部门 +实现:在多的一方建立外键,指向一的一方的主键 + +#### 多对多 + +案例:学生与课程 +关系:一个学生可以选多门课程,一门课程也可以供多个学生选修 +实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键 + +#### 一对一 + +案例:用户与用户详情 +关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率 +实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE) + +### 查询 + +合并查询(笛卡尔积,会展示所有组合结果): +`select * from employee, dept;` + +> 笛卡尔积:两个集合A集合和B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积) + +消除无效笛卡尔积: +`select * from employee, dept where employee.dept = dept.id;` + +### 内连接查询 + +内连接查询的是两张表交集的部分 + +隐式内连接: +`SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;` + +显式内连接: +`SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;` + +显式性能比隐式高 + +例子: + +```mysql +-- 查询员工姓名,及关联的部门的名称 +-- 隐式 +select e.name, d.name from employee as e, dept as d where e.dept = d.id; +-- 显式 +select e.name, d.name from employee as e inner join dept as d on e.dept = d.id; +``` + +### 外连接查询 + +左外连接: +查询左表所有数据,以及两张表交集部分数据 +`SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;` +相当于查询表1的所有数据,包含表1和表2交集部分数据 + +右外连接: +查询右表所有数据,以及两张表交集部分数据 +`SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;` + +例子: + +```mysql +-- 左 +select e.*, d.name from employee as e left outer join dept as d on e.dept = d.id; +select d.name, e.* from dept d left outer join emp e on e.dept = d.id; -- 这条语句与下面的语句效果一样 +-- 右 +select d.name, e.* from employee as e right outer join dept as d on e.dept = d.id; +``` + +左连接可以查询到没有dept的employee,右连接可以查询到没有employee的dept + +### 自连接查询 + +当前表与自身的连接查询,自连接必须使用表别名 + +语法: +`SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;` + +自连接查询,可以是内连接查询,也可以是外连接查询 + +例子: + +```mysql +-- 查询员工及其所属领导的名字 +select a.name, b.name from employee a, employee b where a.manager = b.id; +-- 没有领导的也查询出来 +select a.name, b.name from employee a left join employee b on a.manager = b.id; +``` + +### 联合查询 union, union all + +把多次查询的结果合并,形成一个新的查询集 + +语法: + +```mysql +SELECT 字段列表 FROM 表A ... +UNION [ALL] +SELECT 字段列表 FROM 表B ... +``` + +#### 注意事项 + +- UNION ALL 会有重复结果,UNION 不会 +- 联合查询比使用or效率高,不会使索引失效 + +### 子查询 + +SQL语句中嵌套SELECT语句,称谓嵌套查询,又称子查询。 +`SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);` +**子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个** + +根据子查询结果可以分为: + +- 标量子查询(子查询结果为单个值) +- 列子查询(子查询结果为一列) +- 行子查询(子查询结果为一行) +- 表子查询(子查询结果为多行多列) + +根据子查询位置可分为: + +- WHERE 之后 +- FROM 之后 +- SELECT 之后 + +#### 标量子查询 + +子查询返回的结果是单个值(数字、字符串、日期等)。 +常用操作符:- < > > >= < <= + +例子: + +```mysql +-- 查询销售部所有员工 +select id from dept where name = '销售部'; +-- 根据销售部部门ID,查询员工信息 +select * from employee where dept = 4; +-- 合并(子查询) +select * from employee where dept = (select id from dept where name = '销售部'); + +-- 查询xxx入职之后的员工信息 +select * from employee where entrydate > (select entrydate from employee where name = 'xxx'); +``` + +#### 列子查询 + +返回的结果是一列(可以是多行)。 + +常用操作符: + +| 操作符 | 描述 | +| ------------ | ------------ | +| IN | 在指定的集合范围内,多选一 | +| NOT IN | 不在指定的集合范围内 | +| ANY | 子查询返回列表中,有任意一个满足即可 | +| SOME | 与ANY等同,使用SOME的地方都可以使用ANY | +| ALL | 子查询返回列表的所有值都必须满足 | + +例子: + +```mysql +-- 查询销售部和市场部的所有员工信息 +select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部'); +-- 查询比财务部所有人工资都高的员工信息 +select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部')); +-- 查询比研发部任意一人工资高的员工信息 +select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部')); +``` + +#### 行子查询 + +返回的结果是一行(可以是多列)。 +常用操作符:=, <, >, IN, NOT IN + +例子: + +```mysql +-- 查询与xxx的薪资及直属领导相同的员工信息 +select * from employee where (salary, manager) = (12500, 1); +select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx'); +``` + +#### 表子查询 + +返回的结果是多行多列 +常用操作符:IN + +例子: + +```mysql +-- 查询与xxx1,xxx2的职位和薪资相同的员工 +select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2'); +-- 查询入职日期是2006-01-01之后的员工,及其部门信息 +select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id; +``` + +## 事务 + +事务是一组操作的集合,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 + +基本操作: + +```mysql +-- 1. 查询张三账户余额 +select * from account where name = '张三'; +-- 2. 将张三账户余额-1000 +update account set money = money - 1000 where name = '张三'; +-- 此语句出错后张三钱减少但是李四钱没有增加 +模拟sql语句错误 +-- 3. 将李四账户余额+1000 +update account set money = money + 1000 where name = '李四'; + +-- 查看事务提交方式 +SELECT @@AUTOCOMMIT; +-- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效 +SET @@AUTOCOMMIT = 0; +-- 提交事务 +COMMIT; +-- 回滚事务 +ROLLBACK; + +-- 设置手动提交后上面代码改为: +select * from account where name = '张三'; +update account set money = money - 1000 where name = '张三'; +update account set money = money + 1000 where name = '李四'; +commit; +``` + +操作方式二: + +开启事务: +`START TRANSACTION 或 BEGIN TRANSACTION;` +提交事务: +`COMMIT;` +回滚事务: +`ROLLBACK;` + +操作实例: + +```mysql +start transaction; +select * from account where name = '张三'; +update account set money = money - 1000 where name = '张三'; +update account set money = money + 1000 where name = '李四'; +commit; +``` + +### 四大特性ACID + +- 原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败 +- 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态 +- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 +- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的 + +### 并发事务 + +| 问题 | 描述 | +| ------------ | ------------ | +| 脏读 | 一个事务读到另一个事务还没提交的数据 | +| 不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同 | +| 幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在 | + +> 这三个问题的详细演示:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=55cd + +并发事务隔离级别: + +| 隔离级别 | 脏读 | 不可重复读 | 幻读 | +| ------------ | ------------ | ------------ | ------------ | +| Read uncommitted | √ | √ | √ | +| Read committed | × | √ | √ | +| Repeatable Read(默认) | × | × | √ | +| Serializable | × | × | × | + +- √表示在当前隔离级别下该问题会出现 +- Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差 + +查看事务隔离级别: +`SELECT @@TRANSACTION_ISOLATION;` +设置事务隔离级别: +`SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };` +SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效 + +## 函数 + +- 字符串函数 +- 数值函数 +- 日期函数 +- 流程函数 + +### 字符串函数 + +常用函数: + +| 函数 | 功能 | +| -------------------------------- | --------------------------------------------------------- | +| CONCAT(s1, s2, ..., sn) | 字符串拼接,将s1, s2, ..., sn拼接成一个字符串 | +| LOWER(str) | 将字符串全部转为小写 | +| UPPER(str) | 将字符串全部转为大写 | +| LPAD(str, n, pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 | +| RPAD(str, n, pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 | +| TRIM(str) | 去掉字符串头部和尾部的空格 | +| SUBSTRING(str, start, len) | 返回从字符串str从start位置起的len个长度的字符串 | +| REPLACE(column, source, replace) | 替换字符串 | + +使用示例: + +```mysql +-- 拼接 +SELECT CONCAT('Hello', 'World'); +-- 小写 +SELECT LOWER('Hello'); +-- 大写 +SELECT UPPER('Hello'); +-- 左填充 +SELECT LPAD('01', 5, '-'); +-- 右填充 +SELECT RPAD('01', 5, '-'); +-- 去除空格 +SELECT TRIM(' Hello World '); +-- 切片(起始索引为1) +SELECT SUBSTRING('Hello World', 1, 5); +``` + +### 数值函数 + +常见函数: + +| 函数 | 功能 | +| ----------- | -------------------------------- | +| CEIL(x) | 向上取整 | +| FLOOR(x) | 向下取整 | +| MOD(x, y) | 返回x/y的模 | +| RAND() | 返回0~1内的随机数 | +| ROUND(x, y) | 求参数x的四舍五入值,保留y位小数 | + +### 日期函数 + +常用函数: + +| 函数 | 功能 | +| ---------------------------------- | ------------------------------------------------- | +| CURDATE() | 返回当前日期 | +| CURTIME() | 返回当前时间 | +| NOW() | 返回当前日期和时间 | +| YEAR(date) | 获取指定date的年份 | +| MONTH(date) | 获取指定date的月份 | +| DAY(date) | 获取指定date的日期 | +| DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 | +| DATEDIFF(date1, date2) | 返回起始时间date1和结束时间date2之间的天数 | + +例子: + +```mysql +-- DATE_ADD +SELECT DATE_ADD(NOW(), INTERVAL 70 YEAR); +``` + +### 流程函数 + +常用函数: + +| 函数 | 功能 | +| ------------------------------------------------------------ | --------------------------------------------------------- | +| IF(value, t, f) | 如果value为true,则返回t,否则返回f | +| IFNULL(value1, value2) | 如果value1不为空,返回value1,否则返回value2 | +| CASE WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果val1为true,返回res1,... 否则返回default默认值 | +| CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END | 如果expr的值等于val1,返回res1,... 否则返回default默认值 | + +例子: + +```mysql +select + name, + (case when age > 30 then '中年' else '青年' end) +from employee; +select + name, + (case workaddress when '北京市' then '一线城市' when '上海市' then '一线城市' else '二线城市' end) as '工作地址' +from employee; +``` -- Gitee From f4e37b6397d6ef65781089d5e3284d2c988fb029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=8C?= <280180014@qq.com> Date: Sun, 26 Feb 2023 18:59:21 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=90=B4=E6=96=8C=E7=9A=84=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20230216 DDL\345\222\214DML.md" | 0 .../22030215 \344\270\252\344\272\272\344\273\213\347\273\215.md" | 0 ...030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename "15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240.md" => "15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML.md" (100%) rename "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240.md" => "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215.md" (100%) rename "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240.md" => "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" (100%) diff --git "a/15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240.md" "b/15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML.md" similarity index 100% rename from "15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML\347\232\204\345\255\246\344\271\240.md" rename to "15 \345\220\264\346\226\214/20230216 DDL\345\222\214DML.md" diff --git "a/15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240.md" "b/15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215\347\232\204\345\255\246\344\271\240.md" rename to "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215.md" diff --git "a/15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240.md" "b/15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246\347\232\204\345\255\246\344\271\240.md" rename to "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" -- Gitee From 6d1d0f4f3634bc20ecc2251032d3665f7329dc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=8C?= <280180014@qq.com> Date: Sun, 26 Feb 2023 19:44:11 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=90=B4=E6=96=8C=E7=9A=84=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20230213 \345\256\211\350\243\205\346\225\231\347\250\213.md" | 0 .../20230215 \344\270\252\344\272\272\344\273\213\347\273\215.md" | 0 ...47\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" | 0 ...230222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" | 0 ...44\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename "15 \345\220\264\346\226\214/22030213 \345\256\211\350\243\205\346\225\231\347\250\213.md" => "15 \345\220\264\346\226\214/20230213 \345\256\211\350\243\205\346\225\231\347\250\213.md" (100%) rename "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215.md" => "15 \345\220\264\346\226\214/20230215 \344\270\252\344\272\272\344\273\213\347\273\215.md" (100%) rename "15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" => "15 \345\220\264\346\226\214/20230220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" (100%) rename "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" => "15 \345\220\264\346\226\214/20230222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" (100%) rename "15 \345\220\264\346\226\214/22030223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" => "15 \345\220\264\346\226\214/20230223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" (100%) diff --git "a/15 \345\220\264\346\226\214/22030213 \345\256\211\350\243\205\346\225\231\347\250\213.md" "b/15 \345\220\264\346\226\214/20230213 \345\256\211\350\243\205\346\225\231\347\250\213.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030213 \345\256\211\350\243\205\346\225\231\347\250\213.md" rename to "15 \345\220\264\346\226\214/20230213 \345\256\211\350\243\205\346\225\231\347\250\213.md" diff --git "a/15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215.md" "b/15 \345\220\264\346\226\214/20230215 \344\270\252\344\272\272\344\273\213\347\273\215.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030215 \344\270\252\344\272\272\344\273\213\347\273\215.md" rename to "15 \345\220\264\346\226\214/20230215 \344\270\252\344\272\272\344\273\213\347\273\215.md" diff --git "a/15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" "b/15 \345\220\264\346\226\214/20230220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" rename to "15 \345\220\264\346\226\214/20230220 \347\272\246\346\235\237\347\232\204\345\255\246\344\271\240.md" diff --git "a/15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" "b/15 \345\220\264\346\226\214/20230222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" rename to "15 \345\220\264\346\226\214/20230222 DQL\345\222\214\350\277\220\347\256\227\347\254\246.md" diff --git "a/15 \345\220\264\346\226\214/22030223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" "b/15 \345\220\264\346\226\214/20230223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" similarity index 100% rename from "15 \345\220\264\346\226\214/22030223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" rename to "15 \345\220\264\346\226\214/20230223 \347\233\256\345\211\215\345\212\240\351\242\204\344\271\240\347\232\204\345\205\250\347\254\224\350\256\260.md" -- Gitee