准备工作
# 商品表
create table product(
pid int primary key auto_increment, # 自增加
pname varchar(20), # 商品名称
price double, # 商品价格
pdate date, # 日期
cid int # 分类ID
);
# 目录表
create table category(
id int primary key,
cname varchar(100)
);
INSERT INTO product VALUES(NULL,'泰国大榴莲', 98, NULL, 1);
INSERT INTO product VALUES(NULL,'泰国大枣', 38, NULL, 1);
INSERT INTO product VALUES(NULL,'新疆切糕', 68, NULL, 2);
INSERT INTO product VALUES(NULL,'十三香', 10, NULL, 2);
INSERT INTO product VALUES(NULL,'泰国大枣', 20, NULL, 2);
insert into product values(null,'泰国大枣',98,null,20); #没有对应
insert into product values(null,'iPhone手机',800,null,30);#没有对应
INSERT INTO category VALUES(1,'国外食品');
INSERT INTO category VALUES(2,'国内食品');
INSERT INTO category VALUES(3,'国内服装');
完整DQL语法顺序
SELECT DISTINCT
<select_list>
FROM
<left_table> <join_type>
JOIN <right_table> ON <join_condition>
WHERE
<where_condition>
GROUP BY
<group_by_list>
HAVING
<having_condition>
ORDER BY
<order_by_condition>
LIMIT <limit_number>
简单查询
- 查询所有的商品
select * from product;
- 查询商品名和商品价格
select pname, price from product;
- 别名查询,使用的as关键字,as可以省略的
1. 表别名
select * from product as p;
2. 列别名
select pname as pn from product;
- 去掉重复值
select distinct price from product;
- 查询结果是表达式(运算查询):将所有商品的价格+10进行显示
select pname, price+10 from product;
条件查询
- 查询商品名称为十三香的商品所有信息
select * from product where pname = '十三香';
- 查询商品价格>60的所有的商品信息
select * from product where price > 60;
比较运算符 | > >= < <= = <> | 大于、大于等于、小于、小于等于、等于、不等于 |
---|---|---|
between … and … | 显示在某一区间的值,包含头和尾 | |
in (set) | 显示在in列表中的值, in (10, 20) | |
like ‘张_’ | 模糊查询,like 语句中,% 代表零个或多个任意字符,_代表一个字符, | |
is null | 判断是否为空 | |
逻辑运算符 | and | 多个条件同时成立 |
or | 多个条件任一成立 | |
not | 不成立 |
排序
- 查询所有的商品,按价格进行排序(asc-升序,desc-降序)
select * from product order by price;
- 查询名称有新的商品的信息并且按价格降序排序
select * from product where pname like '%新%' order by price desc;
聚合函数
-
特点:只对单列进行操作
-
常用的聚合函数:
1. 求某一列的和 sum() 2. 求某一列的平均值 avg() 3. 求某一列的最大值 max() 4. 求某一列的最小值 min() 5. 求某一列的元素个数 count()
- 获得所有商品的价格的总和:
select sum(price) from product;
- 获得所有商品的平均价格
select avg(price) from product;
- 获得所有商品的个数
select count(*) from product;
分组
- 根据cno字段分组,分组后统计商品的个数
select cid, count(*) from product group by cid;
- 根据cno分组,分组统计每组商品的平均价格,并且平均价格>60;
select cid, avg(price) from product group by cid having avg(price) > 60;
- 注意事项:
- select语句中的列(非聚合函数列),必须出现在group by 子句中
- group by 子句中的列,不一定要出现在select语句中
- 聚合函数只能出现select语句中或者having语句中,一定不能出现在where语句中。
分页查询
-
limit关键字不是SQL92标准提出的关键字,它是MySQL独有的语法。
-
分页分为逻辑分页和物理分页
逻辑分页:将数据库中的数据查询到内存之后再进行分页。 物理分页:通过LIMIT关键字,直接在数据库中进行分页,最终返回的数据,只是分页后的数据。
-
格式:
select * from table limit [offset] rows
-
offset: 偏移量
-
rows: 每页多少行记录
-
子查询
- 定义
子查询允许把一个查询嵌套在另一个查询当中。
子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。
子查询可以包含普通select可以包括的任何子句,比如:distinct、group by、 order by、limit、join和union等;
对应的外部查询必须是以下语句之一:select、insert、update、delete.
- 位置
select中、from后、where中
group by和order by 中无实用意义
其他查询语句
union 集合的并集(不包含重复记录)
union all 集合的并集(包含重复记录)