总结了常用的sql语法与使用技巧
-- 插入多行
INSERT INTO table(column1,column2...)
VALUES (value1,value2,...),
(value1,value2,...);
-- 从查询中插入
INSERT INTO table_1
SELECT c1, c2, FROM table_2;
-- insert repalce into:插入替换数据,如果存在主键或unique数据则替换数据
-- insert ignore into :如果存在主键或unique数据,则不进行insert。
alter的常用方法:
ALTER TABLE 表名 ADD 列名/索引/主键/外键等;
ALTER TABLE 表名 DROP 列名/索引/主键/外键等;
ALTER TABLE 表名 ALTER 仅用来改变某列的默认值;
ALTER TABLE 表名 RENAME 列名/索引名 TO 新的列名/新索引名;
ALTER TABLE 表名 RENAME TO/AS 新表名;
ALTER TABLE 表名 MODIFY 列的定义但不改变列名;
ALTER TABLE 表名 CHANGE 列名和定义都可以改变。
DELETE FROM customers
WHERE country = 'France'
ORDER BY creditLimit
LIMIT 5;
truncate table table_name
更加高效-- 1通过create创建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
USING [BTREE | HASH | RTREE] -- 索引数据类型,可以省略
ON table_name (column_name [(length)] [ASC | DESC],...) -- 可以添加多个字段,并指定排序方式
-- 索引的类型 PRIMARY KEY,KEY,UNIQUE或INDEX,当创建表时,若声明了主键或者unique,会自动生成索引
-- 2 通过alter table创建索引
ALTER TABLE tbl_name ADD [PRIMARY KEY/UNIQUE INDEX indexname/fulltext indexname] (col_list);
-- 3删除索引
DROP INDEX index_name ON tbl_name;
// 或者
ALTER TABLE tbl_name DROP INDEX index_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;
CREATE
[ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}]
VIEW [database_name].[view_name]
AS
[SELECT statement]
-- 使用条件:
-- SELECT语句可以在WHERE子句中包含子查询,但FROM子句中的不能包含子查询。
-- SELECT语句不能引用任何变量,包括局部变量,用户变量和会话变量。
-- SELECT语句不能引用准备语句的参数。
create trigger audit_log
after insert
on employees_test
for each row
begin
insert into audit(EMP_no,NAME)
values(NEW.ID,NEW.NAME);-- 注意加分号,表示语句的结束
end
limit m,n 从m+1处开始,返回n行,m可以省略
分页显示:limit 每页显示数量*(第n页 -1),每页显示数量
REPLACE INTO table_name(column_list)
VALUES(value_list)
REPLACE INTO table
SET column1 = value1,
column2 = value2
REPLACE INTO cities(name,population)
SELECT name,population FROM cities
WHERE id = 1
CASE case_expression
WHEN when_expression_1 THEN commands
WHEN when_expression_2 THEN commands
...
ELSE commands
END CASE
开窗函数简介
开窗函数使用
window_function_name(expression)
OVER (
[partition_defintion]
[order_definition]
[frame_definition]
)
frame_definition就是在partition内,取每一行的时候,在组内计算时,选择的计算范围,具体使用见下图
dense_rank() 对每个dept_no部门中的partition分组数据进行排序
row_number(),rank(),ntile(n),以及其他聚合函数
Lower(列名)
Upper(列名)
POSITION(字符 IN 列名) mysql
PATINDEX(’%s1%’, s2) sqlserver
CONCAT(列名, ’ is in ', 列名…)
replace(列名,旧字符串,新字符串)
left (列名,位数) 返回字符串列中左边多少位的字符
使用转义字符+特殊字符
SUBSTRING(列名 , 开始位 ,字符长度 ) mysql
获取当前日期
获取当前日期和时间
日期偏移函数
增加偏移date_add函数的使用:链接
DATE_ADD(start_date, INTERVAL expr unit)
常用unit
second,minute,hour,day,month,year
减少偏移date_sub 用法同上
字符串分组合并
group_concat函数使用方法:链接
使用语法:
GROUP_CONCAT(DISTINCT expression
ORDER BY expression
SEPARATOR sep);
按照orderby的顺序,用sep分隔符,连接每个group中的字符串
1. REPLACE(str,old_string,new_string);
- replace函数的使用[连接](https://www.yiibai.com/mysql/string-replace-function.html)
自连接
group by
与distinct
数据量较大时,使用group by
比distinct
更高效
group by 和distinct在去重的时候,都会包含null,将所有的null看作一个组
表连接与子查询
取第n大的值
多表复用与子查询
求累计和
sum(xx) over (order by xx desc/asc)
求组内某项的比例
AVG(
case xx when xx then 1
else 0
end
)
group by xx
用order by + limit
多表复用与子查询
求累计和
sum(xx) over (order by xx desc/asc)
求组内某项的比例
AVG(
case xx when xx then 1
else 0
end
)
group by xx