MySQL 基础知识(六)之数据查询(一)

目录

[1 基本查询](#1 基本查询)

[1.1 查询相关列 (select * / 列名)](#1.1 查询相关列 (select * / 列名))

[1.2 别名 (as)](#1.2 别名 (as))

[1.3 去重 (distinct)](#1.3 去重 (distinct))

[1.4 对列中的数据进行运算 (+、-、*、/)](#1.4 对列中的数据进行运算 (+、-、*、/))

[2 条件查询 (where)](#2 条件查询 (where))

[2.1 等值查询 (=)](#2.1 等值查询 (=))

[2.2 非等值查询 (>、<、>=、<=、!=、><)](#2.2 非等值查询 (>、<、>=、<=、!=、><))

[2.3 逻辑判断 (and、or、not)](#2.3 逻辑判断 (and、or、not))

[2.4 区间判断 (between and)](#2.4 区间判断 (between and))

[2.5 NULL 值判断 (is null、is not null)](#2.5 NULL 值判断 (is null、is not null))

[2.6 in 运算符](#2.6 in 运算符)

[2.7 模糊查询 (like)](#2.7 模糊查询 (like))

[3 分支查询](#3 分支查询)

[4 排序 (order by)](#4 排序 (order by))

[5 日期和时间函数](#5 日期和时间函数)


1 基本查询

goods 表

sql 复制代码
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 * / 列名)

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| > 生产环境下,优先使用列名查询。* 的方式虽然看起来便捷,但实际上需要转换成全列名,效率低,可读性差 sql select * from goods; select id, name, stockdate from goods; > 关键字顺序 > select > ... > from > ... > 以上语句执行顺序: > 1. from > 2. select |

1.2 别名 (as)

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| > 通过 as 可以对列名取别名,as 可以省略(列名和别名之间用空格隔开) sql select id as '商品id', name as '商品名', netprice '进价', saleprice '售价' from goods; |

1.3 去重 (distinct)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| > 通过 distinct 将查询结果中的重复行去除 sql select name from goods; select distinct name from goods; |

1.4 对列中的数据进行运算 (+、-、*、/)

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| > 可以对列中的数据进行加 +、减 -、乘 *、除 / sql select id '商品id', name '商品名', (saleprice - netprice) * weight as '利润' from goods; |

2 条件查询 (where)

通过 where 进行条件查询

关键字顺序

select

...

from

...

where

...

以上语句执行顺序:

  1. from
  2. where
  3. select

2.1 等值查询 (=)

|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| sql select * from goods where name = '苹果'; |

2.2 非等值查询 (>、<、>=、<=、!=、><)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql # 从商品中选择 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)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql # 选择 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)

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql # 选择 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)

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sql # 查询表 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 运算符的 sql select id, name, netprice, saleprice from goods where name in ('苹果', '香蕉'); |

2.7 模糊查询 (like)

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| > * "_" 表示单个任意字符 > * "%" 表示任意个任意字符( 0 ~ n 个任意字符) sql # 查询表 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 sql select id, name, stockdate, case when 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

...

以上语句执行顺序:

  1. from
  2. where
  3. select
  4. order by
sql 复制代码
# 按照 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 | 微秒 | sql # 获得当前系统时间、当前日期、当前时间 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); |

相关推荐
宋发元38 分钟前
数据库的MVCC如何理解?
数据库·oracle
圣心1 小时前
Ollama Linux 部署指南
linux·数据库·mysql
有冠希没关系1 小时前
QT 读取sqlite3数据库中文乱码
数据库·qt·sqlite
阿志iiii1 小时前
【Java毕业设计】商城购物系统(附源码+数据库脚本)
java·数据库·课程设计
南宫文凯1 小时前
hbase集群部署
大数据·数据库·hbase
shepherd枸杞泡茶2 小时前
第4章 4.4 EF Core数据库迁移 Add-Migration UpDate-Database
数据库·c#·asp.net·.net·.netcore
Dnui_King2 小时前
Oracle 深入理解Lock和Latch ,解析访问数据块全流程
数据库·oracle
总是学不会.2 小时前
EasyExcel 使用指南:基础操作与常见问题
java·开发语言·数据库·后端·mysql
️○-2 小时前
后端之JPA(EntityGraph+JsonView)
java·数据库·后端·数据库架构
yqcoder2 小时前
Express + MongoDB 实现新增用户密码加密
数据库·mongodb·express