classSolution { public: introbRange(vector<int>& nums, int start, int end){ int first = nums[start], second = max(nums[start], nums[start + 1]); for (int i = start + 2; i <= end; i++) { int temp = second; second = max(first + nums[i], second); first = temp; } return second; }
CREATE TABLE user( id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(50) UNIQUE NOT NULL, age TINTINT NOT NULL, sex ENUM('M', 'W') NOT NULL )ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO user VALUES(1, 'zhangsan', 20, 'M'); #如果不指明插入的属性,则必须按照字段的顺序全部填入 INSERT INTO user(name,age,sex) VALUES('lisi', 22, 'W'); #指明插入的属性,由于id设置为自增性,所以不用填写。
每次添加一个
1 2 3 4 5
INSERT INTO user(name,age,sex) VALUES('zhangsan', 20, 'M'); INSERT INTO user(name,age,sex) VALUES('gaoyang', 22, 'W'); INSERT INTO user(name,age,sex) VALUES('chenwei', 20, 'M'); INSERT INTO user(name,age,sex) VALUES('zhangfan', 21, 'W'); INSERT INTO user(name,age,sex) VALUES('zhanglan', 21, 'W');
DELETE FROM user; #删除表中所有数据 DELETE FROM user WHERE id=1; #只删除id为1的记录
Update - 更新
1
UPDATE user SET age=age+1 WHERE name='gaoyang'; #调正gaoyang的年龄+1
Retrieve - 查询
在这里我们示例一些简单的查询语句。
无条件查询全部字段
1
SELECT * FROM user; #不推荐,最好还是老老实实地写出所有字段名称,因为表的结构之后可能会变更,可能会影响业务代码。
条件查询指定字段
1 2 3
SELECT name,age,sex FROM user WHERE age>=21; SELECT name,age,sex FROM user WHERE age>20 AND age<22; SELECT name,age,sex FROM user WHERE BETWEEN 20 AND 22;#闭区间
1 2 3
# 以下两个sql语句效果一致。 SELECT name,age,sex FROM user WHERE age=20 OR age=21; SELECT name,age,sex FROM user WHERE age IN (20,21);
使用通配符查询
1
SELECT name,age,sex FROM user WHERE name LIKE "zhang%";#必须用LIKE,不能用=等号,否则会把%通配符看作实际字符。
判断为空不用=,而用IS NULL
1 2
SELECT name,age,sex FROM user WHERE name IS NULL; SELECT name,age,sex FROM user WHERE name IS NOT NULL;
去重
有两种去重的方式
distinct - 简单地去重
group by - 功能强大,耗时
1
SELECT DISTINCT age FROM user;
合并查询 - union
格式如下
1 2 3 4 5 6
SELECT expression1, expression2, ..., expression FROM table1 [WHERE conditions] UNION [ALL | DISTINCT(default)] SELECT expression1, expression2, ..., expression FROM table2 [WHERE conditions]; # union默认为distinct去重,all表示显示重复的记录项
1 2 3 4 5
SELECT name,age,sex FROM user WHERE age>=21 UNION ALL SELECT name,age,sex FROM user WHERE sex='M';
SQL语句和索引的关系
1
SELECT name,age,sex FROM user WHERE age=20 OR age=21;
SELECT e.EmployeeID AS EmpID, e.Name AS EmpName, e.DepartmentID AS A_DeptID, d.DepartmentID AS B_DeptID, d.DepartmentName AS DeptName FROM Employees e -- 给表起别名 'e' CROSS JOIN Departments d; -- 给表起别名 'd' -- 没有 ON 子句!
EmpID
EmpName
A_DeptID
B_DeptID
DeptName
1
张三
101
101
人事部
1
张三
101
102
技术部
1
张三
101
104
财务部
2
李四
102
101
人事部
2
李四
102
102
技术部
2
李四
102
104
财务部
3
王五
102
101
人事部
3
王五
102
102
技术部
3
王五
102
104
财务部
4
赵六
103
101
人事部
4
赵六
103
102
技术部
4
赵六
103
104
财务部
5
钱七
NULL
101
人事部
5
钱七
NULL
102
技术部
5
钱七
NULL
104
财务部
内连接 (INNER JOIN / JOIN)
通俗解释:只保留“两头都能配上对”的数据。 两边都有记录的才显示出来。
1 2 3 4
SELECT Employees.EmployeeID, Employees.Name, Departments.DepartmentName FROM Employees INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
SELECT Employees.EmployeeID, Employees.Name, Departments.DepartmentName FROM Employees LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
SELECT Employees.EmployeeID, Employees.Name, Departments.DepartmentName FROM Employees RIGHT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
SELECT Employees.EmployeeID, Employees.Name, Departments.DepartmentName FROM Employees FULL JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
select s_id, avg(sc_score) from score group by s_id having avg(sc_score)>60
查询所有同学的学号、姓名、选课总数、总成绩。
1
select s_id, s_name, count(c_id), sum(sc_score) from student left join score on student.s_id = score.s_id;
也可以这么写,嵌套select:
1 2 3 4 5
select student.s_id, student.s_name, count_id as XKS, sum_id as ZCJ from student left join (select s_id, count(c_id), as count_id, sum(sc_score) as sum_id from score group by s_id) as ss on student.s_id = ss.s_id;
查询没有选全部课的同学的学号、姓名。
1 2 3 4
select student.s_id, student.s_name from student, score where student.s_id = score.s_id group by student.s_id having count(score.c_id) < (select count(c_id) from course);