SQL查询精简归纳

本文介绍了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为负则为减


 

<think>好的,我现在需要帮助用户解答关于SQL中如何进行日期区间查询的问题。根据用户提供的引用内容,我需要整理出清晰的步骤和示例,同时生成相关问题。首先,我需要确认用户的需求是查找使用BETWEEN运算符或比较运算符来进行日期范围查询的方法。 用户提到的引用[1]和[2]都提到了使用BETWEEN和比较运算符的例子,比如查找某个日期范围内的订单或记录。引用[3]虽然主要关于随机查询,但可能对相关问题有帮助。我需要确保回答涵盖基本查询方法、日期格式注意事项、函数的使用(如CURRENT_DATE())、以及边界处理。 接下来,我应该分步骤说明,例如基本BETWEEN用法、使用比较运算符组合、处理时间部分、动态日期计算等。每个步骤需要给出具体的SQL示例,并引用对应的引用来源。例如,引用[1]中的例子可以直接用来展示BETWEEN和CURRENT_DATE()的使用。 然后,注意事项部分需要提醒用户日期格式的一致性和时区问题,这些都是实际应用中容易出错的地方。此外,可能需要提到索引对查询性能的影响,但用户提供的引用中没有直接提到这点,所以可能不在此次回答范围内。 生成的相关问题需要考虑用户可能进一步的需求,比如排除时间部分、动态区间(如最近30天)、性能优化等。这些问题应该基于现有引用内容,但如果没有的话,可以适当扩展,但要注明来源。 最后,确保回答结构清晰,使用中文,数学公式正确(虽然这个问题可能不需要数学公式,但按照系统指令,如果有的话要正确使用)。同时,检查所有引用是否正确地标注在对应的例子后面,比如[^1]和[^2]。 现在整理回答的结构: 1. 基本查询方法:BETWEEN和比较运算符 2. 处理包含时间的日期 3. 动态日期区间(如当前日期加减) 4. 注意事项:格式、时区 5. 相关问题 确保每个部分都有对应的示例和引用标注。例如,使用BETWEEN的例子来自引用[2],而CURRENT_DATE()的例子来自引用[1]。 可能遇到的问题:用户是否知道日期函数,如DATE()或DATE_ADD(),但根据引用内容,引用[1]提到了CURRENT_DATE(),所以可以包含进去。动态日期部分可能需要使用函数,但如果没有引用支持,可能需要避免猜测,但用户的问题允许生成相关问题,可以在问题部分提出,比如“如何查询最近30天的数据?” 现在开始编写正式回答,确保每个示例正确,引用正确,并且语言简洁明了。</think>### SQL日期范围查询方法详解 #### 一、基础查询方法 1. **BETWEEN运算符** ```sql -- 查询2023年9月所有事件 SELECT * FROM events WHERE event_date BETWEEN '2023-09-01' AND '2023-09-30'; ``` 此方法直接筛选闭区间(包含边界日期)的数据[^2]。 2. **比较运算符组合** ```sql -- 查询早于2023年的记录 SELECT * FROM records WHERE record_date < '2023-01-01'; ``` 使用`>`、`<`、`>=`、`<=`可灵活定义开/闭区间[^1]。 #### 二、处理含时间的日期字段 若字段包含时间部分,需用`DATE()`函数剥离时间: ```sql -- 查询2023-10-01当天所有订单(忽略时间) SELECT * FROM orders WHERE DATE(order_time) = '2023-10-01'; ``` #### 三、动态日期区间 1. **当前日期计算** ```sql -- 查询未来7天的订单 SELECT * FROM orders WHERE order_date BETWEEN CURRENT_DATE() AND CURRENT_DATE() + INTERVAL 7 DAY; ``` 2. **函数生成日期** ```sql -- 查询最近30天记录(假设数据库支持DATE_SUB) SELECT * FROM logs WHERE log_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY); ``` #### 四、注意事项 1. **日期格式统一** 必须使用数据库支持的格式(通常为`YYYY-MM-DD`),否则可能触发隐式转换错误。 2. **时区问题** 若数据库与应用时区不同,需用`CONVERT_TZ()`等函数显式转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值