一、基础语法
(一)表结构
常见的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 join | select 查询字段 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 后常用操作
(一)条件判断
语句 | 语法 |
case | case when 条件 then 输出 …… when 条件 then 输出 else 输出(若有) end |
if | if(expr1,expr2,expr3) expr1 为 true,则返回 expr2,若为false,则返回值为 expr3 |
若(非)空 | ① ifnull( expr1 , expr2 ) 表达式为:字段 is/is not null 表达式若true则返回expr1,若false则返回expr2 |
(二)运算符
类型 | 描述 | 返回值 |
算术运算符 | + - * / % 依次对应 加、减、乘、除、除并返回余数 | 返回结果为数值 |
比较运算符 | =、<>、!=、>、<、>=、<=、!>、!< 依次对应 | 返回结果均为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 |
字段格式 | ① 按指定小数位输出数字 : |
三、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为负则为减 |