~ DQL 操作表记录 – 查

数据查询语言(DQL),用于查询数据库中的数据。


SELECT <字段名列表>
FROM <表名或视图>
[ WHERE 查询条件 ]
[ GROUP BY <分组的字段名> ]
[ ORDER BY <排序的列名>[ ASC或DESC ] ]
[ LIMIT [位置偏移量,] 行数 ]
 
说明:
1. 字段名列表为要查询的字段名,各字段间使用逗号分隔。若查询表中所有字段,则使用 * 表示。
2. FROM 后的表名为要查询的数据的来源,可单个或多个。
3. [可选]
   3-1. WHERE子句为可选项,指定查询的条件;
   3-2. GROUP BY子句表名查询出来的数据按指定字段进行分组;
   3-3. ORDER BY子句指定按什么顺序显示查询出来的数据,什么字段的升序(ASC)或降序(DESC);
   3-4. LIMIT子句(可用于分页查询,常与ORDER BY配合使用)
        SELECT语句查询出来的数据有可能是全部数据,实际开发中可能只需要指定行数的记录,就需要使用LIMIT语句。
        其中,位置偏移量是指从结果集第几条数据开始显示(第一条记录的位置偏移量为0,第二条为1...),此参数可选,省略时从第一条显示;
        行数,指的是显示记录的条数。
 
如,SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate`
   FROM `student`
   WHERE `gradeId`=1
   ORDER BY studentNo
   LIMIT 4;

准备工作(数据表 _ 插入数据)

#创建商品表:
CREATE TABLE product(
	pid INT PRIMARY KEY,
	pname VARCHAR(20),
	price DOUBLE,
	category_id VARCHAR(32)
);
INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
 
INSERT INTO product(pid,pname,price,category_id) VALUES(4,'JACK JONES',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');
 
INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');
 
INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');
 
INSERT INTO product(pid,pname,price,category_id) VALUES(13,'果9',1,NULL);


简单查询(显示所有记录)

// 查询表中的所有数据(所有商品)
   SELECT * FROM product;
 
# 查询商品名和商品价格
  SELECT pname,price FROM product;
# 查询商品的价格
  SELECT price FROM product;
# 去重 distinct
  SELECT DISTINCT price FROM product;
 
 
# 了解 - 查询结果是表达式(运算查询):将所有商品的价格+10元进行显示
  SELECT price+10 FROM product;
# 了解 - 起别名
  SELECT price+10 AS 打折价格 FROM product;
  SELECT price+10 打折价格 FROM product;

条件查询


# 条件查询
 
#查询商品名称为“花花公子”的商品所有信息:
SELECT * FROM product WHERE pname = '花花公子';
 
#查询价格为800商品
SELECT * FROM product WHERE price = 800;
 
#查询价格不是800的所有商品
SELECT * FROM product WHERE price != 800;
SELECT * FROM product WHERE price <> 800;
SELECT * FROM product WHERE NOT(price = 800);
 
#查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price > 60;
 
 
#查询商品价格在200到1000之间所有商品
SELECT * FROM product WHERE price >= 200 AND price <=1000;
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;
 
#查询商品价格是200或800的所有商品
SELECT * FROM product WHERE price = 200 OR price = 800;
SELECT * FROM product WHERE price IN (200,800);
 
#查询含有'霸'字的所有商品
SELECT * FROM product WHERE pname LIKE '%霸%';
 
#查询以'香'开头的所有商品
SELECT * FROM product WHERE pname LIKE '香%';
 
#查询第二个字为'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%';
 
#查询没有分类的商品
SELECT * FROM product WHERE category_id IS NULL;
 
#查询有分类的商品
SELECT * FROM product WHERE category_id IS NOT NULL;
 
# 查询所有价格大于2000的电脑商品(catetory_id是c001)
# 或者价格大于1000的服装商品(catetory_id是c002)
SELECT * FROM product WHERE (price>2000 AND category_id='c001')
			OR (price>1000 AND category_id='c002');
 
# select * from product where (price>1000 and category_id='c002';
 
# 查询所有价格大于2000的电脑商品(catetory_id是c001)
# 或者价格大于1000的服装商品(catetory_id是c002)
SELECT * FROM product WHERE price>2000 AND category_id IN('c001','c002');

SQL 语句查询

[1] 排序查询:通过 order by 语句,对查询出的结果进行排序,放置在 select 语句的最后。

SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC;
 
# ASC 升序(从小打到,默认) ; DESC 降序(从大到小)
# 查询所有记录的name和price,结构按照价格从大到小进行排序
SELECT pname,price FROM product ORDER BY price DESC;
 
#1.查询所有商品信息,使用价格排序(降序)
SELECT * FROM product ORDER BY price DESC;
 
#2.查询所有商品信息,在价格排序(降序)的基础上,以分类排序(降序)
#先将查询结果 在价格上进行降序,如果价格相同再以分类进行降序,如果价格不相同,不在对分类进行排序
SELECT * FROM product ORDER BY price DESC,category_id DESC;
 
#3.显示商品的价格(去重复),并排序(降序)
SELECT DISTINCT price FROM product ORDER BY price DESC;

[2] 聚合查询:之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,是对查询后的结果的列进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

聚合函数用来对已有数据进行汇总,以下为 5 个常用的聚合(统计)函数:

  • count:统计指定列不为 NULL 的记录行数;
  • sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为 0;
  • max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  • min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  • avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为 0;

/*
聚合查询:以前的查询都是横向记录查询,而聚合查询是纵向个数查询
		聚合查询的特点:查询到的结果是:单一值
		
	聚合函数:
		count:求记录数的聚合函数,count函数会自动忽略空值
		
	    以下四个,通常用于数值的计算
		max:求最大值
		min:求最小值
		avg:求平均值
		sum:求和
*/
 
#查询统计所有商品的个数
SELECT COUNT(*) FROM product;
 
#查询统计一共有多少个分类
SELECT COUNT(category_id) FROM product;
 
#查询所有商品价格的最大值
SELECT MAX(price) FROM product;
 
#查询所有商品价格的最小值
SELECT MIN(price) FROM product;
 
#查询所有商品价格的最平均值
SELECT AVG(price) FROM product;
 
#查询所有商品价格的总值
SELECT SUM(price) FROM product;
 
#查询所有商品价格的最大值,最小值,平均值,总和
SELECT MAX(price) AS 最大值,MIN(price) 最小值,AVG(price) 平均值,SUM(price) 总和 FROM product;

[3] 分组查询:使用 group by 字句对查询信息进行分组。

分组查询:把查询数据分为几个组。关键字: group by 字段
 
	基本格式:
	SELECT 字段1,字段2… FROM 表名 GROUP BY分组字段 HAVING 分组条件;
	# 分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
		
	先分组,再查询,具体查询到的结果数,取决于能分多少组
	如果分组后 还有需要条件判断 那么请用having关键字
		
		where和having的区别:
		
		    where 写在 基本查询后面的,是在分组前对数据进行过滤
		    having 写在 分组查询后面的,是在分组后对数据进行过滤
		
		    where后面是不能写 count sum等聚合(统计)函数
		    having后面可以写count和sum等聚合函数过滤数据
# 查询所有以category_id分组后的价格的总和
# 具体有多少个总和 取决于可以分多少组
SELECT SUM(price) FROM product GROUP BY category_id;
 
#0 统计所有商品的个数
SELECT COUNT(*) FROM product;
 
#1 统计各个分类商品的个数
SELECT COUNT(*) FROM product GROUP BY category_id;
 
 
#2 统计各个分类商品的个数,且只显示个数大于1的信息
SELECT category_id, COUNT(*) 个数  FROM product  GROUP BY category_id  HAVING 个数 > 1;


[4] 分页查询:在项目开发中常见,由于数据量很大,显示屏长度有限,因此,对数据需要采取分页显示方式。例如数据共有 30 条,每页显示 5 条,第一页显示 1-5 条,第二页显示 6-10 条。

/*
分页查询:只查询记录中的一部分。关键字: limit 数值1(下标,从0开始),数值2(需要查出来记录数)
		
	SELECT 字段1,字段2... FROM 表名 LIMIT M,N
		M: 整数,表示从第几条索引开始,计算方式 (当前页-1)*每页显示条数
		N: 整数,表示查询多少条数据
*/
SELECT * FROM product LIMIT 0,5;
 
SELECT * FROM product LIMIT 5,5;
 
SELECT * FROM product LIMIT 10,5;
 
# 查询的公式: 假设每一页我要查询 n 条 
 
# 第1页 limit (1-1)*n,n
# 第2页 limit (2-1)n,n
# 第100页 limit (100-1)*n,n
# 第m页 limit (m-1)*n,n

 

 

 

查询表中的数据记录

# 基本语法

select <字段列表>
from <表名或视图>
[where 查询条件]
[group by <分组的字段>]
[order by <排序的字段> [asc|desc]]                 // asc 升序;desc 降序
[limit [从结果集第几条开始显示,]显示记录的条数];

[ 准备工作 ]               => 商品表(字段_数据记录)

# 创建商品表

create table product(
	pid int not null PRIMARY KEY,
	pname VARCHAR(20) not null,
	price DOUBLE,
	category_id VARCHAR(32)
)comment='商品表';

# 插入商品数据

INSERT into product
VALUES
	( 1, '联想', 5000,'c001' ),
	( 2, '海尔', 3000,'c001' ),
	( 3, '雷神', 5000,'c001' ),
	( 4, 'JACK JONES', 800,'c002' ),
	( 5, '真维斯', 200, 'c002' ),
	( 6, '花花公子', 440,'c002' ),
	( 7, '劲霸', 2000, 'c002'),
	( 8, '香奈儿', 800, 'c003' ),
	( 9, '相宜本草', 200, 'c003'),
	( 10, '面霸', 5, 'c003' ),
	( 11, '好想你枣', 56, 'c004' ),
	( 12, '香飘飘', 1, 'c005' ),
	( 13, '果酒', 1, null );

  • 简单查询
# 查询表中所有数据:select * from product;

# 查询商品名称、商品价格:select pname,price from product;

# 查询商品价格,且去重:select distinct price from product;    // distinct,去重

// 以下了解即可

# 查询结果是表达式(运算查询):select distinct price+10 from product;  // 所有价格 +10

# 起别名:select distinct price+10 as 打折价格 from product;

  • 条件查询

# 查询商品名称为花花公子的商品的所有信息;
-- select * from product where `pname`='花花公子';

# 查询价格为800的商品
-- select * from product where `price`=800;

# 查询价格不是800的商品的所有信息
-- select * from product where `price`!=800;
-- select * from product where `price`<>800;
-- select * from product where not(price=800);

# 查询价格大于60的商品的所有信息
-- select * from product where price>60;

# 查询价格在200到1000之间的商品的所有信息
-- select * from product where price between 200 and 1000;
-- select * from product where price>=200 and price<=1000;

# 查询商品价格是200或800的商品的所有信息
-- select * from product where price=200 or price=800;
-- select * from product where price in(200,800);

# 查询商品名称含有“霸”字的商品的所有信息
-- select * from product where pname like '%霸%';

# 查询商品名称以“香”开头的商品的所有信息
-- select * from product where pname like '香%';

# 查询商品名称的第二个字是“想”的商品的所有信息
-- select * from product where pname like '_想%';

# 查询没有分类的商品的所有信息
-- select * from product where category_id is null;

# 查询有分类的商品的所有信息
-- select * from product where category_id is not null;

# 查询价格大于2000的电脑商品(category_id是c001)或者价格大于1000的服装商品(category_id是c002)
-- select * from product where (price>2000 and category_id='c001') or (price>1000 and category_id='c002');

  • 排序查询
# 查询所有商品信息,并按倒序排列    asc:正序,从小到大   desc:倒序,从大到小
-- select * from product order by price desc;

# 查询所有商品信息,按价格进行到序 — 如果价格相同,再以分类进行降序;如果价格不同,则不再进行分类
-- select * from product order by price desc,category_id desc;

# 查询商品价格,降序,去重
-- select distinct price from product order by price desc;

  • 聚合查询:又称纵向或统计查询,是对查询后的结果的列进行计算,然后返回一个单一值;另,聚合函数会忽略空值。

聚合(统计)函数,主要用来对已有数据进行汇总,以下是 5 个常用函数:

1)count:统计指定列不为 null 的记录的行数;    // 行数

2)sum:计算指定列的数值的和。如果该列数据类型不是数值类型,则结果为0。    // 求和

3)max/min:计算指定列的最大值/最小值。如果该列是字符串类型,那么按字符串排序运算。    // 求最值

4)avg:计算指定列的平均值。如果该列数据类型不是数值类型,则结果为0。    // 求平均值


# 查询所有商品的数量
-- select count(*) from product;  // 记录总数

# 查询总共有多少个分类
-- select count(distinct category_id) from product;

# 查询所有商品的价格的最大值、最小值、平均值、总和
-- select max(price) from product;    # 最大值
-- select min(price) from product;    # 最小值
-- select avg(price) from product;  # 平均值
-- select sum(price) as 总和 from product;  # 总和,别名

  • 分组查询
# 基本语法
select ... from 表名 group by 分组字段 having 分组条件;

说明:
1)先分组,再查询 — 具体查询到的结果数,取决于分了多少组
2)分组后,如果需要条件判断,使用having    // having不同于where,其后面可以有聚合函数
# 查询不同的种类各有多少个商品
-- select count(*) from product group by category_id;

# 统计各个分类商品的数量,且只显示个数大于1的信息
-- select category_id,count(*) as 个数 from product group by category_id having 个数>1;


  • 分页查询

[ 查询公式 ] 假设每一页要查询 n 条数据,则

第一页:limit (1-1)n,n
第二页:limit (2-1)n,n
第 m 页:limit (m-1)n,n

# 基本语法
select * from 表名 limit M,N;

# 代码示例:共有13条数据,每页显示5条。

# select * from product limit 0,5;    // 第一页显示1-5条
# select * from product limit 5,5;    // 第二页显示6-10条
select * from product limit 10,5;     // 第三页显示11-13条