MySQL 多表查询
多表关系
一对多(多对一)
比如部门与员工的关系,一个部门对应多个员工,一个员工对应一个部门
在多的一方建立外键,指向一的一方的主键
多对多
比如学生与课程的关系,一个学生可以选修多门课程,一个课程有多个学生可以选择
建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
一对一
比如用户与用户详情的关系,多用于单标拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的
(UNIQUE)
多表查询概述
多表查询指从多张表中查询数据
笛卡尔积:笛卡尔乘积是指在数学中,两个集合A集合 和
B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)
多表查询分类
连接查询
内连接:相当于查询 A、B 交集部分数据
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询
内连接
内连接查询的是两张表的交集的部分
隐式内连接
1SELECT 字段列表 FROM 表1, ...
MySQL 约束
概述
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确、有效性和完整性。
约束
描述
关键字
非空约束
限制该字段的数据不能为null
NOT NULL
唯一约束
保证该字段的所有数据都是唯一、不重复的
UNIQUE
主键约束
主键是一行数据的唯一标识,要求非空且唯一
PRIMARY KEY
默认约束
保存数据时,如果未指定该字段的值,则采用默认值
DEFAULT
检查约束(8.0.16版本之后)
保证字段值满足某一个条件
CHECK
外键约束
用来让两张表的数据之间建立连接,保证数据的一致性和完整性
FOREIGN KEY
自增长约束
自增 1
AUTO INCREMENT
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
外键约束
外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
具有外键的表是 子表或从表,外键关联的表是
父表或主表
添加外键
1234567CREATE TABLE 表名( 字段名 数据类型, ... [ ...
MySQL 函数
字符串函数
函数
功能
CONCAT(S1, S2, …Sn)
字符串拼接,将 S1,S2,...Sn 拼接成一个字符串
LOWER(str)
将字符串 str 全部转为小写
UPPER(str)
将字符串 str 全部转为大写
LPAD(str, n, pad)
左填充,用字符串 pad 对 str 的左边进行填充,达到 n 个字符串长度
RPAD(str, n, pad)
右填充,用字符串 pad 对 str 的右边进行填充,达到 n 个字符串长度
TRIM(str)
去掉字符串头部和尾部的空格
LTRIM(str)
去掉字符串头部的空格
RTRIM(str)
去掉字符串尾部的空格
SUBSTRING(str, start, len)
返回从字符串 str 从 start 位置起的 len 个长度的字符串
LENGTH(str)
得到字符串 str 长度,utf8
编码下,一个汉字三个字节,一个数字或字母一个字节,gbk
编码下,一个汉字两个字节,一个数字或字母一个字节
CHAR_LENGTH(str)
得到字符串 st ...
MySQL 语法
SQL
全称 Structured Query Language,结构化查询语言
根据功能,分为四类
分类
全称
说明
DDL
Data Definition Language
数据定义语言,用来定义数据库对象(数据库,表,字段)
DML
Data Manipulation Language
数据操作语言,用来对数据库表中的数据进行增删改
DQL
Data Query Language
数据查询语言,用来查询数据库中表的记录
DCL
Data Control Language
数据控制语言,用来创建数据库用户、控制数据库的访问权限
DDL
Data Definition
Language,数据定义语言,用来定义数据库对象(数据库,表,字段)
数据库操作
创建
1CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
删除
1DROP DATABASE [IF EXISTS] 数据库名;
切换
1USE 数据库名;
查询
12345# 查询所有数 ...
C++ vector
构造
123456789101112131415161718192021222324252627282930#include <vector>// 1. 创建空的 v1vector<int> v1; // initially empty// 2. 创建一个初始容量为 10 的v2, 默认值为 0,如果是 string 类型,就是空字符串vector<int> v2(10);// 3. 创建一个初始容量为 10,初始值为 0 的v3vector<int> v3(10, 0);// 4. 将一个数组的一部分元素作为初始化赋值给 v4int a[5] = {0, 1, 2, 3, 4};vector<int> v4(a, a+2); // 得到 a 数组的前 2 个元素// orvector<int> v4(begin(a), end(a)); // 赋值整个数组 a// 5. v3 赋值给 v5vector<int> v5(v3);vector<int> v6 = v3;// 初始化vector ...
C++ string
string
当使用加号运算符时,加号两边至少得有一个是 string 类型
123456789101112string s1 = "hello", s2 = "world";string s3 = s1 + ", " + s2 + ’\n’; // validstring s4 = s1 + ", "; // validstring s5 = "hello" + ", "; // invalidstring s6 = s1 + ", " + "world"; // valid// 等效于string s6 = (s1 + ", ") + "world";string s7 = "hello" + ", " + s2; // invalidstring s7 = "hello" + (", " + s2); // valid
"xxx" 实际上是 char*
类型,string 类定义了一种 char * 到
string 的转换功能,这使得可以使用 C-风格字符串来初始化
string 对象,可以用 c_str() 函数返回 C-风格字符串
1234string s = "qwt"; ...
C++ 数组
数组
12345678910111213141516int a1[3] = {0, 1, 2};int a2[] = {0, 1, 2}; // 可以省略维度int a3[5] = {0, 1, 2}; // {0, 1, 2, 0, 0},后面的是默认值string a4[3] = {"qwt"}; // {"qwt", "", ""} 默认值是空字符串char a5[] = "C++"; // 末尾自动添加 '\0'char a6[3] = "C++"; // errorconstexpr size_t n = 5;int a7[n] = {0, 1, 2};// 计算数组长度int length = sizeof(numbers) / sizeof(numbers[0]);// sizeof 变量可以不加括号cout << "Size of qwt array = " << sizeof qwt << " bytes." << endl;// sizeof 数据类型要加括号cout << "Size of one ele ...