学习笔记:
1.每个关系数据库管理系统都存在以下类型的数据完整性:实体完整性?表中没有重复行。域完整性?通过限制值的类型、格式或范围来强制执行给定列的有效条目。引用完整性?不能删除其他记录使用的行。用户定义的完整性?强制执行一些不属于实体、域或引用完整性的特定业务规则。
2.数据库规范化是在数据库中有效地组织数据的过程。这个规范化过程有两个原因:消除冗余数据,例如,将相同的数据存储在多个表中。 确保数据依赖关系是有意义的。
3.SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
4.SELECT语句与ORDER BY
SELECT column_name() FROM table_name ORDER BY column_name() ASC or DESC
5.SELECT COUNT(计数)子句
SELECT COUNT(column_name) FROM table_name WHERE CONDITION;
6.SELECT与HAVING子句
SELECT SUM(column_name) FROM table_name WHERE CONDITION GROUP BY column_name HAVING (arithematic function condition);
7.SELECT DISTINCT语法用于仅返回不同的(different)值。SELECT DISTINCT column1, column2, ... FROM table_name;
8.结合AND,OR和NOT
SELECT * FROM Customers WHERE NOT Country='Germany' AND NOT Country='USA';
9.从"Customers" 表中选择所有客户,按 "Country" 升序排列,并按 "CustomerName" 列降序排列: SELECT * FROM Customers ORDER BY Country ASC, CustomerName DESC;
10.横向渗透攻击技术是复杂网络攻击中广泛使用的一种技术,特别是在高级持续威胁(Advanced Persistent Threats,APT)中更加热衷于使用这种攻击方法。攻击者可以利用这些技术,以被攻陷的系统为跳板,访问其他主机,获取包括邮箱、共享文件夹或者凭证信息在内的敏感资源。攻击者可以利用这些敏感信息,进一步控制其他系统、提升权限或窃取更多有价值的凭证。借助此类攻击,攻击者最终可能获取域控的访问权限,完全控制基于Windows系统的基础设施或与业务相关的关键账户。
11.39. 组合总和
给你一个 无重复元素的整数数组 candidates 和一个目标整数target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的同一个数字可以无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。
解题思路:遍历每一个元素,对每一个元素使用当前元素递归,这样可以得到能够无限重复的所有情况,每一次递归都减去当前元素的值,直到target等于0,就可以将结果添加到结果集里。当target小于0或者index的长度大于数组时,就可以剪枝。
class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<Integer> list = new ArrayList<Integer>();
backTacking(candidates, 0, list, target);
return res;
}
public void backTacking(int[] candidates, int index, List<Integer> list, int target){
if(target<0 || index>=candidates.length){
return;
}
if(target==0){
res.add(new ArrayList<Integer>(list));
}
for(int i=index; i<candidates.length; i++){
list.add(candidates[i]);
backTacking(candidates, i, list, target-candidates[i]);
list.remove(list.size()-1);
}
}
}