修改数据表
删除字段:alter table 表名 drop 字段名;
alter table 表名 modify 字段名 数据类型 [自增/非空/默认] first;
alter table 表名 modify 要排序的字段名 数据类型 [自增/非空/默认] after 参照字段;
添加字段:alter table 表名 add 新字段名 数据类型 [自增/非空/默认] [字段位置];
修改字段的排列位置:
修改表名:alter table 原表名 rename 新表名;
修改字段名:alter table 表名 change 原字段名 新字段名 数据类型 [自增/非空/默认] [字段位置];
修改字段类型:alter table 表名 modify 字段名 新数据类型 [自增/非空/默认] [字段位置];
修改数据库中已经存在的数据表的结构
创建数据库/表
创建表:CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型,... PRIMARY KEY (字段))ENGINE=InnoDB(引擎类型) AUTO_INCREMENT=1(每增加一行时自动增量) DEFAULT CHARSET=utf8 (数据类型)COMMENT='表的内容'
Create database 数据库名称:create database test
查看所有数据库列表
use 数据库名称:use databases
插入函数
插入一行:INSERT INTO 表名 (字段1,字段2,...)VALUE (值1,值2,...)
更新表格
设置数据库安全权限:set sql_safe_updates=0;
增加列:ALTER TABLE 表名 ADD 列名 数据类型
UPDATE 表名 SET 字段 = 新值 where 字段 =旧值
删除函数
delete可以添加where子句删除表中部分数据,truncate只能删除表中全部数据
delete删除表中数据保留表结构,truncate直接把表删除(drop table)然后再创建一张新表(create table),执行速度比delete快。
delete 与 truncate的区别
与delete from 表名一样,都是删除表中全部数据,保留表结构
truncate 表名
delete删除表中的内容,不删除表(砍树枝,砍树叶)
drop删除表/数据库(将树连根拔起)
两者的区别
删除数据库:DROP DATABASE 数据库名
删除表:drop table 表名
删除列:ALTER TABLE 表名 DROP 列名
DROP
删除特定行:delete from 表名 where 条件
DELETE
转换函数
SELECT CAST('0001' AS INTEGER) AS int_col FROM SYSIBM.SYSDUMMY1,结果为1
SELECT CAST(CURRENT_TIMESTAMP AS TIME) AS CUR_TIME,结果为 21:33:59.3400000
CAST(转换当前的值 AS 想要转换的数据类型)
日期函数
TIMESTAMPDIFF(interval,datetime1,datetime2)
FRAC_SECOND。表示间隔是毫秒
SECOND。秒
MINUTE。分钟
HOUR。小时
DAY。天
WEEK。星期
MONTH。月
QUARTER。季度
YEAR。年
interval可以为以下数值
select TIMESTAMPDIFF(DAY,'2018-07-01 09:00:00','2018-07-04 12:00:00'),结果3
timestampdiff:函数日期或日期时间表达式之间的整数差。
DATEDIFF(date2,date1)
SELECT DATEDIFF('2018-07-01','2018-07-04');结果为3
datediff:返回两个日期之间的天数
UNIX_TIMESTAMP:将当前日期和时间返回时间戳
UNIX_TIMESTAMP(2018-08-12 15:23:11)→1534058591
FROM_UNIXTIME:将时间戳返回当前日期和时间
FROM_UNIXTIME(1534058591)→2018-08-12 15:23:11
时间戳函数
DATE_FORMAT(date,fmt):依照指定的fmt格式格式化日期date
DATE_UNIXTIME(timestamp,fmt):根据指定的fmt格式,格式化UNIX时间戳
格式化日期和时间函数
CURRENT_DATE/CURDATE:当前日期,2016-04-25
CURRENT_TIME/CURTIME :当前时间, 18:31:03.704+09
CURRENT_TIMESTAMP/LOCALTIME/NOW/SYSDATE:当前日期和时间,2 016-04-25 18:31:03.704+09
获取当前日期时间函数
DATE_ADD/ADDDATE(date,IINTERVAL expr type):执行日期的加运算
DATE_ADD(‘2018-08-12 23:59:59’, INTERVAL ‘1:1’ MINUTE_SECOND) →2019-01-01 00:01:00
ADDDATE(‘2018-08-12 23:59:59’, INTERVAL 2 SECOND) →2019-01-01 00:00:01
DATE_ADD(‘2018-08-12 23:59:59’, INTERVAL 2 SECOND) →2019-01-01 00:00:01
DATE_SUB/SUBDATE(date,IINTERVAL expr type):执行日期的减运算
DATE_SUB(‘2019-01-01 00:00:01’, INTERVAL ‘00:1:1’ DAY_SECOND) →2018-08-12 23:59:00
SUBDATE(‘2019-01-01 00:00:01’, INTERVAL 2 SECOND) →2018-08-12 23:59:59
DATE_SUB(‘2019-01-01 00:00:01’, INTERVAL 2 SECOND)→2018-08-12 23:59:59
计算日期函数增加和减少函数
DAYNAME:返回d对应法人工作日的英文名称,如Sunday、Monday等
DAYNAME(‘2018-08-12’)→Sunday
DAYOFWEEK:返回d对应的一周中的索引(位置)。1表示周日,2表示周一...7表示周六
DAYOFWEEK(‘2018-08-12’)→1
获取星期的函数
条件函数
CASE WHEN <求值表达式> THEN <表达式> WHEN <求值表达式> THEN <表达式> WHEN <求值表达式> THEN <表达式> . . . ELSE <表达式> END
窗口函数
窗口函数原则上只能写在select子句后
注意事项
排名问题:每个部门按业绩来排名
topN问题:找出每个部门排名前N的员工进行奖励
适用场景:业务需求“在每组内排名”
同时具有分组和排序的功能
不减少原表的行数(group by分组汇总后改变了表的行数,一行只有一个类别)
功能
专用窗口函数:rank,dense_rank,row_number
row_number() :显示分区中公重复不间断的序号,如1,2,3,4,
dense_rank() :如果有并列名次的行,也不会跳过之后的名次,如1,1,1,2
rank() :如果有并列名次的行,会跳过之后的名次,如1,1,1,4
聚合函数:sum ,avg,count,max,min等
聚合函数sum在窗口函数中,是对自身记录、及位于自身记录以上的数据进行求和的结果
如select *, sum(成绩) over (order by 学号) as current_sum
窗口函数位置可以放两种函数
<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)
基本语法
交叉联结函数--比较日期数据
select a.ID, a.日期, a.销售额(万元)from 日销 as a cross join 日销 as b
on datediff(a.日期, b.日期) = 1
where a.销售额(万元) > b.销售额(万元)
请找出所有比前一天(昨天)营业额更高的数据
cross jion
查询第n高的数据
offset n:表示跳过x条语句
查询第n高的数据:select ifNull( (select distinct salary from Employee order by Salary Desc limit 1,1),null ) as SecondHighestSalary;
offset
finull(a,b):如果value1不是空,结果返回a;如果value1是空,结果返回b
ifnull
查找重复值
找出重复出现n次的数据select 列名
from 表名
group by 列名
having count(列名) > n;
经典topN问题
每组最大的N条记录,如查找每个部门前三高工资的员工select * from
( select *, row_number() over (partition by 要分组的列名 order by 要排序的列名 desc) as 排名 from 表名) as a
where 排名 <= N;








暂无数据