1 数据库基本概念
1.1 数据库
数据库产生背景:
数据库就是存储数据的仓库,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
1.2 关系型数据库
一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
主流的关系型数据库有 MySQL、Oracle、DB2、SQL Server等。
MYSQL :开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。
Oracle :收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中。
SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
本课程使用MySQL
1.3 实体关系模型-ER图
怎样将现实生活中的事物,以数据的形式存储起来,就需要一种模型将两者的关系描绘出来。这种模型就是实体关系模型
实体关系模型对现实世界进行抽象,得出实体类型和实体间的关系,用来描述现实世界中数据的组成结构。
实体关系图(Entity Relationship Diagram)是指提供了表示实体、属性和关系的图形化表示方式,用来描述现实世界的概念模型,也简称为E-R图。
实体关系模型核心的元素
- 实体(Entity):是具有相同特征和属性的现实世界事务的抽象,在E-R图中用矩形表示,矩形框内注明实体的名称
- 属性(Attribute):是指实体具有的特性,一个实体可以包含若干个实体。在E-R图中属性用椭圆形表示,并使用线条将其与相应的实体连接起来。比如员工具有工号、入职日期等属性
- 关系(Relationship):是指实体之间的相互联系的方式,一般具有一对一关系(1:1)、一对多关系(1:N)、多对多关系(M:N)
例子:
E-R图与数据表
E-R图 | 数据表 |
---|---|
实体 | 表 |
属性 | 字段 |
实体的一个记录 | 表的一行记录 |
比如:
学生实体 对应 学生表。
一个实体有多个属性, 对应 学生表 有多个字段(二维表的多列)。
一个实体的一条记录, 对应 学生表的一行记录(二维表的一行)。
1.4 数据库三范式
为了规范化关系型数据模型,要求数据库系统在设计时必须遵循一定的规则,这种规则就称为关系型数据库系统范式。
使用范式的主要目的是为了降低数据的冗余,设计结构合理的数据库。
三范式
第一范式(1NF):字段必须具有单一属性特性,不可再拆分,比如姓名字段,必须具有单一的属性,不可以在一个字段中包含员工中文名或英文名,必须考虑拆分为两个字段。
第二范式(2NF):表要具有唯一性的主键列。也就是说表中的每一行要具有一个唯一性的标识列,比如通常使用GUID或自动增长的数字编号来唯一地标识一行,或者是使用学号来唯一标识一个学生。
第三范式(3NF):表中的字段不能包含在其他表中已出现的非主键字段,比如学生表里面不能出现班级名字字段,可以使用班级ID。
2 MySQL安装
2.1 MySQL安装
下载地址:https://downloads.mysql.com/archives/community/
# 由于网络原因,本课程采用离线安装方式
# 解压安装包
mkdir -p /opt/tools/mysql
tar -xf mysql-5.7.22-1.el7.x86_64.rpm-bundle.tar -C /opt/tools/mysql
# 删除系统自带的MySQL-libs
yum remove -y mysql-libs
# 安装server时要依赖
yum install -y net-tools
# 离线安装
rpm -vih /opt/tools/mysql/mysql-community-common-5.7.22-1.el7.x86_64.rpm
rpm -vih /opt/tools/mysql/mysql-community-libs-5.7.22-1.el7.x86_64.rpm
rpm -vih /opt/tools/mysql/mysql-community-client-5.7.22-1.el7.x86_64.rpm
rpm -vih /opt/tools/mysql/mysql-community-server-5.7.22-1.el7.x86_64.rpm
rpm -ivh /opt/tools/mysql/mysql-community-libs-compat-5.7.22-1.el7.x86_64.rpm
# 启动MySQL
systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld
cat /var/log/mysqld.log | grep password 查看初始化密码
# 登录
mysql -uroot -p
# 输入初始化密码
# 设置校验密码的长度
set global validate_password_policy=LOW;
# 修改密码
set password=PASSWORD('12345678');
# 修改my.cnf,默认在/etc/my.cnf,执行:vim /etc/my.cnf,添加如下内容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character_set_server=utf8
# 重启生效
systemctl restart mysqld
# 对外开放权限
grant all privileges on *.* to 'root'@'%' identified by '12345678';
flush privileges;
2.2 DBeaver连接mysql
打开远程桌面找到Dbeaver
点击添加连接,选择mysql组件
编写连接信息
连接成功
3 SQL语句
英文:Structured Query Language,简称 SQL,结构化查询语言,操作关系型数据库的编程语言
sql的作用:
- 在数据库中检索信息。
- 对数据库的信息进行更新。
- 对数据进行删除
- 添加信息到数据库
- 改变数据库的结构。
- 控制数据访问权限
3.1 SQL语句分类
数据定义语言(DDL):
主要由create(创建库、表)、alter(修改结构)、drop(删除库、表) 和 truncate(摧毁重建) 四个关键字完成。
数据操作语言(DML):
分别用于添加、修改和删除表中的行。主要由insert(添加)、update(修改) 和 delete(删除) 三个关键字完成。
数据查询语言(DQL):
用来查询数据库中表的记录。
主要由select关键字完成,查询语句是SQL语句中最复杂、功能最丰富的语句。
数据控制语言(DCL):
用来定义数据库的访问权限和安全级别,及创建用户。
主要由 grant 和 revoke 两个关键字 完成。
事务控制语句(TCL):
主要讲前三种。 主要由commit 、rollback 和 savepoint 三个关键字完成。
3.2 SQL通用语法
-
SQL语句可以单行或多行书写,以分号结尾
-
MySQL数据库的SQL语句不区分大小写(但是数据区分)
-
注释
• 单行注释:
-- 注释内容 或 #注释内容(MySQL 特有)
• 多行注释:
/*
注释内容
*/
3.3 MySQL的数据类型
整型
整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT
浮点型
MySQL支持的浮点数类型,分别是 FLOAT、DOUBLE。
MySQL允许使用 非标准语法 (其他数据库未必支持,因此如果涉及到数据迁移,则最好不要这么用): FLOAT(M,D) 或 DOUBLE(M,D) 。这里,M称为 精度 ,D称为 标度 。(M,D)中 M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30。
例如,定义为FLOAT(5,2)的一个列可以显示为-999.99-999.99。如果超过这个范围会报错。
定点数类型
MySQL中的定点数类型只有 DECIMAL 一种类型。
使用 DECIMAL(M,D) 的方式表示高精度小数。其中,M被称为精度,D被称为标度。0<=M<=65, 0<=D<=30,D<M。例如,定义DECIMAL(5,2)的类型,表示该列取值范围是-999.99~999.99。
日期与时间类型
- YEAR 类型通常用来表示年
- DATE 类型通常用来表示年、月、日
- TIME 类型通常用来表示时、分、秒
- DATETIME 类型通常用来表示年、月、日、时、分、秒
- TIMESTAMP 类型通常用来表示带时区的年、月、日、时、分、秒
注意:TIMESTAMP(时间戳)如果将来不给这个字段赋值或者赋值为null,那么将采用系统当前时间自动填充。
字符串类型
CHAR和VARCHAR类型都可以存储比较短的字符串。
char类型
- CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。
- 如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在 右侧填充 空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。
VARCHAR类型
- VARCHAR(M) 定义时, 必须指定 长度M,否则报错。
- MySQL4.0版本以下,varchar(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;MySQL5.0版本以上,varchar(20):指的是20字符。
- 检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
文本类型
在MySQL中,TEXT用来保存文本类型的字符串,总共包含4种类型,分别为TINYTEXT、TEXT、 MEDIUMTEXT 和 LONGTEXT 类型。
在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。
由于实际存储的长度不确定, MySQL 不允许 TEXT 类型的字段做主键。
BLOB类型
BLOB是一个 二进制大对象 ,可以容纳可变数量的数据。
MySQL中的BLOB类型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB 4种类型,它们可容纳值的最大长度不同。可以存储一个二进制的大对象,比如 图片 、 音频 和 视频 等。需要注意的是,在实际工作中,往往不会在MySQL数据库中使用BLOB类型存储大对象数据,通常会将图片、音频和视频文件存储到 服务器的磁盘上 ,并将图片、音频和视频的访问路径存储到MySQL中。
4 DDL操作
4.1 DDL操作之数据库
操作数据库相关命令
-- 创建数据库,数据库中数据的编码采用的是安装数据库时指定的默认编码 utf8
create database 数据库名;
-- 创建指定字符集编码的数据库
create database 数据库名 character set 字符集;
-- 查看数据库列表
show databases;
-- 使用数据库
use 数据库名;
-- 查看当前使用数据库
select database();
-- 删除数据库
drop database 数据库名称;
代码示例:
-- 创建hainiudb数据库
create database hainiudb;
-- 创建utf8字符集编码的数据库
create database testdb character set utf8;
-- 查看数据库列表
show databases;
-- 使用hainiudb数据库
use hainiudb;
-- 查看当前使用数据库
select database();
-- 删除testdb数据库
drop database testdb;
4.2 DDL操作之数据表
4.2.1 创建表
建表格式:
-- 创建数据表
create table 表名 (
字段名1 数据类型 [约束][缺省值][描述],
...
字段名N 数据类型 [约束][缺省值][描述],
...
);
创建一张商品表
-- 使用hainiudb数据库
use hainiudb;
-- 创建商品类别表
-- 表内有 类别id, 类别名称字段
CREATE TABLE `category` (
`cid` varchar(32) NOT NULL,
`cname` varchar(50),
PRIMARY KEY (`cid`)
);
-- 其中: cid 是主键, 通过 在后面标记字段是 PRIMARY KEY (`cid`),主键可以唯一定义一行记录
4.2.2 查看表
-- 查看表列表
show tables;
-- 查看表结构
desc category;
4.2.3 修改表
1)修改表添加列
语法:alter table 表名 add 列名 类型(长度) [约束];
-- 为商品类别表添加一个新的字段为 分类描述 varchar(10)
-- 当添加列后,这个列成为表的最后的字段
alter table category add `desc` varchar(10);
2)修改表中列的类型长度及约束
语法:alter table 表名 modify 列名 类型(长度) 约束;
--为商品类别表的描述字段进行修改,类型varchar(30) 添加约束 not null(该字段的值不能为null)
alter table category modify `desc` varchar(30) not null;
注意:在使用过程中要考虑表中已经存储的数据,所以只会修改字段类型长度扩容。
3)修改表中列名
语法:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
-- 为商品类别表的分类名称字段进行更换 更换为 cdesc varchar(30)
ALTER TABLE `category` CHANGE `desc` `cdesc` VARCHAR(30);
4)修改表删除列
语法:alter table 表名 drop 列名;
-- 删除商品分类表中cdesc这列
alter table category drop cdesc;
5)修改表名
语法:rename table 表名 to 新表名;
-- 为分类表category 改名成 product_type
rename table category to product_type;
4.2.4 删除表
是把表结构和表数据都删除
格式:drop table 表名;
-- 删除表
drop table product_type;
5 DML操作
5.1 插入表记录——insert
语法:
-- 向表中插入某些字段
insert into 表 (字段1,字段2,字段3..) values (值1,值2,值3..);
--向表中插入所有字段,字段的顺序为创建表时的顺序
insert into 表 values (值1,值2,值3..);
注意:
值与字段必须对应,个数相同,类型相同
值的数据大小必须在字段的长度范围内
除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号)
如果要插入空值,可以不写字段,或者插入 null。
示例:
1)重新创建商品类别表
-- 创建商品类别表
-- 表内有 类别id, 类别名称、描述 三个字段
CREATE TABLE `category` (
`cid` varchar(32) NOT NULL,
`cname` varchar(50),
PRIMARY KEY (`cid`)
);
2)给表添加数据
-- 添加数据
-- 最标准写法(列与值是一一对应的)
insert into category (cid,cname) values (1,'家用电器');
-- 简易写法(值得顺序必须和列循序一致)
insert into category values (2,'手机/运营商/数码');
-- 便捷写法(一次性插入多条语句可以共享前置语法)
insert into category values (3,'电脑/办公'),(4,'家居/家具/家装/厨具'),(5,'男装/女装/童装/内衣');
5.2 修改表记录——update
用来修改指定条件的数据,将满足条件的记录指定列修改为指定值
语法:
--更新所有记录的指定字段(一般不这么用)
update 表名 set 字段名=值,字段名=值,...;
--更新符合条件记录的指定字段(常用)
update 表名 set 字段名=值,字段名=值,... where 条件;
注意:
列名的类型与修改的值要一致.
修改值得时候不能超过最大长度.
除了数值类型外,其它的字段类型的值必须使用倒引号引起
更新时要加一定的筛选条件。
示例:
-- 将家用电器更新为 美妆/个护清洁/宠物
update category set cname = '美妆/个护清洁/宠物' where cname = '家用电器';
update tablename set column = int/varchar/decimal/double// where column = xxx
-- 将ID为5的数据更新为 男鞋/运动/户外
update category set cname = '男鞋/运动/户外' where cid = 5;
5.3 删除表记录——delete
1)如果删除表中的部分数据
此种方式只是删除表中的数据
语法:delete from 表名 where 条件;
2)如果删除表中所有数据
语法:delete from 表名;
或者
truncate table 表名;
3)delete vs truncate
delete:一条一条删除表中的数据,如果表中数据非常多,那这个执行很慢。
truncate:先把表删除,再创建一个空表,也相当于删除了表数据。
在数据非常多的情况下,要删除表所有数据,建议用truncate。
示例:
-- 删除ID为1的数据
delete from category where cid = 1;
-- 删除商品类别表的所有数据
delete from category;
-- 摧毁商品类别表的表结构然后重新创建
truncate table category;
6 DQL操作
6.1 数据准备
创建商品表:
商品表 product
商品编号 主键 自增
商品名称 字符
商品价格 浮点型
商品类别ID
create table product(
pid int primary key auto_increment,
pname varchar(500),
price double,
c_id int
);
添加测试数据:
INSERT INTO product VALUES(null,' 联想(Lenovo)威6 14英寸商务轻薄笔记本电脑(i7-8550U 8G 256G PCIe SSD FHD MX150 Win10 两年上门)鲨鱼灰',5999,1);
INSERT INTO product VALUES(null,'联想(Lenovo)拯救者Y7000 15.6英寸游戏笔记本电脑(英特尔八代酷睿i5-8300H 8G 512G GTX1050 黑)',5999,1);
INSERT INTO product VALUES(null,'三洋(SANYO)9公斤智能变频滚筒洗衣机 臭氧除菌 空气洗 WiFi智能 中途添衣 Magic9魔力净',2499,1);
INSERT INTO product VALUES(null,'海尔(Haier) 滚筒洗衣机全自动 10公斤变频 99%防霉抗菌窗垫EG10014B39GU1',2499,1);
INSERT INTO product VALUES(null,'雷神(ThundeRobot)911SE炫彩版 15.6英寸游戏笔记本电脑(I7-8750H 8G 128SSD+1T GTX1050Ti Win10 RGB IPS)',6599,1);
INSERT INTO product VALUES(null,'七匹狼休闲裤男2018秋装新款纯棉男士直筒商务休闲长裤子男装 2775 黑色 32/80A',299,2);
INSERT INTO product VALUES(null,'真维斯JEANSWEST t恤男 纯棉圆领男士净色修身青年打底衫长袖体恤上衣 浅花灰 M',35,2);
INSERT INTO product VALUES(null,'PLAYBOY/花花公子休闲裤男弹力修身 秋季适中款商务男士直筒休闲长裤 黑色适中款 31(2.4尺)',128,2);
INSERT INTO product VALUES(null,'劲霸男装K-Boxing 短版茄克男士2018新款休闲舒适棒球领拼接青年夹克|FKDY3114 黑色 185',362,2);
INSERT INTO product VALUES(null,'Chanel 香奈儿 女包 2018全球购 新款蓝色鳄鱼皮小牛皮单肩斜挎包A 蓝色',306830,3);
INSERT INTO product VALUES(null,'皮尔卡丹(pierre cardin)钱包真皮新款横竖款男士短款头层牛皮钱夹欧美商务潮礼盒 黑色横款(款式一)',269,3);
INSERT INTO product VALUES(null,'PRADA 普拉达 女士黑色皮质单肩斜挎包 1BD094 PEO V SCH F0OK0',28512,3);
INSERT INTO product VALUES(null,'好想你 干果零食 新疆特产 阿克苏灰枣 免洗红枣子 玛瑙红500g/袋',21.9,4);
INSERT INTO product VALUES(null,'三只松鼠坚果大礼包1588g每日坚果礼盒干果组合送礼火红A网红零食坚果礼盒8袋装',128,4);
INSERT INTO product VALUES(null,'三只松鼠坚果炒货零食特产每日坚果开心果100g/袋',32.8,4);
INSERT INTO product VALUES(null,'洽洽坚果炒货孕妇坚果零食恰恰送礼每日坚果礼盒(26g*30包) 780g/盒(新老包装随机发货)',149,4);
INSERT INTO product VALUES(null,'今之逸品【拍3免1】今之逸品双眼皮贴双面胶美目舒适隐形立显大眼男女通用 中号160贴',9.9,5);
INSERT INTO product VALUES(null,'自然共和国 原自然乐园 芦荟舒缓保湿凝胶300ml*2(约600g)进口补水保湿舒缓晒后修复面膜',72,5);
INSERT INTO product VALUES(null,'欧莱雅LOREAL 男士火山岩控油清痘洁面膏100ml(洗面奶男 清洁毛孔 祛痘 男士洗面奶)',38.9,null);
INSERT INTO product VALUES(null,'阿拉丁 aladdin 144-62-7 无水草酸 O107180 草酸,无水 500g',88.1,null);
INSERT INTO product VALUES(null,'远东电缆(FAR EAST CABLE)BVVB 2*2.5平方国标家装照明插座用2芯硬护套铜芯电线装潢明线 100米',473,null);
6.2 简单查询
1)查询表所有记录
-- 查询所有的商品
select * from product;
-- 查询所有商品的商品名和商品价格
select pname,price from product;
2)别名查询,使用的关键字是as(as可以省略)
-- 表别名:
select p.pname,p.price from product p;
--列别名:
select p.pname as name1,p.price price1 from product p;
3)去掉重复值
-- 查询有多少种不同的价格
select distinct price from product;
4)查询结果是表达式(运算查询)
-- 将所有商品的价格+10元进行显示
select pname,price price1,(price+10) price2 from product;
6.3 条件查询
格式:select ... from tablename where ...;
说明:筛选符合条件的行记录。
比较运算符 | >、<、<= 、 >=、= 、!=、<> | 大于、小于、大于(小于)等于、不等于 |
---|---|---|
BETWEEN...AND... | 显示在某一区间的值(含头含尾) | |
IN(set) | 显示在in列表中的值,例:in(100,200) | |
LIKE ‘张pattern’ | 模糊查询,Like语句中,%代表零个或多个任意字符,_代表一个字符,例如:first_name like ‘_a%’; | |
IS NULL | 判断是否为空 | |
逻辑运算符 | and | 多个条件同时成立 |
or | 多个条件任一成立 | |
not | 不成立,例:where not(salary>100); |
查询商品名称为“三只松鼠坚果炒货零食特产每日坚果开心果100g/袋”的商品所有信息:
SELECT * FROM product WHERE pname = '三只松鼠坚果炒货零食特产每日坚果开心果100g/袋';
查询价格为299商品
SELECT * FROM product WHERE price = 299;
查询价格不是800的所有商品
-- 写法1 : 最正常的写法
SELECT * FROM product WHERE price != 800;
-- 写法2 : 比较诡异的写法
SELECT * FROM product WHERE price <> 800;
查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price > 60;
查询商品价格在2000到10000之间所有商品
-- 标准写法
SELECT * FROM product WHERE price >= 2000 AND price <=10000;
-- 简易写法 效果一样
SELECT * FROM product WHERE price BETWEEN 2000 AND 10000;
查询商品价格小于2000或大于10000的所有商品
select * from product where price > 10000 or price < 2000;
查询商品价格等于 306830 、28512 的商品信息
-- 标准写法
select * from product where price = 306830 or price = 28512;
-- 简写方案
select * from product where price in (306830,28512);
查询含有 '霸' 字的所有商品
SELECT * FROM product WHERE pname LIKE '%霸%';
查询以'三'开头的所有商品
SELECT * FROM product WHERE pname LIKE '三%';
查询第二个字为'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%';
商品表中没有分类的商品
SELECT * FROM product WHERE c_id IS NULL;
查询商品表中有分类的商品
SELECT * FROM product WHERE c_id IS NOT NULL;
6.4 排序查询
通过order by语句,可以将查询出的结果进行排序。暂时放置在select语句的最后。
格式:
SELECT * FROM 表名 ORDER BY 排序字段 ASC|DESC;
-- ASC 升序 (默认)
-- DESC 降序
1)按照价格降序排序
SELECT * FROM product ORDER BY price DESC;
3)在价格排序(降序)的基础上,以分类排序(降序)
SELECT * FROM product ORDER BY price DESC,c_id DESC;
3)显示商品的价格(去重),并排序(降序)
SELECT DISTINCT price FROM product ORDER BY price DESC;
6.5 聚合查询
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
聚合查询就是先把表的数据聚在一起,统一进行计算后,再得出一个结果的查询方式。
聚合函数:
count:
COUNT()函数进行计数使用
COUNT(*)对表中行的数目进行计数,包含空值(NULL)。
使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
1)count(*) vs count(colume)
-- 查询商品的总条数
SELECT COUNT(*) FROM product;
-- 查询结果:21, count(*) 包含 空值
-- 查询商品类别id的总条数
select count(c_id) from product;
-- 查询结果:18, count(c_id) 不包含c_id为空的记录
2)查询价格大于2000商品的总条数
SELECT COUNT(*) FROM product WHERE price > 2000;
3)查询分类为 1 的所有商品的总和
SELECT SUM(price) FROM product WHERE c_id = 1;
4)查询分类为2所有商品的平均价格
SELECT AVG(price) FROM product WHERE c_id = 2;
5)查询商品的最大价格和最小价格
SELECT MAX(price),MIN(price) FROM product;
6.6 分组查询
分组查询是指使用group by字句对查询信息进行分组。
格式:
SELECT 查询字段 FROM 表名 GROUP BY 分组字段 [HAVING 分组条件];
-- 分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
-- 其中 查询字段只能是 分组字段, 聚合函数,常量 这三种
having与where的区别:
having是在分组后对数据进行过滤
where是在分组前对数据进行过滤
having后面可以使用聚合函数(统计函数)
where后面不可以使用聚合函数
1)统计各个分类商品的个数
SELECT c_id ,COUNT(*) FROM product GROUP BY c_id;
2) 统计各个分类商品的个数,且只显示个数大于3的信息
SELECT c_id ,COUNT(*) FROM product GROUP BY c_id HAVING COUNT(*) > 3;
--等效于
SELECT c_id ,COUNT(*) as num FROM product GROUP BY c_id HAVING num > 3;
3)筛选价格>100 的商品,并统计 统计各个分类商品的个数,且只显示个数大于3的信息
SELECT c_id ,COUNT(*) as num FROM product where price>100 GROUP BY c_id having num > 3;
6.7 分页查询
语法:
-- offset:指定从哪一行开始返回,注意:初始行的偏移量为0。
-- rows:返回具体行数。
select * from table_name limit [offset,] rows
--总结:如果limit后面是一个参数,就是检索前多少行。
-- 如果limit后面是2个参数,就是从offset+1行开始,检索rows行记录。
-- 查询前x条数据
SELECT 字段 FROM 表名 limit x
SELECT 字段 FROM 表名 limit x,y
示例:
1. 查询product表中前10条记录
select * from product limit 10
2,每页显示5条数据
select * from product limit 0,5