文章目录
- 1. 数据库操作命令
- 1.进入数据库
- 2.查看数据库列表信息
- 3.查看数据库中的数据表信息
- 2.SQL语句命令
- 1. 创建数据表
- 2. 基本查询语句
- 3. SQL排序
- 4. SQL分组统计
- 5. 分页查询
- 6. 多表查询
- 7.自关联查询
- 8.子查询
1. 数据库操作命令
1.进入数据库
mysql -uroot -p
2.查看数据库列表信息
show databases;
3.查看数据库中的数据表信息
(1)进入数据库
use mysql;
(2)查看数据表
show tables;
2.SQL语句命令
1. 创建数据表
drop table if exists category;
create table category(
id int unsigned primary key auto_increment,
typeId int,
cateName varchar(10)
);
insert into category values
(0, 001, '一次性口罩'),
(0, 002, 'KN95口罩'),
(0, 003, 'N95口罩'),
(0, 004, '医用口罩');
drop table if exists goods;
create table goods(
id int unsigned primary key auto_increment,
goodsName varchar(10),
price int,
num int,
company varchar(20),
remark varchar(20),
typeId int
);
insert into goods values
(0, '三奇', 25, 100, '某东', '三奇3Q口罩', 4),
(0, '振德', 20, 150, 'x宝', '振德一次性口罩', 1),
(0, '袋鼠医生', 30, 180, '并夕夕','袋鼠医生医用口罩', 4),
(0, '京东京造', 139, 100, '某东', null, null),
(0, '闪电卫士', 77, 160, 'x宝', '闪电卫士一次性口罩', 1),
(0, '安克林', 159, 190, '某东','安克林KN95级口罩', 2),
(0, '科西诺', 30, 100, 'x宝', '科西诺三层防护口罩', 2),
(0, '维德医生', 23, 155, '并夕夕', '维德成人医用口罩', 4),
(0, '庭七', 110, 260, '某东', '医用一次性口罩', 1),
(0, '倍舒特', 72, 190, 'x宝', '三层防护一次性口罩医用口罩', 4),
(0, '中服绿盾', 110, 50, '某东', '', null),
(0, '惠寻', 25, 130, '并夕夕', '惠寻一次性口罩', 1);
2. 基本查询语句
-- 基础查询操作
-- 查全部
SELECT * FROM goods;
-- 查部分
SELECT goodsName,price FROM goods;
-- 起别名
SELECT goodsName as '商品名称' FROM goods;
-- 去重
SELECT DISTINCT(company) FROM goods;
-- 条件查询
SELECT * FROM goods WHERE company='并夕夕';
-- 模糊查询
SELECT * FROM goods WHERE remark like '%一次性口罩';
-- 范围查询
SELECT goodsName 商品名称,price 价格 FROM goods WHERE price BETWEEN 10 and 50;
-- 判空查询
SELECT * FROM goods WHERE remark is null;
3. SQL排序
-- sql排序
-- 语句:ORDER BY asc\dese
-- 按商品价格升序
SELECT * FROM goods;
SELECT * FROM goods ORDER BY price ASC;
-- 按商品价格降序,价格相同时 按数目升序排列
SELECT * FROM goods ORDER BY price DESC,num ASC;
4. SQL分组统计
-- SQL 分组统计
-- 聚合函数: count min max avg
-- 语句分组:group by
SELECT * FROM goods;
-- 统计表单数据量
SELECT count(*) FROM goods; -- 12
-- 统计表单中各商品的平均数量
SELECT AVG(num) FROM goods; -- 147.0833
-- 查询每家公司商品的数量信息
SELECT company,count(*) FROM goods GROUP BY company;
分组+条件删选
-- 查询某东和x宝的最贵商品
SELECT company 公司,MAX(price) 最贵商品价格 FROM goods GROUP BY company HAVING company!='并夕夕';
SELECT company 公司,MAX(price) 最贵商品价格 FROM goods GROUP BY company HAVING company in ('某东','x宝');
where和having区别:
- where是针对From进行删选;
- having是针对分组后(group by)的结果进行删选;
- 只有having后才能用聚合函数;
这里是我的一个疑问和解答
为什么不能直接使用where进行以上条件删选? 而是一定要分组(group by),正如如下代码:
SELECT company 公司,MAX(price) 最贵商品价格 FROM goods WHERE company in (‘某东’,‘x宝’);
.
运行结果是这样的:
解释:
解释1:分组的意义
- GROUP BY 语句根据一个或多个字段对结果集进行分组(也就是把值相同放到一个组中,显示组中一条记录),实现对每个组而不是对整个结果集统计。比如统计每个公司最贵的商品价格,重点理解查询条件的是每个,也就是我们要对表中的数据根据公司要分个类,其次是在分类结果中在依次寻求必要条件,如果没有group by的话,where后只能加一个表项中的一个条件。
解释2:使用where如何分组
- 重要的一点:where在分组前加条件,having在分组后加条件
SELECT company 公司,MAX(price) 最贵商品价格 FROM goods WHERE company in ('某东','x宝') GROUP BY company;
group by详解:https://blog.csdn.net/qq_39221436/article/details/122576925
5. 分页查询
-- 分页查询
-- 页是查询页的页,不是数据表的页
-- 语句:limit satrt,count
-- 查询商品表5-10行数据 (起始显示第五行,一共显示6行)
SELECT * FROM goods;
SELECT * FROM goods LIMIT 4,6;
6. 多表查询
-- 多表查询
-- 类:内连接、左连接、右连接
-- 语句:inner join、LEFT JOIN、RIGHT JOIN
-- aim:对连接后的表进行字段显示限制;
SELECT * FROM goods;
SELECT * FROM category;
-- 内连接
SELECT * FROM goods INNER JOIN category ON goods.typeId=category.typeId;
-- 左连接
SELECT * FROM goods LEFT JOIN category ON goods.typeId=category.typeId;
-- 右连接
SELECT * FROM goods RIGHT JOIN category ON goods.typeId=category.typeId;
7.自关联查询
-- 自关联
-- 条件:一个数据表,表中至少有两个数据项相关联;
-- 方法:起别名,将一个表变成两个表
SELECT * FROM areas;
-- 选择所以河北的城市
SELECT * FROM areas a1 INNER JOIN areas a2 on a1.aid=a2.pid WHERE a1.atitle = '河北省';
8.子查询
-- 子查询
-- 在一条语句中,利用另一条语句充当数据或条件。
-- 充当条件
-- 查高于平均价的商品信息
SELECT * FROM goods WHERE price>(SELECT AVG(price) FROM goods);
-- 充当数据
-- 查询所有来着pdd的商品信息
SELECT * FROM category c INNER JOIN (SELECT * FROM goods WHERE company='并夕夕') a ON c.typeId=a.typeId;