Dawn's Blogs

分享技术 记录成长

0%

COMMIT

COMMIT提交数据。一旦执行COMMIT,则数据被永久的保存在了数据库中,数据不可以回滚

ROLLBACK

ROLLBACK回滚数据。一旦执行ROLLBACK,则可以实现数据回滚。回滚到最近一次COMMIT之后


注意

  • DDL的操作一旦执行,不可以回滚。(在执行完DDL之后,一定执行一次COMMIT
  • DML的操作默认情况下,一旦执行,不可以回滚。但是再执行SET autocommit = FALSE,则执行DML后可以回滚

创建表

  • 创建新的表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE IF NOT EXISTS myemp1 (
id INT,
emp_name VARCHAR(15),
hire_date DATE
);

DESC myemp1;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| emp_name | varchar(15) | YES | | NULL | |
| hire_date | date | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
  • 基于现有的表,利用SELECT语句查询,创建新的表,同时导入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE myemp2
AS
SELECT employee_id, last_name, salary
FROM employees;

DESC myemp2;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| employee_id | int | NO | | 0 | |
| last_name | varchar(25) | NO | | NULL | |
| salary | double(8,2) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
阅读全文 »

创建数据库

  • 创建数据库
1
CREATE DATABASE mytest;
  • 创建数据库,指定字符集
1
CREATE DATABASE mytest1 CHARACTER SET 'gbk';
  • 判断数据库是否存在,若不存在则创建
1
CREATE DATABASE IF NOT EXISTS mytest2;

修改数据库

  • 修改数据库的字符集
1
ALTER  DATABASE mytest1 CHARACTER SET 'utf8';

删除数据库

  • 删除数据库
1
DROP DATABASE mytest;
  • 如果数据库存在就删除
1
DROP DATABASE IF EXISTS mytest1;

最长回文子串

最长回文子串

解题思路

  1. 中心扩展算法,从每个位置出发,向两边扩展,若遇到的是回文子串,就继续扩展;若不是回文子串就结束,到下一个位置去。扩展方法:

    • 向左扩展,向左寻找与当前位置相同的字符,直到遇到不等的字符为止
    • 向右扩展,向右扩展,向右寻找与当前位置相同的字符,直到遇到不等的字符为止
    • 左右双向扩展,同时向左右扩展,直到遇到左右字符不等为止
  2. 动态规划法,用dp[i][j]表示字符串s从第i个字符到第j个字符是否未回文子串(true表示是回文子串,false表示不是回文子串)。

    • 状态转移方程dp[i][j] = dp[i+1][j-1] ^ (s[i] == s[j])
    • 边界条件
      • 只有一个字符时,肯定是回文子串dp[i][i] = true
      • 只有两个字符时,只要两个字符相等就一定是回文子串dp[i][i+1] = (s[i] == s[i+1])
阅读全文 »

二叉树的右视图

二叉树的右视图

解题思路

利用二叉树的层序遍历,将每一层的最右侧节点加入到结果中

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func rightSideView(root *TreeNode) []int {
if root == nil {
// 树为空
return []int{}
}
res := []int{} // 记录结果
q := []*TreeNode{root} // 队列,根节点入队

for i := 0; len(q) > 0; i++ {
p := []*TreeNode{} // p记录下一层节点
res = append(res, q[len(q)-1].Val) // 将本层最右边的节点加入结果集
for j := 0; j < len(q); j++ {
// 将下一层节点加入队列
cur := q[j]
if cur.Left != nil {
// 左子树不为空,入队
p = append(p, cur.Left)
}
if cur.Right != nil {
// 右子树不为空,入队
p = append(p, cur.Right)
}
}
q = p // 已经遍历过本层节点,将q更新为下一层节点
}

return res
}
阅读全文 »

子查询是指,一个查询语句(内查询)嵌套在另一个查询语句(外查询)内部的查询。子查询可以按照两种方法进行分类:

  • 从内查询返回的结果的条目数
    • 单行子查询
    • 多行子查询
  • 内查询是否被执行多次
    • 相关子查询:查询工资大于本部门平均工资的员工信息
    • 不相关子查询:查询工资大于本公司平均工资的员工信息
阅读全文 »

SELECT 语句的完整结构

SQL 92

1
2
3
4
5
6
7
SELECT (DISTINCT) 字段1,字段2, ... (存在聚合函数)
FROM1, 表2, ...
WHERE 多表连接条件 AND 不包含聚合函数的过滤条件
GROUP 分组
HAVING 包含聚合函数的过滤条件
ORDER BY 字段1, 字段2 (ASC / DESC)
LIMIT index, rows

SQL 99

1
2
3
4
5
6
7
8
SELECT (DISTINCT) 字段1,字段2, ... (存在聚合函数)
FROM1 (LEFT | RIGHT) JOIN2
ON 多表连接条件
WHERE 不包含聚合函数的过滤条件
GROUP 分组
HAVING 包含聚合函数的过滤条件
ORDER BY 字段1, 字段2 (ASC / DESC)
LIMIT index, rows

SELECT 语句执行过程

  1. FROM语句,找到相应的表,多表进行笛卡尔积连接
  2. ON限制多表连接条件,进行多表连接。同时考虑左外LEFT/右外RIGHT连接,补充行
  3. WHERE过滤行
  4. GROUP BY 分组。HAVING 每组的满足条件
  5. SELECT查询字段,对列上进行过滤。若有DISTINCT,对数据去重
  6. ORDER BY对结果排序
  7. LIMIT进行分页

聚合函数介绍

聚合函数作用于一组数据,并对一组数据返回一个值

常用的聚合函数

  • 适用于数值类型
    • AVG:求平均值
    • SUM:求和
  • 适用于数值类型、字符串日期类型(这些都是可比较的)
    • MAX:最大值
    • MIN:最小值
  • COUNT:计算指定字段在查询结果中出现的个数(COUNT计入NULL值,AVG = SUM / COUNT成立)
    • 统计表中记录数,使用COUNT(*) COUNT(1)效率较高
阅读全文 »

岛屿的数量

岛屿数量

解题思路

可以将grid看作是一个有向图,每个节点最多有上下左右四条边竖直或水平相邻的 1 之间有边相连,那么岛屿的数量就是图的连通分量个数。所以可以进行图的遍历,来求得连通分量的个数:

  1. 图的深度优先遍历
  2. 图的广度优先遍历
阅读全文 »

多表查询基本实现

多表查询需要连接条件(有n个表实现多表查询,至少需要n-1个连接条件)

SQL92语法

1
2
3
4
5
6
7
8
9
10
11
# 给表起别名时必须用别名,不能用原名
SELECT emp.employee_id, dept.department_name
FROM employees emp, departments dept
WHere emp.department_id = dept.department_id;
+-------------+------------------+
| employee_id | department_name |
+-------------+------------------+
| 200 | Administration |
| 201 | Marketing |
| 202 | Marketing |
| 114 | Purchasing |

SQL99语法 JOIN ON

SQL99语法采用表1 JOIN 表2 ON 连接条件的方式实现多表连接

1
2
3
SELECT emp.employee_id, dept.department_name
FROM employees emp JOIN departments dept
ON emp.department_id = dept.department_id;

注意:

  • 多表查询需要有连接条件。若没有连接条件,可能会出现笛卡尔积错误(两个集合中的每一个成员,都与对方集合中的任意一个成员有关)
  • 多表查询时,建议每个字段前指明其所在的表。从SQL优化的角度来讲,这样避免了在各个表中找相应字段的时间。
  • 表起别名必须用别名,不能用原名
阅读全文 »