T-CYP

一、数据库概念

1.1 DB

database:存储数据的“仓库”,他保存了一系列有组织的数据。一张张数据表table,存储在DB中;

1.2 DBMS

database management system:数据库管理系统,数据库是通过DBMS创建和操作的容器,例如mysql、sqlserver、Oracle等安装的软件系统;

 

 

 

1.3 SQL

结构化查询语言:专门用来与数据库通信的语言;

二、mysql常见的命令

2.1 查看当前所有的数据库

show databases

显示了test1下的所有数据库

 

 

 

2.2 打开指定的库

use database库名(具体的数据库名字)

则当前工作数据库直接切换到到了database下,再执行这个数据库下不存在的表,会提示doesn\'t exist

 

2.3 查看指定库的所有表

show tables from database库名

 

 

2.4 查看当前库的所有表

show tales

2.5 创建表

2.5.1 查看mysql 版本

select version()

 

2.5.2  不指定字符集创建表语法

字符集是Character set

①字符编码方式是用一个或多个字节表示字符集中的一个字符

②每种字符集都有自己特有的编码方式,因此同一个字符,在不同字符集的编码方式下,会产生不同的二进制

常见字符集:

ASCII字符集:基于罗马字母表的一套字符集,它采用1个字节的低7位表示字符,高位始终为0。

LATIN1字符集:相对于ASCII字符集做了扩展,仍然使用一个字节表示字符,但启用了高位,扩展了字符集的表示范围。

GBK字符集:支持中文,字符有一字节编码和两字节编码方式。

UTF8字符集:Unicode字符集的一种,是计算机科学领域里的一项业界标准,支持了所有国家的文字字符,utf8采用1-4个字节表示字符。

不指定字符集创建表案例:

create table table_name表名(

column_name1字段名 data_type(size)字段类型及数据长度,

column_name2字段名 data_type(size)字段类型及数据长度,

column_name3字段名 data_type(size)字段类型及数据长度,

...

);

data_type数据类型:

数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:

字节与字符:

  • ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
  • UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。新的utf8mb4字符集中一个汉字占4个字节.
  • Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
  • 符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
  • UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
  • UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。
数据类型 描述
tinyint
integer(size)
smallint
int(size)
smallint(size)
tinyint(size)
仅容纳整数。在括号内规定数字的最大位数
1.tinyint: 一个字节 取值范围 -128~127相当于java中的byte
2.smallint=integer: 两个字节 取值范围 -32768~32767相当于java中的short
3.mediumint:三个字节
4.int: 四个字节 取值范围 -2147483648~2147483647
5.bigint: 8个字节相当于java的long
decimal(size,d)
numeric(size,d)
容纳带有小数的数字。

"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。
char(size)

mysql5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 即65532/3个汉字


保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
超过字符长度会报错,实际存储的数据不足指定长度,数据库会使用空格来补全

varchar(size)
保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。

注释:如果值的长度大于 255,则被转换为 TEXT 类型。
text:存放最大长度为 65,535 个字节的字符串。
date(yyyymmdd) 容纳日期。

 

 

 

2.5.2.1 查看建表语句

字符集是默认的,通过show create table 表名查看建表语句

2.5.3 创建表也可以指定字符集格式

create table table_name表名(

column_name1字段名 data_type(size)字段类型及数据长度 character set utf8 not null,

column_name2字段名 data_type(size)字段类型及数据长度character set utf8 not null,

column_name3字段名 data_type(size)字段类型及数据长度character set utf8 not null,

...

);

2.5.4 表的修改

修改列名称

ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>

ALTER TABLE table_test_0512 CHANGE column_name3 column_name3_new VARCHAR(255) NOT null ;

修改表名:

ALTER TABLE <表名> rename to 新表名;

列 新增/变更数据类型:

ALTER TABLE <表名> add/modify  COLUMN 字段名 数据类型(vachar/int/double) ;

列 删除:

ALTER TABLE <表名> drop COLUMN 字段名;

修改列名:

ALTER TABLE <表名> change COLUMN 字段名 旧字段名 新字段名;

2.5.5 删除表

如果存在再删除,但是if exists不适用于列

DROP table IF EXISTS 表名

2.5.6 复制表

复制表的结构:

create table table_test_0513_copy like table_test_0513

查看表数据是空的

 

 

查看表结构

 

 

复制表数据

insert into table_test_0512_copy--要求表必须存在
select * from table_test_0512

2.6 创建数据库

2.6.1 方式一

create database database库名

2.6.2 方式二

严谨一点的语法是:如果不存在就创建 if not exists固定用法

create database books if not exists books;

2.6.3 库的修改

数据层面的修改是update

库表层的修改:

alter/rename

库名的修改:

语法:

rename database 库名 to 新库名;

库的字符集修改:character set

alter database 库名 character set 字符集类型(utf8/gbk);

库的删除:

drop database 库名;

 

2.7 查看表结构

desc tablename表名

int最大长度是11位。即11为字符长度,如果在建表时不指定字段int类型的长度时,系统则默认生成长度为11的字段。11也是int类型的最大长度,其中第一位表示符号+或者-,后面十位表示数字。 

从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。

 

 

2.8 创建索引

索引被创建于已有的表中,它可使对行的定位更快速更有效。可以在表格的一个或者多个列上创建索引,每个索引都会被起个名字。用户无法看到索引,它们只能被用来加速查询。

注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常用于搜索的列上面创建索引。

索引是查询优化最主要的方式;

查询方式:

一种是:全表扫描,即从第一行,一行行查,直到查到对应的那行才停止;

一种是:利用数据表上建立的索引进行扫描。

索引会单独形成一张数据表,里面存储了索引字段名、value值、指针;

这个指针是每一行value值在库表中对应的行地址,只要通过查询索引表知道这行数据的指针,mysql就可以直接到库表中定位到该行并返回该行所有数据;

Mysql索引根据用途分为:

1.普通索引:列值可以取空值或重复值。创建使用关键字INDEX或KEY;

2.唯一索引:列值不能重复;即索引列值必须是唯一的,但可以是空值;创建使用关键字UNIQUE;

3.主键索引:主键索引是系统自动创建的主键索引,并且是唯一的。与唯一索引区别是;列值不能为空

4.聚簇索引:就是数据存储的物理存储顺序,非聚簇索引就是索引顺序与数据的物理顺序无关。一个表只能有一个聚簇索引。目前只有InoDB和solidDB支持。

5.全文索引:只能创建在varchar或text的列上;建立全文索引能够在全文索引的列上进行查找。

(1)单列索引:就是一个索引只包含表中的一个列;比创建一个学号ID的索引;以name再创建一个姓名的单列索引。即每个索引包含一个列。

(2)组合索引(复合索引或多列索引):就是表中的两个列或多个列来创建成一个索引;比如;以用户ID、用户名Name、用户年龄Age来创建的索引就是联合索引。

2.8.1唯一的索引 (Unique Index)

在表格上面创建某个一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

CREATE UNIQUE INDEX 索引名称 ON 表名称 (列名称)
因为查了数据库的字符集类型,编码格式是utf8mb4一个中文是4个字节,所以767个字节最多存储191个中文字符

TEXT、VARCHAR、CHAR等类型的列,只能用前面的 191 个字符做索引,因为 191×4=764,192×4=768,191个字符正好没有超过 767 字节的限制。如果 char、varchar 等定义的长度超过了 191,而指定索引时未说明索引长度,则会自动使用前191个字符做索引。

但是,若是唯一索引,单列的长度不能超过 191个字符,否则报错。

 

2.8.2 更新字段数据类型

ALTER TABLE <表名> MODIFY  <新字段名> <新数据类型>

ALTER TABLE table_test_0512 MODIFY id varchar(191)

 

2.8.3 更新数据类型长度后查看索引

 

2.8.4 创建简单索引

CREATE INDEX 索引名称

ON 表名称 (列名称)

create index column_name1_index
on table_test_0512 (column_name1)

 

多个简单索引,字段用逗号分隔即可;

2.8.5 创建表时指定主键和索引

2.8.5.1 不带主键

CREATE TABLE `table_test_0513` (
`id` varchar(191) DEFAULT 1,
`column_name1` varchar(191) DEFAULT \'qiaqia\',
`column_name2` varchar(255) DEFAULT \'guanzhu\',
`column_name3_new` varchar(255) NOT NULL,
`gmv` int(11) DEFAULT 100,
UNIQUE KEY `idindex` (`id`),
KEY `column_name1_index` (`column_name1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

#删除索引 17 drop index index_n on my_test;

 

2.8.5.2 带主键

CREATE TABLE `table_test_05132` (
`id` varchar(191) DEFAULT 1,
`column_name1` varchar(191) DEFAULT \'qiaqia\',
`column_name2` varchar(255) DEFAULT \'guanzhu\',
`column_name3_new` varchar(255) NOT NULL,
`gmv` int(11) DEFAULT 100,
PRIMARY KEY `idindex` (`id`),--主键且默认是索引,不允许为空和重复值
KEY `column_name1_index` (`column_name1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.9 查看当前数据库的字符集

show variables like \'char%\';

名词解释:
character_set_client:客户端请求数据的字符集
character_set_connection:客户机/服务器连接的字符集
character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
character_set_filesystem:把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
character_set_results:结果集,返回给客户端的字符集
character_set_server:数据库服务器的默认字符集
character_set_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。

 

 

 

以上这些参数如何起作用:

1.库、表、列字符集的由来

  ①建库时,若未明确指定字符集,则采用character_set_server指定的字符集。

  ②建表时,若未明确指定字符集,则采用当前库所采用的字符集。

  ③新增时,修改表字段时,若未明确指定字符集,则采用当前表所采用的字符集。

2.更新、查询涉及到得字符集变量

  更新流程字符集转换过程:character_set_client-->character_set_connection-->表字符集。

  查询流程字符集转换过程:表字符集-->character_set_result

3.character_set_database

  当前默认数据库的字符集,比如执行use xxx后,当前数据库变为xxx,若xxx的字符集为utf8,那么此变量值就变为utf8(供系统设置,无需人工设置)。

3 mysql的语法规范

3.1 规则

1.不区分大小写,但是建议关键字大写,表名、列名小写

2.每条命令最好用分号结尾

3.每条命令根据需要,可以进行缩进或换行

4.注释:

单行注释:#

单行注释:--

多行注释:/* */

3.2 查询语句

select `id` from table_test_05132 

``是着重符,为了告诉sql服务器这个是一个字段,不是关键字

 

3.3 起别名

起别名的意义:便于理解、如果有查询字段重复可以用别名区分;

3.3.1 方式一使用as

3.3.2 方式二使用空格

3.4 加号的作用

运算符的作用

3.4.1 都是纯数值型

select 100+100;两个操作数都为数值则做加减乘除法运算

3.4.2 有字符型数值

select \'100\'+100;其中一方为字符型,试图将字符型数值转成数值型;如果转换成功则做加法运算,

 

 

 如果转换失败则将字符型数值转换成0:select \'john\'+100;

3.4.3 有一方是null

只要有一方是null,则结果是null

select null+100;

 

3.5 IFNULL和COALESCE、NVL区别

3.5.1 IFNULL(参数1,参数2);

IFNULL(判断是否不为null的参数,为null则返回第二个参数值):

第一个参数不为null则返回第一个参数的值

如果为null,则返回第二个参数值;

这个函数只适用于mysql;

 

 

3.5.2 COALESCE(参数1,参数2,参数3...)

返回参数列表中第一个不为null的参数值;

 hive与mysql通用

select IFNULL(column_name1,0) from table_test_0512

select COALESCE(column_name1,0) from table_test_0512

3.5.3 NVL(参数1,参数2)

适用于数字型、字符型和日期型 , 不适用于mysql 适用于 oracle 和hive

Select NVL(null, 2)

3.6 筛选条件表达式

3.6.1 简单条件运算符

> 、<、 =、 !=、 <>、 >=、 <=;

3.6.2 逻辑表达式

逻辑运算符:连接多个条件表达式

与:&&=and、或:||=or、非; !=not推荐用not

非举例:

-- 查询gmv不在200到300之间的记录
select * from table_test_0512
where gmv<200 or gmv>300;
-- 等同于下
select * from table_test_0512
where not(gmv>=200 and gmv<=300);--gmv在200~300之间的否定则是不在这个范围的数据记录

3.6.3 模糊查询

like:

  一般和通配符搭配使用

    通配符:

      % 任意多个字符,包含0个字符

      _  任意单个字符

like 举例:

like的通配符在前%/_xxxxx,表示前模糊即半模糊,在后表示后模糊xxxx_/%,前后都有则表示全模糊%/_xxxxx%/_;

查询表中第三个字符是m,第六个字符是n的column_name1

select * from table_test_0512
where column_name1 like \'__m__n\';--只能查ccmbbn,因为后面没有了%或者_

 

select * from table_test_0512
where column_name1 like \'__m__n%\';-可以查ccmbbn和ccmbbnll,因为最后有%任意多个字符

 

 

 

查询表中第二个字符为_的column_name1

需要用到转义字符“\”,告诉服务器斜杠后面的_是单纯的下划线不是任意单个字符

select * from table_test_0512
where column_name1 like \'_\_%\'

转义字符除了用斜杠\,还可以自定义,使用函数escape,escape后面的字符就是自定义的转义字符

select * from table_test_0512
where column_name1 like \'_$_%\' escape \'$\'

 

 

between and

in

is null;

判断为空不能用字段名=null,因为=判断不出来nul值,所以只能用is null;

拓展:select * from table_test_0512和

select * from table_test_0512
where column_name1 like \'%%\';

select * from table_test_0512
where column_name1 like \'%%\' or column_name3_new like \'%%\';

相等么?

答案是:不一定,首先%%不能查字段为null,所以为null记录查不出来,但是只要不存在null值就相等;

 

3.7 where后面不可用select的as别名

因为where后的条件是针对表内的字段,执行顺序高于select语句,不属于表内的字段是不认识的

3.8 order by后面可以用select的as别名

因为排序是将查询的select结果排序,执行顺序低于select的,是认别名的;

order by 排序多个字段用逗号分隔,后面都需要加上是asc/desc,asc可以省略;

3.9 length函数

字节长度函数,在utf-8数据类型下一个英文字母是一个字节,一个中文是3个字节

在utf-8mb4是一个英文是1一个字节,一个中文是4个字节;

3.10 upper、lower

upper是字符串转大写

lower是字符串转小写

select id,column_name1,UPPER(column_name1),LOWER(column_name1) from table_test_0512

3.11 substr截取

substr(exp1,2)截取从第2个字符开始;

 

 

subatr(exp1,1,2)截取从第一个到第2个字符;

3.12 instr函数

返回字段中第一次出现的索引,如果找不到则返回0,不会返回负数

实例中找name1中m第一次出现的索引

 

3.13 trim函数

默认去掉前后空格

想要去掉字段前后的字符,可以传参数:trim(exp1 from exp2)把exp2中的前后exp1去掉

 

3.14 lpad、rpad填充函数

lpad是左填充,如果本身字符串长度够,就不需要填充,长度不足才要填充

参数:lpad(exp1,12,\'*\')

 

rpad 右填充

3.15 round函数

round不填保留几位则默认是四舍五入保留整数

3.16 floor函数向下取整

3.17 ceil函数向上取整

3.18 mod函数取余

相当于%

select mod(10,3)=select 10%3

被除数是负数/正数,则余数就是负数/正数

select mod(-10,3)=-1

select mod(10,-3)=1

可以验证下,取余就是select mod(a,b)=select a-a/b*b=select mod(-10,3)=select -10-(-10/3*3)

=select -10-(-9)=-1

3.19 日期函数

3.19.1 返回当前系统日期+时间

select now();

 

 

3.19.2 返回当前系统日期不包含时间

select curtime();

select CURRENT_DATE()

 

 

 

3.19.3 返回当前系统时间不包含日期

select cuttime();

 

 

3.19.4 获取时间部分年、月、日、时、分、秒

select year(now())

 

 

select month(now()) 

 

获取英文的月份:

一月:January(尖)、二月:February(飞鸟)、三月:march(马吃)、四月:April(A与4型近)、五月:may(妩媚)、六月:june(祝嗯-六一)、七月:july、八月:August、九月:September(蛇泡酒)、十月:October、十一月:November(no 温度)、十二月:december(底)

 

3.20 str_to_date函数

 将字符串类型的日期转换成对应的日期格式

转换的日期格式必须和字符串的格式一 一对应

Y是指四位年、y是两位年、H是24小时制、h是12小时制、i是分、s是秒

 

 

 

不对应格式会返回null,因为要转换的日期格式是对字符串格式解释说明

拓展 date()函数

mysql默认支持的日期格式是YYYY-MM-DD或者YYYY/MM/DD、YYYYMMDD,所以如果字符串格式是这种可以使用date直接转换成日期

 

3.21 date_format函数 

如果已经得到一个标准日期格式的字段,想要自定义日期的显示的格式,可以使用此函数

select DATE_FORMAT(\'2021-05-19\',\'%Y%m%d\')

拓展:from_unixtime();

将当前时间的时间戳格式转化为标准时间格式

select from_unixtime()

 

3.22 日期的计算

date_add()--加

select date_add(\'2021-05-20\',interval 10 day);

date_sub()--减

datediff(endtime,starttime)--差值

 

 

 

3.23 聚合函数

功能是做统计使用;

分类:sum() max() min() avg() count()

特点:

sum、avg一般作用于数值型数据

如果不是数值型会尝试转换,转换数值不成功则返回0

 

 

sum() max() min() avg() count()都忽略null值

count函数一般使用count(*)来统计行数

和聚合函数一同查询的字段必须是group by后的字段

3.24 流程控制函数

3.24.1 if函数

语法:if(判断语句,判断语句为true后的取值语句,判断语句为false后的取值语句);

 

 

 

3.24.2 case when语法

case 要判断的字段或表达式

when 常量1 then 要显示的值1或语句1

when 常量2 then 要显示的值2或语句2

。。。

else 要显示的值n或语句n;

end as 别名--必须要起别名,因为then后面的值必须有个字段列展示出来

类似于java 的switch case

案例:

select
case user_role
when \'b\' then \'b\'
when \'e\' then \'e\'
when \'全部\' then \'全部\'
end as user_role
from rpt_operate_order_flow_period
where date_time_key=(select MAX(date_time_key)
from rpt_operate_order_flow_period)
and user_role <>\'o\'
group by user_role

case when 条件1 then 1

when 条件2 then 2

。。。

else 条件n then n

end as 别名

案例:

select
case
when user_role=\'b\' then \'b\'
when user_role=\'e\' then \'e\'
when user_role=\'全部\' then \'全部\'
end as user_role
from rpt_operate_order_flow_period
where date_time_key=(select MAX(date_time_key)
from rpt_operate_order_flow_period)
and user_role <>\'o\'
group by user_role

3.24.3 case when 写在where中的变量

同一个字段的判断要写在一个case中,用不同的when

案例1:

where CASE

WHEN ${datatype} =\'d\' and ${datadate} is null then datadate=(select current_date - integer \'1\')--条件判断可以增加多个用and连接

WHEN ${datatype} =\'d\' and ${datadate} is not null then datadate=${datadate}

WHEN ${datatype} != \'d\' then datatype = ${datatype} else true end;

但是不同的字段判断则需要多个case

案例2:多个条件字段判断判断那么每一个结尾都要end结束

where period_type=\'accu\'
and case when ${user_role} is null then user_role=\'全部\'
else user_role in (${user_roles}) end
and case when ${user_level} is null then user_level=\'全部\'
else user_level in (${user_levels}) end

3.24.4 case when 占位符

当字段值是随着前端的筛选随机变化时,那么where条件中该字段值的判断需要用变量来表示${}

and case when ${user_role} is null then true else ${user_role} end-------${user_role}代表是字段名

and case when \'${user_role}\' is \'null\' then true else user_role = \'${user_role}\' end------ \'${user_role}\' 代表是将false的结果复制给字段名

3.24.5 case when null is null then true

then true是表示不做处理,获取全量数据

3.25 group by分组函数

3.25.1 group by 多个字段该怎么理解呢:

如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。两个字段都相同的行会聚合成一行,否则就是多行

3.25.2 语法:

select 聚合函数,(group by后面的字段)

from 表

where 

group by 分组列表

having 字段必须是聚合函数表达式,可以是表中任意字段

order by ;

案例:having的字段在group by分组内

 

案例:having的字段不在group by分组内

select column_name2,MAX(gmv) from table_test_0512
group by column_name2
having max(gmv)>=500

 

 

 

3.25.3特点:

分组查询中的筛选条件分为两类:

1.分组前筛选 针对的是原始数据源即where部分

2.分组后筛选 分组后的结果集having部分

group by和having、order by 后可以跟select 别名

3.35.4 group by和grouping sets

代表把group by后面的字段再次分别进行分组聚合,然后union all

比如按照月,日分组后执行grouping sets就是:

按照月分组,日=null,按照月进行聚合再union all 月=null,按照日聚合

3.26 多表关联查询

3.26.1 笛卡尔乘积

格式:select * from 表1,表2

表1 m行 表2 n行,结果为m*n行

发生原因是因为没有:没有有效的连接条件

如何避免:添加有效的连接条件即where条件;

案例:table_test_0512 10行记录仪 table_test_0513 2条记录,笛卡尔乘积后20条记录;

 

 

案例:添加有效的连接条件后,2条记录

where 条件中用:表名.字段名=表名.字段名

 

 

3.26.2 【inner】 join 连接

语法:

select 查询列表 

from 表1 别名 【连接类型】

join 表2 别名

on 连接条件

【where】

【group by】

【having】

【order by】

连接类型分类:

内连接:inner 取交集,inner可以省略的

等值连接:

如图 on字段相等的数据记录,不相等的行剔除

 

拓展1:3个及以上的表join原理

如果是三个及以上的表连接如下:那么就有顺序要求,因为A和B join后的结果集和C再去连接的,所以必须前面的结果集能和C有关联到的字段才行;

select * from A 

inner join B on A.id=B.id

inner join C on A.key=C.key

非等值连接:on字段是一个非=号

a.id<=b.id则是将a表每一行的id值和b表对比,如果满足条件则输出展示

a的id=1 b表的id=1相等,则输出

a的id=1小于 b表的id=2,则输出

a的id=2 b表的id=2相等,则输出

忽略id=10,因为是字符串没比较出来;

 

 

自连接:自己和自己join

3.26.3 外连接

  左外:left【outer】

 

 

 

       右外:right【outer】

 

 

 

       全外:full【outer】

3.26.3 交叉连接:cross

也就是笛卡尔乘积

 

 

3.27 子查询

3.27.1 exists(相关子查询)

语法:

exists(完整的查询语句)

结果:1/0

如果子查询结果有数据,则存在=1,否则=0

经常用来放在where后面,必须where exists子查询存在,那么where前的查询才生效

 

 

3.28 分页查询

limit offset,size

offset是起始索引,即从第几行开始,mysql中从0开始表示第一行记录

size是获取条目

前5条等同于limit 5,offset=0可以省略

从2行开始,取5行

 

 

3.29 联合查询union

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

UNION 内部的 SELECT 语句必须拥有相同数量的列;

列也必须拥有相似的数据类型;

每条 SELECT 语句中的列的顺序必须相同;

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

注释:

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

 

 UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

 

 

3.30 insert into 方式

3.30.1 insert into 表名 列名(可是部分/全部,但前提是必填项)values(和列名数据类型要一致)

3.30.2 insert into 表名 set 后面是字段名=字段值,逗号分隔多个

3.20.3 insert into select 批量插入自增id字段

#批量插入带有自增字段的记录

insert into rpt_kpi_dboard_1d

set @id=0;--初始化id

select (@id:=@id+1) id  

3.31 update多表关联的记录

语法:

update 表名1 别名

inner/left/right/full join 表名2 别名

on 连接条件

set 列=值。。。

where 筛选条件

案例:

update table_test_0512 a
join table_test_0513 b
on a.id=b.id
set b.column_name3_new=\'update-new\'--在where条件后执行set语句,只修改id=2的记录
where b.id=2

3.32 delete数据

3.32.1 多表删除

语法:delete 表1别名,表2别名

from 表1 别名

关联类型 join 表2 别名

on 连接条件

where 筛选条件后删除;

案例:

delete a,b -- 要删除的表记录,删除a,b表id=2的记录
from table_test_0512 a
join table_test_0513 b
on a.id=b.id-- 前面这一串是获得多表关联的结果集
where b.id=2

 

 

3.32.2 单表删除

delete from users where 条件语句

3.33 truncate 数据

语法

truncate table 表名;

案例:

truncate table users;--truncate语法是不能加where条件,要删除都是整个表删除;

3.34 to_char(数据,FM999990.09) 格式化函数-oracle sql

select to_char(0.63,\'FM999,999,990.00\' )

其中 9 代表 如果该位存在数字则显示数字,不存在显示空格,其中 FM 代表 如果是因为9 带来的空格则删除因为该为没有数据

其中 0 代表 如果存在数字则显示数字,不存在则显示0, 即占位符,为了解决小数展示.001,没有展示个位0

3.35 row_number()排序和rank()区别

3.35.1row_number

row_number只是分组后按照字段进行排序后,给一个序号,即便记录一模一样也会有一个先后顺序,

row_number() over(PARTITION BY coalesce(t1.data_date,t2.data_date) ORDER BY t1.sales_amt desc ) as sales_amt_rank

如果t1和t2表取并集后,t1表对应的datadate字段有的行是null,那么为null的作为一个分组进行123的排序,不为null的相同value结果的作为一组进行123的排序

但是如果排序字段取t1和t2的datadate就不存在为null的情况,都会有具体的日期了,就不会存在相同日期有多个一样的排名了

 

 

3.35.2 rank

RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里为什么和ROW_NUMBER()不一样那,ROW_NUMBER()是排序,当存在相同排序值时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样,出现相同的,他们的排名会是一样的值。

3.36 next_day(sysdate,\'mo\') -oracle

sysdate查询出下一个星期一是哪一日

dt between to_char(dateadd(to_date1(next_day(to_char(to_date1(\'${bizdate}\',\'yyyymmdd\'),"yyyy-mm-dd"), "MO"),"yyyy-mm-dd"),-7,\'dd\'),"yyyymmdd") and \'${bizdate}\'

其中 next_day(to_char(to_date1(\'${bizdate}\',\'yyyymmdd\'),"yyyy-mm-dd"), "MO")是下一个星期一是哪一天

 

3.37 取最近一小时内每五分钟的合计数据

DATE_FORMAT(
concat(
date( pay_time ),-- 获取支付时间的年-月-日
\' \',-- 和空格拼接
HOUR ( pay_time ),-- 获取支付时间的h
\':\',-- 和空格拼接
cast( floor( MINUTE ( pay_time ) / 5 ) * 5 AS INT ),-- 获取支付时间中整5分钟数的分钟
\':00\'
),
\'%Y-%m-%d %H:%i:%s\' --指定拼接后的日期格式
);

 

3.38 返回7天内数据平均值

select avg(data_num) (SELECT
data_dt,
sum( data_num ) as data_num -- 7日平均数
FROM
rpt_ubt_realtime_repost_d_15m
WHERE
data_dt BETWEEN DATE_SUB( CURDATE(), INTERVAL 6 DAY ) -- 从当前日期-6天+当天=7天
AND CURDATE()
AND data_hour LIKE \'%09:15:00\'
AND data_type IN ( \'effective_repost\', \'confirm\', \'request\' )
AND channel_type = \'ALL\'
group by data_dt--每一天的数据汇总
)

3.39 with as

当一条SQL语句,在同一个SQL语句中多次出现时,可以使用with as 将该SQL语句作为公用SQL,之后,在下一条SQL中,使用公用SQL语句。

使用:如下

with tt as (select * from table_1);

select * from tt;  -- tt代表的是公用SQL

公共语句和引用语句之间不能有;执行时要一起选中

with tt as (select NOW()) select * from tt;

3.40 sum() over (order by )--oracle

3.40.1 sql 时间类型:

date:yyyy-mm-dd

time:hh:mi:ss

datetime:yyyy-mm--dd hh:mi:ss

timestamp:10位时间戳

year:yyyy

先sum,然后按照paytime正序排列

SELECT
pay_time AS time,
sum( pay_amount )over ( ORDER BY pay_time ) AS yesterday_money

3.41 first_value() over(partition by rder by)-oracle

分组排序后取第一个值

select first_value(cur_gmv) over

(partition by data_date order by data_time desc) cur_gmv

from datahub_mysql_rpt_trd_channel_1s_his

where channel=\'大盘\'

3.42 map类型的字段插入方式

只能用insert into select的方式,且必须全量所有字段一起同时插入才行

INSERT INTO akdc.stg_trfc_event_mshop_wx_app_15m_test

PARTITION(dt=\'20201126\',mi=\'1000\')--指定分区

select \'1606199447\' as xwhen,--时间

map(\'$debug\',\'0\',\'coupon_amount\',\'20\') as xcontext--map类型

,\'49db5d52c1480201\' as appid,

\'0CO5jlZThG\' as xwho,

\'share\' as xwhat;

3.43 插入分区values

INSERT INTO TABLE tablename

[PARTITION (partcol1=val1, partcol2=val2,...)][(co1name1,colname2,...)]

[VALUES (col1_value,col2_value,...),(col1_value,col2_value,...),...]

参数说明:

  • tablename:待插入数据的表名称。该表为已经存在的表。
  • PARTITION (partcol1=val1, partcol2=val2,...)]:分区信息。如果需要更新的表为分区表,您需要指定该参数。
  • [(co1name1,colname2,...):目标表中的字段名称。
  • col_value:目标表中列对应的列值。多个列值之间用逗号(,)分隔。该列值必须为常量,未指定列值时,默认值为NULL。

INSERT INTO TABLE PARTITION (分区字段)(目标表列)values()

3.44 replace函数

语法:

replace(字段,被替换数据,要替换的数据)

3.45 ADDTIME

SELECT ADDTIME(\'2018-10-31 23:59:59\',\'0:1:1\')

 

3.46 convert(decimal(18,2),price)---sqlserver

select convert(decimal(18,2),1343.546567) 结果:1343.55

decimal(18,0)

18是定点精度,0是小数位数。

decimal(a,b)

a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。

b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。

3.47 unoin all

unoin all 以上的sql是语句作为一个整体子级

如:select * from

(select * from aa)p1

unoin all

(select * from aa)p2

结果不会查出来p1和p2并集,而是把

select * from

(select * from aa)p1作为一个子级和(select * from aa)p2做并集

这里的select * from 是和p1是一体的

3.48 least(num1,num2)

那个数值小,取哪个

least(tt2.virtual_real_amt,tt2.real_amt*0.10)

4 事务的概念

事务是由单独单元的一个或多个sql语句组成,在这个单元中(执行sql时选中的所有语句),每个mysql语句是相互依赖的。而整个单独单元作为一个不可分隔的整体,如果单元中某条sql语句一旦执行失败或者产生错误,整个单元将会回滚;

5 视图的概念

从5.0.1版本开始提供视图的功能。一种虚拟存在的表,行和列的数据来自定义视图的逻辑sql里的表,并且是在使用视图时动态生成,只保存sql逻辑,不保存查询结果;

5.1创建视图

语法:

/*

create view 视图名

as

select from表

*/

create view table_test_0512_view as
select * from table_test_0512
where id=10

 

在视图列表就会看到创建的视图

 

 

5.2 查看视图和查看普通表是一样的

5.3 删除视图

drop view 视图名 

6 用户自定义变量

语法:

set @变量=变量值;或者

set @变量:=变量值;

用户自定义变量和引用的语句要用分号隔开,否则属于一个事务同时执行,那么后面的语句拿不到初始化后的值会爆错;

set @id=2;--限执行这个
insert into table_test_0513--再执行这个,那么第二次就不会执行初始化语句了,就会不断地自增下去的;
values(@id:=@id+1 ,\'pipei1\',\'pipei1\',\'pipei1\',2)

 

 

分类:

技术点:

相关文章: