SQL查询精简归纳

一、基础语法

(一)表结构

常见的SQL查询是基于数据库中各数据表进行的记录及结果查询,故初学者需先了解表结构。

1.百度释义:

数据表是由表名、表中的字段和表的记录三个部分组成的。设计数据表结构就是定义数据表文件名,确定数据表包含哪些字段,各字段的字段名、字段类型、及宽度,并将这些数据输入到计算机当中。

2.表结构

每个表都是由一系列的字段和行记录组成,有唯一的主键字段,每个字段都有其固定的字段类型,如以销售表,产品明细表,营销人员明细,地区表举例如下:

红字是每个表的主键,具备唯一不重属性,可以用于表连接,箭头所指即表与表之间的连接关系

3.常见的数据库字段类型

字段类型说明
int整数
tinyint短整型整数,范围从0到255之间的整数
bigint长整型整数,任意大的整数
float带有浮动小数点的小数字
double带有浮动小数点的大数字
decimal

小数,作为字符串存储的double类型,允许固定的小数点;

如decimal(10,2),表示整数8位,小数点后2位

timestamp时间戳
datetime日期时间组合
date日期
char字符,固定长度
varchar字符,可变长度
text图片的 不知道长度的,速度慢于varchar

(二)查询语法及表连接

1、查询语句

基础查询:select 查询字段 from  tables  where  限制条件(若有);
分组查询:select 分组依据,聚合字段 from  tables  where  限制条件(若有) GROUP BY  分组依据  HAVING 分组限制条件(若有);
注:
tables可以是单表,也可以是多表连接后的组合表,
可用"*"代表指定表的全量查询字段


带有表连接的基础查询,
以常见的多表左连接为例:
select 查询字段 from  table1 a 
left join table2 b on b.连接字段=a.连接字段
left join table3 c on c.连接字段=a.连接字段
where  限制条件(若有);

多表连接也可写成如下(用where替代join on ):
select 查询字段 from  table1 a,table2 b,table3 c 
where b.连接字段=a.连接字段 and c.连接字段=a.连接字段 and 其他限制条件(若有)

2、查询执行顺序

详细语法:

网页直接搜索SQL语法教程,会有很多梳理完整详尽的语法介绍,但初学者无需看懂每一个语法,只需理解并掌握上述查询语句及执行顺序即可,具体可在实操中进步巩固。

3、表连接

(1)表连接种类

表连接语法说明

形态

(分别对应a表和b表)

left joinselect 查询字段 from a left join b on a.关系id=b.关系id 1、左连接:输出a表全部及b表中匹配到的信息
2、b.关系id需满足非重且唯一
最常用
right join select 查询字段 from a right join b on a.关系id=b.关系id 1、右连接:输出b表全部及a表匹配到的信息
2、a.关系id需满足非重且唯一
inner join

①select 查询字段 from a inner join b on a.关系id=b.关系id 

②select 查询字段 from a,b where a.关系id=b.关系id

输出a与b表有匹配到的信息,未匹配到的不显示
full join select 查询字段 from a full join b 全连接,左表与右表的合集,若匹配不上的会显示为null
cross join

①select 查询字段 from a cross join b 

②select 查询字段 from a cross join b where a.关系id=b.关系id

交叉连接,后方不用跟on条件,查询返回结果的行数等于两个表行数的乘积,如①;若后方通过where添加表连接关系,则结果同inner join 类似,如②;
unoin及 union all

select  查询字段  from table1

union  (all)

select  查询字段  from table2

union  (all)

……

union   (all)

select  查询字段  from tablen

①用于把多个select 结果组合到一个结果集中,各select的查询结果字段对应的列应该具有相同的字段属性,且第一个select 的字段名称将被用于整体结果的字段名称;

②union  去重后输出

union all 不去重,输出所有行

注意事项:

两个表之间通过关系字段可建立连接,这种关系通常可以是一对一,一对多,多对一,多对多。

以最常用的left join 为例:左表a为主表,右表b为辅表,若想使连接后的表有实际意义,则只能使用“多对一”或“一对一”,即b表的关系字段必须非重且唯一,若b表关系字段是“多”,则原本a表的一行记录会因为匹配到b表的多行记录而显示为多行,a表记录就失真了。

二、select 后常用操作

(一)条件判断

语句语法
casecase
when 条件 then  输出
    ……
when 条件 then  输出
else 输出(若有)
end
ifif(expr1,expr2,expr3)
expr1 为 true,则返回 expr2,若为false,则返回值为 expr3
若(非)空

① ifnull( expr1 , expr2 )
若expr1不为空,则返回expr1,否则返回expr2;
② if(表达式,expr1,expr2)

表达式为:字段 is/is not null

表达式若true则返回expr1,若false则返回expr2
③ coalesce(expr1,expr2,expr3, ...,expr_n)
依次参考各参数表达式,遇到非null值即停止并返回该值,如果所有的表达式都是空值,最终将返回一个空值;
④ 延伸:nullif(expr1 , expr2),如果expr1 , expr2相等则返回null,否则返回expr1

(二)运算符

类型描述返回值
算术运算符

 +  -  *  /  % 依次对应

加、减、乘、除、除并返回余数

返回结果为数值
比较运算符

 =、<>、!=、>、<、>=、<=、!>、!<  依次对应
等于、不等于、不等于、大于、小于、大于等于、小于等于、不大于、不小于

返回结果均为true或false

(三)常见用法

分类语法(select后面放置的字段)
基础字段直接的查询字段,或者条件判断字段
聚合

sum()/count()/max()/min()/avg()

可直接聚合或者结合groupby聚合或者聚合运算,count(*)可直接统计所有行

字符拼接

concat(char c1, char c2, ..., char cn),

可将所有参数字符串拼接,参数可以是字符也可以是表达式

去重distinct,常见用法:
查询非重记录:select distinct 字段 from table;
去重计数:select  字段A,count(distinct 字段B) from table group by 字段A 
字段格式

① 按指定小数位输出数字 :
round(expr1 , expr2)  或  truncate(expr1 , expr2)
expr1指要输出的数值或数值型表达式,expr2指要保留的指定的小数点位数,round是四舍五入, truncate是全舍无入也即直接截断
② 向上/下取整
floor(expr) 向上取整,ceiling(expr) 向下取整
③ 按指定小数位输出百分比:
cancat(round(expr1*100,expr),"%")
expr即小数点位数,根据需要round也可替换为truncate

 三、where条件

(一)常用函数

函数用法
in()/not in()在/不在某范围内
and并集条件
or

或集条件,与and连用时,用()区分开即可,如:

where  year(date)=2022 and (id<10  or  id>20)

like()/not like()

后跟字符串,常用通配符有%和_,%指包含零个或多个字符的任意字符串,_指任意单个字符,如:
select * from table where name like "%雨"
("%雨"是以雨结尾,"雨%"是以雨开头,"%雨%"是含雨,整体字符长度不限);
select * from table where name like “_雨"
("_雨"是两个字符且以雨结尾,"雨_"两个字符是以雨开头,"_雨_"三个字符且含雨);
between and
取两个值(含)中间的值,该值可以是数字,文本或日期;
前闭后闭区间,且开始值需小于结束值
any()
任意一个
all()全部
is null/is not null空值判断
length()length(expr),输出字符串expr的长度,可用于根据字符串长度做限制

(二)分组groupby与having

group by用于对from后的表做分组,having用于对分组后的新表做条件限制,如:

select 分组依据字段(可多个),聚合字段,聚合运算 from table 
where 限制条件 
group by  分组依据字段(可多个)  having  count(id)>5;
说明:
①表示按分组依据字段(可多个)分组且只取小组count(id)>5的
②select后的前置字段需要与groupby 后的分组字段一致,且其后应为max/min/avg()/sum()/count()等聚合字段
 

四、时间相关

(一)时间格式转换

1、时间格式转日期格式

date(create_time);
date_format(create_time,'%Y-%m-%d)  注意Y大写 ;
 

(二)当前时间及年月日取值

取当前时间:select CURDATE(),NOW();
取年/月/日:year(),month(),day();
取年月:substr(expr1,expr2,expr3) expr1指取值字段,expr2指从第几个字符取值,expr3指取多少个字符,具体用法是substr(create_time,1,7),输出的是字符格式;
year(expr1)*100+month(expr1)  expr1指时间字段,输出的是数字格式。

(三)时间差及时间加减

函数表达式

具体用法

日期差

datediff(date1,date2)

date1 减 date2

时间差

timestampdiff(unit,time1,time2)

以unit为单位,time1 减 time2的单位差,unit可多种,如day/hour等

时间加减

date_add(time,interval expr unit)

在time上加expr个unit,expr为负则为减


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值