目录
 
1 基本查询
 
1.1 查询相关列 (select * / 列名)
 
1.2 别名 (as)
 
1.3 去重 (distinct)
 
1.4 对列中的数据进行运算 (+、-、*、/)
 
2 条件查询 (where)
 
2.1 等值查询 (=)
 
2.2 非等值查询 (>、<、>=、<=、!=、><)
 
2.3 逻辑判断 (and、or、not)
 
2.4 区间判断 (between and)
 
2.5 NULL 值判断 (is null、is not null)
 
2.6 in 运算符
 
2.7 模糊查询 (like)
 
3 分支查询
 
4 排序 (order by)
 
5 日期和时间函数
 
 
 
1 基本查询
 
 goods 表
 
 
drop table if exists goods;
create table goods (
id int(10) primary key auto_increment,
name varchar(14),
netprice float(7,2),
saleprice float(7,2),
weight float(7,2),
stockdate date
)charset=utf8; #单条插入
insert into goods(name,netprice, saleprice, weight, stockdate) values('香蕉', 2.5, 3.8, 24, '2024-02-13');#多条插入
insert into goods(name,netprice, saleprice, weight, stockdate) values
('苹果', 4.5, 7.2, 15, '2024-02-12'),
('苹果', 4.5, 7.5, 65, '2024-02-14'),
('橘子', 3.2, 4.5, 52, str_to_date('02-12-2024', '%m-%d-%Y')),
('橘子', 2.8, 4.5, 76, '2024-02-13'),
('橘子', 3.1, 5.2, 63, '2024-02-14'),
('葡萄', 2.1, 4.7, 26, str_to_date('2024/02/14', '%Y/%m/%d'));
 
1.1 查询相关列 (select * / 列名)
 
|  生产环境下,优先使用列名查询。* 的方式虽然看起来便捷,但实际上需要转换成全列名,效率低,可读性差 select * from goods;
select id, name, stockdate from goods;
      关键字顺序 select         ... from         ... 以上语句执行顺序: fromselect
 | 
 
1.2 别名 (as)
 
|   通过 as 可以对列名取别名,as 可以省略(列名和别名之间用空格隔开) select id as '商品id', name as '商品名', netprice '进价', saleprice '售价' from goods;
 
 | 
 
1.3 去重 (distinct)
 
|   通过 distinct 将查询结果中的重复行去除 select name from goods;
select distinct name from goods;
   
 | 
 
1.4 对列中的数据进行运算 (+、-、*、/)
 
|   可以对列中的数据进行加 +、减 -、乘 *、除 / select id '商品id', name '商品名', (saleprice - netprice) * weight as '利润' from goods; 
 
 | 
 
2 条件查询 (where)
 
 通过 where 进行条件查询
  关键字顺序
 select
         ...
 from
         ...
 where
         ...
  以上语句执行顺序:
 - from
- where
- select
 
2.1 等值查询 (=)
 
| select * from goods where name = '苹果';
 
 | 
 
2.2 非等值查询 (>、<、>=、<=、!=、><)
 
| # 从商品中选择 weight > 52 的商品
select id, name, netprice, saleprice, weight from goods where weight > 52;# 从商品中选择 weight < 52 的商品
select id, name, netprice, saleprice, weight from goods where weight < 52;# 从商品中选择 weight >= 52 的商品
select id, name, netprice, saleprice, weight from goods where weight >= 52;# 从商品中选择 weight <= 52 的商品
select id, name, netprice, saleprice, weight from goods where weight <= 52;# 从商品中选择 weight != 52 的商品,此外 != 还可以这样用,如 name != '苹果'
select id, name, netprice, saleprice, weight from goods where weight != 52;# 从商品中选择 weight <> 52 的商品,<> 等价于 !=
select id, name, netprice, saleprice, weight from goods where weight <> 52;
 
   
 
 
 
 | 
 
2.3 逻辑判断 (and、or、not)
 
| # 选择 weight > 52 且 name != '苹果' 的商品
select id, name, netprice, saleprice, weight from goods where weight > 52 and name != '苹果';# 选择 weight > 52 或 not name = '苹果' 的商品(not name = '苹果' 等价于 name != '苹果')
select id, name, netprice, saleprice, weight from goods where weight > 52 or not name = '苹果';
  
 | 
 
2.4 区间判断 (between and)
 
| # 选择 24 <=  weight <= 50 的商品
select id, name, netprice, saleprice, weight from goods where weight between 24 and 50;
 
 | 
 
2.5 NULL 值判断 (is null、is not null)
 
| # 查询表 goods 中 weight 为 null 的商品
select * from goods where weight is null;# 查询表 goods 中 weight 不为 null 的商品
select * from goods where weight is not null;
 
 | 
 
2.6 in 运算符
 
| in 运算符语法: where 列名 in (value1, value2, ...)where 列名 not in (value1, value2, ...)只要列值在列表项 (value1, value2, ...) 中,则该行符合条件
in 列表项不仅支持数字,也支持字符甚至时间日期类型等,并且可以将这些不同类型的数据项混合排列而无须跟 column(列) 的类型保持一致,如 in (1, 2,'str')in 可以和 and、or、>、<= 等运算符结合使用in 列表项可以是子查询如果 in 的列表项是确定的,那么可以用多个 or 来代替。一般认为,如果是对索引字段进行操作,使用 or 效率高于 in,但对于列表项不确定的时候(如需要子查询得到结果),就必须使用 in 运算符。另外,对于子查询表数据小于主查询的时候,也是适用 in 运算符的
 select id, name, netprice, saleprice from goods where name in ('苹果', '香蕉');
 
 | 
 
2.7 模糊查询 (like)
 
|  “_” 表示单个任意字符“%” 表示任意个任意字符( 0 ~ n 个任意字符)
 # 查询表 goods 中 stockdate 为 '2024-02-x4' 的商品
select id, name, stockdate from goods where stockdate like '2024-02-_4';# 查询表 goods 中 saleprice 为 7.xx 的商品
select id, name, saleprice from goods where saleprice like '7.%';# 查询表 goods 中 name 不为 '苹x' 的商品
select id, name stockdate from goods where name not like '苹_';
 
 
 
 | 
 
3 分支查询
 
|  分支查询语法: case         when 条件1 then 结果1         when 条件2 then 结果2         ...         else 结果n end select id, name, stockdate,casewhen stockdate = '2024-02-12' then '前天'when stockdate = '2024-02-13' then '昨天'when stockdate = '2024-02-14' then '今天'else '不知道'end as time
from goods;
 
 | 
 
4 排序 (order by)
 
 order by 列名 asc / desc;
 asc 表示升序,desc 表示降序,默认是升序
  关键字顺序
 select
         ...
 from
         ...
 where
         ...
 order by
         ...
  以上语句执行顺序:
 - from
- where
- select
- order by
 
# 按照 weight 重量升序
select id, name, netprice, saleprice, weight from goods order by weight;
# 按照 weight 重量降序
select id, name, netprice, saleprice, weight from goods order by weight desc;
先按照 netprice 进价降序,如果 netprice 相等,则按照 id 降序
select id, name, netprice, saleprice, weight from goods order by netprice desc, id asc;
 

 

 

 
5 日期和时间函数
 
| | 时间函数 | 描述 | 
|---|
 | sysdate() | 获得当前系统时间(年、月、日、时、分、秒) |  | curdate() | 获得当前日期 |  | curtime() | 获得当前时间 |  | week(date) | 获得指定日期是一年中的第几周 |  | year(date) | 获得指定日期的年份 |  | month(date) | 获得指定日期的月份 |  | day(date) | 获得指定日期是月份的第几天 |  | hour(date) | 获得指定时间的小时值 |  | minute(date) | 获得指定时间的分钟值 |  | second(date) | 获得指定时间的秒值 |  | datediff(enddate,startdate) | 获得两个时间相隔的天数 enddate - startdate 注意和 SQL Server 中的 datediff(datepart,startdate,enddate) 不同 |  | adddate(date,n) | 在指定日期后面加 n 天 |  | str_to_date(str,fmt) | 将不同时间格式的字符串转为的特定格式的日期  ('%Y-%m-%d') |  | date_format(date,fmt) | 将时间转为不同时间格式的字符串 | 
 | 时间格式 | 描述 | 
|---|
 | %Y | 年,4 位 |  | %y | 年,2 位 |  | %X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |  | %x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |  | %b | 缩写月名 |  | %c | 月,数值 |  | %M | 月名 |  | %m | 月,数值(00-12) |  | %j | 年的天 (001-366) |  | %D | 带有英文前缀的月中的天 |  | %d | 月的天,数值(00-31) |  | %e | 月的天,数值(0-31) |  | %U | 周 (00-53) ,星期日是一周的第一天 |  | %u | 周 (00-53) ,星期一是一周的第一天 |  | %V | 周 (01-53) ,星期日是一周的第一天,与 %X 使用 |  | %v | 周 (01-53) ,星期一是一周的第一天,与 %x 使用 |  | %w | 周的天 (0=星期日, 6=星期六) |  | %a | 缩写星期名 |  | %W | 星期名 |  | %T | 时间,24-小时 (hh:mm:ss) |  | %r | 时间,12-小时(hh:mm:ss AM 或 PM) |  | %p | AM 或 PM |  | %H | 小时 (00-23) |  | %h | 小时 (01-12) |  | %I | 小时 (01-12) |  | %k | 小时 (0-23) |  | %l | 小时 (1-12) |  | %i | 分钟,数值(00-59) |  | %S | 秒(00-59) |  | %s | 秒(00-59) |  | %f | 微秒 | 
 # 获得当前系统时间、当前日期、当前时间
select sysdate(), curdate(), curtime();# 获得指定日期是一年中的第几周、指定日期的年份、月份、指定日期是月份的第几天
select week('2024-02-14') week, year('2024-02-14') year, month('2024-02-14') month, day('2024-02-14') day;# 获得指定时间的小时值、分钟值、秒值
select hour('16:33:24'),minute('16:33:24'), second('16:33:24');# 获得两个时间之间相隔的天数,只计算日期,这里是2024-03-02 减去 2024-02-29 得到两天
select datediff('2024-03-02 08:00:00','2024-02-29 10:00:00') day;# 将不同时间格式的字符串转为的特定格式的日期
select str_to_date('2024/02-13 13:4356','%Y/%m-%d %H:%i%s');# 将时间转为不同时间格式的字符串
select date_format(sysdate(), '%Y/%m/%d %H:%i:%s');# 在 '2024-02-28 23:59:59' 加 1 / 2 天
select adddate('2024-02-28 23:59:59',1);
select adddate('2024-02-28 23:59:59',2);
 
 
 
 
 |