mysql刷题笔记
Posted 鸟随二月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql刷题笔记相关的知识,希望对你有一定的参考价值。
目录标题
- DATEDIFF
- round保留几位小数
- case
- dense_rank
- rank(),dense_rank(),row_number()函数区别
- mysql中常用的三种插入数据的语句
- MYSQL创建数据表的三种方法
- mysql索引
- 创建事务
- 使用强制索引
- 增加新列
- 触发器的使用
- replace
- alter
- 后期创建外键
- 按照部分字母排序
- group_concat(X,Y)
- SUM(salary)over(ORDER BY emp_no)累计和
- SUM 统计和round的四舍五入
- 查询某一天的后一天
- [PARTITION BY](https://www.nowcoder.com/practice/e524dc7450234395aa21c75303a42b0a?tpId=82&tags=&title=&difficulty=0&judgeStatus=0&rp=1)
- ifnull函数
- [并且用聚合函数可以实现行转列 ( 这里min()或max()都可以)。](https://www.nowcoder.com/practice/348afda488554ceb922efd2f3effc427?tpId=82&tags=&title=&difficulty=0&judgeStatus=0&rp=1)
- DATE_FORMAT
DATEDIFF
round保留几位小数
SUM(IF(Status=‘completed’,0,1))
case
dense_rank
SELECT
emp_no,
salary,
dense_rank () over (
ORDER BY salary DESC) AS rank1
FROM
salaries
order by rank1,emp_no asc;
rank(),dense_rank(),row_number()函数区别
mysql中常用的三种插入数据的语句
- insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
- replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
- insert ignore into表示,如果中已经存在相同的记录,则忽略当前新数据;
MYSQL创建数据表的三种方法
- 常规创建
create table if not exists 目标表 - 复制表格
create 目标表 like 来源表 - 将table1的部分拿来创建table2
create table if not exists actor_name
(
first_name varchar(45) not null,
last_name varchar(45) not null
)
select first_name,last_name
from actor
mysql索引
- 添加主键
ALTER TABLE tbl_name ADD PRIMARY KEY (col_list);
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
2.添加唯一索引
ALTER TABLE tbl_name ADD UNIQUE index_name (col_list);
// 这条语句创建索引的值必须是唯一的。
3.添加普通索引
ALTER TABLE tbl_name ADD INDEX index_name (col_list);
// 添加普通索引,索引值可出现多次。
4. 添加全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name (col_list);
// 该语句指定了索引为 FULLTEXT ,用于全文索引。
5.删除索引
DROP INDEX index_name ON tbl_name;
// 或者
ALTER TABLE tbl_name DROP INDEX index_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;
创建事务
create view actor_name_view(first_name_v,last_name_v)
as
select first_name,last_name
from
actor;
使用强制索引
SELECT *
FROM salaries
FORCE INDEX(idx_emp_no)
WHERE emp_no = 10005;
补充知识:强制索引FORCE INDEX
FORCE INDEX强制查询优化器使用指定的命名索引。查询优化器是MySQL数据库服务器中的一个组件,它为SQL语句提供最佳的执行计划。查询优化器使用可用的统计信息来提出所有候选计划中成本最低的计划。
增加新列
ALTER table actor
ADD column create_date datetime NOT NULL DEFAULT '2020-10-01 00:00:00';
触发器的使用
replace
UPDATE titles_test
SET emp_no = REPLACE(emp_no, 10001, 10005)
WHERE id = 5;
alter
后期创建外键
ALTER TABLE <表名>
ADD CONSTRAINT FOREIGN KEY (<列名>)
REFERENCES <关联表>(关联列)
按照部分字母排序
题目: 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
LEFT(s,n)返回字符串 s 的前 n 个字符
RIGHT(s,n)返回字符串 s 的后 n 个字符
第一种:(right)
select first_name
from employees
order by right(first_name,2)
第二种:(substr)
select first_name from employees
order by substr(first_name,-2)
第三种:(substring)
select first_name from employees order by substring(first_name,-2)
group_concat(X,Y)
聚合函数group_concat(X,Y),其中X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号。此函数必须与GROUP BY配合使用。
例子
SELECT dept_no,GROUP_CONCAT(emp_no) AS employees
FROM dept_emp
GROUP BY dept_no;
SUM(salary)over(ORDER BY emp_no)累计和
SELECT emp_no, salary, SUM(salary)over(ORDER BY emp_no)
FROM salaries
WHERE to_date = '9999-01-01';
SUM 统计和round的四舍五入
SELECT date,ROUND(SUM(type='no_completed')/count(*),3) AS p
FROM email
WHERE send_id IN(
select id
from user WHERE is_blacklist=0) AND receive_id IN(select id
from user WHERE is_blacklist=0)
GROUP BY date
ORDER BY date
查询某一天的后一天
DATE_ADD(yyyy-mm-dd,INTERVAL 1 DAY)
PARTITION BY
ifnull函数
并且用聚合函数可以实现行转列 ( 这里min()或max()都可以)。
DATE_FORMAT
以上是关于mysql刷题笔记的主要内容,如果未能解决你的问题,请参考以下文章