MySQL数据库-DQL(单表查询)

数据准备
-- 创建db1数据库
CREATE DATABASE db1;
-- 使用db1数据库
USE db1;
-- 创建数据表
CREATE TABLE product(
id INT, -- 商品编号
NAME VARCHAR(20), -- 商品名称
price DOUBLE, -- 商品价格
brand VARCHAR(10), -- 商品品牌
stock INT, -- 商品库存
insert_time DATE -- 添加时间
);
-- 添加数据
INSERT INTO product VALUES (1,'华为手机',3999,'华为',23,'2088-03-10'),
(2,'小米手机',2999,'小米',30,'2088-05-15'),
(3,'苹果手机',5999,'苹果',18,'2088-08-20'),
(4,'华为电脑',6999,'华为',14,'2088-06-16'),
(5,'小米电脑',4999,'小米',26,'2088-07-08'),
(6,'苹果电脑',8999,'苹果',15,'2088-10-25'),
(7,'联想电脑',7999,'联想',NULL,'2088-11-11');
创建了一个db1的数据库,其中含有product表如下所示:

查询语法
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件 (分组之后不能使用where,只能使用having)
order by
排序
limit
分页限定
查询全部
(1)查询全部表的数据
SELECT * FROM 表名;
SELECT * FROM product;

(2)查询指定字段的表数据
SELECT 列名1,列名2... FROM 表名;
例如:查询name,price,brand这三列的数据
SELECT name,price,brand FROM product;

(3)去除重复查询
SELECT DISTINCT 列名,列名... FROM 表名;
例如:查询品牌,去除重复
SELECT DISTINCT brand FROM product;

(4)计算列的值(四则运算)
SELECT 列名1[ 运算符 ], 列名2[ 运算符 ] FROM 表名;
例如:价格都上涨1000,库存增加10部。
SELECT price+1000, stock+10 FROM product;

观察上面的数据,显然最右下角的数据有问题!是NULL!
需要处理
SELECT price+1000,IFNULL(stock,0)+10 FROM product;

(5)起别名查询
上述的案例,这样子查询出来的结果明显不美观,而且有问题,所以这里可以在显示出来的时候给它取一个别名。
SELECT 列名1 AS 别名1, 列名2 AS 别名2 FROM 表名;
SELECT price+1000 AS price_new,IFNULL(stock,0)+10 AS stock_new FROM product;

条件查询 (where)
查询条件分类
| 符号 | 功能 |
|---|---|
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| = | 等于 |
| <> 或 != | 不等于 |
| BETWEEN ... AND ... | 在某个范围之内(都包含) |
| IN(...) | 多选一 |
| LIKE 占位符 | 模糊查询 _单个任意字符 %多个任意字符 |
| IS NULL | 是NULL |
| IS NOT NULL | 不是NULL |
| AND 或 && | 并且 |
| OR 或 || | 或者 |
| NOT 或 ! | 非,不是 |
条件查询的语法
SELECT 列名列表 FROM 表名 WHERE 条件;
如下述案例:
(1)查询库存大于20的商品信息
SELECT * FROM product WHERE stock > 20;

(2)查询品牌为华为的商品信息
SELECT * FROM product WHERE brand='华为';

(3)查询金额在4000 ~ 6000之间的商品信息
SELECT * FROM product WHERE price >= 4000 AND price <= 6000;
SELECT * FROM product WHERE price BETWEEN 4000 AND 6000;
between..and 也是可以实现的!(数值在...与...之间)

(4)查询库存为14、30、23的商品信息
SELECT * FROM product WHERE stock=14 OR stock=30 OR stock=23;
SELECT * FROM product WHERE stock IN(14,30,23);
IN(...) 也可以实现

(5)查询库存为null的商品信息
SELECT * FROM product WHERE stock IS NULL;

(6)查询库存不为null的商品信息
SELECT * FROM product WHERE stock IS NOT NULL;

(7)查询名称以小米为开头的商品信息
SELECT * FROM product WHERE NAME LIKE '小米%';

(8)查询名称第二个字是为的商品信息
SELECT * FROM product WHERE NAME LIKE '_为%';

(9)查询名称为四个字符的商品信息
SELECT * FROM product WHERE NAME LIKE '____';
注:上述代码是有四个“_” ,表示有四个字符。

(10)查询名称中包含电脑的商品信息
SELECT * FROM product WHERE NAME LIKE '%电脑%';

聚合函数查询
聚合函数介绍
将一列数据作为一个整体,进行纵向的计算
聚合函数分类
| 函数名 | 功能 |
|---|---|
| count(列名) | 统计数量(一般选用不为null的列) |
| max(列名) | 最大值 |
| min(列名) | 最小值 |
| sum(列名) | 求和 |
| avg(列名) | 平均值 |
聚合函数语法
SELECT 函数名(列名) FROM 表名 [WHERE 条件];
案例学习
(1)计算product表中总记录条数
SELECT COUNT(*) FROM product;
![]()
(2)获取最高价格
SELECT MAX(price) FROM product;

(3)获取最高价格的商品名称 (有难度)
SELECT NAME,price FROM product
WHERE price = (
SELECT MAX(price)
FROM product
);

(4)获取最低库存
SELECT MIN(stock) FROM product;

(5)获取最低库存的商品名称 (有难度)
SELECT NAME,stock FROM product
WHERE stock = (
SELECT MIN(stock)
FROM product
);

(6)获取总库存数量
SELECT SUM(stock) FROM product;

(7)获取品牌为苹果的总库存数量
SELECT SUM(stock) FROM product WHERE brand='苹果';

(8)获取品牌为小米的平均商品价格
SELECT AVG(price) FROM product WHERE brand='小米';

排序查询 (order by)
注意
多个排序条件,当前边的条件值一样时,才会判断第二条件
| 关键词 | 功能 |
|---|---|
| ORDER BY 列名1 排序方式1,列名2 排序方式2 | 对指定列排序,ASC升序(默认的) DESC降序 |
排序语法
注意:不一定要使用 where
SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2...;
案例学习
(1)按照库存升序排序
SELECT * FROM product ORDER BY stock ASC;

(2)查询名称中包含手机的商品信息。按照金额降序排序
SELECT * FROM product WHERE NAME LIKE '%手机%' ORDER BY price DESC;

(3)按照金额升序排序,如果金额相同,按照库存降序排列
SELECT * FROM product ORDER BY price ASC,stock DESC;
-- 注意没有 where 之前写的时候一不小心用了

分组查询 (group by)
对数据进行分组 ,数据-group by - 后面的东西。
不论是分组,还是排序,有条件一定要先过滤,虽然最后的结果是一样的,但是效率不同!
语法
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];
(1)按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product GROUP BY brand;

(2)对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product WHERE price > 4000 GROUP BY brand;
与上述的案例类似,加了一个where price > 4000 的条件。

(3)对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的
SELECT brand,SUM(price) AS getSum FROM product
WHERE price > 4000
GROUP BY brand
HAVING getSum > 7000;
注意:
这里分组完之后,还需要条件过滤,(只显示金额大于7000的)就不能使用 WHERE 了!只能使用HAVING!
(4)对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的、并按照总金额的升序排列
SELECT brand,SUM(price) AS getSum FROM product
WHERE price > 4000
GROUP BY brand
HAVING getSum > 7000
ORDER BY getSum ASC;

分页查询 (limit)
语法
-- 标准语法
SELECT 列名 FROM 表名[WHERE 条件]
[GROUP BY 分组列名]
[HAVING 分组后条件过滤]
[ORDER BY 排序列名 排序方式]
LIMIT 开始索引,查询条数;
公式:开始索引 = (当前页码-1) * 每页显示的条数
(1)每页显示3条数据
SELECT * FROM product LIMIT 0,3; -- 第一页 开始索引=(1-1) * 3
SELECT * FROM product LIMIT 3,3; -- 第二页 开始索引=(2-1) * 3
SELECT * FROM product LIMIT 6,3; -- 第三页 开始索引=(3-1) * 3



浙公网安备 33010602011771号