M158****2569

2020-09-18   阅读量: 526

Mysql

常用SQL知识点

扫码加入数据分析学习群
  • 修改数据表

    • 删除字段: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;


添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
72.9557 2 0 关注作者 收藏

评论(0)


暂无数据

推荐课程

推荐帖子