SQL查询基础

SQL查询基础


前言

  • 数据库查询的一些基础操作:select where 常用的日期函数。

一、SELECT子句

  • 查询记录通过SELECT语句实现,其(精简)语法为:
    SELECT select_expr,... [ FROM table] [ WHERE condition ]
  • 查询表达式语法为:select_expr [ [ AS ] alias ]
  • SELECT语句是完成一次数据查询的完整SQL指令,而SELECT子句是负责定义"返回什么数据"的核心部分。

1.1as别名

  • 语法: SELECT 字段 [as] 别名
  • SELECT 字段,... FROM 表名 [as] 别名

1.2SELECT子句作用

1.3练习

• 计算 10*5的结果

• 查看books 表所有数据

• 提取books 表书名和出版社

• 提取books 表的作者和书名

sql 复制代码
# • 计算 10*5的结果
select 10*5;

#• 查看books 表所有数据
select * from books;

#• 提取books 表书名和出版社
select bname,press from books;

#• 提取books 表的作者和书名

select author ,bname from books;

1.4算术运算

1.5练习

• 查看books表的书名,价格,8折后价格

• 查看books表的书名,价格,价格对2取余的结果

• 查看books表的书名,价格,价格对3整除的结果

sql 复制代码
# • 查看books表的书名,价格,8折后价格
select bname ,price,price*0.8 as discount_price from books;
# • 查看books表的书名,价格,价格对2取余的结果
select bname ,price,price %2 as discount_price from books;
# • 查看books表的书名,价格,价格对3整除的结果
select bname ,price,price div 3 as discount_price from books;

1.6条件运算

  • 语法:IF(expr1,expr2,expr3)

  • 说明: expr1表示的是判断条件,expr2和expr3是符合expr1的自定

    义的返回结果当expr1的值为真时,则返回值为expr2;当expr1的值

    为假时,则返回值为expr3

  • 用法一:需要判断单个字段等于多个固定值时

  • 用法二:WHEN后接独立的条件表达式,复杂逻辑

1.7练习

• 查看books表的书名,作者,价格,折后价格(作者为老舍的8折,

其他九折)

• 查看books表的书名,作者,作者,折后价格(作者为老舍的8折,

鲁迅的7折,矛盾9折,其他作者6折)

• 查看books表的书名,价格,价格奇偶数判断

sql 复制代码
#• 查看books表的书名,作者,价格,折后价格(作者为老舍的8折,其他九折)
select bname,author,price,
      if(author="老舍",price*0.8,price*0.9)  as 折后价格
      from   books;

#• 查看books表的书名,作者,价格,折后价格(作者为老舍的8折,鲁迅的7折,矛盾9折,其他作者6折)
select bname,author,price,
       case author
		    when "老舍" then price*0.8
            when "鲁迅" then price*0.7
            when "矛盾" then price*0.9
            else price*0.6 
		end as 折后价格
        from books;

#• 查看books表的书名,价格,价格奇偶数判断
select bname,price,
       if(price%2,"奇数","偶数") as 价格奇偶性判断
       from books;

二、WHERE子句

  • WHERE子句用于规定选择的标准
  • 如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句。

2.1比较运算

2.2条件查询训练

• 图书价格>50的图书所有信息

• 图书价格不等于41的图书所有信息

• 备注为空的图书

• 备注不为空的图书

sql 复制代码
#• 图书价格>50的图书所有信息
select * 
from books
where price>50;


#• 图书价格不等于41的图书所有信息
select * 
from books
where price!=41;


#• 备注为空的图书
select * 
from books
where common is null;

#• 备注不为空的图书
select * 
from books
where common is not null;

2.3 逻辑运算

2.4 训练

• 图书价格40-50元的图书(and 和 between and分别实现)

• 鲁迅或老舍的图书(or 和 in 分别实现)

• 价格不在40-50元的图书(or 和 not between and 分别实现)

• 不是鲁迅或老舍的图书(and 和 not in 分别实现)

sql 复制代码
#• 图书价格40-50元的图书(and 和 between and分别实现)
select *
from books
where price>=40 and
      price<=50;
      
select *
from books
where price between 40 and 50;

#• 鲁迅或老舍的图书(or  和 in 分别实现)
select *
from books
where author="鲁迅" or
      author="老舍";
      
      
select *
from books
where author in ("鲁迅", "老舍");

#• 价格不在40-50元的图书(or 和 not between and 分别实现)
select *
from books
where price<40 or
      price>50;
      
select *
from books
where price not between 40 and 50;
#• 不是鲁迅或老舍的图书(and 和 not in 分别实现)

select *
from books
where author!="鲁迅" and
      author!="老舍";
      
      
select *
from books
where author not in ("鲁迅", "老舍");

2.5逻辑运算注意事项

  • AND中只要有一个条件是0(假),结果必为0(假);只有全为1(真)
    才是1,否则可能是NULL
  • OR中只要有一个条件是1(真),结果必为1(真);只有全为0(假)才
    是0,否则可能是NULL
  • 多个OR条件(同一字段)可简化为IN

2.6运算级优先级

先算数,再比较,最后逻辑

2.7练习

• 查找40多元的图书

• 查找人民教育出版社出版的图书

• 查找老舍写的,中国文学出版社出版的图书

• 查找备注不为空的图书

• 查找价格超过50元的图书,只看书名和价格

• 查找鲁迅写的或者茅盾写的图书

sql 复制代码
#• 查找40多元的图书
select *
from books
where price between 40 and 49;

#• 查找人民教育出版社出版的图书 
select *
from books
where press = "人民教育出版社";


#• 查找老舍写的,中国文学出版社出版的图书 
select *
from books
where press = "中国文学出版社" and
	  author = "老舍";


#• 查找备注不为空的图书
select * 
from books
where common is not null;

#• 查找价格超过50元的图书,只看书名和价格
select bname,price
from books
where price>50;
      

#• 查找鲁迅写的或者茅盾写的图书

select *
from books
where author in ("鲁迅", "茅盾");

三、常用日期函数

3.1系统时间

  • CURDATE() 或CURRENT_DATE() 返回当前的日期
  • CURTIME()或CURRENT_TIME() 返回当前的时间
  • NOW() 返回当前的日期和时间

3.2时间计算

  • DATE_ADD(date,INTERVAL int keyword),返回日期date加上间隔时间int的结果
    (int必须按照关键字进行格式化),如:SELECT
  • DATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
  • DATE_SUB(date,INTERVAL int keyword),返回日期date加上间隔时间int的结果
    (int必须按照关键字进行格式化),如:SELECT
  • DATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
  • DATEDIFF(结束日期,开始日期),计算两个日期天数之差
  • TIMESTAMPDIFF(unit,开始日期,结束日期),计算两个日期unit之差,unit 包含
  • SECOND:秒 MINUTE:分钟HOUR:小时 DAY:天 WEEK:星期 MONTH:月
    QUARTER:季度 YEAR:年

3.3时间类型转换

  • UNIX_TIMESTAMP(date/datetime) 把日期/日期时间字段转换为时间戳
  • FROM_UNIXTIME(timestamp,fmt) 根据指定的fmt格式,格式化UNIX时间戳为日期格式 ,
    默认%Y-%m-%d %H:%i:%s
  • DATE_FORMAT(date/datetime/timestamp,fmt) 依照指定的fmt格式格式化
  • 日期时间:
  • 支持格式:'YYYY-MM-DD' 'YYYY-MM-DD HH:mm:ss' 'YYYYMMDD'(如 '20251203');
  • 不支持格式:'MM/DD/YYYY'(如 '12/03/2025')、'YYYY年MM月DD日',需先通过
    STR_TO_DATE() 转换SELECT STR_TO_DATE('12/03/2025', '%m/%d/%Y')

3.4格式符

3.5提取时间函数

  • DATE(datetime/timestamp) 提取日期时间/时间戳的日期部分
  • YEAR(date) 返回日期date的年份(1000~9999)
  • QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
  • MONTH(date) 返回date的月份值(1~12)
  • WEEK(date) 返回日期date为一年中第几周(0~53)
  • DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)
  • DAYOFMONTH(date) 返回date是一个月的第几天(1~31)
  • DAYOFYEAR(date) 返回date是一年的第几天(1~366)
  • HOUR(time) 返回time的小时值(0~23)
  • MINUTE(time) 返回time的分钟值(0~59)

3.6尝试实现函数:

sql 复制代码
select curdate();
select curtime();
select now();
select date_add(curdate(),interval 2 day);
select date_sub(curdate(),interval 4 day);
select datediff("2024-5-21" ,"2023-8-1");
select timestampdiff(day,"2023-8-1","2024-5-21" );
select unix_timestamp(curdate());
select unix_timestamp(curtime());
# 按照指定格式化日期
select from_unixtime(1766543860,"%Y%m%d");
select date_format(curdate(),"%y/%m/%d");

select date_format(curtime(),"%H:%i:%s");
select date(now());
select date("2025-7-1 07:37:29");

select  year("2025-7-1");
select month("2025-7-1");
select hour("2025-7-1");
select quarter("2025-7-1");

select dayofweek(curdate());

3.7综合训练

• 计算每个人报名比赛的年龄 (比赛日期-生日)

• 找到前几个月过生日的人(当前月-n = 出生月)

• 未来15天内过生日的人

• 数据准备如下

• create table marathon (

• id int primary key auto_increment,

• athlete varchar(32),

• birthday date,

• r_time datetime comment "报名时间",

• performance time

• );

• insert into marathon values

• (1,"曹操","1998-2-16","2021/5/6 10:10:27","2:38:49"),

• (2,"关羽","2000-7-19","2021/4/30 16:22:09","2:27:18"),

• (3,"孙策","1995-10-23","2021/5/2 20:1:2","2:44:00");

sql 复制代码
create table marathon (
 id int primary key auto_increment,
 athlete varchar(32),
 birthday date,
 r_time datetime comment "报名时间",
 performance time
 );
insert into marathon values
(1,"曹操","1998-2-16","2021/5/6 10:10:27","2:38:49"),
(2,"关羽","2000-7-19","2021/4/30 16:22:09","2:27:18"),
(3,"孙策","1995-10-23","2021/5/2 20:1:2","2:44:00");

select athlete,
       timestampdiff(year,birthday,r_time) as年龄
	   from marathon;

select * 
from marathon 
where month(birthday) >= month(date_sub(now(),interval 6 month));
# 这里为了方便实现的逻辑不对大概熟悉函数就行
select * 
from marathon 
where day(birthday) <=
day(date_add(now(),interval 24 day));

总结

• 本章节主要内容是Select、Where子句

• 算数、条件、比较、逻辑四类运算

• 常用日期函数:系统时间、时间计算、类型转换、提取单位

相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花5 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸5 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain5 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java6 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿7 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴7 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存